J o e
JoE's StOrY
J o e
  • 분류 전체보기 (206)
    • workSpace (184)
      • 도메인 지식 (2)
      • ALGORITHM (39)
      • ANDROID (3)
      • JS (0)
      • JAVA (21)
      • MYSQL (6)
      • NETWORK (3)
      • PYTHON (91)
      • LINUX (9)
      • PROJECT (4)
    • Others (20)
      • Opic (1)
      • myLife (17)
      • popSong (1)
      • 정보처리기사 (1)
    • 훈빠의 특강 (0)
      • opencv (0)
      • python (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • The code with long statements is⋯
  • 매일 매일이 행복하고 밝은 날이 될거에요

인기 글

태그

  • How to create a GUI in Java with JFrame?
  • linearclassification
  • 파이썬
  • Fully Connected Network
  • full loss
  • sort_index
  • 태블릿 연동
  • numpy
  • sort_value
  • 단어의 개수
  • ㅖ43
  • Python
  • 이미지 연산
  • dao
  • DTO
  • java
  • MySQL
  • 넘파이 문제
  • 넘파이함수
  • read_html

최근 댓글

최근 글

티스토리

J o e

WHY?

[Pandas] 판다스 기초 상식 정리 및 함수 응용 3 - 네이버 영화 평점 분석
workSpace/PYTHON

[Pandas] 판다스 기초 상식 정리 및 함수 응용 3 - 네이버 영화 평점 분석

2021. 1. 14. 08:28
pandas_ws4

네이버 영화 평점 분석¶

In [1]:
from bs4 import BeautifulSoup
from urllib.request import urlopen
import urllib
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import matplotlib.pyplot as plt
import seaborn as sns

import warnings
warnings.filterwarnings('ignore')
In [2]:
# plot 시 한글이 깨지는 현상 방지!

import platform

from matplotlib import font_manager, rc
plt.rcParams['axes.unicode_minus'] = False

if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    path = "c:/Windows/Fonts/malgun.ttf"
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc('font', family=font_name)
else:
    print('Unknown system!!') 
2019년 의 영화 평점 데이터를 가져옵니다.¶
In [3]:
csv = pd.read_csv('../data/2019년 네이버 영화 평점 리스트.csv')
movie = DataFrame(csv)
movie
Out[3]:
date name point
0 2019-01-01 보헤미안 랩소디 9.49
1 2019-01-01 헌터 킬러 9.43
2 2019-01-01 폴란드로 간 아이들 9.42
3 2019-01-01 트루먼 쇼 9.32
4 2019-01-01 점박이 한반도의 공룡2 : 새로운 낙원 9.24
... ... ... ...
16006 2019-12-31 대통령의 7시간 6.18
16007 2019-12-31 쥬만지: 넥스트 레벨 6.13
16008 2019-12-31 백두산 5.93
16009 2019-12-31 아내를 죽였다 5.18
16010 2019-12-31 캣츠 4.69

16011 rows × 3 columns

html 크롤링 (시간 많이 걸려서 csv파일로 대체)¶

In [4]:
# import time

# date = pd.date_range('20190101', periods=31, freq='D')
# # pd로 읽어와서 파일 불러와서 크롤링해도된다.
# movie_date = []
# movie_name = []
# movie_point = []

# for today in date:
#     html = "http://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=cur&date={date}"
#     response = urlopen(html.format(date=
#                                    urllib.parse.quote(today.strftime('%Y%m%d'))))
#     soup = BeautifulSoup(response, "html.parser")
    
#     end = len(soup.find_all('td', 'point'))
    
#     movie_date.extend([today for n in range(0, end)])
#     movie_name.extend([soup.find_all('div', 'tit5')[n].a.string for n in range(0, end)])
#     movie_point.extend([soup.find_all('td', 'point')[n].string for n in range(0, end)])
#     time.sleep(1)
In [5]:
# len(movie_date), len(movie_name), len(movie_point)
In [6]:
# # 수집된 데이터 건수 확인
# len(movie_date), len(movie_name), len(movie_point)
In [7]:
# movie = pd.DataFrame({'date':movie_date, 
#                       'name':movie_name, 
#                       'point':movie_point})
# movie.head()
In [8]:
movie.head()
Out[8]:
date name point
0 2019-01-01 보헤미안 랩소디 9.49
1 2019-01-01 헌터 킬러 9.43
2 2019-01-01 폴란드로 간 아이들 9.42
3 2019-01-01 트루먼 쇼 9.32
4 2019-01-01 점박이 한반도의 공룡2 : 새로운 낙원 9.24
In [9]:
# 인터넷의 문제로 미리 수집된 데이터를 이용합니다.
# 2019년 네이버 영화 평점 리스트(2019년 네이버 영화 평점 리스트.csv 파일이용)를 movie 변수로 불러옵니다.

movie.head()
Out[9]:
date name point
0 2019-01-01 보헤미안 랩소디 9.49
1 2019-01-01 헌터 킬러 9.43
2 2019-01-01 폴란드로 간 아이들 9.42
3 2019-01-01 트루먼 쇼 9.32
4 2019-01-01 점박이 한반도의 공룡2 : 새로운 낙원 9.24
In [10]:
# 데이터 프레임의 컬럼 정보를 확인합니다.
movie.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 16011 entries, 0 to 16010
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   date    16011 non-null  object 
 1   name    16011 non-null  object 
 2   point   16011 non-null  float64
dtypes: float64(1), object(2)
memory usage: 375.4+ KB
In [11]:
# date 컬럼을 datetime 타입으로 변경합니다.
movie['date']= pd.to_datetime(movie['date'])
movie.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 16011 entries, 0 to 16010
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   date    16011 non-null  datetime64[ns]
 1   name    16011 non-null  object        
 2   point   16011 non-null  float64       
dtypes: datetime64[ns](1), float64(1), object(1)
memory usage: 375.4+ KB
In [12]:
movie
Out[12]:
date name point
0 2019-01-01 보헤미안 랩소디 9.49
1 2019-01-01 헌터 킬러 9.43
2 2019-01-01 폴란드로 간 아이들 9.42
3 2019-01-01 트루먼 쇼 9.32
4 2019-01-01 점박이 한반도의 공룡2 : 새로운 낙원 9.24
... ... ... ...
16006 2019-12-31 대통령의 7시간 6.18
16007 2019-12-31 쥬만지: 넥스트 레벨 6.13
16008 2019-12-31 백두산 5.93
16009 2019-12-31 아내를 죽였다 5.18
16010 2019-12-31 캣츠 4.69

16011 rows × 3 columns

In [13]:
# 영화별 평점 평균을 계산합니다.
movie.pivot_table(index='name')
Out[13]:
point
name
0.0MHz 5.604231
1919 유관순 8.449024
28일 후 7.906774
47미터 2 7.244756
4월 이야기 8.190000
... ...
호텔 뭄바이 9.318500
홀리 모터스 7.560294
황혼에서 새벽까지 8.080385
히트 9.100000
힘을 내요, 미스터 리 7.601077

494 rows × 1 columns

In [14]:
movie.groupby(['name']).agg('mean')
Out[14]:
point
name
0.0MHz 5.604231
1919 유관순 8.449024
28일 후 7.906774
47미터 2 7.244756
4월 이야기 8.190000
... ...
호텔 뭄바이 9.318500
홀리 모터스 7.560294
황혼에서 새벽까지 8.080385
히트 9.100000
힘을 내요, 미스터 리 7.601077

494 rows × 1 columns

In [15]:
# 평균 평점이 높은 10개 영화를 시각화합니다.
movie.pivot_table(index=['name']).sort_values(['point'],ascending=False).head(10)
Out[15]:
point
name
그린 북 9.627650
가버나움 9.595488
포드 V 페라리 9.576667
베일리 어게인 9.545778
사랑의 선물 9.530588
주전장 9.513767
원더 9.450000
안녕 베일리 9.447805
보헤미안 랩소디 9.442478
당갈 9.438000
In [16]:
# 평균 평점이 낮은 10개 영화를 시각화합니다.
movie.pivot_table(index=['name']).sort_values(['point'],ascending=True).head(10)
Out[16]:
point
name
킹 오브 프리즘 -샤이니 세븐 스타즈- 2.008889
행동하는 양심 김대중 3.044444
얼굴없는 보스 3.437000
나랏말싸미 3.534694
자전차왕 엄복동 4.047692
극장판 엉덩이 탐정: 화려한 사건 수첩 4.149535
천안함 프로젝트 4.330000
시선 4.340000
봉신연의: 영웅의 귀환 4.866000
우상 4.866667
In [17]:
movie.pivot_table(index='name',values='point',aggfunc='count')
Out[17]:
point
name
0.0MHz 26
1919 유관순 82
28일 후 31
47미터 2 82
4월 이야기 19
... ...
호텔 뭄바이 40
홀리 모터스 34
황혼에서 새벽까지 26
히트 1
힘을 내요, 미스터 리 65

494 rows × 1 columns

In [18]:
# 영화별 평점 건수(리뷰 요일)를 계산합니다.
movie.groupby(['name'])['point'].agg(['count'])
Out[18]:
count
name
0.0MHz 26
1919 유관순 82
28일 후 31
47미터 2 82
4월 이야기 19
... ...
호텔 뭄바이 40
홀리 모터스 34
황혼에서 새벽까지 26
히트 1
힘을 내요, 미스터 리 65

494 rows × 1 columns

In [19]:
# 평점 건수(리뷰 요일)가 높은 10개 영화를 시각화합니다.
movie.pivot_table(index='name', values='date', aggfunc='count').sort_values('date',ascending=False).head(10)
Out[19]:
date
name
교회오빠 226
기생충 214
그린 북 183
인생 후르츠 172
가버나움 164
일일시호일 156
알라딘 153
주전장 146
극한직업 131
폴란드로 간 아이들 130
In [20]:
# 평점 건수(리뷰 요일)가 낮은 10개 영화를 시각화합니다.
movie.pivot_table(index='name', values='date', aggfunc='count').sort_values('date',ascending=True).head(10)
Out[20]:
date
name
나쁜 나라 1
라스베가스를 떠나며 1
명탐정 코난 : 제로의 집행인 1
그때 그사람들 1
수상한 그녀 1
리즈와 파랑새 1
분노의 질주: 언리미티드 1
인천상륙작전 1
럭키 1
천장지구 1
In [21]:
# 평균 평점이 높은 순서대로 영화 정보를 추출합니다.
tmp = movie.pivot_table(index='name').sort_values('point',ascending=False).index
tmp
Out[21]:
Index(['그린 북', '가버나움', '포드 V 페라리', '베일리 어게인', '사랑의 선물', '주전장', '원더', '안녕 베일리',
       '보헤미안 랩소디', '당갈',
       ...
       '우상', '봉신연의: 영웅의 귀환', '시선', '천안함 프로젝트', '극장판 엉덩이 탐정: 화려한 사건 수첩',
       '자전차왕 엄복동', '나랏말싸미', '얼굴없는 보스', '행동하는 양심 김대중', '킹 오브 프리즘 -샤이니 세븐 스타즈-'],
      dtype='object', name='name', length=494)
In [22]:
# 평균 평점 1위 영화의 평점 변화를 시각화합니다.
green_book_rank = movie.groupby(['name'])[['point']].agg('mean').sort_values('point', ascending=False).index[0]
green_book_rank
gdf = movie[movie['name']==green_book_rank]
gdf.plot(x='date', figsize=(12,8))
plt.show()
In [23]:
# 모든 영화에 대해 날짜별 평점 변화를 계산합니다.
movie.pivot_table(index='date',columns='name', values='point').head(5)
Out[23]:
name 0.0MHz 1919 유관순 28일 후 47미터 2 4월 이야기 500일의 썸머 7년-그들이 없는 언론 7번방의 선물 80일간의 세계일주 82년생 김지영 ... 헬보이 현기증 혈투 호두까기 인형과 4개의 왕국 호랑이보다 무서운 겨울손님 호텔 뭄바이 홀리 모터스 황혼에서 새벽까지 히트 힘을 내요, 미스터 리
date
2019-01-01 NaN NaN NaN NaN NaN NaN 8.52 NaN NaN NaN ... NaN NaN NaN 7.39 NaN NaN NaN NaN 9.1 NaN
2019-01-02 NaN NaN NaN NaN NaN NaN 8.52 NaN NaN NaN ... NaN NaN NaN 7.40 NaN NaN NaN NaN NaN NaN
2019-01-03 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN 7.40 NaN NaN NaN NaN NaN NaN
2019-01-04 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN 7.40 NaN NaN NaN NaN NaN NaN
2019-01-05 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN 7.40 NaN NaN NaN NaN NaN NaN

5 rows × 494 columns

In [24]:
# 평점이 없는 경우 (na의 경우) 0으로 치환합니다.
movie.pivot_table(index='date',columns='name', values='point').fillna(0)
Out[24]:
name 0.0MHz 1919 유관순 28일 후 47미터 2 4월 이야기 500일의 썸머 7년-그들이 없는 언론 7번방의 선물 80일간의 세계일주 82년생 김지영 ... 헬보이 현기증 혈투 호두까기 인형과 4개의 왕국 호랑이보다 무서운 겨울손님 호텔 뭄바이 홀리 모터스 황혼에서 새벽까지 히트 힘을 내요, 미스터 리
date
2019-01-01 0.0 0.0 0.0 0.0 0.0 0.0 8.52 0.0 0.0 0.00 ... 0.0 0.0 0.0 7.39 0.0 0.0 0.0 0.0 9.1 0.0
2019-01-02 0.0 0.0 0.0 0.0 0.0 0.0 8.52 0.0 0.0 0.00 ... 0.0 0.0 0.0 7.40 0.0 0.0 0.0 0.0 0.0 0.0
2019-01-03 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.0 0.0 0.00 ... 0.0 0.0 0.0 7.40 0.0 0.0 0.0 0.0 0.0 0.0
2019-01-04 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.0 0.0 0.00 ... 0.0 0.0 0.0 7.40 0.0 0.0 0.0 0.0 0.0 0.0
2019-01-05 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.0 0.0 0.00 ... 0.0 0.0 0.0 7.40 0.0 0.0 0.0 0.0 0.0 0.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2019-12-27 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.0 0.0 6.69 ... 0.0 0.0 0.0 0.00 0.0 0.0 0.0 0.0 0.0 0.0
2019-12-28 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.0 0.0 6.69 ... 0.0 0.0 0.0 0.00 0.0 0.0 0.0 0.0 0.0 0.0
2019-12-29 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.0 0.0 6.69 ... 0.0 0.0 0.0 0.00 0.0 0.0 0.0 0.0 0.0 0.0
2019-12-30 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.0 0.0 6.69 ... 0.0 0.0 0.0 0.00 0.0 0.0 0.0 0.0 0.0 0.0
2019-12-31 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.0 0.0 6.69 ... 0.0 0.0 0.0 0.00 0.0 0.0 0.0 0.0 0.0 0.0

365 rows × 494 columns

In [25]:
# date 컬럼에서 년, 월, 일, 요일 정보를 추출합니다.
movie['year'] = pd.DatetimeIndex(movie['date']).year
movie['month'] = pd.DatetimeIndex(movie['date']).month
movie['day'] = pd.DatetimeIndex(movie['date']).day
movie['wday'] = pd.DatetimeIndex(movie['date']).weekday
movie['week'] = pd.DatetimeIndex(movie['date']).week
movie
Out[25]:
date name point year month day wday week
0 2019-01-01 보헤미안 랩소디 9.49 2019 1 1 1 1
1 2019-01-01 헌터 킬러 9.43 2019 1 1 1 1
2 2019-01-01 폴란드로 간 아이들 9.42 2019 1 1 1 1
3 2019-01-01 트루먼 쇼 9.32 2019 1 1 1 1
4 2019-01-01 점박이 한반도의 공룡2 : 새로운 낙원 9.24 2019 1 1 1 1
... ... ... ... ... ... ... ... ...
16006 2019-12-31 대통령의 7시간 6.18 2019 12 31 1 1
16007 2019-12-31 쥬만지: 넥스트 레벨 6.13 2019 12 31 1 1
16008 2019-12-31 백두산 5.93 2019 12 31 1 1
16009 2019-12-31 아내를 죽였다 5.18 2019 12 31 1 1
16010 2019-12-31 캣츠 4.69 2019 12 31 1 1

16011 rows × 8 columns

In [26]:
# 영화의 요일별 평균 평점을 계산합니다.
movie.pivot_table(index=['name','wday'], values='point')
Out[26]:
point
name wday
0.0MHz 0 5.522500
1 5.482500
2 5.697500
3 5.592500
4 5.587500
... ... ...
힘을 내요, 미스터 리 2 7.585000
3 7.619000
4 7.613333
5 7.602000
6 7.602222

3165 rows × 1 columns

In [27]:
# 인덱스를 재설정합니다. reset_index함수 이용
movie.pivot_table(index=['name','wday'], values='point').reset_index()
Out[27]:
name wday point
0 0.0MHz 0 5.522500
1 0.0MHz 1 5.482500
2 0.0MHz 2 5.697500
3 0.0MHz 3 5.592500
4 0.0MHz 4 5.587500
... ... ... ...
3160 힘을 내요, 미스터 리 2 7.585000
3161 힘을 내요, 미스터 리 3 7.619000
3162 힘을 내요, 미스터 리 4 7.613333
3163 힘을 내요, 미스터 리 5 7.602000
3164 힘을 내요, 미스터 리 6 7.602222

3165 rows × 3 columns

In [28]:
# 영화의 주별 평균 평점을 계산합니다.
movie.pivot_table(index=['name','week'],values=['point'])
Out[28]:
point
name week
0.0MHz 22 6.026000
23 5.844286
24 5.515714
25 5.235000
26 5.118000
... ... ...
힘을 내요, 미스터 리 44 7.560000
45 7.570000
46 7.570000
47 7.570000
48 7.570000

2902 rows × 1 columns

In [29]:
# 인덱스를 재설정합니다. reset_index함수 이용
movie.pivot_table(index=['name','week'], values='point').reset_index()
Out[29]:
name week point
0 0.0MHz 22 6.026000
1 0.0MHz 23 5.844286
2 0.0MHz 24 5.515714
3 0.0MHz 25 5.235000
4 0.0MHz 26 5.118000
... ... ... ...
2897 힘을 내요, 미스터 리 44 7.560000
2898 힘을 내요, 미스터 리 45 7.570000
2899 힘을 내요, 미스터 리 46 7.570000
2900 힘을 내요, 미스터 리 47 7.570000
2901 힘을 내요, 미스터 리 48 7.570000

2902 rows × 3 columns

In [30]:
# 영화별 주차를 계산합니다. 주차는 그 영화가 몇주가 동안 상영됬는지

def count(x):
    return len(x.unique())
movie.groupby(['name'])['week'].agg(count).sort_values(ascending=False)

# movie[movie['name'] == '교회오빠']['week'].unique()
# movie[movie['name'] == '교회오빠']['week'].nunique()
Out[30]:
name
교회오빠          33
기생충           32
그린 북          31
알라딘           28
가버나움          26
              ..
코코             1
꾸뻬씨의 행복여행      1
꿈의 제인          1
용호문            1
라스베가스를 떠나며     1
Name: week, Length: 494, dtype: int64
In [31]:
#  평균 평점 10위 영화의 이름을 추출합니다
tmp = movie.pivot_table(index='name').sort_values('point',ascending=False).index[:10]
tmp
Out[31]:
Index(['그린 북', '가버나움', '포드 V 페라리', '베일리 어게인', '사랑의 선물', '주전장', '원더', '안녕 베일리',
       '보헤미안 랩소디', '당갈'],
      dtype='object', name='name')
In [32]:
movie.groupby(['name','month']).agg('mean')
Out[32]:
point year day wday week
name month
0.0MHz 5 6.083333 2019.0 30.000000 3.000000 22.000000
6 5.541739 2019.0 13.086957 2.782609 24.043478
1919 유관순 4 8.582692 2019.0 17.500000 3.038462 15.923077
5 8.561364 2019.0 12.409091 3.545455 19.409091
7 8.287143 2019.0 23.714286 2.714286 29.857143
... ... ... ... ... ... ...
황혼에서 새벽까지 7 8.080000 2019.0 12.000000 2.782609 28.173913
히트 1 9.100000 2019.0 1.000000 1.000000 1.000000
힘을 내요, 미스터 리 9 7.670000 2019.0 21.000000 3.157895 38.263158
10 7.573871 2019.0 16.000000 2.903226 41.870968
11 7.570000 2019.0 17.533333 3.266667 46.466667

1138 rows × 5 columns

In [33]:
tmp
Out[33]:
Index(['그린 북', '가버나움', '포드 V 페라리', '베일리 어게인', '사랑의 선물', '주전장', '원더', '안녕 베일리',
       '보헤미안 랩소디', '당갈'],
      dtype='object', name='name')
In [34]:
# 평균 평점 10위 영화의 월별 평균 평점을 계산합니다.
# top=movie[movie['name'].isin(tmp)]
#top=movie[movie['name'].isin(tmp)].groupby(['name','month'])[['point']].agg('mean')
#top

top_10=movie[movie['name'].isin(tmp)]
top_10.pivot_table(index=['name','month'], values='point')
Out[34]:
point
name month
가버나움 1 9.590000
2 9.588929
3 9.600000
4 9.598333
5 9.600000
6 9.593333
12 9.590000
그린 북 1 9.670476
2 9.641429
3 9.625161
4 9.620000
5 9.620000
6 9.612000
7 9.611250
9 9.610000
10 9.610000
11 9.610000
당갈 5 9.430000
8 9.440000
베일리 어게인 4 9.549286
5 9.540000
보헤미안 랩소디 1 9.471935
2 9.438571
3 9.430000
4 9.424348
사랑의 선물 9 9.660000
10 9.513333
안녕 베일리 9 9.474286
10 9.420000
원더 7 9.450000
주전장 8 9.532258
9 9.533333
10 9.515806
11 9.492143
12 9.490000
포드 V 페라리 12 9.576667

'workSpace > PYTHON' 카테고리의 다른 글

[ML] SVM - 지도학습 분류모델  (0) 2021.01.18
[ML][DL] 전반적인 이해도 및 로직 설명, 자료  (0) 2021.01.18
[Pandas] 판다스 기초 상식 및 함수 정리 4 - pivot_table  (0) 2021.01.14
[Pandas] 판다스 기초 상식 및 함수 정리 3 - groupby  (0) 2021.01.14
[Pandas] 판다스 기초 상식 정리 및 함수 응용 2 - 서울시 구별 CCTV 현황 분석하기  (0) 2021.01.13
    'workSpace/PYTHON' 카테고리의 다른 글
    • [ML] SVM - 지도학습 분류모델
    • [ML][DL] 전반적인 이해도 및 로직 설명, 자료
    • [Pandas] 판다스 기초 상식 및 함수 정리 4 - pivot_table
    • [Pandas] 판다스 기초 상식 및 함수 정리 3 - groupby
    J o e
    J o e
    나의 과거를 기록합니다.

    티스토리툴바