<jupyter_start><jupyter_text>원작이 있는 영화가 더 흥행 할까?  1. 주제 선정 이유&nbsp; 최근 어벤져스 : 엔드게임이 개봉하였다. 어벤져스 엔드게임이 개봉하면서 개봉 초에는 스크린 점유율이 약 80프로였고, 개봉 첫주에만 630만명이 관람 했다. 그리고 현재 개봉 약 3주가 지나가는 지금까지도 예매율 1순위를 지킬 정도로 흥행하고 있다. 흥행의 요인으로는 그동안 쌓아 왔던 마블 영화의 팬층 때문일것이다. 하지만 마블 영화가 아닌 코믹스의 팬층 또한 그 원인이라 생각 한다. 이처럼 원작이 있는 영화들은 대부분 흥행하는 경우가 많다. 해리포터 시리즈,본 시리즈,007 시리즈등 소설을 원작으로해 흥행한 영화는 매우 많았고 웹툰을 원작으로 했었던 우리나라 영화 신과 함께 또한 외국으로 수출할 정도로 흥행 했었다. &nbsp; 반면에 대부분의 영화들은 원작이 없다. 그럼에도 불구하고 흥행을 일으킨다. 예를 들자면 유명한 트랜스포머 시리즈나 아바타, 스타워즈 시리즈는 원작이 없는 영화이다. 이 영화들은 원작이 없음에도 불구하고 엄청난 흥행을 일으켰다. 특히 아바타의 경우 역대 박스 오피스에서 외국 영화중 가장 많은 수익과 관객수를 남긴 영화이다.(5/17 KOBIS 역대 박스오피스 기준) 뿐만 아니라 우리나라의 대부분의 영화들은 원작이 존재하지 않지만 흥행을 한다. &nbsp; 위 사례처럼 원작이 존재하는 영화가 흥행하는 경우도, 그렇지 않은 경우도 있다. 어느쪽이 더 많이 흥행을 할까? 이번 프로젝트를 통해 이를 증명하고자 한다.   2. 가설 정의 &nbsp; 원작이 있는 영화가 더 흥행 할 것이다. &nbsp; 우선, 원작이 있는 영화들은 해당 영화의 순수 팬층이 아닌 원작의 팬층이 존재한다. 그 원작의 팬층들이 영화의 흥행에 큰 몫을 기여 할 것이라고 본다. 또한 해당 영화 개봉 전에 영화의 예고편에서 원작을 두었다고 얘기 하거나 서점이나 온라인 상에서 원작에 대해서도 곧 영화가 개봉한다고 마케팅을 할 것이다. 이를 보고 영화 개봉 전 사람들이 미리 원작을 접하고 흥미를 느껴 영화를 보는 경우도 많을 것이다. 즉, 원작이 없는 경우 보다는 관람객을 더 많이 이끌 수 있는 방법이 많이 존재 한다. 따라서 원작이 있는 영화가 더 흥행 할 것이라 생각한다. &nbsp; 이를 증명하기 위해, 우선 원작이 있는 영화 데이터를 가지고 온다. 이를 근 15년 간의 주간 박스오피스 순위를 가지고와, 해당 박스 오피스 순위에 있는 영화중 해당 영화가 있으면 매칭해 박스 오피스 순위 데이터에서 원작이 있는 영화 분류 한 뒤, 그렇지 않은 영화와 총매출액, 총관객수를 비교 한다. 또한 스크린 독점 또한 흥행 요인 중 하나라고 생각한다. 따라서 스크린 횟수와 상영 횟수 대비 관객수값을 비교해 흥행의 요인이 더 많은 스크린 할당, 횟수 할당, 즉 스크린 독점 때문에 관객들의 당시 영화 선택 폭이 줄어서인지를 분석한다.  3. 데이터 획득 1) 원작 있는 영화 데이터 획득&nbsp;&nbsp;위키피디아를 제외 하고 많은 데이터를 가지고 있는 사이트가 없었다. 따라서 해당 사이트들을 크롤링 해온다. 이때, 하위 분류에 속하는 문서들 모두 크롤링 해온다.- [소설을 바탕으로 한 영화 목록](https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%86%8C%EC%84%A4%EC%9D%84_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94)- [만화을 바탕으로 한 영화 목록](https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%A7%8C%ED%99%94%EB%A5%BC_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94)- [비디오 게임을 원작으로 한 영화 목록](https://ko.wikipedia.org/wiki/%EB%B9%84%EB%94%94%EC%98%A4_%EA%B2%8C%EC%9E%84%EC%9D%84_%EC%9B%90%EC%9E%91%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94_%EB%AA%A9%EB%A1%9D)- [희곡을 바탕으로 한 영화](https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%ED%9D%AC%EA%B3%A1%EC%9D%84_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94) 2) 영화 박스오피스 데이터 획득- [영화입장권 통합 전산망 오픈 API](http://www.kobis.or.kr/kobisopenapi/homepg/main/main.do) 를 통해 주간 박스 오피스 데이터를 획득한다.- 주간 박스 오피스 데이터 요청 url은 json형태로 받는다. http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchWeeklyBoxOfficeList.json- open api를 통해 획득한 데이터    1. movieNm : 영화명    2. salesAcc : 누적 매출액    3. audiAcc : 누적 관객수    4. scrnCnt : 해당 일자에 상영한 스크린 횟수    5. showCnt : 해당 일자에 상영된 횟수  4. 분석을 위한 데이터 가공 1) 원작이 있는 영화 데이터 - Beautiful Soup 과 Requests 를 사용해 데이터를 획득한다.- 크롤링 할 url 형식이 일정하지 않았다. 따라서 크롤링 할 url들을 모두 직접 복사해와, dictionary타입의 자료형의 key값으로 저장한다.- soup.select()시 selector를 사용한다. 이때 각 url 마다 영화 이름들이 다른  selector를 가지고 있었다. 따라서 위에서 선언한 dictonary 타입의 자료형에서 해당 url의 key값에 해당하는 value 값으로 selector를 직접 저장 하였다. selector example :  ``mw-pages > div > div > div > ul > li > a`` - soup.select로 가져온 객체를 한줄씩 가지고 와 string으로 변환한 한다.  ``리틀 포레스트`` - '>'을 기준으로 split을 해  split 한 결과 값중 1번째 원소를 가지고 와 다시 '<'을 기준으로 split 한다. 마지막 split 결과의 0번째 원소 값이 영화 이름이 된다.  2) 주간 박스 오피스 데이터 - 주간/주말 박스 오피스 API를 사용한다. 이때, REST 방식으로 받아 온다. - Rest 방식의 응답 형식은 JSON 형태로 받아 온다.    기본 요청 url :  http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchWeeklyBoxOfficeList.json- 요청 parameter는 ``{'key': _key, 'targetDt':_tagetDT, 'weekGb':"0"}`` 로 설정 해 GET 방식으로 받아 온다. 이때, weekGB : 0는 주간 데이터를 뜻한다. - 요청 parameter의 targetDT는 매일이 아닌 일주일 단위로 들어가야 한다. 따라서 pandas의 daterange를 사용해 2004-01-01 부터 2019-05-12까지 매주 월요일의 날짤를 targetDT로 넘겨 데이터 중복을 막는다.- salesAcc와 audiAcc는 누적 매출액이므로 매주 갱신 된다. 따라서 갱신된 값을 저장해 준다. scrnCnt와 showCnt의 경우, 해당 일자에 사영된 스크린 횟수, 상영 횟수 이므로 이전의 값에 누적을 시켜준다. - 받아온 movieNm, salesAcc,audiAcc,scrnAcc,showCnt는 movie_data에 저장 한다. 3) 데이터의 일관성- 1번 데이터와 2번 데이터의 출처는 다르다. 따라서 데이터의 일관성이 떨어진다. 두 데이터를 비교하기 위해서는 데이터의 일관성이 필요하다. 따라서 데이터의 일관성을 맞추기 위한 작업을 진행 한다.    1. 영화 이름에 ``VS.``들어간 경우 : 모두 ``VS``로 바꿔준다. EX) 에이리언 VS 프레데터    2. 영화 이름에 ``&amp;`` 들어간 경우 : 이는 ``&``로 바꿔준다. EX) 미스터 & 미세스 스미스    3. 영화 이름에 ``1부, 2부``가 들어간 경우 : 숫자로 대체한다. EX) 해리 포터와 죽음의 성물1    4. 영화 이름에 (애니)와 같이 추가 설명이 들어간 경우: 추가 설명은 삭제한다.  4) 데이터 매칭- 3번의 과정을 마친 데이터들을 가지고 1번과 2번 데이터 매칭을 시킨다. - 데이터 매칭 전에 movie_data에 hasOriginal이라는 원소의 dictionary value값으로 len(movie_data['movieNm']) 만큼 0을 가지고 있어야 한다. - 3번 데이터 일관성에서 잡지 못하는 한가지가, 띄어쓰기 문제이다. 예를 들면 '해리 포터'와 '해리포터'는 같은 이름이지만 컴퓨터는 이를 같게 인식 하지 않는다. 따라서 데이터 매칭시 띄어쓰기는 무시하고 매칭한다.- 띄어쓰기를 무시하고 매칭 하기 위해 영화 이름을 한글자씩 분석 한다. 만일, 모든 문자가 같다면 이는 같은 영화 이름으로 인식 한다.- 1번의 특정 데이터와 2번의 특정 데이터가 매칭이 되었다면 해당 데이터의 hasOriginal = 1로 만든다.위 과정을 거친 데이터들, movieNm, salesAcc,audiAcc,scrnAcc,showCnt,hasOriginal을 pandas의 to_csv를 이용해 movie_data.csv에 저장한다.        5. 분석 결과 도출<jupyter_code>%matplotlib inline
from matplotlib import pyplot as plt
import pandas as pd
from matplotlib import rc
import numpy as np

#차트에 한국어를 출력한다
rc('font', family='AppleGothic')
plt.rcParams['axes.unicode_minus'] = False

#movie_data 파일을 읽어 온다
movielist = pd.read_csv('movie_data.csv', encoding='utf-8')
has_original = movielist[movielist['hasOriginal']==1]
no_original = movielist[movielist['hasOriginal']==0]

print("원작 있는 영화 갯수: ",len(has_original))
print("원작 없는 영화 갯수: ",len(no_original))<jupyter_output>원작 있는 영화 갯수:  562
원작 없는 영화 갯수:  2063<jupyter_text>&nbsp;분석을 위해 ``movie_data.csv`` 에서 읽어온 데이터를 원작 있는 영화와 원작이 없는 영화로 분류 작업을 우선 진행 한다. 분류 작업 결과 원작이 있는 영화가 약 500개, 없는 영화가 약 2000개 정도 나왔다. 해당 영화들 중 상위 20개씩만 가져와 분석을 해도 충분히 가설을 증명 할수 있다고 판단 하였다. 따라서 분석 과정에서는 약 40개의 데이터를 가지고 분석을 진행 한다. 분석의 과정은 다음과 같다.1. 총 매출액을 기준으로 비교를 한다.2. 총 관객수를 기준으로 비교를 한다.3. 총 관객수가 스크린 할당과 상영횟수와 관련이 있는지 조사한다.&nbsp;``총 매출액``과 ``총 관객수``를 비교 할때는 총 3개의 그래프를 그린다. 첫번째 그래프는 비교 수치 기준 원작이 있는 영화 TOP20 이다. 두번째 그래프는 비교 수치 기준 원작이 없는 영화 TOP20이다. 그리고 마지막 세번째 그래프는 첫번째와 두번째 그래프를 합친것으로, 각 순위에 있는 영화를 비교 하기 위한 그래프이다. 즉, 첫번째와 두번째의 그래프는 TOP20 영화의 이름을 알기 위해서 그린 그래프이고, 세번째 그래프는 각 순위 비교를 위해 그린 그래프 이다. &nbsp;``총 관객수가 스크린 할당과 상영횟수와 관련이 있는지 조사`` 이 그래프는 누적 스크린수 대비 관객수, 누적 상영횟수 대비 관객수의 그래프를 나타내었다. x = 총 누적 스크린수 또는 누적 상영 횟수 그리고 y = 총 관객수로 두어, y = x 를 기준으로 y > x 일때 스크린 할당 또는 상영 횟수가 총 관객수에 큰 영향을 주지 않았다고 판단 할 수 있고, y < x일때, 스크린 독점의 이유등으로 영향을 주었다고 판단 할 수 있다.   1) 총 매출액을 기준으로 비교<jupyter_code>#총 매출액 기준으로 정렬한다
has_original = has_original.sort_values(["salesAcc"], ascending=[False])
no_original = no_original.sort_values(["salesAcc"], ascending=[False])

selected_has_original = (has_original[["movieNm","salesAcc"]])[:20].sort_values("salesAcc")
selected_no_original = (no_original[["movieNm","salesAcc"]])[:20].sort_values("salesAcc")


#원작 있는 영화 Top20의 총 매출액을 bar 그래프로 그린다
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
y = np.arange(20)
rects = plt.barh(y, selected_has_original["salesAcc"], height=0.5)
plt.yticks(y, selected_has_original["movieNm"])
plt.xlim(40000000000,  140000000000)
plt.xlabel('총매출액')
plt.ylabel('영화이름')
plt.title('원작 있는 영화의 top20 총 매출액(0.4 = 40000000000/ 1.4 = 140000000000)')
plt.show()

#원작 없는 영화 Top20의 총 매출액을 bar 그래프로 그린다
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
y = np.arange(20)
rects = plt.barh(y, selected_no_original["salesAcc"], height=0.5)
plt.yticks(y, selected_no_original["movieNm"])
plt.xlim(40000000000,  140000000000)
plt.xlabel('총매출액')
plt.ylabel('영화이름')
plt.title('원작 없는 영화의 top20 총 매출액(0.4 = 40000000000/ 1.4 = 140000000000)')
plt.show()


#둘의 비교를 위해 영화 이름을 제외 하고 랭크 순으로 비교 한다.
rank = []

for i in range (1,21):
    rank.append(str(21-i)+'위')

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
y = np.arange(20)
plt.barh(y-0.2, selected_has_original["salesAcc"], label='원작 있는 영화', height=0.4, color='#ff6600')
plt.barh(y+0.2, selected_no_original["salesAcc"], label='원작 없는 영화', height=0.4, color='#0066ff')
plt.yticks(y, rank)
plt.xlim(40000000000,  140000000000)
plt.xlabel('총매출액')
plt.ylabel('영화랭킹')
plt.title('top20 총 매출액 비교 (0.4 = 400억원/ 1.4 = 1400억원)')
plt.show()<jupyter_output><empty_output><jupyter_text>&nbsp; 원작이 있는 영화의 ``총 매출액`` TOP20를 보면 주로 해외 영화였다. 마블 코믹스의 영화가 주를 이루었다. 원작이 없는 영화의 총 매출액 TOP20르 보면, 아바타, 보헤미안 랩소디, 인터스텔라, 트랜스포머등을 제외 하면 주로 한국 영화 또는 한국 감독이 감독한 영화 였다. &nbsp; 원작이 있는 영화와 없는 영화 총 매출액 기준 TOP20를 비교 해보면 원작이 없는 영화의 총 매출액이 원작 있는 영화의 총 매출액 보다 훨씬 많다는것을 알 수 있다. 1위의 매출액만 보아도 약 200억원 이상이 차이남을 알 수 있고 1위 외에도, 각 순위별로 원작이 없는 영화의 총 매출액이 없는 영화보다 평균 약 200억원 정도 매출액이 더 많음을 알 수 있다.  2) 총 관객수를 기준으로 비교<jupyter_code>#총 관객수 기준으로 정렬 후 top20 를 가지고 온다
has_original = has_original.sort_values(["audiAcc"], ascending=[False])
no_original = no_original.sort_values(["audiAcc"], ascending=[False])
selected_has_original = (has_original[["movieNm","audiAcc"]])[:20].sort_values("audiAcc")
selected_no_original = (no_original[["movieNm","audiAcc"]])[:20].sort_values("audiAcc")

#원작 있는 영화 Top20의 총 관객수를 bar 그래프로 그린다
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
y = np.arange(20)
plt.barh(y, selected_has_original["audiAcc"], height=0.5)
plt.yticks(y, selected_has_original["movieNm"])
plt.xlim(5000000,  18000000)
plt.xlabel('총관객수')
plt.ylabel('영화이름')
plt.title('원작 있는 영화의 top20 총관객수(0.6 = 600만/ 1.8 = 1800만)')
plt.show()

#원작 없는 영화 Top20의 총 관객수를 bar 그래프로 그린다
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
y = np.arange(20)
plt.barh(y, selected_no_original["audiAcc"], height=0.5)
plt.yticks(y, selected_no_original["movieNm"])
plt.xlim(5000000,  18000000)
plt.xlabel('총관객수')
plt.ylabel('영화이름')
plt.title('원작 없는 영화의 top20 총관객수(0.6 = 600만/ 1.8 = 1800만)')
plt.show()


#둘의 비교를 위해 영화 이름을 제외 하고 랭크 순으로 비교 한다.
rank = []

for i in range (1,21):
    rank.append(str(21-i)+'위')

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
y = np.arange(20)
plt.barh(y-0.2, selected_has_original["audiAcc"], label='원작 있는 영화', height=0.4, color='#ff6600')
plt.barh(y+0.2, selected_no_original["audiAcc"], label='원작 없는 영화', height=0.4, color='#0066ff')
plt.yticks(y, rank)
plt.xlim(5000000,  18000000)
plt.xlabel('총관객수')
plt.ylabel('영화랭킹')
plt.title('top20 총관객수 비교 (0.6 = 600만/ 1.8 = 1800만)')
plt.show()<jupyter_output><empty_output><jupyter_text>&nbsp; ``총 관객수`` 기준 원작이 없는 영화 그리고 원작이 있는 영화 TOP 20의 경우 총 매출액 기준 TOP20와 큰 차이가 없었다. 총 관객수 TOP20 순위별 비교의 경우, 위의 그래프와 마찬가지로 원작이 없는 영화가 눈에 띄게 총 관객수가 더 많았다.  3)  누적 스크린 수 대비 총 관객수, 누적 상영횟수 대비 총 관객수<jupyter_code>#총 관객수 기준으로 정렬 후 top40 를 가지고 온다
movielist = movielist.sort_values(["audiAcc"], ascending=[False])
selected_list = (movielist[["movieNm","scrnCnt","audiAcc"]])[:40].sort_values("audiAcc")

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
value = selected_list["movieNm"].values.tolist()
x = selected_list["scrnCnt"].values.tolist()
y = selected_list["audiAcc"].values.tolist()

#누적 스크린 수 대비 관객수로 그래프를 그린다
for i,type in enumerate(value):
    _x = x[i]
    _y = y[i]
    plt.scatter(_x, _y)
    plt.text(_x+0.3, _y+0.3, type, fontsize=9)
plt.xlabel('누적 스크린 수')
plt.ylabel('관객수')
plt.title('TOP 40 누적 스크린수 대비 관객수')
plt.show()

plt.show()

#총 관객수 기준으로 정렬 후 top40 를 가지고 온다
movielist = movielist.sort_values(["audiAcc"], ascending=[False])
selected_list = (movielist[["movieNm","showCnt","audiAcc"]])[:40].sort_values("audiAcc")

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
value = selected_list["movieNm"].values.tolist()
x = selected_list["showCnt"].values.tolist()
y = selected_list["audiAcc"].values.tolist()

#누적 상영횟수 대비 관객수로 그래프를 그린다
for i,type in enumerate(value):
    _x = x[i]
    _y = y[i]
    plt.scatter(_x, _y)
    plt.text(_x+0.3, _y+0.3, type, fontsize=9)
plt.xlabel('누적 상영횟수')
plt.ylabel('관객수')
plt.title('TOP 40 누적 상영횟수 대비 관객수')
plt.show()

plt.show()<jupyter_output><empty_output><jupyter_text>&nbsp;``TOP 40 누적 스크린수 대비 관객수`` 그래프를 분석하면,  y = x를 기준으로 봤을때, 명량, 아바타,국제시장, 극한직업과 같은 영화들은 스크린 독점과 관객수와 관련이 없다고 판단이 된다. 하지만, 보헤미안 랩소디나 어벤져스 인피니티워 같은 경우, 스크린 할당 수는 다른 영화보다 매우 높은 편인 반면, 관객 수는 그에 미치지 못한다. 또한 주로 원작이 있는 영화가 스크린 독점이 강한 성향을 보이고 있다. 즉, 저 관객 수 중 일부는 스크린 독점으로 인해, 영화 상영 당시 영화의 선택 폭이 줄어 어쩔 수 없이 영화를 시청해야 했었던 관객도 있었을 것이라고 생각 한다. &nbsp;``TOP 40 누적 상영횟수 대비 관객수``그래프 역시 누적 스크린수 대비 관객수 그래프와 비슷하게 나왔다. 즉 누적 스크린 수 대비 관객수와 같게 분석 할 수 있다.   6. 결론&nbsp; 처음에 설정한 가설 ``원작이 있는 영화가 더 흥행 할 것이다``을 증명 하기 위해 원작이 있는 영화 데이터와, 근 15년간의 주간 박스 오피스 데이터를 가지고와 역대 박스 오피스 데이터로 재구성해 원작 있는 영화 그리고 없는 영화 TOP 20를 분석 하였다. 그 결과 해당 가설은 옳지 않음을 알 수 있었다. 위의 분석 결과를 정리 하면 다음과 같다.1. 원작이 없는 영화의 경우 총 매출액이 약 200억정도 더 많음2. 원작이 없는 영화의 총 관객수 또한 약 500만 정도 더 많음3. 스크린 독점 또한 원작이 있는 영화 보다 심하지 않아 스크린 독점이 관객수에 크게 영향을 미치지 않았음&nbsp; 해당 가설이 옳지 않았다는 결론이 나오게 된 이유를 생각해 보면 다음과 같다고 생각 할 수 있다. 우선 원작이 없는 영화 TOP20의 경우 대부분 한국 영화이다. 한국 영화의 경우 시사회, 방송, 배우들의 무대 인사등 다양한 방법으로 마케팅을 많이 한다. 그리고 입소문을 많이 타는 경향이 있다. 이 때문에 외국 영화보다 많은 관객수를 끌어들일 수 있었던 것 같다고 생각 한다. &nbsp; 또한 해당 데이터를 얻어오는 시점의 문제가 있었다고 생각한다. 해당 데이터를 얻어온 시점은 ``pd.date_range("2004-01-01","2019-05-12",freq='W-MON')`` 이다. 즉, 원작이 있는 영화의 1위 영화인 어벤져스 : 엔드게임이 상영하고 있었던 기간이다. 원작 있는 영화의 1위 데이터가 원작 없는 1위 데이터와 다르게 완전한 데이터가 아니라는 것이다. 이를 감안 하고 분석한 결과이다.  7. 참고 문헌- 역대 박스 오피스 http://www.kobis.or.kr/kobis/business/stat/boxs/findFormerBoxOfficeList.do- 시계열 자료 다루기 https://datascienceschool.net/view-notebook/8959673a97214e8fafdb159f254185e9/ - 나만의 웹 크롤러 만들기 with Requests/BeautifulSoup  https://beomi.github.io/2017/01/20/HowToMakeWebCrawler/ - Pandas 0.24.2 Documentation  https://pandas.pydata.org/pandas-docs/stable/index.html- 파이썬으로 데이터 분석하자 (4) - Pandas 기본  https://sacko.tistory.com/18- Python Matplotlib - 가로 막대 그래프 기초 3(다중 막대 그래프)https://developer-ankiwoong.tistory.com/214?category=797931- matplotlib scatter plot annotate / set text at / label each point https://www.pythonmembers.club/2018/05/08/matplotlib-scatter-plot-annotate-set-text-at-label-each-point/  8. 별첨1: (3)의 획득한 데이터 원본 - 원작이 있는 데이터 원본 예시``wiki_data.txt`` 중 일부이다. 완전한 데이터 원본은 ``wiki_data.txt``를 참고 ```강철의 연금술사 (영화)그녀는 거짓말을 너무 사랑해넥스트 제네레이션 패트레이버노다메 칸타빌레 최종악장노부나가 콘체르토논짱 도시락뇌내 포이즌 베리닌자 거북이 (영화)닌자 거북이 TMNT닌자보이 란타로닌자터틀닌자터틀: 어둠의 히어로도로로 (영화) ``` - 주간 박스 오피스 데이터 원본 예시``movie_raw_data.txt`` 중 일부이다. 데이터 형식은 json이다. 원본 데이터는 ``movie_raw_data.txt``를 참고.```{'boxOfficeResult':     {'boxofficeType': '주간 박스오피스', 'showRange': '20040105~20040111', 'yearWeekTime': '200402', 'weeklyBoxOfficeList': [{'rnum': '1', 'rank': '1', 'rankInten': '0', 'rankOldAndNew': 'OLD', 'movieCd': '20030410', 'movieNm': '실미도', 'openDt': '2003-12-24', 'salesAmt': '1743325000', 'salesShare': '46.1', 'salesInten': '99739000', 'salesChange': '6.1', 'salesAcc': '4117849500', 'audiCnt': '273863', 'audiInten': '14727', 'audiChange': '5.7', 'audiAcc': '647712', 'scrnCnt': '49', 'showCnt': '1843'}, {'rnum': '2', 'rank': '2', 'rankInten': '0', 'rankOldAndNew': 'OLD', 'movieCd': '20030316', 'movieNm': '반지의 제왕 : 왕의 귀환', 'openDt': '2003-12-17', 'salesAmt': '736133500', 'salesShare': '19.5', 'salesInten': '-293695500', 'salesChange': '-28.5', 'salesAcc': '3409265500', 'audiCnt': '117833', 'audiInten': '-48482', 'audiChange': '-29.2', 'audiAcc': '548189', 'scrnCnt': '44', 'showCnt': '1155'}, {'rnum': '3', 'rank': '3', 'rankInten': '7', 'rankOldAndNew': 'OLD', 'movieCd': '20030430', 'movieNm': '라스트 사무라이', 'openDt': '2004-01-09', 'salesAmt': '556340000', 'salesShare': '14.7', 'salesInten': '554415500', 'salesChange': '28808.3', 'salesAcc': '558264500', 'audiCnt': '87988', 'audiInten': '87712', 'audiChange': '31779.7', 'audiAcc': '88264', 'scrnCnt': '35', 'showCnt': '730'}, {'rnum': '4', 'rank': '4', 'rankInten': '-1', 'rankOldAndNew': 'OLD', 'movieCd': '20030420', 'movieNm': '동해물과 백두산이', 'openDt': '2003-12-31', 'salesAmt': '393291000', 'salesShare': '10.4', 'salesInten': '-165134000', 'salesChange': '-29.6', 'salesAcc': '957631000', 'audiCnt': '62006', 'audiInten': '-25127', 'audiChange': '-28.8', 'audiAcc': '150056', 'scrnCnt': '20', 'showCnt': '909'}, {'rnum': '5', 'rank': '5', 'rankInten': '-1', 'rankOldAndNew': 'OLD', 'movieCd': '20030404', 'movieNm': '러브 액츄얼리', 'openDt': '2003-12-05', 'salesAmt': '139352000', 'salesShare': '3.7', 'salesInten': '-76529500', 'salesChange': '-35.4', 'salesAcc': '1221928000', 'audiCnt': '21289', 'audiInten': '-11620', 'audiChange': '-35.3', 'audiAcc': '187172', 'scrnCnt': '10', 'showCnt': '264'}, {'rnum': '6', 'rank': '7', 'rankInten': '-1', 'rankOldAndNew': 'OLD', 'movieCd': '20030426', 'movieNm': '더 캣', 'openDt': '2003-12-31', 'salesAmt': '76723000', 'salesShare': '2.0', 'salesInten': '-32066000', 'salesChange': '-29.5', 'salesAcc': '185512000', 'audiCnt': '12677', 'audiInten': '-5049', 'audiChange': '-28.5', 'audiAcc': '30403', 'scrnCnt': '12', 'showCnt': '346'}, {'rnum': '7', 'rank': '8', 'rankInten': '-1', 'rankOldAndNew': 'OLD', 'movieCd': '20030350', 'movieNm': '올드보이', 'openDt': '2003-11-21', 'salesAmt': '49121000', 'salesShare': '1.3', 'salesInten': '-17371000', 'salesChange': '-26.1', 'salesAcc': '1897548500', 'audiCnt': '7634', 'audiInten': '-2674', 'audiChange': '-25.9', 'audiAcc': '294319', 'scrnCnt': '5', 'showCnt': '119'}, {'rnum': '8', 'rank': '9', 'rankInten': '-1', 'rankOldAndNew': 'OLD', 'movieCd': '20030408', 'movieNm': '해피 에로 크리스마스', 'openDt': '2003-12-17', 'salesAmt': '4716500', 'salesShare': '0.1', 'salesInten': '-33002500', 'salesChange': '-87.5', 'salesAcc': '459220000', 'audiCnt': '702', 'audiInten': '-4885', 'audiChange': '-87.4', 'audiAcc': '71441', 'scrnCnt': '6', 'showCnt': '51'}, {'rnum': '9', 'rank': '10', 'rankInten': '0', 'rankOldAndNew': 'NEW', 'movieCd': '20030433', 'movieNm': '말죽거리 잔혹사', 'openDt': '2004-01-16', 'salesAmt': '2175500', 'salesShare': '0.1', 'salesInten': '2175500', 'salesChange': '100.0', 'salesAcc': '2175500', 'audiCnt': '284', 'audiInten': '284', 'audiChange': '100.0', 'audiAcc': '284', 'scrnCnt': '1', 'showCnt': '1'}]    }}```  9. 별첨2: (4)의 가공된 데이터 원본``movie_data.csv``중 일부 데이터, 50개이다. 영화 이름, 총 매출액, 총 관객수, 총 상영한 스크린 횟수, 총 상영 횟수, 원작 여부를 저장하였다. 원본은 ``movie_data.csv``를 참고.  ```movieNm,salesAcc,audiAcc,scrnCnt,showCnt,hasOriginal실미도,10858321500,1708985,348,11826,0반지의 제왕 : 왕의 귀환,4297594000,691077,120,2464,1라스트 사무라이,1901421500,298634,129,3056,0동해물과 백두산이,1041198500,163084,36,1260,0러브 액츄얼리,1891134108,276343,123,1516,0더 캣,185512000,30403,12,346,0올드보이,1897548500,294319,5,119,1해피 에로 크리스마스,459220000,71441,6,51,0말죽거리 잔혹사,3834994000,604625,177,5487,0내사랑 싸가지,1828895000,294918,82,2879,0피터 팬,831929500,138547,59,1521,0빙우,322899500,49463,34,828,0브라더 베어,104735000,15887,18,240,0페이첵,832432500,130266,61,1673,1안녕! 유에프오,246417500,39682,31,796,0그녀를 모르면 간첩,146877500,23907,16,476,0런어웨이,92187500,14532,11,199,0태극기 휘날리며,15680941000,2542870,746,22242,0베이직,74411000,11597,23,489,0사랑할 때 버려야 할 아까운 것들,790557000,121364,58,1378,0열두명의 웬수들 ,80004000,12618,24,408,0자토이치,144138000,22338,6,99,0목포는 항구다,2662114000,423833,157,6137,0그녀를 믿지 마세요,1791543000,287380,114,4204,0콜드 마운틴,308899500,48670,44,877,0사랑도 통역이 되나요?,163676000,25153,29,676,0스파이 키드 3D,34331500,5663,3,50,0타임라인,90901500,14412,20,383,0스쿨 오브 락,135408000,21585,37,591,08명의 여인들,45975500,7205,10,157,1사마리아,264384000,41580,46,1424,0빅 피쉬,435353000,66031,41,1052,0휴먼 스테인,76406500,11901,14,298,0어디선가 누군가에 무슨일이 생기면 틀림없이 나타난다 홍반장,1141231000,178900,103,3464,0어깨동무,722932000,114906,77,2651,0헌티드,155582000,24440,30,837,0모나리자 스마일,224228000,34941,36,987,0히달고,178098000,27991,30,786,0맹부삼천지교,1346611000,216251,135,4400,0아홉살 인생,492547000,79738,78,2132,1허니 ,99903000,15229,13,354,1패션 오브 크라이스트,5300866500,835216,307,9513,0어린 신부,6233979000,990624,384,12796,0마지막 늑대,272413500,42850,52,1330,0폴리와 함께,177086000,26728,49,877,0고티카,136434500,21018,31,666,0바람의 전설,611858000,94096,102,2701,1저지 걸,551868000,86084,83,2406,0범죄의 재구성,6111808000,938870,345,11223,0```  10. 별첨3: (3)을 (4)로 변환하는 등의 작업을 위하여 본인이 직접 개발한 Python 소스코드 원본<jupyter_code>import pandas as pd
import datetime
import requests
from bs4 import BeautifulSoup
import json

# 원작이 있는 영화 크롤링을 위한 url 주소 및 selector
url_list= {
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%A7%8C%ED%99%94%EB%A5%BC_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:DC_%ED%99%95%EC%9E%A5_%EC%9C%A0%EB%8B%88%EB%B2%84%EC%8A%A4_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%8B%A4%ED%81%AC_%ED%98%B8%EC%8A%A4_%EC%BD%94%EB%AF%B9%EC%8A%A4%EC%9D%98_%EC%98%81%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%A7%88%EB%B8%94_%EC%BD%94%EB%AF%B9%EC%8A%A4%EC%9D%98_%EC%98%81%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%AF%B8%EA%B5%AD_%EB%A7%8C%ED%99%94%EB%A5%BC_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EA%B0%80%ED%95%84%EB%93%9C_%EC%98%81%ED%99%94':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD_%EB%A7%8C%ED%99%94%EB%A5%BC_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%ED%97%88%EC%98%81%EB%A7%8C_%EC%9B%90%EC%9E%91%EC%9D%98_%EC%98%81%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EC%9D%98_%EC%9B%B9_%EB%A7%8C%ED%99%94%EB%A5%BC_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EC%9B%B9%ED%88%B0%EC%9D%84_%EC%9B%90%EC%9E%91%EC%9C%BC%EB%A1%9C_%EC%82%BC%EC%9D%80_%EC%98%81%ED%99%94_%EB%AA%A9%EB%A1%9D':'#mw-content-text > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EA%B0%95%ED%92%80_%EC%9B%90%EC%9E%91%EC%9D%98_%EC%98%81%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%A7%8C%ED%99%94%EB%A5%BC_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%8B%A4%EC%82%AC%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%A7%8C%ED%99%94%EC%9D%98_%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98_%EC%98%81%ED%99%94%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:DC_%EC%BD%94%EB%AF%B9%EC%8A%A4_%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98_%EC%98%81%ED%99%94':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%B0%B0%ED%8A%B8%EB%A7%A8_%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%8A%88%ED%8D%BC%EB%A7%A8_%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%A0%80%EC%8A%A4%ED%8B%B0%EC%8A%A4_%EB%A6%AC%EA%B7%B8_%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%82%98%EB%A3%A8%ED%86%A0_%EA%B7%B9%EC%9E%A5%ED%8C%90':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%9D%BC%EB%B3%B8_%EB%A7%8C%ED%99%94%EB%A5%BC_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/w/index.php?title=%EB%B6%84%EB%A5%98:%EC%86%8C%EC%84%A4%EC%9D%84_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94&pageuntil=%EB%B0%94%EB%9E%8C%EC%9D%98+%EC%A0%84%EC%84%A4+%282004%EB%85%84+%EC%98%81%ED%99%94%29#mw-pages':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/w/index.php?title=%EB%B6%84%EB%A5%98:%EC%86%8C%EC%84%A4%EC%9D%84_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94&pagefrom=%EB%B0%94%EB%9E%8C%EC%9D%98+%EC%A0%84%EC%84%A4+%282004%EB%85%84+%EC%98%81%ED%99%94%29#mw-pages':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/w/index.php?title=%EB%B6%84%EB%A5%98:%EC%86%8C%EC%84%A4%EC%9D%84_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94&pagefrom=%EC%99%95%EC%9D%98+%EB%94%B8#mw-pages':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/w/index.php?title=%EB%B6%84%EB%A5%98:%EC%86%8C%EC%84%A4%EC%9D%84_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94&pagefrom=%ED%99%98%EC%83%9D+%282003%EB%85%84+%EC%98%81%ED%99%94%29#mw-pages':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%8B%A8%ED%8E%B8%EC%86%8C%EC%84%A4%EC%9D%84_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:SF_%EC%86%8C%EC%84%A4%EC%9D%98_%EC%98%81%ED%99%94%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EA%B3%B5%ED%8F%AC_%EC%86%8C%EC%84%A4%EC%9D%84_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%A1%9C%EB%A7%A8%EC%8A%A4_%EC%86%8C%EC%84%A4%EC%9D%98_%EC%98%81%ED%99%94%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%AF%B8%EA%B5%AD%EC%9D%98_%EC%86%8C%EC%84%A4%EC%9D%84_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%A1%B0%EB%A1%9C_%EC%98%81%ED%99%94':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%8A%A4%EB%A6%B4%EB%9F%AC_%EC%86%8C%EC%84%A4%EC%9D%84_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%86%8C%EC%84%A4%EC%9D%84_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98_%EC%98%81%ED%99%94':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%98%81%EA%B5%AD%EC%9D%98_%EC%86%8C%EC%84%A4%EC%9D%84_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EA%B3%B0%EB%8F%8C%EC%9D%B4_%ED%91%B8_%EC%98%81%ED%99%94':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%A0%9C%EC%9E%84%EC%8A%A4_%EB%B3%B8%EB%93%9C_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%ED%8C%90%ED%83%80%EC%A7%80_%EC%86%8C%EC%84%A4%EC%9D%98_%EC%98%81%ED%99%94%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%B0%98%EC%A7%80%EC%9D%98_%EC%A0%9C%EC%99%95_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%ED%98%B8%EB%B9%97_%EC%82%BC%EB%B6%80%EC%9E%91':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%8A%A4%ED%8B%B0%EB%B8%90_%ED%82%B9_%EC%9B%90%EC%9E%91%EC%9D%98_%EC%98%81%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%82%98%EB%8B%88%EC%95%84_%EC%97%B0%EB%8C%80%EA%B8%B0_%EC%98%81%ED%99%94':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%9D%B4%EC%83%81%ED%95%9C_%EB%82%98%EB%9D%BC%EC%9D%98_%EC%95%A8%EB%A6%AC%EC%8A%A4_%EC%98%81%ED%99%94':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%ED%8A%B8%EC%99%80%EC%9D%BC%EB%9D%BC%EC%9E%87_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%ED%95%B4%EB%A6%AC_%ED%8F%AC%ED%84%B0_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B9%84%EB%94%94%EC%98%A4_%EA%B2%8C%EC%9E%84%EC%9D%84_%EC%9B%90%EC%9E%91%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94_%EB%AA%A9%EB%A1%9D':'#mw-content-text > div > table > tbody > tr > td > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%ED%9D%AC%EA%B3%A1%EC%9D%84_%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C_%ED%95%9C_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%AE%A4%EC%A7%80%EC%BB%AC%EC%9D%98_%EC%98%81%ED%99%94%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%98%A4%ED%8E%98%EB%9D%BC%EC%9D%98_%EC%98%81%ED%99%94%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EA%B9%80%EC%9A%A9_%EC%9B%90%EC%9E%91%EC%9D%98_%EC%98%81%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%95%8C%EB%A0%89%EC%83%81%EB%93%9C%EB%A5%B4_%EB%92%A4%EB%A7%88_%EC%9B%90%EC%9E%91%EC%9D%98_%EC%98%81%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%B0%B0%EC%8A%A4_%EB%94%94%ED%82%A8%EC%8A%A4_%EC%9B%90%EC%9E%91%EC%9D%98_%EC%98%81%ED%99%94_%EC%9E%91%ED%92%88' : '#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%9C%8C%EB%A6%AC%EC%97%84_%EC%85%B0%EC%9D%B5%EC%8A%A4%ED%94%BC%EC%96%B4_%EC%9B%90%EC%9E%91%EC%9D%98_%EC%98%81%ED%99%94_%EC%9E%91%ED%92%88' : '#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%ED%9E%88%EA%B0%80%EC%8B%9C%EB%85%B8_%EA%B2%8C%EC%9D%B4%EA%B3%A0_%EC%9B%90%EC%9E%91%EC%9D%98_%EC%98%81%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%A7%88%ED%81%AC_%ED%8A%B8%EC%9B%A8%EC%9D%B8_%EC%9B%90%EC%9E%91%EC%9D%98_%EC%98%81%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%A0%88%ED%94%84_%ED%86%A8%EC%8A%A4%ED%86%A0%EC%9D%B4_%EC%9B%90%EC%9E%91%EC%9D%98_%EC%98%81%ED%99%94_%EC%9E%91%ED%92%88' : '#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%A7%88%EC%9D%B4%ED%81%B4_%ED%81%AC%EB%9D%BC%EC%9D%B4%ED%8A%BC_%EC%9B%90%EC%9E%91%EC%9D%98_%EC%98%81%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%A5%98_%EB%B2%A0%EB%A5%B8_%EC%9B%90%EC%9E%91%EC%9D%98_%EC%98%81%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%B9%85%ED%86%A0%EB%A5%B4_%EC%9C%84%EA%B3%A0_%EC%9B%90%EC%9E%91%EC%9D%98_%EC%98%81%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:H._G._%EC%9B%B0%EC%8A%A4_%EC%9B%90%EC%9E%91%EC%9D%98_%EC%98%81%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%ED%83%80%EC%9E%94_%EC%98%81%ED%99%94' : '#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%ED%95%9C%EC%8A%A4_%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8B%B0%EC%95%88_%EC%95%88%EB%8D%B0%EB%A5%B4%EC%84%BC_%EC%9B%90%EC%9E%91%EC%9D%98_%EC%98%81%ED%99%94_%EC%9E%91%ED%92%88':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%8A%A4%ED%8C%8C%EC%9D%B4%EB%8D%94%EB%A7%A8_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EB%A7%A8_%EC%9D%B8_%EB%B8%94%EB%9E%99':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%ED%8C%90%ED%83%80%EC%8A%A4%ED%8B%B1_%ED%8F%AC_%EC%98%81%ED%99%94':'#mw-pages > div > ul > li > a',
   'https://ko.wikipedia.org/wiki/%EB%B6%84%EB%A5%98:%EC%97%91%EC%8A%A4%EB%A7%A8_%EC%98%81%ED%99%94':'#mw-pages > div > div > div > ul > li > a'

}



# 영화 data 오픈 api를 통해 얻기
_key = "05514fa4c26ae02602c818773b7069ed"
_tagetDT = ""
# 2004년부터 현재의 date까지 매주 월요일
crawl_date = pd.date_range("2004-01-01","2019-05-12",freq='W-MON')
string_date=crawl_date.strftime('%Y%m%d')
movie_data = {'movieNm':[],'salesAcc':[],'audiAcc':[],'scrnCnt':[],'showCnt':[], 'hasOriginal':[]}
temp = []

for date in string_date:
    _tagetDT = date
    params = {'key': _key, 'targetDt':_tagetDT, 'weekGb':"0"}
    res=requests.get('http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchWeeklyBoxOfficeList.json', params=params)
    
    for item in res.json()['boxOfficeResult']['weeklyBoxOfficeList']:
#         print("Name:"+item['movieNm']+" salesAcc:"+item['salesAcc']+" audiAcc:"+item['audiAcc']+" scrnCnt:"+item['scrnCnt']+" showCnt:"+item['showCnt'])
        
        #scrnCnt와 showCnt는 string형태로 반환 된다. 따라서 연산을 진행 하기 위해 int 형으로 변환한다.  
        _screencnt = int(item['scrnCnt'])
        _showcnt = int(item['showCnt'])
       
        # 추가 설명은 삭제한다. 
        if '(' in item['movieNm'] : 
             item['movieNm'] = item['movieNm'].split('(')[0]
                
        # 이미 movie_data에 해당 영화가 있으면 정보를 업데이트 한다.
        if item['movieNm'] in movie_data['movieNm']:
            index = movie_data['movieNm'].index(item['movieNm'])
            movie_data['scrnCnt'][index] += _screencnt
            movie_data['showCnt'][index] += _showcnt
            movie_data['audiAcc'][index] = item['audiAcc']
            movie_data['salesAcc'][index] = item['salesAcc']
            
        # movie_data에 해당 영화가 없으면 정보를 새로 넣어준다.   
        else:
            movie_data['movieNm'].append(item['movieNm'])
            movie_data['salesAcc'].append(item['salesAcc'])
            movie_data['audiAcc'].append(item['audiAcc'])
            movie_data['scrnCnt'].append(_screencnt)
            movie_data['showCnt'].append(_showcnt)

# movie_data에 있는 영화 이름 원소 갯수 만큼 원작의 원소를 0으로 초기화 한다.        
for i in range (len(movie_data['movieNm'])):
    movie_data['hasOriginal'].append(0)
    
#원작이 있는 영화 목록 크롤링 하기

#크롤링시 영화 이름의 중복이 발생 할 수 있다. 따라서 set을 사용해 중복을 막는다. 
movie_set = set()

for url,selector in url_list.items():
    #wiki에서 requests와 beautifulsoup을 사용해 크롤링 해온다. 
    response = requests.get(url)
    html = response.text
    soup = BeautifulSoup(html,"html.parser")
    div_class = soup.select(selector)
    
    # 크롤링한 데이터 후처리를 한다. 
    for i in div_class:
        _movie_name = str(i).split('>')[1]
        _movie_name = _movie_name.split('<')[0]
        if '(' in _movie_name:
           _movie_name = _movie_name.split('(')[0]
        if '&amp;' in _movie_name:
            _movie_name = _movie_name.replace('&amp;','&')
        if ' VS.' in _movie_name:
           _movie_name = _movie_name.replace('VS.','VS')
        if _movie_name[-1] == " ":
            _movie_name = _movie_name[0:-1]
        if '1부' in _movie_name:
            _movie_name = _movie_name.replace(' 1부','1')
        if '2부' in _movie_name:
            _movie_name = _movie_name.replace(' 2부','2')
        movie_set.add(_movie_name)   

# 크롤링한 데이터와 영화 데이터 매칭을 한다. 이때 띄어쓰기는 무시하고 매칭을 진행한다.
for ele in movie_set:
    for movie in movie_data['movieNm']:
        if '"' in movie:
            movie = movie.split('"')[1]
        isTrue = True
        iter1 = 0
        iter2 = 0

        while isTrue == True:    
            if iter1 == len(ele) or iter2 == len(movie) : 
                break
            else:
                if ele[iter1] == " ": iter1 += 1
                if movie[iter2] == " ": iter2 += 1
                if(iter2 == len(movie)) : break
                if ele[iter1] == movie[iter2]:
                    iter1 += 1
                    iter2 += 1
                    if(iter1 == len(ele) and iter2 == len(movie)) : break
                else:
                     isTrue = False

        if isTrue == True :
            index = movie_data['movieNm'].index(movie)
            movie_data['hasOriginal'][index] = 1
            
                
# movie_data.csv파일에 저장한다.    
df2 = pd.DataFrame(movie_data, columns=['movieNm','salesAcc','audiAcc','scrnCnt','showCnt','hasOriginal'])
df2.to_csv('movie_data.csv',sep=',',encoding='UTF-8', index=False)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.209526446967599, 'fraction_numerical': 0.13630573248407643, 'mean_word_length': 5.041659695499415, 'pattern_counts': {'":': 3, '<': 23, '<?xml version=': 0, '>': 361, 'https://': 73, 'lorem ipsum': 0, 'www.': 6, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 10, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '603092', 'license': 'MIT', 'n_tokens_mistral': 24822, 'n_tokens_neox': 25553, 'n_words': 3218, 'path': 'main.ipynb', 'repo_name': 'kathryn-choi/movie_data_analysis', 'size': '36110'}