본문 바로가기
Data Projects/mini 데이터 분석 프로젝트

[데이터 분석 스터디] 03 넷플릭스 시청 데이터로 알아보는 데이터형 변환

by 천뿌니 2022. 1. 29.
728x90

엘리스에서 제공하는 파이썬 실전 데이터 분석 강의 중

세 번째 주제인 넷플릭스 시청 데이터로 알아보는 데이터형 변환 리뷰 하겠습니다.


1. 주제

  • 넷플릭스 시청 데이터 분석하기
    • 회원 별로 시청한 작품 정리하기
    • 두 작품의 유사도 비교하기
    • 예상 선호도 점수 구하기

 

2. 필자가 해야 하는 것

  1. preprocess_data(filename) 함수 구현
  2. reformat_data(title_to_users) 함수 구현
  3. get_closeness(title_to_users, title1, title2) 함수 구현
  4. 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.

댓글