안녕하세요!
데이터분석 파이썬 원형 그래프, 워드 클라우드 본문
https://shinyfood.tistory.com/77
데이터분석 교통데이터 시각화
import pandas as pd df_bus_card_tot = pd.read_csv("./01_data/all/df_bus_card_tot.csv") print("개수 : ", len(df_bus_card_tot)) df_bus_card_tot.head(1) 데이터를 다룰땐 결측치와 이상치(기초통계)를 확인해야한다. 해당 자료는 이
shinyfood.tistory.com
해당 글에서 사용했던 데이터를 이용하여 원형 데이터를 그려보도록 하자.
fig, axs = plt.subplots(5, 2, figsize=(13,22))
axs = axs.flatten()
# 긍정/부정/기타 색상 정의
colors = ["pink", "gold", "cyan"]
#레이블 정의
labels_dict = {0 : "부정(1 ~ 4점)", 1 : "긍정(8 ~ 10점)", 2 : "기타(5 ~ 7점)"}
# 긍정/부정에 대한 원형 그래프 그리기(긍정/부정 개수)
for title, ax in zip(avg_score.keys(), axs) :
# 영화별 건수 필터링하기
num_reviews = len(df_new[df_new["title"]==title])
# print(f"num_reviews = {num_reviews}") 리뷰 수 프린트 확인
# label 컬럼의 범주별로 개수 필터링하기
values = df_new[df_new["title"] == title]["label"].value_counts()
# print(f"values = {values}") 레이블 수 0 , 1 , 2 각각 확인
# 원형 그래프에 표시할 레이블값 정의하기
# - 영화별로 긍정 또는 부정 또는 기타 중에 하나라도 없으면 처리가 필요 함.
label_list = df_new[df_new["title"] == title]["label"].unique()
labels = []
for k in label_list :
### 영화별 실제 존재하는 긍정/부정/기타 레이블 정의하기
labels.append(labels_dict[k])
# 각 그래프 제목 넣기
ax.set_title(f"{title} ({num_reviews}명)", fontsize = 17, fontweight ="bold")
# 원형(pie) 그래프 그리기
ax.pie(values,
# 원형그래프에 표시할 라벨 지정
labels = labels,
# 원형 그래프에 표시할 값의 소숫점 자리수 지정
autopct = "%1.1f%%",
# 원형 그래프 각 영역의 색상 지정
colors=colors,
# 그림자 효과 지정하기
shadow = True,
# 그래프의 시작 위치를 12시 방향으로
startangle = 90)
plt.savefig("./img/긍정_부정_원형그래프_시각화.png")
plt.show()
그에 따른 결과물.
원형그래프 세팅시 가장 많은 리뷰수가 핑크색을 갖도록 세팅했으니 주의하도록 하자. 제일높은게 핑크색으로 정해진것이 아니다.
KoNLPY를 이용하여 영화 리뷰 키워드로 워드 클라우드 만들어보기
환경변수설정 : 내 pc => 속성 => 고급시스템설정 => 환경변수 =>
위(사용자변수) 아래(시스템변수) // %JAVA_HOME% 및 %JAVA_HOME%\bin 확인.
<한글 형태소 분석 라이브러리 : KoNLPY>
Java 기반으로 만들어진 라이브러리로 JDK 설치 및 환경 설정 필요
환경변수 등록
JAVA_HOME : JDK 폴더까지
Path 수정 후 추가 : %JAVA_HOME%, %JAVA_HOME%\bin
PC 재부팅 후 설정 확인 : cmd 창 open. java 및 javac 입력 후 help 내용 나오면 성공.
<라이브러리 설치>
nltk 설치 : 영어 형태소 분석 라이브러리(KoNLPY의 상위 라이브러리)
pip install nltk
nltk 플러그인 추가 설치(다운로드 설치 방식) → 플러그인은 최초 한번만 설치하면,
추후 다른 가상환경에서도 적용 됨. → 다른 가상환경에서는 pip insntall nltk
라이브러리만 설치하면 됨.
python import nltk nltk.download() NLTK 창이 open됨 All Packages 탭 선택
=> punkt 더블클릭, stopwords 더블클릭 exit()
워드클라우드 라이브러리 설치
pip install wordcloud
Konlpy 설치 전에 파이썬에서 JAVA 라이브러리 인식을 위한 라이브러리 설치
pip install JPype1 pip install konlpy
jvm.py 파일 내에 별표시(*) 삭제하기
위치 : C:\Users\user\anaconda3\envs\gj_env_01\Lib\site-packages\konlpy
메모장으로 jvm.py 열기
folder_suffix[] 리스트 내의 별(*) 표시 찾아서 삭제 > 저장 > 닫기
해당하는것처럼 세팅을 해줘야한다.
파이썬에서는 영어로된 형태소만 분리되는 라이브러리가 존재하기 때문에, 한글로 된 자료를 이용하려면 java기반으로 만들어진 konlpy를 이용해야하고, 이 분석기는 jpype를 이용해 파이썬이 이용할 수 있도록 도와줘야 하기 때문이다.
import pandas as pd
df_org = pd.read_csv("./data/df_new.csv")
df_org
다시 df_org라는 변수로 영화 데이터를 받아오도록 하자.
긍정 및 부정에 대해서만 각각 데이터 필터링하기
pos_reviews = df_org[df_org["label"] == 1]
neg_reviews = df_org[df_org["label"] == 0]
우리가 레이블을 이용하여 0과 1 그리고 2로 각각 점수를 나눴기 때문에, 1인경우의 긍정리뷰와 0인경우의 부정리뷰로 따로 필터링하여 담는다.
import re
pos_reviews.loc[ : , "comment"] = [re.sub(r"[^ㄱ-ㅣ가-힣+]", " ", data)
for data in pos_reviews["comment"]]
이제 정규식을 이용하여 한글이 아닌 이모티콘 또는 영어리뷰 등을 공백으로 변경해준다. (부정리뷰도 해준다.)
neg_reviews.loc[ : , "comment"] = [re.sub(r"[^ㄱ-ㅣ가-힣+]", " ", data)
for data in neg_reviews["comment"]]
import jpype
from konlpy.tag import Okt
이후 자바와 파이썬을 연결해주는 jpype와 konlpy.tag로부터 Okt를 임포트해준다.
Okt 의 경우는 대문자로 시작하는걸로봐서 클래스인걸 알아봐야한다.
즉, 선언을해주고 시작해야 사용이 가능하다.
okt = Okt()
pos_comment_nouns = []
for cmt in pos_reviews["comment"] :
# print(okt.nouns(cmt))
pos_comment_nouns.extend(okt.nouns(cmt))
긍정 리뷰 데이터에서 → 명사만 추출해보자. 이때 nouns를 이용한다.
명사만 담아 놓을 리스트 변수 선언하고, comment에 담아야하는데, append는 리스트 형태에 타입 자체를 추가하는 방식이므로 이때는 extend를 이용하여 리스트의 값만 추출하여 확장하여 추가하도록 하자.
neg_comment_nouns = []
for cmt in neg_reviews["comment"] :
# print(okt.nouns(cmt))
neg_comment_nouns.extend(okt.nouns(cmt))
(부정도 하도록 하자. 이 후부터는 긍정만 쓰도록 하겠다)
긍정 및 부정 리뷰 데이터에서 1글자는 모두 제외시키기
리뷰에서 한글자의 명사들은 원래의 뜻을 알아보기 어렵거나, 뜻이 없을 확률이 존재하기때문에 제외하도록 하자.
pos_comment_nouns2 = [data for data in pos_comment_nouns if len(data) > 1]
긍정 및 부정 명사들의 빈도 분석
# 리뷰 명사들에 대한 워드 카운트
from collections import Counter
카운트를 위해 임포트를 해준다.
pos_word_count = Counter(pos_comment_nouns2)
이렇게 처리해주고 나면 어떤 명사가 얼만큼 나왔는지를 확인할 수 있다.
긍정 및 부정 워드카운트 상위 20개 단어만 추출
Count() → 지원하는 함수 → 내림차순 함수 : most_common(20)
most_common(n)을 이용하여 필요한 숫자만큼 추출한다.
pos_top_20 = {}
for k, v in pos_word_count.most_common(20):
pos_top_20[k] = v
print(pos_top_20)
key, value의 형태로 zip 처럼 넣어준다.
긍정 및 부정 상위 20개 명사에 대한 빈도 시각화
우선 워드클라우드 식으로 표현해 보기전에 막대그래프로 먼저 해보도록 하자.
# 시각화 라이브러리
import matplotlib.pyplot as plt
# 폰트 설정 라이브러리
from matplotlib import font_manager, rc
# 폰트 설정
plt.rc("font", family="Malgun Gothic")
# 마이너스기호 설정
plt.rcParams["axes.unicode_minus"] = False
기본적인 임포트를 해준다.
# 긍정 막대 그래프를 이용한 빈도 시각화
plt.figure(figsize=(10,5))
### 제목 넣기
plt.title("긍정리뷰의 상위 (20개) 명사에 대한 빈도 시각화", fontsize=17)
for key, value in pos_top_20.items():
### 영화 라는 단어는 의미가 없으므로 제외
if key == "영화" :
continue
plt.bar(key, value, color="blue")
### x축과 y축 제목 넣기
plt.xlabel("리뷰 명사")
plt.ylabel("빈도(count)")
# x축 각도 조절
plt.xticks(rotation = 45)
###그래프 그리기
plt.show()
우리는 영화를 리뷰하는것이므로 key값이 영화와 같을경우는 제외하여 19가지를 표현했다.
아무래도 서울의 봄이 있다보니 역사 국민 전두환 등의 키워드가 나올 수 밖에 없는것같다..
이제 마지막으로 word cloud형으로 표현해보도록 하자.
긍정 및 부정 리뷰 단어 워드 클라우드(word cloud) 시각화
# 긍정 리뷰 단어 워드클라우드 시각화
plt.figure(figsize=(8,8))
# 그래프 제목
plt.title("[긍정]리뷰 단어 워드 클라우드 시각화")
# 사용할 폰트 파일 지정하기
font_path = "C:/Windows/Fonts/malgunsl.ttf"
# 워드클라우드 속성 설정
wc = WordCloud(
### 폰트 지정
font_path = font_path,
### 배경색 지정
background_color = "ivory",
### 그래프 너비
width = 800,
### 그래프 높이
height = 600
)
# 워드클라우드 그래프에 데이터 넣기
# - generate_from_frequencies() : 워드클라우드 이미지로 반환해줌.
# cloud = wc.generate_from_frequencies(pos_top_20)
# 긍정 전체 단어 넣어보기
cloud = wc.generate_from_frequencies(pos_word_count)
# 워드클라우드 이미지 보여주기
plt.imshow(cloud)
# x y 좌표 축 제외하기
plt.axis("off")
# 저장하기
plt.savefig("./img/긍정_리뷰_단어_워드클라우드_시각화.png")
# 표현
plt.show()
중간의 주석처리된 cloud = wc... 이부분을 주석처리를 해제하고 전체 단어라는 부분을 주석처리하면, 전체가아닌 top20을 볼 수 있는점 참고 부탁드린다.
또한 워드클라우드로 하더라도 x y축이 나오기때문에 깔끔한 처리를 위해 plt.axis("off") 해준다.
아주 만족스러운(?) 결과를 보며 마치도록 하겠다.
'개발일지 > 데이터 분석' 카테고리의 다른 글
시계열 데이터 관련 다시보기 (2) | 2024.01.16 |
---|---|
데이터 분석에서의 violin plot (2) | 2024.01.03 |
데이터분석 교통데이터 시각화 (4) | 2023.12.04 |
데이터분석 교통데이터 수집 및 가공(2) (0) | 2023.12.04 |
데이터분석 교통데이터 수집 및 가공(1) (7) | 2023.11.30 |