과연 실무에서 전공자가 아닌 비전공자가 분석 내용을 확인하는 방법중에 가장 효과적인 방법은 무엇일까?

바로 그래프이다. 그래프를 통해 알기 어려운 insight를 한눈에 알아차릴 수 있다. 하지만, 그 과정을 만들어 잘 보여지게 하는게 analysist 의 일이다.

 

시작 데이터는 항상 연습용으로 사용하는 리뷰데이터를 통해 시작하겠다. 이유는 간단하다. 전처리 하기에도 가장 훌륭한 연습용 데이터이기 때문이다.

먼저 필요한 라이브러리 함수를 불러온다.

 

import numpy as np
import pandas as pd
from konlpy.tag import Okt
from collections import Counter
import re
from konlpy.tag import Twitter
from pykospacing import spacing
import matplotlib.pyplot as plt
twitter=Twitter()
data=pd.read_csv('c:/data/thisweek_selected_classified.csv')
stopwords = ['도', '는', '다', '의', '가', '이', '은', '한', '에', '하', '고', '을', '를', '인', '듯', '과', '와', '네', '들', '듯', '지', '임', '게','요','거','로','으로',
            '것','수','할','하는','제','에서','그','데','번','해도','죠','된','건',
             '바','구','세','랑','시','저','만']

data는 작성일전으로부터 1주일 데이터를 크롤링한 데이터이다. 한번 데이터를 확인해보자.

데이터는 10개만 확인해본다.

data=pd.read_csv('c:/data/thisweek_selected_classified.csv')
data[:10]

본인이 생각하기에 실무자가 아닌 일반 비전공자들은 이 데이터르 보면 '아 1주일데이터가 이렇구나'까지이다. 우리의 임무는 어떤 방식으로 어떻게 상대방에게 결과 즉, insight를 꺼내주면 된다.

content 칼럼의 리뷰 문장들을 한번 간단하게라도 전처리 및 토큰화를 해보자.

twitter=Twitter()
data=pd.read_csv('c:/data/thisweek_selected_classified.csv')
#불용어 단어
stopwords = ['도', '는', '다', '의', '가', '이', '은', '한', '에', '하', '고', '을', '를', '인', '듯', '과', '와', '네', '들', '듯', '지', '임', '게','요','거','로','으로',
            '것','수','할','하는','제','에서','그','데','번','해도','죠','된','건',
             '바','구','세','랑','시','저','만']

#단어의 길이가 2개 이상인 경우만 선택 및 저장
data['content']=data['content'].str.replace('[^ㄱ-ㅎㅏ-ㅣ|가-힣]','') #전처리 
data['tokenized']=data['content'].apply(twitter.morphs) #명사마나ㅏ 토큰화
data['tokenized']=data['tokenized'].apply(lambda x: [item for item in x if item not in stopwords])
#불용어 처리
x=data['tokenized']
for line in x:
    for word in line:
        if len(word)<2:
            line.remove(word)
data['tokenized']=x 

*참고) Twitter 전처리 라이브러리는 Konlpy에서 만든 것인데, KoNLPy v0.4.5 버전 이후로는 Okt 전처리 라이브러리와 통합되었다.

아직까지 Konlpy에서 만든 토큰화 라이브러리는 단어가 조금만 오타가 나도 오류를 범하기에 가장 빠르게 할 수 있는 방법은 단어 길이가 1인 경우는 지워주는 것이다. 본인 기준이다.... 

다시 데이터 10개를 확인해보면 잘 처리가 되었다. 이후 우리는 numpy에서 제공하는 단어 카운트 라이브러리를 사용할 것이다. 

우선 긍정 및 부정으로 나누어 주고, 각 부분 별 단어의 빈도 최고 10개를 확인해 보자.

negative_count=np.hstack(data[data.grade<3]['tokenized'].values)
positive_count=np.hstack(data[data.grade>2]['tokenized'].values)
negative_word_count=Counter(negative_count)
positive_word_count=Counter(positive_count)

print(negative_word_count.most_common(10))
print(positive_word_count.most_common(10))

[('영상', 9), ('너무', 7), ('화면', 7), ('업데이트', 6), ('라이브', 6), ('버전', 6), ('기능', 5), ('따로', 4), ('채널', 4), ('계속', 3)]
[('영상', 12), ('브이', 8), ('너무', 7), ('기록', 5), ('삭제', 5), ('업데이트', 4), ('라이브', 4), ('까지', 4), ('설정', 4), ('좋은데', 3)]

긍정과 부정에 최빈 단어는 '영상' 이다. 수치로도 확인할 수 있지만, 본래 취지는 그래프를 통한 insight이기에 그래프로 확인해보자.

import matplotlib.font_manager as fm
def bar_plot(dict1,dict2):

    fl = fm.FontProperties(fname='c:/Windows/Fonts/malgun.ttf').get_name()
    plt.rc('font', family=fl)
    plt.bar(dict1.keys(), dict1.values(), color='b')
    plt.bar(dict2.keys(), dict2.values(), color='r')
    plt.legend()
    plt.title('Bar Chart')
    plt.show()
    
ne_data=dict(negative_word_count.most_common(10))
po_data=dict(positive_word_count.most_common(10))

bar_plot(po_data,ne_data)

위 그래프를보면 까지, 너무, 이런 단어들은 굳이 있을 필요가 없는 단어들이다. 그러므로 다시 불용어 처리를 하며 그래프를 더 정교화 시키면 된다. 연습용 데이터가 작기에 이 단어 빈도수가 작지만 데이터를 늘린다면 더 괜찮은 insight를 도출해 낼 수 있을 것이다. 

 

+ Recent posts