[wanted 채용 공고 분석] 5. 기술 스택 분석(2) - 데이터 시각화
저번 포스팅까지 정규표현식과 nltk tokenizer를 이용하여 전처리를 완료했다. 또한 빈도 수 분석을 위해 Counter 함수로 빈도수를 체크하고 각 항목을 딕셔너리 형태로 저장하였다. 이제 전처리가 완료된 데이터를 시각화하여 분석을 진행한다.
현직 데이터 분석가에 따르면 실제로 시각화 과정이 다른 팀과의 협업, 혹은 프레젠테이션 과정에서 상당히 중요하다고 한다. 모두가 데이터와 분석 방법론에 대한 지식을 갖춘 것은 아니다. 다른 부서, 혹은 의사 결정자에게 공들인 프로젝트를 알기 쉽게 설명하기 위해서는 다양한 시각화 방법을 익혀야 하며 전략적으로 사용할 수 있어야 한다. 개인적인 toy project가 아니라 실제 비즈니스 의사결정에 데이터 기반 인사이트를 제공하기 위해서 분석 과정과 결과를 효과적으로 전달하는 역량을 반드시 갖춰야 한다. 본 프로젝에서는 텍스트 데이터에서 주로 쓰이는 word cloud 와 seabon barplot으로 데이터 시각화를 진행한다.
0. 모듈 & 라이브라리
#### konlpy 설치 (jpype, java_home 환경변수 설정, 시스템파일 수정), wordcloud 설치 과정은 따로 기재하지 않았습니다. #####
import os
import sys
import pandas as pd
import numpy as np
import re
from konlpy.tag import Okt # 형태소분석기 : Openkoreatext
from collections import Counter # 빈도 수 세기
from wordcloud import WordCloud # wordcloud 만들기
import matplotlib.pyplot as plt # 시각화
import matplotlib as mpl
import seaborn as sns
from matplotlib import font_manager, rc # font 설정
import nltk # natural language toolkit : 자연어 처리
# matplotlib 그래프 한글폰트 깨질 때 대처(Mac & Window)
import platform
if platform.system() == 'Windows':
# 윈도우인 경우
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name() # 한글 폰트 깨지는 겨우
rc('font', family=font_name)
else:
# Mac 인 경우
rc('font', family='AppleGothic')
cleaned_counted_ranked = dict(cleaned_counted.most_common()) # 빈도수 내림차순 정렬 후 딕셔너리화
cleaned_counted_ranked
1. Word cloud
각각 단어를 key값, 빈도 수를 value로 가지는 딕셔너리를 word cloud로 시각화한다. word cloud는 직접적인 빈도 수를 알 수 없지만 상대적인 빈도를 직관적으로 볼 수있는 시각화 도구이다. 전체 중에서 해당 텍스트가 얼마나 큰 비율을 차지하는 지 직관적으로 알 수 있기 때문에 종종 사용된다. 또한 전처리만 잘 이루어지면 손 쉽게 만들 수 있고 디자인적으로도 예쁘게 나타낼 수 있다.
# wordcloud 만들기
wc = WordCloud(font_path = 'C:\Windows\Fonts\malgun.ttf',background_color="white",width=2000, height=1000).generate_from_frequencies(cleaned_counted_ranked) # font 경로 개별적으로 설정해야함
plt.figure(figsize = (40,40))
plt.imshow(wc)
plt.axis('off')
plt.show()
2. Seaborn Bar plot
python의 대표적인 시각화 관련 라이브러리는 matplotblib 과 seaborn이 있다. seaborn은 matplotlib에 비해 다양한 디자인을 제공하고 (예쁘게 만들 수 있음) 보다 손 쉽게 차트 등을 그릴 수 있다. 물론, 세부적인 그래프 지정에는 matplotlib과 함께 사용되는 경우도 많으므로 둘 다 사용할 수 있도록 준비해야 한다. 위에 모듈과 라이브러리에서 import하고 sns라는 이름으로 저장하였다.
현재 토큰들은 cleaned_counted_ranked 라는 변수에 딕셔너리 형태로 지정되어 있다. bar plot을 보다 직관적으로 보기 위해서 dataframe 으로 만든 뒤 빈도 수 상위 10개 항목만으로 bar plot을 그려본다.
df_count = pd.DataFrame.from_dict(cleaned_counted_ranked,orient='index') # 단어별 빈도 수를 데이터프레임으로 저장
df_count['skill'] = df_count.index # index로 들어있는 skill들을 컬럼으로 추가
df_count=df_count.rename(columns={0:'count'}) # 빈도 수 열이름 count로 변경
df_count = df_count[['skill','count']] # 컬럼 순서 변경
df_count.reset_index(inplace=True,drop=True) # 기존 인덱스 리셋 -> 내림차순 정렬로 새로운 index가 순위의 의미를 가짐
df_count2 = df_count[df_count['count']>=10] # 10회 이상 등장한 skill로 barplot 그리기 위함
df_count2
위와 같이 skill, count 두 개의 컬럼을 가진 데이터 프레임으로 만든 후 빈도 상위 10개 항목만으로 구성하였다. 현재 내림차순으로 정렬되어 있으므로 행의 index는 순위의 의미를 가지게 되었다. barplot에 넣기 위해서는 데이터를 dataframe 형식으로 구성하는 것이 효과적이다.
plt.figure(figsize=(20, 10))
bar=sns.barplot(data=df_count2,x='skill',y='count')
bar.set_title('Preferred skills for Data Analyst', fontsize=18)
bar.set_xlabel('Skill', fontdict={'size':16})
bar.set_ylabel('Count', fontdict={'size':16})
for p in bar.patches: # annotation : 차트 위에 count 나타내기
height = p.get_height()
bar.text(p.get_x() + p.get_width() / 2., height + 1, height, ha = 'center', size = 15,)
plt.show()
여기까지 크게 word clout , seaborn barplot으로 데이터 시각화를 진행하였다. 다음 포스팅에서는 이러한 시각화 자료를 기초로 구체적으로 분석하는 프로젝트의 최종 목표를 달성해 보자!