[데이터분석] 2주차 강의노트 (1)
기본 세팅
- 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)]