크롤링(crawling) | 시각화

[웹 크롤링(web crawling)] 영화데이터시각화 1(막대그래프)

멈머이 2023. 12. 4. 23:29
728x90

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()

728x90