엘리스에서 제공하는 파이썬 실전 데이터 분석 강의 중
세 번째 주제인 넷플릭스 시청 데이터로 알아보는 데이터형 변환 리뷰 하겠습니다.
1. 주제
- 넷플릭스 시청 데이터 분석하기
- 회원 별로 시청한 작품 정리하기
- 두 작품의 유사도 비교하기
- 예상 선호도 점수 구하기
2. 필자가 해야 하는 것
- preprocess_data(filename) 함수 구현
- reformat_data(title_to_users) 함수 구현
- get_closeness(title_to_users, title1, title2) 함수 구현
- predict_preference(title_to_users, user_to_titles, user, title) 함수 구현
3. preprocess_data(filename) 세부 구현 사항
- 목적 : 입력받은 JSON 형식의 데이터를 딕셔너리 형태로 변환하여 반환합니다. 이때 int()를 이용해 key를 정수로 설정합니다.
- JSON 데이터의 key는 영화 id, value는 유저 id가 담긴 리스트로 구성되어있습니다.
- 각 영화 id에 대해 해당 영화를 시청한 유저들의 id를 담고 있는 리스트가 매칭 된 딕셔너리를 반환합니다.
def preprocess_data(filename):
processed = {}
with open(filename) as file:
# 입력 받은 JSON 파일을 불러와 loaded에 저장한다.
loaded = file.read()
load_json = json.loads(loaded) # json에서 딕셔너리로 전달하는 과정은 loads!
# JSON 형식의 데이터에서 영화와 사용자 정보를 하나씩 가져온다
for title, user in load_json.items():
processed[title] = user
# processed 딕셔너리에 title을 키로, user를 값으로 저장한다.
return processed
실행 결과
- 실행 결과는 {영화 id : [유저 id1, 유저 id2.....]}로 출력이 된다.
- 데이터가 많아서 실행을 중지시켰음에도 계속 출력이 돼서 실행 결과 화면을 첨부하지 못했습니다.
4. reformat_data(title_to_users) 세부 구현 사항
- 목적 : 작품별 시청한 사용자 데이터인 title_to_users가 주어집니다. 이 데이터를 사용자별 시청 작품이 각각 key와 value로 담긴 딕셔너리로 반환합니다.
def reformat_data(title_to_users):
user_to_titles = {}
# 입력받은 딕셔너리에서 영화와 사용자 정보를 하나씩 가져온다.
for title, keys in title_to_users.items():
for key in keys: # 사용자 한명씩 가져온다.
if key in user_to_titles: # 만약 사용자가 user_to_titles에 있으면 해당 사용자의 영화 정보를 추가한다.(리스트 형태)
user_to_titles[key].append(title)
else: # user_to_titles에 사용자 정보가 없을 경우 해당 사용자와 사용자 영화 정보 둘다 추가한다. (리스트 형태)
user_to_titles[key] = [title]
return user_to_titles
실행 결과
- 실행 결과는 {유저 id : [영화 id1, 영화 id2,...],...}로 출력이 된다.
- 데이터가 많아서 실행을 중지시켰음에도 계속 출력이 돼서 실행 결과 화면을 첨부하지 못했습니다.
5. get_closeness(title_to_users, title1, title2) 세부 구현 사항
- 목적 : 두 작품의 유사도를 구합니다.
이때 유사도는 (두 작품을 모두 본 사용자) / (두 작품 중 하나라도 본 사용자)와 같은 형태로 구합니다.
def get_closeness(title_to_users, title1, title2):
# title_to_users를 이용해 title1를 시청한 사용자의 집합을 저장한다.
title1_users = set(title_to_users[title1])
# title_to_users를 이용해 title2를 시청한 사용자의 집합을 저장한다
title2_users = set(title_to_users[title2])
# 두 작품을 모두 본 사용자를 구한다.
both = len(title1_users & title2_users)
# 두 작품 중 하나라도 본 사용자를 구한다.
either = len(title1_users | title2_users)
return both/either # 두 작품의 유사도계산
실행 결과
- 결과는 두 작품의 유사도를 계산하여 반환해준다.
- 위 함수는 아래 predict_preference함수와 같이 동작하기 때문에 최종 결과에서 한 번에 보여줄 예정이다.
6. predict_preference(title_to_users, user_to_titles, user, title) 세부 구현 사항
- 목적 : 작품 1과 사용자 A가 주어졌을 때, 예상 선호도를 계산합니다.
작품 1에 대한 사용자 A의 예상 선호도는 사용자 A가 시청한 모든 작품과 작품 1 유사도의 평균값입니다.
- 예를 들어, 사용자 A가 시청한 3개의 작품과 작품 1의 유사도가 0.6, 0.4, 0.5일 때, 선호도 점수는 0.5입니다.
def predict_preference(title_to_users, user_to_titles, user, title):
# user_to_titles를 이용해 user가 시청한 영화를 저장한다.
titles = user_to_titles[user] # 해당 사용자가 시청한 작품들을 titles에 저장한다.
# get_closeness() 함수를 이용해 유사도를 계산한다.
closeness = []
for my in titles: # 작품을 하나씩 꺼내면서
closeness.append(get_closeness(title_to_users, my, title)) # 내가 시청한 작품과 특정 작품의 유사도를 계산하여 closeness 리스트에 넣는다
return sum(closeness) / len(closeness) # 평균값 계산
7. 결과
![]() |
![]() |
※ 엘리스가 제공한 학습 자료, 콘텐츠의 저작권은 엘리스에 있습니다.
※ COPYRIGHT 2016-2022. ELICE ALL RIGHTS RESERVED.
'Data Projects > mini 데이터 분석 프로젝트' 카테고리의 다른 글
[데이터 분석 스터디/항공사 고객 만족도 예측] 항공사 고객 만족도 예측 보충 EDA + 전처리 + 학습 (0) | 2022.02.11 |
---|---|
[데이터 분석 스터디/항공사 고객 만족도 예측] 항공사 고객 만족도 예측 EDA (0) | 2022.02.08 |
[데이터 분석 스터디] 02 영어 단어 모음으로 시작하는 텍스트 파일 분석 (0) | 2022.01.29 |
[데이터 분석 스터디] 01 트럼프 대통령 트윗으로 시작하는 데이터 처리 (0) | 2022.01.28 |
댓글