호쌤
호쌤 Just For Fun

[Python 데이터 수집] 영화진흥원 Open API를 통한 박스오피스 데이터 수집

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Python 데이터 수집] 영화진흥원 Open API를 통한 박스오피스 데이터 수집≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

[Python 데이터 수집] 영화진흥원 Open API를 통한 박스오피스 데이터 수집

OpenAPI란, 누구나 사용할 수 있도록 공개된 API로서 대부분의 OpenAPI는 데이터 교환 형식으로 JSON을 사용합니다.

API (Application Programming Interface) : 프로그램에서 데이터를 주고 받기 위한 방법

영화진흥위원회 OpenAPI를 활용하면 현재 극장에서 상영중인 영화들에 대한 박스오피스 데이터를 조회할 수 있습니다.

이번 포스팅에서는 영화진흥원 OpenAPI를 통해 JSON 형식의 데이터를 수집하고 이를 그래프로 시각화 하는 내용을 소개합니다.

#01. 기본 준비 단계

1) Key 발급받기

  1. 영화진흥위원회 OpenAPI 사이트에 회원가입 후 로그인을 수행한다.
  2. 키 발급/관리 메뉴를 통해 연동에 필요한 인증키 발급받는다.

2) 연동 스팩 확인하기

http://www.kobis.or.kr/kobisopenapi/homepg/apiservice/searchServiceInfo.do 페이지를 통해 요청에 필요한 정보와 응답 형식을 확인한다.

3) 브라우저를 통한 URL 확인

영화진흥원 OpenAPI 명세서를 통해 요청변수 항목들을 확인하여 전체 URL 구성 후 브라우저를 통해 접근한다.

http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=자신의Key값&targetDt=20200110

targetDt값의 경우 하루 전 날짜까지 적용 가능하다. 오늘에 해당하는 값을 전달한 경우 아직 집계되지 않은 데이터이므로 데이터가 조회회지 않는다.

웹 브라우저를 통해 JSON을 직접 확인하는 경우 JSON 전문이 한 줄로 표시되어 확인하기 어려운 부분이 있다.

이 경우 크롬 브라우저를 통해 크롬 웹 스토어에서 JSONView 확장 프로그램 설치하고 재접속 하면 JSON 데이터를 보기 좋게 정렬하고 컬러링을 적용해 준다.

4) 필요한 패키지 가져오기

1
2
3
4
5
6
import requests
import json
import datetime as dt
import pandas as pd
from pandas import DataFrame
from matplotlib import pyplot

5) API 키 준비하기

1
api_key = "자신이_직접_발급받은_API_키"

6) 세션 생성

1
2
3
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
session = requests.Session()
session.headers.update( {'User-agent': user_agent, 'referer': None} )

#02. 특정 날짜에 대한 박스오피스 관람객 수

영화진흥위원회의 OpenAPI는 오늘을 기준으로 하루 전날 까지의 데이터를 제공한다.

1) 접속 주소 준비하기

변수가 치환될 주소 템플릿

1
url_tpl = "http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key={key}&targetDt={date}"

조회날짜 문자열 만들기

여기서는 어제 날짜로 준비함

1
2
3
4
5
today = dt.datetime.now()                       # 오늘날짜
delta = dt.timedelta(days = -1)                 # 하루 전을 의미하는 timedelta객체
yesterday = today + delta                       # 오늘 날짜와 timedelta 연산
yesterday_str = yesterday.strftime("%Y%m%d")    # yyyymmdd 형식 문자열로 변환
yesterday_str
▶ 출력결과
1
'20200320'

최종 접속 주소 확인

1
2
api_url = url_tpl.format(key=api_key, date=yesterday_str)
api_url
▶ 출력결과
1
'http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=자신이_직접_발급받은_API_키&targetDt=20200320'

2) API를 통한 JSON 데이터 가져오기

OpenAPI를 통한 JSON 가져오기

1
2
3
4
5
6
7
8
r = session.get(api_url)

if r.status_code != 200:
    print("[%d Error] %s" % (r.status_code, r.reason))
    quit()

r.encoding = "utf-8"
r.text
▶ 출력결과
1
'{"boxOfficeResult":{"boxofficeType":"일별 박스오피스","showRange":"20200320~20200320","dailyBoxOfficeList":[{"rnum":"1","rank":"1","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20199842","movieNm":"인비저블맨","openDt":"2020-02-26","salesAmt":"80671740","salesShare":"24.4","salesInten":"22331560","salesChange":"38.3","salesAcc":"4016717280","audiCnt":"8919","audiInten":"1966","audiChange":"28.3","audiAcc":"460437","scrnCnt":"554","showCnt":"1400"},{"rnum":"2","rank":"2","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20192399","movieNm":"1917","openDt":"2020-02-19","salesAmt":"66291500","salesShare":"20.1","salesInten":"13509060","salesChange":"25.6","salesAcc":"5870307000","audiCnt":"7247","audiInten":"1169","audiChange":"19.2","audiAcc":"639680","scrnCnt":"501","showCnt":"1073"},{"rnum":"3","rank":"3","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20204791","movieNm":"다크 워터스 ","openDt":"2020-03-11","salesAmt":"39894800","salesShare":"12.1","salesInten":"5504840","salesChange":"16","salesAcc":"756416720","audiCnt":"4453","audiInten":"297","audiChange":"7.1","audiAcc":"87124","scrnCnt":"460","showCnt":"1028"},{"rnum":"4","rank":"4","rankInten":"1","rankOldAndNew":"OLD","movieCd":"20193321","movieNm":"정직한 후보","openDt":"2020-02-12","salesAmt":"14999440","salesShare":"4.5","salesInten":"3215980","salesChange":"27.3","salesAcc":"12689590590","audiCnt":"2494","audiInten":"406","audiChange":"19.4","audiAcc":"1512476","scrnCnt":"282","showCnt":"452"},{"rnum":"5","rank":"5","rankInten":"-1","rankOldAndNew":"OLD","movieCd":"20205096","movieNm":"세인트 아가타 ","openDt":"2020-03-19","salesAmt":"18705840","salesShare":"5.7","salesInten":"-5753100","salesChange":"-23.5","salesAcc":"44474760","audiCnt":"2012","audiInten":"-891","audiChange":"-30.7","audiAcc":"5080","scrnCnt":"365","showCnt":"654"},{"rnum":"6","rank":"6","rankInten":"2","rankOldAndNew":"OLD","movieCd":"20180523","movieNm":"스타 이즈 본","openDt":"2018-10-09","salesAmt":"8645340","salesShare":"2.6","salesInten":"2070900","salesChange":"31.5","salesAcc":"4378664420","audiCnt":"1695","audiInten":"402","audiChange":"31.1","audiAcc":"514616","scrnCnt":"201","showCnt":"278"},{"rnum":"7","rank":"7","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20192240","movieNm":"작은 아씨들","openDt":"2020-02-12","salesAmt":"13493100","salesShare":"4.1","salesInten":"2696420","salesChange":"25","salesAcc":"7108127850","audiCnt":"1528","audiInten":"186","audiChange":"13.9","audiAcc":"843092","scrnCnt":"225","showCnt":"330"},{"rnum":"8","rank":"8","rankInten":"-2","rankOldAndNew":"OLD","movieCd":"20180962","movieNm":"지푸라기라도 잡고 싶은 짐승들","openDt":"2020-02-19","salesAmt":"13451840","salesShare":"4.1","salesInten":"1583260","salesChange":"13.3","salesAcc":"5263809450","audiCnt":"1500","audiInten":"93","audiChange":"6.6","audiAcc":"606536","scrnCnt":"261","showCnt":"428"},{"rnum":"9","rank":"9","rankInten":"1","rankOldAndNew":"OLD","movieCd":"20167542","movieNm":"분노의 질주: 더 익스트림","openDt":"2017-04-12","salesAmt":"8731500","salesShare":"2.6","salesInten":"320500","salesChange":"3.8","salesAcc":"29998298848","audiCnt":"874","audiInten":"32","audiChange":"3.8","audiAcc":"3654954","scrnCnt":"35","showCnt":"123"},{"rnum":"10","rank":"10","rankInten":"2","rankOldAndNew":"OLD","movieCd":"20135428","movieNm":"어바웃 타임","openDt":"2013-12-05","salesAmt":"4011000","salesShare":"1.2","salesInten":"1008000","salesChange":"33.6","salesAcc":"25209231800","audiCnt":"786","audiInten":"192","audiChange":"32.3","audiAcc":"3432668","scrnCnt":"75","showCnt":"91"}]}}'

JSON을 딕셔너리로 변환

1
2
daily_boxoffice_dict = json.loads(r.text)
daily_boxoffice_dict
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
{'boxOfficeResult': {'boxofficeType': '일별 박스오피스',
  'showRange': '20200320~20200320',
  'dailyBoxOfficeList': [{'rnum': '1',
    'rank': '1',
    'rankInten': '0',
    'rankOldAndNew': 'OLD',
    'movieCd': '20199842',
    'movieNm': '인비저블맨',
    'openDt': '2020-02-26',
    'salesAmt': '80671740',
    'salesShare': '24.4',
    'salesInten': '22331560',
    'salesChange': '38.3',
    'salesAcc': '4016717280',
    'audiCnt': '8919',
    'audiInten': '1966',
    'audiChange': '28.3',
    'audiAcc': '460437',
    'scrnCnt': '554',
    'showCnt': '1400'},
   {'rnum': '2',
    'rank': '2',
    'rankInten': '0',
    'rankOldAndNew': 'OLD',
    'movieCd': '20192399',
    'movieNm': '1917',
    'openDt': '2020-02-19',
    'salesAmt': '66291500',
    'salesShare': '20.1',
    'salesInten': '13509060',
    'salesChange': '25.6',
    'salesAcc': '5870307000',
    'audiCnt': '7247',
    'audiInten': '1169',
    'audiChange': '19.2',
    'audiAcc': '639680',
    'scrnCnt': '501',
    'showCnt': '1073'},
    ... 생략 ...
   {'rnum': '10',
    'rank': '10',
    'rankInten': '2',
    'rankOldAndNew': 'OLD',
    'movieCd': '20135428',
    'movieNm': '어바웃 타임',
    'openDt': '2013-12-05',
    'salesAmt': '4011000',
    'salesShare': '1.2',
    'salesInten': '1008000',
    'salesChange': '33.6',
    'salesAcc': '25209231800',
    'audiCnt': '786',
    'audiInten': '192',
    'audiChange': '32.3',
    'audiAcc': '3432668',
    'scrnCnt': '75',
    'showCnt': '91'}]}}

딕셔너리를 데이터프레임으로 변환

1
2
daily_boxoffice_df = DataFrame(daily_boxoffice_dict['boxOfficeResult']['dailyBoxOfficeList'])
daily_boxoffice_df
▶ 출력결과
rnum rank rankInten rankOldAndNew movieCd movieNm openDt salesAmt salesShare salesInten salesChange salesAcc audiCnt audiInten audiChange audiAcc scrnCnt showCnt
0 1 1 0 OLD 20199842 인비저블맨 2020-02-26 80671740 24.4 22331560 38.3 4016717280 8919 1966 28.3 460437 554 1400
1 2 2 0 OLD 20192399 1917 2020-02-19 66291500 20.1 13509060 25.6 5870307000 7247 1169 19.2 639680 501 1073
2 3 3 0 OLD 20204791 다크 워터스 2020-03-11 39894800 12.1 5504840 16 756416720 4453 297 7.1 87124 460 1028
3 4 4 1 OLD 20193321 정직한 후보 2020-02-12 14999440 4.5 3215980 27.3 12689590590 2494 406 19.4 1512476 282 452
4 5 5 -1 OLD 20205096 세인트 아가타 2020-03-19 18705840 5.7 -5753100 -23.5 44474760 2012 -891 -30.7 5080 365 654
5 6 6 2 OLD 20180523 스타 이즈 본 2018-10-09 8645340 2.6 2070900 31.5 4378664420 1695 402 31.1 514616 201 278
6 7 7 0 OLD 20192240 작은 아씨들 2020-02-12 13493100 4.1 2696420 25 7108127850 1528 186 13.9 843092 225 330
7 8 8 -2 OLD 20180962 지푸라기라도 잡고 싶은 짐승들 2020-02-19 13451840 4.1 1583260 13.3 5263809450 1500 93 6.6 606536 261 428
8 9 9 1 OLD 20167542 분노의 질주: 더 익스트림 2017-04-12 8731500 2.6 320500 3.8 29998298848 874 32 3.8 3654954 35 123
9 10 10 2 OLD 20135428 어바웃 타임 2013-12-05 4011000 1.2 1008000 33.6 25209231800 786 192 32.3 3432668 75 91

2) 데이터 전처리

사용할 컬럼만 추출

1
2
tmp_df = daily_boxoffice_df.filter(['movieNm', 'audiCnt'])
tmp_df
▶ 출력결과
movieNm audiCnt
0 인비저블맨 8919
1 1917 7247
2 다크 워터스 4453
3 정직한 후보 2494
4 세인트 아가타 2012
5 스타 이즈 본 1695
6 작은 아씨들 1528
7 지푸라기라도 잡고 싶은 짐승들 1500
8 분노의 질주: 더 익스트림 874
9 어바웃 타임 786

영화제목을 인덱스로 지정

1
2
3
4
5
6
7
name_dict = {}
for i, v in enumerate(list(tmp_df['movieNm'])):
    name_dict[i] = v
    
daily_rank_df = tmp_df.rename(index=name_dict, columns={'audiCnt': '관람객'})
daily_rank_df.drop('movieNm', axis=1, inplace=True)
daily_rank_df
▶ 출력결과
관람객
인비저블맨 8919
1917 7247
다크 워터스 4453
정직한 후보 2494
세인트 아가타 2012
스타 이즈 본 1695
작은 아씨들 1528
지푸라기라도 잡고 싶은 짐승들 1500
분노의 질주: 더 익스트림 874
어바웃 타임 786

관람객 컬럼에 대한 데이터 타입 확인

외부에서 수집한 데이터의 경우 숫자 모양을 한 문자열 형식인 경우가 대부분이기 때문에 반드시 분석할 컬럼만 출력하여 type을 확인해야 한다.

type이 int, 나 float 형식이 아닌 경우 타입 변환 처리가 필수적으로 요구된다.

1
daily_rank_df['관람객']
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
11
인비저블맨               8919
1917                7247
다크 워터스              4453
정직한 후보              2494
세인트 아가타             2012
스타 이즈 본             1695
작은 아씨들              1528
지푸라기라도 잡고 싶은 짐승들    1500
분노의 질주: 더 익스트림       874
어바웃 타임               786
Name: 관람객, dtype: object

관람객 컬럼의 타입을 숫자형식으로 변환

1
2
daily_rank_df['관람객'] = daily_rank_df['관람객'].apply(pd.to_numeric)
daily_rank_df['관람객']
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
11
인비저블맨               8919
1917                7247
다크 워터스              4453
정직한 후보              2494
세인트 아가타             2012
스타 이즈 본             1695
작은 아씨들              1528
지푸라기라도 잡고 싶은 짐승들    1500
분노의 질주: 더 익스트림       874
어바웃 타임               786
Name: 관람객, dtype: int64

3) 데이터 시각화

1
2
3
4
5
6
7
8
9
10
11
12
# 그래프 만들기
pyplot.rcParams["font.family"] = 'NanumGothic'
pyplot.rcParams["font.size"] = 18
pyplot.rcParams["figure.figsize"] = (32, 16)

# 전체 컬럼에 대한 시각화
daily_rank_df.plot.barh(rot=45)
pyplot.grid()
pyplot.title("%s 박스오피스 순위" % yesterday_str)
pyplot.legend()
pyplot.show()
pyplot.close()
▶ 출력결과

png

#03. 영화별 1주일 간의 관람객 수 변동 현황

URL에 접속하는 연동 부분을 하나의 블록으로 묶고 날짜를 변경해 가며 1주일간의 변화량 확인한다.

한 블록의 코드가 길기 때문에 반복 처리의 단계를 주석으로 미리 나누어 놓고, 각 단계별로 출력 결과를 확인하면서 구현하도록 한다.

1) 반복문을 수행하며 1주일치 데이터 수집하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 반복을 수행하면서 생성되는 데이터프레임을 누적시킬 빈 데이터 프레임 준비
영화관람객수_df = DataFrame()

# 일주일간의 기간을 위한 반복문 구성
for i in range(-7, 0):
    
    #### 조회날짜 문자열 만들기
    today = dt.datetime.now()                       # 오늘날짜
    delta = dt.timedelta(days = i)                  # i일 전을 의미하는 timedelta객체
    yesterday = today + delta                       # 오늘 날짜와 timedelta 연산
    yesterday_str = yesterday.strftime("%Y%m%d")    # yyyymmdd 형식 문자열로 변환
    #print(yesterday_str)
    
    #### 최종 접속 주소 확인
    api_url = url_tpl.format(key=api_key, date=yesterday_str)
    #print(api_url)
    
    #### API를 통한 JSON 데이터 가져오기
    r = session.get(api_url)
    
    if r.status_code != 200:
        print("[%d Error] %s" % (r.status_code, r.reason))
        # 특정 주소에 대해 에러가 발생하더라도 다른 주소에 대한 수집을 시도하기 위해 반복을 계속 수행
        continue

    r.encoding = "utf-8"
    #print(r.text)
    #print("-" * 50)
    
    #### 데이터 프레임으로 변환
    daily_boxoffice_dict = json.loads(r.text)
    daily_boxoffice_df = DataFrame(daily_boxoffice_dict['boxOfficeResult']['dailyBoxOfficeList'])
    #print(daily_boxoffice_df)
    
    #### 사용할 컬럼만 추출
    tmp_df = daily_boxoffice_df.filter(['movieNm', 'audiCnt'])
    #print(tmp_df)
    
    #### 영화제목을 인덱스로 지정하기 위한 딕셔너리 구성
    name_dict = {}
    for i, v in enumerate(list(tmp_df['movieNm'])):
        name_dict[i] = v
    #print(name_dict)
        
    # 인덱스 이름 변경, 컬럼이름 변경 --> 관람객 수를 의미하는 컬럼을 해당 날짜로 변경한다.
    daily_rank_df = tmp_df.rename(index=name_dict, columns={'audiCnt': yesterday_str})
    daily_rank_df.drop('movieNm', axis=1, inplace=True)
    #print(daily_rank_df)
    
    #### 관람객 컬럼의 타입을 숫자형식으로 변환
    daily_rank_df[yesterday_str] = daily_rank_df[yesterday_str].apply(pd.to_numeric)
    #print(daily_rank_df)
    
    #### 영화이름(daily_rank_df의 인덱스)가 동일한 데이터를 기준으로 누적
    #### -> how값을 outer로 지정하여 중복되지 않는 인덱스명(영화제목)도 누락되지 않도록 한다.
    영화관람객수_df = pd.merge(영화관람객수_df, daily_rank_df, left_index=True, right_index=True, how="outer")
    
############ 최종 결과 출력
영화관람객수_df
▶ 출력결과
20200314 20200315 20200316 20200317 20200318 20200319 20200320
1917 16742.0 14834.0 5167.0 5004.0 5495.0 6078.0 7247.0
그린 북 NaN NaN 530.0 NaN NaN NaN NaN
다크 워터스 19100.0 16338.0 5421.0 5132.0 5780.0 4156.0 4453.0
더 보이 2: 돌아온 브람스 1306.0 1324.0 NaN NaN NaN NaN NaN
메멘토 1948.0 1611.0 759.0 755.0 843.0 NaN NaN
분노의 질주: 더 익스트림 NaN NaN NaN NaN NaN 842.0 874.0
세인트 아가타 NaN NaN NaN NaN NaN 2903.0 2012.0
쉰들러 리스트 NaN NaN 619.0 620.0 NaN NaN NaN
스타 이즈 본 3780.0 3348.0 1562.0 1479.0 1726.0 1293.0 1695.0
시원찮은 그녀를 위한 육성방법 피날레 NaN NaN NaN NaN NaN 960.0 NaN
어바웃 타임 2005.0 1669.0 NaN 585.0 669.0 NaN 786.0
인비저블맨 24718.0 20560.0 8089.0 7922.0 8234.0 6953.0 8919.0
작은 아씨들 4245.0 3671.0 1515.0 1680.0 1864.0 1342.0 1528.0
정직한 후보 4814.0 5065.0 2965.0 3004.0 2956.0 2088.0 2494.0
지푸라기라도 잡고 싶은 짐승들 5595.0 5393.0 2082.0 1943.0 1958.0 1407.0 1500.0
찬실이는 복도 많지 NaN NaN NaN NaN 722.0 NaN NaN

2) 데이터 정제

결측치 대체

관람객 수가 결측치인 경우는 병합 과정에서 해당 날짜에 개봉하지 않은 영화를 의미한다.

결측치인 경우 관람객 수가 0이라는 의미이므로 결측치 대체법을 적용한다.

1
2
final_df = 영화관람객수_df.fillna(0)
final_df
▶ 출력결과
20200314 20200315 20200316 20200317 20200318 20200319 20200320
1917 16742.0 14834.0 5167.0 5004.0 5495.0 6078.0 7247.0
그린 북 0.0 0.0 530.0 0.0 0.0 0.0 0.0
다크 워터스 19100.0 16338.0 5421.0 5132.0 5780.0 4156.0 4453.0
더 보이 2: 돌아온 브람스 1306.0 1324.0 0.0 0.0 0.0 0.0 0.0
메멘토 1948.0 1611.0 759.0 755.0 843.0 0.0 0.0
분노의 질주: 더 익스트림 0.0 0.0 0.0 0.0 0.0 842.0 874.0
세인트 아가타 0.0 0.0 0.0 0.0 0.0 2903.0 2012.0
쉰들러 리스트 0.0 0.0 619.0 620.0 0.0 0.0 0.0
스타 이즈 본 3780.0 3348.0 1562.0 1479.0 1726.0 1293.0 1695.0
시원찮은 그녀를 위한 육성방법 피날레 0.0 0.0 0.0 0.0 0.0 960.0 0.0
어바웃 타임 2005.0 1669.0 0.0 585.0 669.0 0.0 786.0
인비저블맨 24718.0 20560.0 8089.0 7922.0 8234.0 6953.0 8919.0
작은 아씨들 4245.0 3671.0 1515.0 1680.0 1864.0 1342.0 1528.0
정직한 후보 4814.0 5065.0 2965.0 3004.0 2956.0 2088.0 2494.0
지푸라기라도 잡고 싶은 짐승들 5595.0 5393.0 2082.0 1943.0 1958.0 1407.0 1500.0
찬실이는 복도 많지 0.0 0.0 0.0 0.0 722.0 0.0 0.0

3) 데이터 시각화

시간에 따른 데이터의 변화를 표현하기 적합한 형태는 선 그래프(=시계열 그래프) 이다.

데이터 프래임을 선 그래프로 표현할 경우 각각의 컬럼이 선으로 표현되고 인덱스가 x축, 값이 y축으로 사용된다.

현재 DataFrame을 바로 시각화 할 경우 영화 제목이 x축이 되고 날짜별로 하나의 선이 구현되어 맞지 않는 그래프가 표현된다.

각각의 영화가 하나의 선이 되고, 날짜가 x축, 관람객 수가 y축이 되도록 하려면 현재 데이터 프래임의 컬럼과 인덱스를 맞바꾼 형태인 전치를 통해 그래프를 표현해야 한다.

데이터프레임의 전치 확인

1
final_df.T
▶ 출력결과
1917 나의 청춘은 너의 것 더 플랫폼 라라랜드 레미제라블: 뮤지컬 콘서트 레이니 데이 인 뉴욕 마이 스파이 씨 피버 저 산 너머 트롤: 월드 투어 패왕별희 디 오리지널 프리즌 이스케이프 호텔 레이크
20200507 979.0 2322.0 0.0 810.0 0.0 5342.0 1170.0 0.0 3198.0 2869.0 2794.0 2125.0 1612.0
20200508 1128.0 1915.0 0.0 925.0 0.0 5171.0 1120.0 0.0 3943.0 2480.0 2831.0 1944.0 1233.0
20200509 4061.0 4257.0 0.0 2574.0 0.0 17092.0 3730.0 0.0 6438.0 8766.0 6335.0 8106.0 3662.0
20200510 2959.0 3903.0 0.0 2255.0 0.0 12161.0 2570.0 0.0 5653.0 8115.0 5474.0 8777.0 3821.0
20200511 853.0 1508.0 0.0 855.0 0.0 4118.0 733.0 0.0 2556.0 1648.0 2298.0 2589.0 1302.0
20200512 954.0 1700.0 0.0 991.0 0.0 4178.0 659.0 0.0 2533.0 1753.0 2211.0 3008.0 1203.0
20200513 0.0 1414.0 3497.0 0.0 1190.0 3330.0 0.0 1903.0 3647.0 1513.0 1907.0 3431.0 865.0

전치를 사용한 그래프

1
2
3
4
5
6
7
8
9
10
pyplot.rcParams["font.family"] = 'NanumGothic'
pyplot.rcParams["font.size"] = 24
pyplot.rcParams["figure.figsize"] = (30, 15)

final_df.T.plot(rot=45)
pyplot.grid()
pyplot.title("일주일간의 영화별 관람객 수 변화")
pyplot.legend(bbox_to_anchor=(1, 1))
pyplot.show()
pyplot.close()
▶ 출력결과

png

Rating:

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Python 데이터 수집] 영화진흥원 Open API를 통한 박스오피스 데이터 수집≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

comments powered by Disqus