728x90
반응형
In [1]:
import pandas as pd
In [12]:
file_path = "./data/movie_reviews.txt"
df_org = pd.read_csv(file_path, delimiter="\t",names =["title","score","comment","label"])
In [13]:
# 데이터 정보 확인 : 결측치 확인
df_org.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 4076 entries, 0 to 4075 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 title 4076 non-null object 1 score 4076 non-null int64 2 comment 4076 non-null object 3 label 4076 non-null int64 dtypes: int64(2), object(2) memory usage: 127.5+ KB
데이터 전처리¶
In [15]:
# 데이터
df_org
Out[15]:
title | score | comment | label | |
---|---|---|---|---|
0 | 서울의 봄 | 10 | 최고의 영화.. 지금 검찰 특수부 우두어너 윤두환이나 전두환 하나회나 똑같은 거... | 1 |
1 | 서울의 봄 | 10 | 이것이 한국의 역사.짦은 줄거리 요약하자면그땐 총칼이 대한민국을 장악했고.온갖비리와... | 1 |
2 | 서울의 봄 | 10 | 꼭 봐야 할 영화!!무능이 얼마나 무서운 일인지보여주는 영화!!영화 속 일은 현재도... | 1 |
3 | 서울의 봄 | 9 | 영화야 잘 만들었지.씁씁한 과거.빨리빨리 대한민국.용서도 왜그리 빨리하는지.아니지 ... | 1 |
4 | 서울의 봄 | 10 | 이건 묻고 따지지도 말고 그냥 봐야하는 영화!! | 1 |
... | ... | ... | ... | ... |
4071 | 싱글 인 서울 | 10 | 이상이배우 님 어떤모습으로 변신하실지 궁금합니다 화이팅 | 1 |
4072 | 싱글 인 서울 | 10 | 너무 기대됩니당!! 꺅⟩⟨ | 1 |
4073 | 싱글 인 서울 | 10 | 레드카펫 이후 신작 기다리다 목빠지는 줄 알았어요 기대합니다 | 1 |
4074 | 싱글 인 서울 | 10 | 꺅꺅 벌써부터 설레네욤 뿌잉 | 1 |
4075 | 싱글 인 서울 | 10 | 출연진들 완~~전 기대입니다 | 1 |
4076 rows × 4 columns
In [10]:
### 평점 (score) 현황 데이터 확인
df_org["score"].value_counts()
Out[10]:
score 10 2911 1 394 9 209 8 144 2 93 6 87 7 85 5 69 4 47 3 34 Name: count, dtype: int64
In [11]:
### 긍정 부정 현황 데이터 확인
df_org["label"].value_counts()
Out[11]:
label 1 3264 0 568 2 241 Name: count, dtype: int64
In [20]:
### 중복 데이터 확인하기
# keep=False : 중복된 모든 행 체크(중복이 있으면 True, 없으면 False)
df_org[df_org.duplicated(keep=False)==True]
Out[20]:
title | score | comment | label | |
---|---|---|---|---|
61 | 서울의 봄 | 10 | 최고 | 1 |
127 | 서울의 봄 | 10 | 최고입니다 | 1 |
192 | 서울의 봄 | 10 | 최고 | 1 |
220 | 서울의 봄 | 10 | 역사를 잊은 민족에게 미래는 없다 | 1 |
282 | 서울의 봄 | 10 | 재미있어요 | 1 |
... | ... | ... | ... | ... |
3844 | 뉴 노멀 | 10 | 정동원 가수님 뉴노멀 응원합니다 | 1 |
3877 | 뉴 노멀 | 10 | 정동원 뉴노멀 응원합니다 | 1 |
3884 | 뉴 노멀 | 10 | 정동원 뉴노멀 응원합니다 | 1 |
3908 | 뉴 노멀 | 10 | 정동원 뉴노멀 기대됩니다 | 1 |
3939 | 뉴 노멀 | 10 | 정동원 뉴노멀 응원합니다 | 1 |
64 rows × 4 columns
In [73]:
### 중복 된 것 중에 기존에 있는 하나는 남겨두고 중복된것은 40개다. 그러므로 64-40=24개는 남겨둬야하는 값
### 중복 데이터 추출하기
# 중복 중에 하나는 제외하고 나머지 중복만 추출
df_del=df_org[df_org.duplicated()==True]
len(df_org[df_org.duplicated()==True])
Out[73]:
40
In [26]:
# 중복 제거 하기
df_new= df_org.drop_duplicates()
len(df_new)
df_new.info()
<class 'pandas.core.frame.DataFrame'> Index: 4036 entries, 0 to 4075 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 title 4036 non-null object 1 score 4036 non-null int64 2 comment 4036 non-null object 3 label 4036 non-null int64 dtypes: int64(2), object(2) memory usage: 157.7+ KB
데이터 탐색하기¶
In [29]:
### 영화 제목만 추출하기
print (df_new["title"].unique())
print (df_new["title"].unique())
['서울의 봄' '그대들은 어떻게 살 것인가' '더 마블스' '프레디의 피자가게' '소년들' '30일' '톡 투 미' '헝거게임: 노래하는 새와 뱀의 발라드' '뉴 노멀' '싱글 인 서울']
In [31]:
# 영화 제목별 리뷰 갯수 현황
df_new["title"].value_counts()
Out[31]:
title 서울의 봄 2319 뉴 노멀 510 더 마블스 290 그대들은 어떻게 살 것인가 287 30일 221 소년들 179 싱글 인 서울 84 프레디의 피자가게 63 톡 투 미 46 헝거게임: 노래하는 새와 뱀의 발라드 37 Name: count, dtype: int64
In [40]:
# 영화별 평점 기초 통계 확인하기
# - 영화 제목 별 평점에 대한 그룹집계하기
movie_info= df_new.groupby("title")["score"].describe()
### 기초 통계 행단위 데이터 내림 차순 정렬하기
movie_info= movie_info.sort_values(by=["count"], axis=0, ascending=False)
movie_info
Out[40]:
count | mean | std | min | 25% | 50% | 75% | max | |
---|---|---|---|---|---|---|---|---|
title | ||||||||
서울의 봄 | 2319.0 | 9.464856 | 1.818191 | 1.0 | 10.0 | 10.0 | 10.0 | 10.0 |
뉴 노멀 | 510.0 | 9.482353 | 1.845369 | 1.0 | 10.0 | 10.0 | 10.0 | 10.0 |
더 마블스 | 290.0 | 3.772414 | 3.538703 | 1.0 | 1.0 | 2.0 | 6.0 | 10.0 |
그대들은 어떻게 살 것인가 | 287.0 | 5.397213 | 3.761564 | 1.0 | 1.0 | 6.0 | 10.0 | 10.0 |
30일 | 221.0 | 6.778281 | 3.520160 | 1.0 | 4.0 | 8.0 | 10.0 | 10.0 |
소년들 | 179.0 | 8.134078 | 2.843070 | 1.0 | 8.0 | 10.0 | 10.0 | 10.0 |
싱글 인 서울 | 84.0 | 8.273810 | 2.942629 | 1.0 | 8.0 | 10.0 | 10.0 | 10.0 |
프레디의 피자가게 | 63.0 | 7.015873 | 3.240331 | 1.0 | 5.0 | 8.0 | 10.0 | 10.0 |
톡 투 미 | 46.0 | 7.217391 | 2.811983 | 1.0 | 6.0 | 8.0 | 10.0 | 10.0 |
헝거게임: 노래하는 새와 뱀의 발라드 | 37.0 | 6.729730 | 3.141555 | 1.0 | 6.0 | 7.0 | 10.0 | 10.0 |
데이터 시각화¶
In [42]:
### 시각화 라이브러리
import matplotlib.pyplot as plt
# 폰트 설정라이브러리
from matplotlib import font_manager, rc
In [44]:
### 한글 폰트 설정
plt.rc("font", family="malgun Gothic")
### 마이너스 기호 설정
plt.rcParams["axes.unicode_minus"] = False
영화별 평점평균 시각화¶
In [45]:
"""
- 영화별 평점 평균이 가장 큰 영화는 orange 색으로, 나머지는 lightgrey 색으로 표현
"""
Out[45]:
'\n- 영화별 평점 평균이 가장 큰 영화는 orange 색으로, 나머지는 lightgrey색으로 표현\n'
In [46]:
### 평점 평균 계산을 위해 사용
import numpy as np
In [60]:
### 영화제목을 리스트 타입으로 받아오기 array가 붙어있는 건 numpy 배열
"""
- array(): 넘파이(numpy)에서 사용하는 배열(파이썬 리스트와 동일)
:단 ,하나의 타입만 저장 가능합니다. 숫자면 숫자, 문자면 문자
: 이외 사용법은 파이썬의 리스트와 동일
"""
# unique() : numpy의 배열 타입으로 반환함
# toList() : 파이썬의 리스트 타입으로 반환하는 함수
movie_title= df_new["title"].unique().tolist()
# movie_title
### 영화별 평점 평균 추출하기
# 평점 평균값을 저장할 딕셔너리 변수 선언
avg_score={}
for m_title in movie_title:
### 평점 평균 계산하여 딕셔너리에 넣기
avg= df_new[df_new["title"]==m_title]["score"].mean()
# print(f"평점평균 : {avg}")
### 딕셔너리 에 담기
# key는 제목, value = 평점평균값
avg_score[m_title]= avg
print(f"딕셔너리 최종 값: {avg_score}")
딕셔너리 최종 값: {'서울의 봄': 9.464855541181544, '그대들은 어떻게 살 것인가': 5.397212543554007, '더 마블스': 3.7724137931034485, '프레디의 피자가게': 7.015873015873016, '소년들': 8.134078212290502, '30일': 6.778280542986425, '톡 투 미': 7.217391304347826, '헝거게임: 노래하는 새와 뱀의 발라드': 6.72972972972973, '뉴 노멀': 9.48235294117647, '싱글 인 서울': 8.273809523809524}
In [117]:
### 영화별 평점평균 시각화
# 그래프 너비와 높이지정
plt.figure(figsize=(20,12))
# 그래프 제목
plt.title("영화별 평점 평균", fontsize=27, fontweight="bold")
### 각 영화별 평점 평균 막대그래프 그리기
for k,v in avg_score.items():
### 컬러값 지정하기
# array_srt(): 문자열로 반환하는 함수
# where() : 파이썬에서 if 문과 동일한 조건문
# where (조건, 참 , 거짓) : 조건이 참이면 첫번째 값, 거짓이면 두번째 값 처리
color = np.array_str(np.where(v==max(avg_score.values()),"orange","lightgray"))
# print(color)
# 막대 그래프 그리기
plt.bar(k,v,color = color)
## 막대 그래프 상단에 평점평균 텍스트 표시하기
plt.text(k,v, "%.2f"%v, horizontalalignment="center", verticalalignment="bottom", fontweight="bold")
### x축과 y축 제목 넣기
plt.xlabel("영화 제목", fontweight="bold")
plt.ylabel("평점평균" , fontweight="bold")
# x축의 값 각도 조절하기
plt.xticks(rotation=20)
### 그래프를 이미지로 저장시키기
# savefig() 함수는 plt.show() 전에 수행되어야 합니다.
plt.savefig("./img/영화별 평점 평균 막대그래프.png")
plt.show()
점 (분포) 그래프 그리기¶
In [142]:
### 각 영화별 평점 분포도 그리기
# 하나의 그래프에 여러개를 넣겠다. 서브플렛
# - 하나의 큰 그래프 안에 10개의 그래프를 넣어서 표현
# - 이를 subplot 라고 칭합니다.
# -5행 2열의 subplot 생성하여 구현하기
# subplots(행갯수, 열갯수,전체 그래프 크기)
# fig : 큰그래프 정보
# axs : 5행 2열의 내부 그래프 공간 정보
fig, axs = plt.subplots(5,2, figsize=(15,25))
### 여러개의 그래프를 for 문을이용해서 표현하고자 할때 아래 먼저 수행
# flattren() :틀 정렬하기: 5행2열의 틀을 정렬해 놓기
axs = axs.flatten()
### 각 그래프를 행렬 공간의 subplot에 넣기
for title, avg, ax in zip(avg_score.keys(), avg_score.values(), axs):
# print(title, avg, ax)
### x축에는 영화 리뷰 갯수, y축에는 평점평균
### 리뷰 갯수 추출하기
num_reviews= len(df_new[df_new["title"]==title])
# arange(num) : 0부터 num까지 값을 순차적으로 만들기
x = np.arange(num_reviews) # 0부터 len까지 x 축 길이
# print(f"x------->{x}")
### y 축에는 평점 추가
y=df_new[df_new["title"]==title]["score"]
# print(f"y-----{y}")
# x 축과 y축은 범주형 데이터다.
### 각 그래프에 제목 넣기
subtitle=f"{title} ({num_reviews}명)"
ax.set_title(subtitle, fontsize=15, fontweight="bold")
### 점 그래프 기르기
# - "o" : 점으로 표현하는 마커 기호
ax.plot(x,y,"o")
### 각 영화별 평점평균을 빨강석 점선으로 표시하기
# - 각 영화별 평점 평균을 빨강색 점선으로 표시하기
# axhline(): 각 subplot 공간에 수평선 그리기
ax.axhline(avg, color="red" , linestyle="--")
plt.savefig("./img/영화별 평점 평균 분포도.png")
plt.show()
# 공공데이터에서 다운 받기, 웹크롤링, 데이터 처리 시각화
# 내일은 원 그래프, 워드 클라우드
In [ ]:
728x90
반응형
'파이썬' 카테고리의 다른 글
워드클라우드_시각화 (3) | 2023.12.05 |
---|---|
원형 그래프 그리기 (1) | 2023.12.05 |
영화 데이터 수집 웹 크롤링 (2) | 2023.12.04 |
버스교통카드 데이터 전처리 시각화해봅시다 (2) | 2023.11.30 |
전체파일 통합하기 (1) | 2023.11.30 |