이전 내용과 이어집니다.
이전 내용이 궁금하시다면 클릭 해주세요~!
긍정 / 부정 / 기타에 대한 원형그래프
비율이 가장 높은 경우 : pink , 두번째 : gold , 세번째 : whitesmoke 로 표현
subplot 사용
fig, axs = plt.subplots(5,2,figsize = (15,25))
axs = axs.flatten()
# 빈도 비율별 색상 정의
colors = ["pink","gold","whitesmoke"]
# 라벨 정의
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])
# label 컬럼의 범주별로 개수 필터링하기
values = df_new[df_new["title"] == title]["label"].value_counts()
# 원형그래프에 표시할 라벨값 정의하기
# 영화별로 긍정 또는 부정 또는 기타중에 하나라도 없으면 처리가 필요함
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 = 15)
# 원형 그래프(pie) 그리기
ax.pie(values,
# 원형 그래프에 표시할 라벨 지정
labels = labels,
# 원형 그래프에 표시할 값의 소숫점 자리수 지정
autopct = "%1.1f%%",
# 원형 그래프 각 영역의 색상 지정
colors = colors,
# 그림자 효과 지정하기
shadow = True,
# 그래프의 시작위치 12시 방향으로 설정
startangle = 90)
# 이미지 저장하기
plt.savefig("./img/긍정_부정_원형그래프_시각화.png")
plt.show()
▶ 보통 원형그래프의 시작점이 12시 방향인것이 가독성이 좋다.
개선점 : 비율이 큰 순서대로 pink , gold , whitesmoke 색이 지정되고 있음.
이를 긍정 / 부정 / 기타 각각에 맞춰 지정할 수 있도록 코딩이 필요함
데이터 파일로 저장하기
### 최종 전처리된 데이터는 파일로 관리하기
# 파일명 : df_new.csv , 인덱스는 포함하지 않기
# 저장 위치 : data 폴더
save_path = "./data/df_new.csv"
df_new.to_csv(save_path,index = False)
워드 클라우드 시각화 환경 구축
[KoNLPY 라이브러리 설치]
<한글 형태소 분석 라이브러리 : >
- Java 기반으로 만들어진 라이브러리로 JDK 설치 및 환경 설정 필요
① 환경변수 등록
* JAVA_HOME : JDK 설치 폴더까지
* Path 수정 후 두 개 추가 : %JAVA_HOME%, %JAVA_HOME%\bin
- PC 재부팅 후 설정 확인 : command 창 open 후 java , javac 입력 후 help 내용 나오면 성공
시스템 > 정보 > 고급 시스템설정 > 환경변수
나의 경우에는 path에 open jdk만 있어서 시스템변수에 JAVA_HOME 변수를 생성해줬다.
값은 open jdk의 위치를 bin 제외하고 넣었다.
시스템 변수의 path 를 누르고 편집을 누른뒤에 아래와 같은 화면이 나오면 새로만들기를 통해
%JAVA_HOME% 과 %JAVA_HOME%₩bin 을 새로 만들어준다.
② nltk 설치
- nltk 설치 : 영어 형태소 분석 라이브러리(KoNLPY의 상위 라이브러리)
* pip install nltk
- nltk 플러그인 추가 설치(다운로드 설치방식)
> python
> import nltk
> nltk.download()
> NLTK 창이 Open 됨
> All Packages 탭 선택 > punkt 더블클릭 , stopwords 더블클릭 ( 마우스로 위아래 넘기면 다른것이 install될 수 있음)
> exit()
③ 워드 클라우드 라이브러리 설치
> pip install wordcloud
④ KoNLPY 설치 전에 파이썬에서 JAVA 라이브러리 인식을 위한 라이브러리 설치
> pip install JPype1
⑤ KoNLPY 설치
> pip install konlpy
⑥ jvm.py 파일 내에 별표시(*) 삭제하기
위치 : C:\Users\user\anaconda3\envs\gj_env_01\Lib\site-packages\konlpy
메모장으로 jvm.py 열기
folder_suffix[] 리스트 내에 별(*) 표시 찾아서 삭제 > 저장 > 닫기
from konlpy.tag import Okt
okt = Okt()
okt.nouns("안녕 하세요~ 파이썬 입니다. 안녕")
['안녕', '파이썬', '안녕']
▶ 가상환경에 kolnpy 를 설치했으나 import 했을때 오류가 발생하여 base(Python3) 에서 실행하니 잘 작동하는 것을 확인할 수 있었다.
영화 긍정/부정 리뷰데이터 빈도분석 및 워드클라우드 시각화
① 라이브러리 정의 및 데이터셋 읽어들이기
import pandas as pd
df_org = pd.read_csv("./data/df_new.csv")
② 긍정 및 부정에 대해서만 각각 데이터 필터링 하기
# 긍정 리뷰 데이터 필터링
# 데이터 프레임 변수명 : pos_reviews
pos_reviews = df_org[df_org["label"] == 1]
pos_reviews
▶ 긍정값인 label = 1 인 데이터 3224개가 출력되는것을 확인할 수 있다.
# 부정 리뷰 데이터 필터링
# 데이터 프레임 변수명 : neg_reviews
neg_reviews = df_org[df_org["label"] == 0]
neg_reviews
▶ 부정값인 label = 0 인 데이터 568개가 출력되는것을 확인할 수 있다.
③ 리뷰 데이터 전처리
긍정 및 부정 리뷰 데이터에서 한글 이외 모두 제거하기
정규표현식 라이브러리 활용
import re
pos_reviews.loc[:,"comment"] = [re.sub(r"[^ㄱ-ㅣ가-힣+]"," ",data) for data in pos_reviews["comment"]]
pos_reviews
▶ sub(정규표현식 , 정규식에 맞지 않을 때 대체 값 , 데이터) : 정규식에 맞지 않으면 " "로 대체한 데이터를 뽑아냄.
대괄호 안 ^ 표시는 부정의 의미
부정 데이터도 동일하게 진행함.
④ 긍정 및 부정 리뷰 형태소 추출하기
# 형태소 분석 라이브러리
# jpype : java 라이브러리를 python에서 사용할 수 있도록 도와주는 라이브러리
# konlpy 는 java로 만들어진 라이브러리
import jpype
# Okt(Open Korean Text) : 한국어 형태소 분석 라이브러리(형태소 분석기)
from konlpy.tag import Okt
# 형태소 분석기 객체 생성하기
okt = Okt()
# 긍정 리뷰 데이터에서 명사 추출하기
# 명사만 담아 놓을 리스트 변수 선언
pos_comment_nouns = []
# 한 행씩 명사만 있는 리스트가 만들어짐
for cnt in pos_reviews["comment"] :
pos_comment_nouns.extend(okt.nouns(cnt))
▶ 하나의 리스트형태로 모든 명사를 담기 위해 extend 사용
부정도 동일하게 진행
⑤ 긍정 및 부정 리뷰 데이터에서 1글자는 모두 제외시키기
보통 1글자의 단어는 의미를 갖지 않는 경우가 많으므로 제외시킨다.
inline for문을 사용하여 pos_comment_nouns2에 1글자를 제외한 모든 긍정 리뷰 단어들을 리스트에 넣어준다.
# 긍정 리뷰 명사 데이터에서 1글자 모두 제외하기
pos_comment_nouns2 = [n for n in pos_comment_nouns if len(n) > 1]
부정도 동일하게 진행
⑥ 긍정 및 부정 명사들의 빈도 분석
# 긍정 리뷰 명사들에 대한 위드카운트 라이브러리
from collections import Counter
# 긍정 명사 위드카운트 처리
pos_word_count = Counter(pos_comment_nouns2)
print(pos_word_count)
▶ 딕셔너리형태로 단어와 그 단어의 빈도수를 확인할 수 있다.
부정도 동일하게 진행
⑦ 긍정 및 부정 워드카운트 상위 20개 단어만 추출
pos_top_20 = pos_word_count.most_common(20)
pos_top_20
▶ most_common(개수) : Count() 지원함수로 내림차순하여 정렬한 뒤 개수만큼 상위의 데이터를 출력하는 함수이다.
리스트안에 튜플형태로 출력되는 것을 확인할 수 있다.
이를 딕셔너리 형태로 만들기 위해 for문 또는 inline for문을 사용할 수 있다.
# 1
pos_top_20 = {}
for k,v in pos_word_count.most_common(20):
pos_top_20[k] = v
#2
pos_top_20 = {k : v for k,v in pos_word_count.most_common(20)}
print(pos_top_20)
부정도 동일하게 진행
⑧ 긍정 및 부정 상위 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 = "lightgrey")
# x축과 y축 제목 넣기
plt.xlabel("리뷰 명사")
plt.ylabel("빈도(count)")
# x축 각도 조절
plt.xticks(rotation = 70)
plt.show()
▶ 상위 20개의 단어 중 '영화' 단어는 데이터 분석에 의미가 없을 것으로 여겨지므로 제외하고 그래프 생성하였다.
그래프에서 if문을 통해 영화 데이터를 제외해도 되지만 이전에 데이터를 20개 추출할때 제외하는 것이 더 나을 것같다.
동일한 방식으로 부정리뷰에 대해서도 진행하였다.
⑨ 긍정 및 부정 리뷰 단어 워드클라우드(wordcloud) 시각화
### 워드 클라우드 라이브러리
from wordcloud import WordCloud
# 긍정 리뷰 단어 워드클라우드 시각화
plt.figure(figsize=(8,8))
# 그래프 제목
plt.title("긍정 리뷰 단어 워드클라우드 시각화")
# 사용할 폰트 파일 지정하기
font_path = "C:/Windows/Fonts/malgunsl.ttf"
# 워드클라우드 그래프 속성 설정
wc = WordCloud(
# 폰트 지정
font_path=font_path,
# 배경색 지정
background_color = "white",
# 그래프 너비
width = 800,
# 그래프 높이
height = 600)
# 워드클라우드 그래프에 데이터 넣기
# generate_from_frequencies() : 워드클라우드 이미지로 반환해줌
cloud = wc.generate_from_frequencies(pos_top_20)
# 워드클라우드 이미지 보여주기
plt.imshow(cloud)
plt.show()
위의 경우에는 x축과 y축이 나왔는데 이를 없애려면
plt.axis("off") 를 적어준다.
위와 동일한 방식으로 x축과 y축을 없앤 부정리뷰 워드클라우드 이다.
'DB' 카테고리의 다른 글
데이터 프레임 pandas , plotly 구문 (0) | 2023.12.11 |
---|---|
데이터 프레임 - 합치기 / 결측치 / 중복 / 이상치 처리 (2) | 2023.12.05 |
[웹크롤링] - 다음 영화 사이트 웹크롤링 (8) | 2023.12.04 |
[데이터실습](2)데이터 전처리/시각화(matplotlib/pyplot/seaborn) (3) | 2023.11.30 |
MVC 는 무엇인가? ORM은 무엇인가? (2) | 2023.11.29 |