스터디 노트(EDA 3-2)

zoe·2023년 4월 3일
0

1. 네이버 영화 평점 사이트 분석

  • 네이버 영화 페이지 종료로 다음 영화 페이지로 진행
    - https://movie.daum.net/ranking/boxoffice/weekly

  • 영화랭킹 탭 이동

  • 영화랭킹에서 박스오피스 선택



  • 웹 페이지 주소에는 많은 정보가 담겨 있다

  • 원하는 정보를 얻기 위해서 변화시켜줘야 하는 주소의 규칙을 찾을 수 있다

# requirments

import pandas as pd
from urllib.request import urlopen
from bs4 import BeautifulSoup
url = "https://movie.daum.net/ranking/boxoffice/weekly"

response = urlopen(url)
#response.status

soup = BeautifulSoup(response, "html.parser")
print(soup.prettify())
# 영화 제목 태그


#soup.select("strong.tit_item>a.link_txt")
#soup.select(".tit_item")[0].find("a").text
#soup.select(".tit_item")[0].select_one("a").get_text()

#soup.find_all("strong", "tit_item")[0].a.text
soup.find_all("strong",{"class":"tit_item"})[0].get_text()
# 참고 사이트 :  https://codemate.kr/@bombom/Day-14-%EC%9E%90%EC%9C%A0%EB%A1%9C%EC%9A%B4-%ED%81%AC%EB%A1%A4%EB%A7%81-1



# tbody -> t가 테이블 형태의 태그를 말함
# 영화 관객수 태그

#soup.find_all("span","txt_info")[0].find_all("span","info_txt")[1].text
soup.select(".txt_info")[14].select_one(".screen_out").parent.text
len(soup.find_all("strong","tit_item")), len(soup.find_all("span",{"class":"txt_info"}))
#soup.find_all("span",class_="txt_grade")[0].text
soup.select(".txt_info")[0].select(".info_txt")[1].string
# 영화 제목 리스트

end = len(soup.find_all("strong", {"class":"tit_item"}))

movie_name = []

for n in range(0, end):
    movie_name.append(
        soup.find_all("strong","tit_item")[n].a.string
                )
movie_name
movie_name = [soup.find_all("strong","tit_item")[n].a.get_text() for n in range(0, end)]
movie_name
# 영화 관객수 리스트 
import re


end = len(soup.find_all("span",{"class":"txt_info"}))
movie_audience = []

for n in range(0, end):
    tmp = soup.select(".txt_info")[n].select_one(".screen_out").parent.text
    tmp = tmp.replace("관객수","").replace("명","")
    tmp = re.sub(",", "", tmp)
    
    movie_audience.append(tmp)
movie_audience
# 전체 데이터 수 확인

len(movie_name), len(movie_audience)



2. 자동화를 위한 코드

#url = https://movie.daum.net/ranking/boxoffice/weekly?date=20230327

dates = pd.date_range("2022.01.01", periods=100, freq="D")
date_monday = []
dates[0].weekday()

for date in dates: # 다음 영화의 주간, 월간, 년간 데이터 제공하여 주간 데이터를 수집하는 것으로 변경
    if date.weekday() == 0:
        date_monday.append(date)
date_monday
date_monday[0]
date_monday[0].strftime("%Y.%m.%d") , date_monday[0].strftime('%Y%m%d')
# 문자열 format

test_string = "Hi, I'm {name}"
test_string.format(name = "hong gil dong")
#dir(test_string)
import time
from tqdm import tqdm
import re

movie_date = []
movie_name = []
movie_audience = []

for today in tqdm(date_monday):
    url = "https://movie.daum.net/ranking/boxoffice/weekly?date={date}"
    response = urlopen(url.format(date = today.strftime('%Y%m%d')))
    soup = BeautifulSoup(response, "html.parser")
    
    end = len(soup.find_all("span",{"class":"txt_info"}))
    
    movie_date.extend([today for _ in range(0, end)])
    
    movie_name.extend([soup.find_all("strong","tit_item")[n].a.string for n in range(0, end)])
    
    
    for n in range(0, end):
        tmp = soup.select(".txt_info")[n].select_one(".screen_out").parent.text
        tmp = tmp.replace("관객수","").replace("명","")
        tmp = re.sub(",", "", tmp) 
        #print(temp)
        movie_audience.append(tmp)
    
    time.sleep(0.5)
    
len(movie_date), len(movie_name), len(movie_audience)
movie_audience
movie = pd.DataFrame({
    "date":movie_date, 
    "name":movie_name,
    "audience":movie_audience
})
movie.tail()
movie.info()
movie["audience"] = movie["audience"].astype(float) #astype() : 데이터형 변경
movie.info()
# 데이터 저장

movie.to_csv("../data/03. daum_movie_data.csv", sep=",", encoding="utf-8")
df = pd.read_csv("../data/03. daum_movie_data.csv", index_col=0)
df



3. 영화 평점 데이터 정리

import numpy as np
import pandas as pd
movie = pd.read_csv("../data/03. daum_movie_data.csv", index_col=0)
movie.tail()
# 영화 이름으로 인덱스 설정
# 점수(daum 영화 관객수)의 합산 구하기
# 100일(daum 영화 기간 설정) 간 네이버(다음) 영화 평점(관객수) 기준 베스트&워스트 100 선정
# pivot table

movie_unique = pd.pivot_table(data = movie, index="name", aggfunc=np.sum)
movie_best = movie_unique.sort_values(by="audience", ascending=False) # 내림차순
movie_best.head()
tmp = movie.query("name == ['스파이더맨: 노 웨이 홈']") # 총 관객수로 누적된 값이라 그래프가 적절하진 않다;;
tmp
# 시각화

import matplotlib.pyplot as plt
from matplotlib import rc

rc("font", family="Malgun Gothic") # mac : Arial Unicode MS
#%matplotlib inline
get_ipython().run_line_magic("matplotlib", "inline")
# 총 관객수로 누적된 값이라 그래프가 적절하진 않다;;


plt.figure(figsize = (20, 8)) # x : 20 , y : 8
plt.plot(tmp["date"], tmp["audience"]) # 선 그래프 x축 날짜, y축 평점(관객수) → 날짜에 따른 평점(관객수 ) 변화를 선 그래프로 표현(시계열)
plt.xlabel("날짜")
plt.ylabel("관객수") # 평점
plt.xticks(rotation="vertical") #x축 항목을 세로로 표시하기
plt.legend(labels=["관객수 추이"], loc="best") # 평점 # loc = "best" : 가장 좋은 곳에 배치해라
plt.grid(True)
plt.show()
# 상위 10개 영화
movie_best.head(10)
# 하위 10개 영화
movie_best.tail(10)
movie_pivot = pd.pivot_table(data=movie, index="date", columns="name", values="audience")#values="point"
movie_pivot
movie_pivot.to_excel("../data/03. movie_pivot.xlsx")
#movie_pivot.columns = movie_pivot.columns.droplevel()
# 상단에 멀티로 행 이름이 생겼을 때 원하는 행을 삭제해서 줄일 수 있음

  • matplotlib 한글 설정★★★
import platform
import seaborn as sns
from matplotlib import font_manager, rc

path = "C:/Windows/Fonts/malgun.ttf"

if platform.system() == "Darwin": # mac일 경우 한글 설정
    rc("font", family="Arial Unicode MS")
elif platform.system() == "Windows": #window일 경우 한글 설정
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc("font", family = font_name)
else:
    print("Unknown system. sorry")
target_col = ["드라이브 마이 카", "경관의 피", "더 배트맨", "스파이더맨: 노 웨이 홈", "언차티드"]
plt.figure(figsize=(20, 8))
plt.title("날짜별 관객수")
plt.xlabel("날짜")
plt.ylabel("관객수") # 평점
plt.xticks(rotation="vertical")
plt.tick_params(bottom="off", labelbottom="off")
plt.plot(movie_pivot[target_col])
plt.legend(target_col, loc = "best") # plt.legend(target_col, loc = "best") : target_col별로 색을 설정하고 위치는 가장 좋은 곳으로 설정
plt.grid(True)
plt.show()

네이버 영화 페이지가 사라져서 daum 영화 페이지로 해보았는데 평점이 없고 관객수도 누적관객수라 그래프 그리는데에는 적절하지 않았던 것같다.... 😟

💻 출처 : 제로베이스 데이터 취업 스쿨

profile
#데이터분석 #퍼포먼스마케팅 #데이터 #디지털마케팅

0개의 댓글