[공모전] OTT 인기 콘텐츠 기반 도서 추천 대시보드

주관 : 2024 도서관 데이터 활용 공모전 (최우수상)
프로젝트 명 : OTT 콘텐츠 기반 도서 추천 대시보드
프로젝트 기간 : 24년 7월 ~ 24년 9월
인원 : 3명 (BOAZ 시각화 21&22기, 팀 보아주라)
활용 Tool : Notion, Python, Tableau, Figma, PPT
☐ 프로젝트 개요 : OTT 콘텐츠에 따른 맞춤형 도서 추천 시스템을 통해, 전반적인 독서율을 높이고 개인화된 독서 경험 제공
☐ 본인이 맡은 역할 :
  • 자료 수집 및 전처리
    • Selenium을 이용하여 도서 정보/평점/리뷰 크롤링
    • 국민 독서 실태 현황 데이터 수집
  • 대시보드 제작
  • PPT 제작
☐ 성과/의의 :
  • OTT 콘텐츠에 따른 맞춤형 도서 추천 시스템 구축을 통해, 도서 소비 촉진 기반 마련
  • 국립중앙도서관을 위한 대시보드 활용 아이디어 제시

📑 프로젝트 내용


❓주제 선정 배경

지속적으로 독서율은 감소하고 있는 반면, OTT 소비는 꾸준하게 증가하고 있습니다. 또한, 도서와 OTT는 취향에 따라 다양한 콘텐츠를 접한다는 공통점을 가지고 있으나, 매체의 특성에 따라 소비량의 정도가 다른 것을 파악하여, 두 매체의 공통점을 기반으로 새로운 연결점을 제공하고자 했습니다.
이를 해결하기 위해, 크게 다음 두 가지의 목표를 세웠습니다.
  1. 독서 및 OTT 현황 파악
  1. 도서와 OTT의 연결성 강화

🔗 데이터 수집

토글을 펼치면 활용 데이터 목록을 확인할 수 있습니다.
데이터
시점
출처
데이터 설명 및 목적
2024 인기대출 도서 1000권
2024. 1 ~ 2024. 7
도서관 정보나루
대출 인기 도서 도출
사서 추천 도서
2010. 3 ~ 2024. 8
국립중앙도서관 누리집
추천 도서의 다양성 확보 및 퀄리티 보장
도서 장르/평점/리뷰
~ 2024. 8
교보문고
도서 상세 설명
도서 줄거리 핵심 키워드
2024. 1 ~ 2024. 8
도서관 정보나루 + 누리집
도서 키워드 도출
OTT 콘텐츠별 추천 도서
2024. 1 ~ 2024. 8
도서관 정보나루 + 누리집
콘텐츠별 추천 도서 매칭
OTT별 인기 콘텐츠
2024. 7 ~ 2024. 8
키노라이츠
인기 콘텐츠 도출
도서 선호 분야 (종이책, 성인)
2021. 1 ~ 2021. 12
문화체육관광부
성인 도서 선호 분야 파악
독서 매체별 독서시간 (성인)
2021. 1 ~ 2021. 12
문화체육관광부
성인 독서 시간 파악
독서 빈도 (성인)
2021. 1 ~ 2021. 12
문화체육관광부
성인 독서 빈도 파악
독서 장애 요인 (성인, 학생)
2021. 1 ~ 2021. 12
문화체욱관광부
독서 장애 요인 파악
종합 독서량 (성인, 학생)
2019. 1 ~ 2021. 12
문화체육관광부
연간 종합 독서량 파악
독서인구
2003 ~ 2024
통계청
독서 인구 및 1인당 평균 독서 건수 파악
온라인동영상제공서비스 OTT 이용 빈도
2015. 1 ~ 2023. 12
정보통신정책연구원
OTT 이용 빈도 파악
최근 3개월 OTT 서비스 이용 경험 여부
2021. 1 ~ 2023. 12
정보통신정책연구원
OTT 이용 경험 여부 파악
활용한 모든 데이터는, 프로젝트 진행 당시 기준 최신 데이터로 수집하였습니다.

🙋🏻‍♀️ 본인이 맡은 역할


⓵ 교보문고를 통해 도서 장르/평점/리뷰 크롤링

도서관 정보나루, 국립중앙도서관 누리집에 실려있는 도서들에 대해, 교보문고를 통해 도서의 장르/평점/리뷰 크롤링을 진행하였습니다.
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pandas as pd import numpy as np import re import time bn = pd.read_excel('/Users/hyewon/Downloads/사서추천도서 목록_2024-09-14.xls') def collect_reviews_from_bn(start_idx, end_idx): # 크롬 드라이버 경로를 지정하고 드라이버 실행 driver = webdriver.Chrome() # 크롬 드라이버 경로 설정 필요 wait = WebDriverWait(driver, 10) # 최대 10초 대기 # 국립중앙도서관 URL 접속 url = 'https://nl.go.kr/NL/contents/N20500000000.do' driver.get(url) try: # 주어진 인덱스 범위의 책에 대해서만 반복 (start_idx부터 end_idx까지) for index, row in bn.iloc[start_idx:end_idx].iterrows(): book_title = row['서명'] # '서명' 값 추출 try: # 검색창에 서명 값 입력 (ID 확인 후 수정 필요) search_box = wait.until(EC.presence_of_element_located((By.ID, 'schStr'))) # 검색창의 ID search_box.clear() # 이전 검색 내용 지우기 search_box.send_keys(book_title) # '서명' 값 입력 # 검색어를 치고 엔터키를 입력하는 것과 같은 효과 search_box.send_keys("\n") # 엔터키 입력 # 검색 결과 페이지에서 첫 번째 책 클릭 (XPATH 확인 후 수정 필요) first_book_image = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="list_tabpanel"]/div/ul/li/a/div/div[1]'))) first_book_image.click() # 세부 페이지로 이동 후, 페이지 로딩 대기 time.sleep(2) # 특정 요소 클릭 (XPATH 경로의 요소 클릭) clickable_element = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="sub_content"]/div[2]/div/div[1]/div[1]/div[1]/div[1]/div[2]/div/a'))) clickable_element.click() # 해당 요소 클릭 # 클릭 후 페이지 로딩 대기 time.sleep(2) # 세부 페이지에서 p 태그의 모든 텍스트 추출 p_elements = driver.find_elements(By.XPATH, '//*[@id="divSeoji"]/div/div[1]/div/p') # 모든 p 태그 선택 # 추출한 p 태그 텍스트를 저장할 리스트 p_texts = [p.text for p in p_elements] # 각 p 태그에 해당하는 열을 동적으로 생성 (p1, p2, p3, ... 형식) for i, text in enumerate(p_texts): column_name = f'p{i + 1}' # 열 이름 생성 (p1, p2, ...) if column_name not in bn.columns: # 만약 열이 존재하지 않으면 새로 추가 bn[column_name] = None bn.at[index, column_name] = text # 해당 열에 텍스트 값 저장 except Exception as e: print(f"책 '{book_title}' 처리 중 오류 발생: {e}") continue # 오류가 발생해도 다음 책으로 넘어가기 # 다음 검색을 위해 이전 페이지로 돌아가기 try: driver.back() time.sleep(2) except Exception as e: print(f"페이지 이동 중 오류 발생: {e}") driver.get(url) # 만약 페이지 이동에 실패하면 다시 URL로 이동 time.sleep(2) except Exception as e: print(f"전체 프로세스 중 오류 발생: {e}") finally: # 브라우저 닫기 driver.quit() # ISBN 추출 함수 def extract_isbn_number(row): isbn_pattern = r'(97[89][\d\-]+)' for col in ['p4', 'p5']: if pd.notna(row.get(col)): match = re.search(isbn_pattern, row[col]) if match: return match.group(0).replace('-', '') return None # 리뷰 수집 collect_reviews_from_bn(start_idx=584, end_idx=800) # ISBN 추출 및 추가 bn['isbn'] = bn.apply(extract_isbn_number, axis=1) # 결과 저장 bn.to_csv('/Users/hyewon/Downloads/사서추천도서 목록_isbn처리완료.csv', index=False) ---- 여기 밑에서부터는 내 코드 # ISBN 번호 추출 함수 def extract_isbn_number(row): # 'p4'와 'p5'에서 ISBN이 있는지 확인하고 숫자만 추출 isbn_pattern = r'(97[89][\d\-]+)' # '978' 또는 '979'로 시작하는 패턴 if pd.notna(row['p4']): match = re.search(isbn_pattern, row['p4']) if match: return match.group(0).replace('-', '') # ISBN 값에서 '-' 제거하여 반환 if pd.notna(row['p5']): match = re.search(isbn_pattern, row['p5']) if match: return match.group(0).replace('-', '') # ISBN 값에서 '-' 제거하여 반환 return None # 'p4' 또는 'p5'에서 ISBN 값을 추출하여 'isbn' 열에 저장 bn_isbn['isbn'] = bn_isbn.apply(extract_isbn_number, axis=1) bn_isbn bn_isbn.to_csv('/Users/hyewon/Downloads/사서추천도서 목록_isbn처리완료.csv')

⓶ 국민 독서 실태, 도서 추천 대시보드 제작

국민 독서 실태 및 OTT 이용 현황 확인을 위한 대시보드와, 올 여름 OTT 인기 콘텐츠 및 추천 도서를 제공해주는 대시보드를 제작하였습니다.
notion image
notion image
notion image
notion image
notion image

💡성과/의의


📍대시보드 인사이트

제작한 총 3개의 대시보드별 인사이트는 다음과 같습니다.
💡
독서 및 OTT 현황 파악 대시보드
  1. 1인당 평균 독서 권수는 점차 하락하며, 2023년 기준 남성 16.1권 여성 13.8권의 독서를 소비.
  1. OTT 사용 빈도는 점차 상승하며, 2023년 기준 매일 이용하는 인구는 전체 인구의 42.3%임.
💡
독서 현황 특징 대시보드
  1. 연령이 증가함에 따라, 1년 평균 독서 권수는 감소하는 추세.
  1. 40대 이전의 연령대는 전자책 선호도가 높은 비중을 차지하며, 모든 연령대의 전차잭 수요 증가.
  1. 셩인 연령대의 평균 독서시간은 1시간이 넘지 않음.
💡
OTT 인기 플랫폼 기반 도서 추천 대시보드
  1. 원하는 OTT 플랫폼 및 인기 콘텐츠를 선택할 수 있게 배치.
  1. 원하는 콘텐츠를 선택했을 경우, 추천 도서 5권에 대한 상세 정보 표시.
    → ‘나는 솔로’ 선택 시, ‘우리는 여전히 삶을 사랑하는가’와 같은 사랑 이야기를 주제로 다룬 책이 추천된다. 책 소개 뿐만 아니라 독자들의 생생한 리뷰도 함께 제공함에 따라, 추천 받은 사람이 해당 책을 결정함에 추가적인 도움을 제공한다.

📍프로젝트 의의

진행한 프로젝트 의의는 다음과 같습니다.
  1. 원인 분석을 통한 큐레이션의 필요성
    1. 도서와 OTT는 매체의 특성에 따라 소비량이 다르나, 취향에 따라 다양한 콘텐츠를 접한다는 공통점을 기반으로 새로운 연결점을 제공하고자 하였습니다.
    2. 본인이 즐겨서 보는 OTT의 인기 콘텐츠를 통해, 해당 콘텐츠와 유사한 도서를 추천하는 대시보드를 제공함으로써, 더 나아지는 독서율에 기여하고자 하였습니다.
  1. 국립중앙도서관의 2024 주요업무추진계획 아이디어 제공
    1. ‘신뢰도 높은 데이터 구축과 큐레이션 강화’, ‘디지털 시민성 강화와 첨단기술 적용 정보서비스 강화’를 추진과제로 삼은 국립중앙도서관 측에 아이디어를 제공하였습니다.
    2. 국립중앙도서관 홈페이지 내, OTT 인기 콘텐츠 기반 도서 추천 대시보드를 임베딩함으로써, 매월마다 남녀노소 불문하고 다양한 도서 추천 서비스 경험을 제공하고자 하였습니다.
 

📍아이디어 결론

플라이북에서 실시할 수 있는 이벤트 아이디어 제시
FLYBOOK의 이용 경험을 개선시키고 더 즐거운 독서 경험으로 이어질 수 있도록, FLYBOOK에서 실시할 수 있는 이벤트의 기획안을 전달드렸습니다.
💡
[아이디어] 국립중앙도서관 2024 주요업무추진계획의 아이디어 제공
  1. 배경
    1. 국립중앙도서관 2025 주요업무추진계획은 다음과 같습니다.
      • 추진과제 1. [담고] 지식을 지혜로 담다
        : 신뢰도 높은 데이터 구축과 큐레이션 강화
      • 추진과제 2. [나누다] 국민과 함께 나누다
        : 디지털 시민성 강화와 첨단기술 적용 정보서비스 강화
  1. 운영
    1. 국립중앙도서관 홈페이지 내, ‘OTT 인기 콘텐츠 기반 도서 추천 대시보드’를 임베딩합니다.
      • ‘추천도서’ 신규 코너 생성
      • 세부 항목 고도화
  1. 의의
    1. 운영에 대한 의의는 다음과 같습니다.
      • 누구나 이용 가능한 도서 추천 서비스
        • : OTT 콘텐츠 기반 맞춤형 도서 추천 대시보드를 임베딩함으로써, 신선한 도서 추천 서비스를 제공한다.
      • 매월 기대되는 도서 추천 서비스
        • : 정교화된 추천 서비스와 매월 달라지는 인기 OTT 콘텐츠는, 더 다양한 도서 추천 서비스 경험을 제공한다.

💬 회고


➕ 보완할 점

  • OTT 콘텐츠의 제목 및 줄거리가 애매한 작품의 경우, 도서 추천 알고리즘의 정확도가 다른 콘텐츠들에 비해 다소 부정확한 부분이 아쉬웠습니다.
  • 더 많은 도서 정보를 가져오고 더 긴 기간의 OTT 콘텐츠 정보를 가져와서, 더욱 다양한 도서 추천 서비스를 기획하는 것이 목표입니다.

🚶🏻‍♀️‍➡️ 성장한 점

  • 추천 서비스에 관심이 많았는데, 좋아하는 카테고리인 ‘도서’를 추천하는 대시보드를 제작할 수 있게 되어 더욱 의미있었습니다.
  • 시각화 하는 과정을 통해 점차 감소하는 독서율을 몸소 느꼈으며, 이를 발전시켜 나갈 수 있는 아이디어를 제공할 수 있는 시간이 되었습니다.