[웹 크롤링(web crawling)] 영화데이터시각화 1(막대그래프)
https://coding-heading.tistory.com/69
[크롤링(crawling)] 영화데이터수집
크롤링(crawling) 웹상에 존재하는 데이터들을 수집하는 작업 (프로그래밍으로 자동화) 웹 페이지의 html 코드를 가져와서, HTML/CSS 등을 필요한 데이터만 추출하는 기법 Open API(Rest API)를 제공하는 서
coding-heading.tistory.com
위 글부터 이어집니다.
# - 행렬데이터 처리 라이브러리
import pandas as pd
1. 외부파일 읽어 들이기
file_path = "./data/movie_reviews.txt"
df_org = pd.read_csv(file_path, delimiter="\t", names=["title", "score", "comment", "label"])
#구분자 알려주기
df_org
2. 데이터 전처리
### 평점(score) 현황 데이터 확인
df_org["score"].value_counts()
### 긍정 / 부정 현화 데이터 확인
df_org["label"].value_counts()
- 긍정 : 평점이 8 이상인 경우로, 긍정값은 => 1
- 부정 : 평점이 4 이하인 경우로 , 부정값은 => 0
- 기타 : 나머지, 기타 값은 => 2
* 중복데이터 확인부터 삭제과
### 중복데이터 확인하기
df_org[df_org.duplicated(keep=False) == True]
결과 : 64 rows × 4 columns
- keep=False : 중복된 모든 행 체크(중복이 있으면 True, 없으면 False)
### 중복 데이터 중 삭제할 데이터 추출하기
df_del = df_org[df_org.duplicated() == True]
len(df_org[df_org.duplicated() == True])
결과 : 41
- 중복 중에 하나는 제외하고 나머지 중복만 추출
### 중복 데이터 삭제하기
df_new = df_org.drop_duplicates()
len(df_new)
df_new.info()
처음 파일을 읽어 들일 때 개수 : 4126개
제거된 중복 데이터 수 : 41개
최종 남은 데이터 수 : 4085개
3. 데이터 탐색하기
### 영화 제목만 추출하기
df_new["title"].unique()
결과 :
array(['서울의 봄', '그대들은 어떻게 살 것인가', '더 마블스', '프레디의 피자가게', '소년들', '30일', '톡 투 미', '헝거게임: 노래하는 새와 뱀의 발라드', '뉴 노멀', '싱글 인 서울'], dtype=object)
### 영화 제목별 리뷰갯수 현황 확인하기
df_new["title"].value_counts()
결과 :
title
서울의 봄 2317
뉴 노멀 510
더 마블스 290
그대들은 어떻게 살 것인가 287
30일 220
소년들 179
싱글 인 서울 84
프레디의 피자가게 63
톡 투 미 46
헝거게임: 노래하는 새와 뱀의 발라드 37
Name: count, dtype: int64
### 각 영화별 평점 기초통계 확인하기
# - 영화제목별 평점에 대한 그룹집계하기
movie_info = df_new.groupby("title")["score"].describe()
# - 기초통계 행단위 데이터 내림차순 정렬하기
movie_info = movie_info.sort_values(by=["count"], axis=0, ascending=False)
movie_info
4. 데이터 시각화
### 시각화 라이브러리
import matplotlib.pyplot as plt
### 폰트 설정 라이브러리
from matplotlib import font_manager, rc
### 한글폰트 설정
plt.rc("font", family="Malgun Gothic")
### 마이너스 기호설정
plt.rcParams["axes.unicode_minus"] = False
### 평점 평균 계산을 위해 사용
import numpy as np
4-1 영화별 평균점수 시각화
- 영화별 평점 평균이 가장 큰 영화는 orange색으로, 나머지는 light gray 색으로 표현하기.
### 영화제목을 리스트 타입으로 받아오기
### unique() : numpy의 배열 타입으로 변환한
### tolist() : 파이썬의 리스트 타입으로 변환하는 함수
# array와 list 차이점 => 메모리구조는 같지만 형태가 달라 크기가 다르다.
movie_title = df_new["title"].unique().tolist()
#movie_title
### 영화별 평점 평균 추출하기
# - 평점평균값을 저장할 딕셔너리 변수 선언 key = 영화제목 value = 평점평균
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.464393612429866, '그대들은 어떻게 살 것인가': 5.397212543554007, '더 마블스': 3.7724137931034485, '프레디의 피자가게': 7.015873015873016, '소년들': 8.134078212290502, '30일': 6.786363636363636, '톡 투 미': 7.217391304347826, '헝거게임: 노래하는 새와 뱀의 발라드': 6.72972972972973, '뉴 노멀': 9.48235294117647, '싱글 인 서울': 8.273809523809524}
- array() : 넘파이(numpy)에서 사용하는 배열(파이썬의 리스트와 동일)
: 단, 하나의 타입만 저장가능. 이외 사용법은 파이썬의 리스트와 동일
4-2 영화별 평점평균 시각화
- 막대그래프 그리기
# - 그래프 너비와 높이 지정
plt.figure(figsize=(10,5))
# - 그래프 재목
plt.title("영화별 평점 평균", fontsize=17, fontweight="bold")
### 각 영화별 평점 평균 막대그래프 그리기
for k,v in avg_score.items():
### 컬러값지정하기
# - array_str() : 문자열로 변환하는 함수
# - where() : 파이썬에서 if문과 동일한 조건문
# - where(조건, 참, 거짓) : 조건이 참이면 첫번째 값, 거짓이면 두번쨰 값 처리
color = np.array_str(np.where(v==max(avg_score.values()), "orange", "lightgrey"))
#print(color)
### 막대 그래프 그리기
plt.bar(k, v, color=color)
### 막대 그래프 상단에 평점평균 텍스트 표시하기
plt.text(k, v, "%.2f"%v, horizontalalignment="center", verticalalignment="bottom")
### x축 y축 제목넣기
plt.xlabel("영화제목", fontweight="bold")
plt.ylabel("평점평균", fontweight="bold")
### x축 값 각도 조적하기
plt.xticks(rotation = 75)
### 그래프를 이미지로 저장시키기
# - savefig() : plt.show()전에 수행되어야 한다.
plt.savefig("./img/영화별 평점 평균 막대그래프.png")
plt.show()