Python

[데이터분석] 2주차 강의노트 (1)

화두 2022. 6. 23. 16:23

기본 세팅

- colab에는 한글 세팅이 안 되어 있으므로 코드로 한글 세팅을 해줘야 함

import matplotlib as mpl
import matplotlib.pyplot as plt
 
%config InlineBackend.figure_format = 'retina'
 
!apt -qq -y install fonts-nanum
 
import matplotlib.font_manager as fm
fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
font = fm.FontProperties(fname=fontpath, size=9)
plt.rc('font', family='NanumBarunGothic') 
mpl.font_manager._rebuild()

- 한글 코드 실행한 다음 '런타임 다시 시작', 한번 더 셀 실행

- colab을 껐다 다시 켤 경우 처음부터 실행을 해줘야 함!

- csv 파일 업로드

- pandas 라이브러리 import 후 'df'라는 변수에 데이터 프레임을 담는다

import pandas as pd

df = pd.read_table('news_data.csv', sep=',') #파일명
df #데이터 프레임 출력

 

텍스트 마이닝

- df.isnull()은 파이썬에게 빈 행이 있는지 물어보는 함수 -> True or False로 출력됨

- 빈 행이 몇 개인지 물어볼 때는 sum 함수를 씀

print(df.isnull().sum()) #파이썬아, 빈 행/열이 몇 개 있어?

- 빈 행을 데이터 분석에서는 '결측치'라고 함

df['news'].unique() #news 열에서 unique한 값을 출력해줘
df['code'].unique() #code 열에서 하나씩 존재하는 값을 출력해줘

- unique 함수는 해당 열에서 하나씩 존재하는 걸 출력해준다. 이때, unique앞에 n을 붙이면 하나씩만 존재하는 값의 개수를 구할 수 있음

 

중복된 값 지우기 

df.drop_duplicates(subset=['news'], inplace=True)

- inplace=True를 빼면 df는 달라지지 않음. 원본이 그대로 남아 있게 되고, 사용자가 원할 경우 df2로 저장할 수 있게 해주는 역할만 함.

- 그런데 굳이 데이터프레임을 하나 더 만들 필요가 없으므로 inplace=True를 써서 데이터 프레임 자체에서 중복값을 제거해서 df로 저장

- 중복값 제거한 데이터 프레임의 길이를 확인할 때는 len() 함수!

- 카테고리별로 중복 제거 개수를 셀 때는 value_counts()를 쓴다

df['code'].value_counts()

시각화

- 막대 그래프 형태는 kind='bar'

df['code'].value_counts().plot(kind='bar')

 

 

형태소 분석

- 형태소 또는 명사 단위로 뽑아낼 때 형태소 분석기(konlpy) 패키지 사용

from konlpy.tag import Okt

* 개발자가 konlpy의 함수명을 Okt라고 정해 놨음

tokenizer = Okt() # 명사 분석기를 tokenizer라는 이름으로 사용하겠습니다

- 명사만 뽑아낼 때는 tokenizer.nouns(kor_text)

 

 

쓸모 없는 단어(불용어) 제거

- stop_words = [ ' ', ' ', ~]

- 열 각각에 적용하는 토큰화를 할 때는 apply() 함수를 쓴다

df['news'].apply(tokenizer.nouns)
df['tokenized(새로운 열 이름)'] = df['news'].apply(tokenizer.nouns) # 토큰화한 열을 새로 만듦

 

리스트 컴프리핸션 연산

test_list = ['경찰서', '상해', '혐의', '씨', '구속', '수사', '일']
remove_word_list = ['경찰서', '구속']
test_list = [item for item in test_list if item not in remove_word_list and len(item) > 1]

print(test_list)

- for 문 먼저 쓰고 if 문 추가. 조거문을 두 개 쓸 때는 and로 연결

- 글자수가 2개 초과인 경우만 남길 때는 len(item) > 2

- item이 remove_world_lis에 있지 않는 요소만 담을 때는 not in remove_word_list

 

불용어 제거

df['tokenized'] = df['tokenized'].apply()

- 함수가 아니라 조건문 형태로 만들어놨기 때문에 lamda x를 활용

- lamda x는 특정 행을 x라고 지칭한다는 의미 -> 조건문을 lamda x: []에 넣기

df['tokenized'] = df['tokenized'].apply(lambda x: [item for item in x if item not in stop_words and len(item) > 1])

- 하나하나 조건문을 적용해서 'tokenized'라는 열에 저장해줘!

 

numpy 패키지 이용한 텍스트 마이닝

df[df['code(열이름)'] == '사회(특정값)'].values

- 열 이름이 특정값일 때만 필터링한 데이터프레임

0    2019-01-02
1          3.14
2           ABC
3           100
4          True
dtype: object

- 특정 데이터프레임의 열을 리스트로 만드는 코드는 df['특정열'].values

['2019-01-02' 3.14 'ABC' 100 True] # .values 실행하면 열 -> 리스트로

- 특정 카테고리의 뉴스 데이터만으로 리스트를 만들 때는

 

df[df['code']=='특정 카테고리']['tokenized'].values

 

 

리스트 묶기

- list 안에 여러 개의 list가 들어 있을 때는 numpy 패키지 안에서 np.hstack() 함수로 묶어줄 수 있음

import numpy as np
temp_list = [['a', 'b', 'c'], ['i', 'j', 'k'], [1, 2, 3]] # temp_list는 임의로 정할 수 있음
result = np.hstack(temp_list)
print(result)

['a', 'b', 'c', 'i', 'j', 'k', 1, 2, 3]

- print(len(social_news)를 하면 각 분야별 총 단어 개수를 구할 수 있음

 

 

단어별 빈도수 파악

- 단어별 빈도수는 collections라는 패키지에 들어 있는 Counter 함수 활용 (* 대소문자 주의!)

life_news = ['헤럴드경제' '승희' '문화' ... '동아' '사이언스' '콘텐츠']

# 단어 카운트를 수행
life_news_count = Counter(life_news)

# 전체 단어 카운트를 출력
print(life_news_count)

Counter({'코로나': 243, '한국': 193, '판매': 153, '관광': 139, '기온': 124 ...})

- 등장 빈도를 카운트한 결과에 most_common(특정 숫자)을 사용할 경우 순위별로 출력이 가능함

# 빈도수 상위 10개에 대해서만 카운트를 출력
print(life_news_count.most_common(10))

[('코로나', 243), ('한국', 193), ('판매', 153), ('관광', 139), ('기온', 124), ('서울', 116), ('국내', 90), ('문화', 86), ('내일', 83), ('지역', 80)]