Task : 추천/검색 유입 관련 분석 데이터 시각화하기
1.
미리보기 사용 비율 막대그래프
•
전체 사용자 중에서 미리보기를 사용한 유저의 비율 시각화
2.
미리보기 사용 여부에 따른 추천 실패 비율 막대그래프
•
미리보기를 사용했는지 하지 않았는지를 기준으로 나누어 추천 실패 비율을 시각화
3.
추천 클릭 후 자발적 이탈 사유 비율 막대그래프
•
추천 클릭으로 책을 읽게 된 사용자들의 구체적 사유가 차지하는 비율을 시각화
4.
완독하지 못한 사용자 중 추천 실패 장르 비율 막대그래프
•
추천을 받고 완독하지 못한 사용자들을 주로 어떤 장르를 추천 받았는지 시각화
5.
완독자 중 추천 장르 비율 막대그래프
•
완독자들에게는 주로 어떤 장르가 추천되었는지 시각화
6.
완독률 히스토그램과 정규분포 히스토그램 비교
•
현재 데이터셋의 완독률 히스토그램과 정규분포 히스토그램의 분포 양상 비교 시각화
7.
개선 필요 부분
•
추천 클릭이 아닌 사람들의 추천 실패도 있는지 ?
•
경제 시사가 왜 완독 실패 비율도 적고 완독될 비율도 적은가?
•
정규분포 기반 완독률 그래프 실제 출처 찾아서 그리기!
실행 및 진행 사항 정리
# 1. 미리보기 값 정리
df['quick_preview_used'] = df['quick_preview_used'].astype(str).str.strip().str.lower()
df['preview_label'] = df['quick_preview_used'].replace({
'yes': '사용',
'true': '사용',
'1': '사용',
'no': '미사용',
'false': '미사용',
'0': '미사용'
})
# 2. 비율 계산
preview_ratio = df['preview_label'].value_counts(normalize=True).reset_index()
preview_ratio.columns = ['사용여부', '비율']
# 3. 그래프
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(5, 4))
sns.barplot(data=preview_ratio, x='사용여부', y='비율', order=['미사용', '사용'])
plt.title('미리보기 사용 비율')
plt.ylabel('비율')
plt.ylim(0, 1)
plt.grid(axis='y')
plt.tight_layout()
plt.show()
Python
복사
# 1. 값 정리
df['quick_preview_used'] = df['quick_preview_used'].astype(str).str.strip().str.lower()
# 2. 매핑 처리
import numpy as np
df['quick_preview_used'] = df['quick_preview_used'].apply(
lambda x: 1 if x in ['yes', 'true', '1'] else (0 if x in ['no', 'false', '0'] else np.nan)
)
# 3. 추천 실패 여부 컬럼 생성
df['is_reco_fail'] = df['dropout_reason_detail'] == '추천 실패'
# 4. 비율 계산
preview_group = df.groupby('quick_preview_used')['is_reco_fail'].mean().reset_index()
preview_group['quick_preview_used'] = preview_group['quick_preview_used'].map({1: '미리보기 사용', 0: '미사용'})
# 5. 시각화
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(6, 4))
sns.barplot(data=preview_group, x='quick_preview_used', y='is_reco_fail')
plt.title('미리보기 사용 여부에 따른 추천 실패 비율')
plt.ylabel('추천 실패 비율')
plt.ylim(0, 1)
plt.grid(axis='y')
plt.tight_layout()
plt.show()
Python
복사
# 추천 클릭 + 자발적 이탈 + 세부 이탈 사유 필터링
filtered = df[
(df['recommendation_clicked'] == 1) &
(df['dropout_reason_category'] == '자발적')
# & (df['dropout_reason_detail'].isin(['지루함', '너무 김']))
]
reason_ratio = filtered['dropout_reason_detail'].value_counts(normalize=True)
plt.figure(figsize=(6,4))
sns.barplot(x=reason_ratio.index, y=reason_ratio.values)
plt.title('추천 클릭 후 자발적 이탈 사유 비율')
plt.ylabel('비율')
plt.ylim(0,1)
plt.grid(axis='y')
plt.tight_layout()
plt.show()
Python
복사
import matplotlib.pyplot as plt
import seaborn as sns
# 1. 완독 못한 사람 필터링 (독서 중단 위치 75 미만)
incomplete_df = df[df['exit_position_numeric'] < 75]
# 2. 그 중 추천 실패한 사람만 필터링
reco_fail_df = incomplete_df[incomplete_df['dropout_reason_detail'] == '추천 실패']
# 3. 장르별 추천 실패 비율 계산 (전체 추천 실패 중에서 장르 비중)
genre_ratio = reco_fail_df['genre'].value_counts(normalize=True)
# 4. 시각화
plt.figure(figsize=(8, 5))
colors = ['red', 'orange', 'yellow', 'green'] # 장르 수만큼 색 자동 설정
sns.barplot(x=genre_ratio.index, y=genre_ratio.values,
hue=genre_ratio.index, palette=colors,
dodge=False, legend=False)
plt.title('완독하지 못한 사용자 중 추천 실패 장르 비율', fontsize=14)
plt.xlabel('장르')
plt.ylabel('비율')
plt.ylim(0, 1)
plt.grid(axis='y')
plt.tight_layout()
plt.show()
Python
복사
import seaborn as sns
import matplotlib.pyplot as plt
# 1. 완독자 중 추천 클릭 유저에게 추천된 장르 비율
completed = df[df['exit_position_numeric'] >= 75]
completed_recommended = completed[completed['recommendation_clicked'] == 1]
genre_ratio = completed_recommended['genre'].value_counts(normalize=True)
# 2. 시각화
plt.figure(figsize=(8, 5))
colors = ['orange', 'red', 'yellow', 'green'] # 장르 수에 맞게
sns.barplot(x=genre_ratio.index, y=genre_ratio.values, hue=genre_ratio.index, palette=colors, dodge=False, legend=False)
plt.title("완독자 중 추천 클릭 유저에게 추천된 장르 비율", fontsize=14)
plt.xlabel("장르")
plt.ylabel("비율")
plt.ylim(0, 1)
plt.grid(axis='y')
plt.tight_layout()
plt.show()
Python
복사
결과









