목표 설정 방법
“ e-book 컨텐츠 완주에 영향을 줄 수 있는 요인은 무엇이 있을까? “
” 이탈하는 유저와 끝까지 보는 읽는 유저와의 차이는 무엇일까? “
A 유저는 “이 책 재밌어 보이긴 하는데… 시간 날 때 읽자” 라며 첫 페이지만 읽고 다시 접속하지 않았습니다.
→ ‘가볍게 훑어보는 유저’로 설정
B 유저는 “웹툰만 주로 보는데, 이번 콘텐츠는 너무 지루해서 접었어요” 라고 의견을 남겼습니다.
→ ‘빠른 재미와 몰입을 기대하는 유저’로 설정
→ 여러 고객들을 상상해보고 논의하여 분석 고객을 설정
핵심 질문
Q. 완주에 영향을 주는 요인은?
독자의 성향 (선호도) |
독자의 현재 상황 & 환경 ( 온라인에서는 플랫폼의 UI.UX(?)) |
독서 방법의 차이(병렬 독서 VS 직렬 독서) |
강제성 Ex. 독서 모임, 챌린지 등 |
집중력의 차이 |
디바이스 유형
: 이리더기 사용자는 독서에 투자하는 사람이므로 나머지 기기를 사용하는 사람과의 이탈률 비교해보면 좋을 듯 |
구독 정보
: 무료체험 이탈률 높을 것 (비용 X)
먼슬리는 사용해보고 이탈률 결정 |
장르
: 책의 길이 |
Q. 이탈하는 유저와 끝까지 보는 유저의 차이는?
이탈자 | 완독자 | |
책에 대한 관심도
(책 자체나 카테고리) | ||
책을 볼 수 있는 시간
(자투리 시간 포함) | ||
해당 책에 대한 이해도 |
→ 오디오북에 대한 홍보, 유튜브 숏츠로 인한 독서 흥미 유발, (요약본)
Q. 처음에(1~50%) / 중간에(50~100%) 이탈하는 요인은?
처음에 이탈 | 중간에 이탈 |
책이 읽히지 않아서(재미가 없어서) | 병렬 독서하다가 몇 권 까먹어서 |
관심 없는 내용이라 | 읽으려다가 점점 지루해져서 |
책이 생각보다 길어서 | |
Q. 전자책과 종이책을 보는 독자의 이탈율 차이는?
종이책 | 휴대폰 | 태블릿 | eReader |
Q. 몰입을 높이기 위한 요인은?
독서하기 좋은 환경 (대중교통도 생각보다 |
Q. 장르에 따른 완독율 혹은 이탈율은?
Q. 플랫폼 서비스 문제로 인한 독서 이탈율 비중은? (자발적과 비교)
서비스 문제로 인한 이탈 | 자발적 이탈 |
UI 불편 | 책이 지루함 |
기술 이슈 | 알고리즘 추천 실패 |
개인적인 급한 일 |
Q. 자발적으로 독서를 중단하는 이유는? *값이 이미 나와있긴 하지만 추가적으로
데이터 기반의 페르소나 설정
분석하고 싶은 고객(페르소나) 설정
이름: 김리디
나이: 2030
성별: 여성
키: 160cm
읽는 기기: eReader 기기 없는 사람
독서량: 달에 1-2권
완독률: 6-70%
직업: 직장인 9-6
직종:
선호하는 장르:
구독 종류: 먼슬리
대중교통 이용
직장: 서울
거주지: 경기도
(자취: 지방이면 자취 아니면 본가 거주)
독서 읽을 때: 모닝 | 자투리 시간 활용 | 퇴근 후
1번 읽을 때 체류시간:
반려동물: 고양이
기상시간: 6시 30분 ~ 7시
페르소나 설정
이름 | 김리디 |
성별 | 여성 |
나이 | 2030 |
기기 타입 | eReader 기기 없는 사람 |
구독 유형 | 먼슬리 |
유입 경로 | |
선호 장르 |
가설 설정
e-Reader기를 사용하는 사람이 이탈률이 적을 것이다. 승인님
## e리더기 사용
df_merged['device_type'].value_counts(normalize = True)
Python
복사
##구독플랜의 종류와 함께 확인해봄
df_merged.groupby(['subscription_plan','device_type']).count() / df_merged.count() *100
Python
복사
이탈한 대상 1000명 중에 e리더기 비율이 가장 낮다.
(e리더기 사용자 자체가 적을 가능성이 있다 )
e리더기를 구매한 사용자는 완독할 가능성이 크다
e리더기 사용자들의 행동 패턴 분석하여 다른 기기에 적용해볼 수 있다.
경제/시사 장르를 읽는 사람들의 이탈률이 높을 것이다. 승인님
df_merged['genre'].value_counts(normalize=True)
Python
복사
df_merged['exit_po_group'] = pd.cut(df_merged['exit_position_numeric'], ##이탈한 위치를 나눔
bins=[0,25,50,75,100],
labels=['25% 이하', '25~49%', '50~74%', '75% 이상'],
right = True)
df_merged[df_merged['genre'] =='경제/시사'].value_counts('exit_po_group',normalize=True) ##비율
## 전체 장르 확인
df_merged.groupby(['genre','exit_po_group']).count() ##인원수
#읽고 나간 곳은 거의 비슷. 4구간을 같은 비율로 해서 그런 것 같음.
#나누는 구간의 차이를 두어야 할 것 같아보임.
Python
복사
이탈한 대상 1000명 중에 경제/시사 비율이 가장 낮다.
(경제/시사를 읽는 사람들의 비율이 낮을 수 있다)
경제/시사는 높은 충성도를 가졌을 수 있다.
경제/시사 장르 강화하여 충성도 확립할 수 있다.
경제/시사를 읽는 고객들은 광고 타겟으로 적합할 수 있다.
*25% 이하인 사람들이 미리보기 보고왔는지
연령대가 높은 사람들은 검색 유입 비중이 많을 것이다. 승인님
df_merged['age'] = 2023 - df_merged['birthday_filled'].dt.year+1
df_merged['age_group'] = pd.cut(df_merged['age'],
bins=[0,9,19,29,39,49,59,130],
labels=['0대','10대', '20대', '30대', '40대', '50대', '60대 이상'],
right = True)
## 연령대 높음의 기준을 50대 이상으로 설정
#50대 이상 유입채널 비율
df_merged[df_merged['age']>= 50].groupby('entry_channel').count()
###같
df_merged[(df_merged['age_group']=='50대') | (df_merged['age_group']=='60대 이상')].groupby('entry_channel').count()
Python
복사
연령대가 높은 사람들은 추천으로 유입된 인원의 이탈이 가장 많다.
연령대가 높은 사람들은 외부링크로 유입된 인원의 이탈이 가장 적다.
*기준을 잡는 것 : 90% 이상은 완독했다고
무료 체험이면 이탈률이 높을 것이다. 수민님
가설 오류
•
이탈률의 정의
이탈률은 (이탈한 사용자 수/전체 사용자 수)로 구할 수 있다. 현재 우리가 갖고 있는 데이터는 이탈한 사람들로만 이루어진 데이터이기에 이탈률을 구할 수 없다.
따라서 성별 별 구독 유형 별 이탈자 수 분포를 구하는 것을 목표로 진행했다.
# 성별 별 / 구독 유형 별로 이탈률 구하기
gender_sub = pd.crosstab(
df['subscription_plan'], # 행 인덱스로 사용할 열 지정
df['user_demographics_gender'], # 열 인덱스로 사용할 열 지정
normalize=True, # 정규화 (전체 기준으로 비율 계산)
margins=True, # 총계 포함 여부
margins_name='Total' # 총계 이름 지정
)
print(gender_sub)
>>>
user_demographics_gender female male Total
subscription_plan
free_trial 0.173 0.204 0.377
monthly 0.167 0.138 0.305
pay_per_book 0.168 0.150 0.318
Total 0.508 0.492 1.000
Python
복사
•
분석결과
◦
성별과 관계 없이 free_trial 유형의 이탈 비중이 크다.
◦
성별과 관계 없이 monthly 유형의 이탈 비중이 작다.
•
인사이트
◦
사용자의 몰입도는 구독 유형에 따라 차이가 있다.
무료 체험 사용자는 책을 가볍게 탐색하는 경향이 있고, 콘텐츠에 대한 몰입도나 기대치가 낮을 수 있다. 월간 구독자는 금전적 지불을 했기 때문에 책을 끝까지 읽으려는 의지나 목적의식이 더 강할 수 있다.
◦
성별과 관계 없이 free_trial 유형의 이탈 비중이 크다.
◦
성별과 관계 없이 monthly 유형의 이탈 비중이 작다.
eReader를 이용하는 여성중에는 mz 세대가 많을 것이다. 수민님
•
MZ 세대의 정의 : 1980 ~ 2012년 출생자
# mz 세대 구분하기
birth_year = df['birthday_filled'].dt.year # 출생 년도 구하기
def mz_gen(year): # mz 세대를 구분하는 함수 정의
if 1980 <= year <=2012: # 조건 : 1980년대 ~ 2012년대
return True
else:
return False
df['is_mz'] = birth_year.apply(mz_gen) # 새로운 컬럼 is_mz를 만들어 mz 여부 확인하기
# eReader 사용자 중 여성 mz 세대 비율 구하기
ereader_df = df[df['device_type'] == 'eReader']
total_users = len(ereader_df)
female_ratio = (ereader_df['user_demographics_gender'] == 'female').mean()
mz_ratio = ereader_df['is_mz'].mean()
female_mz_ratio = ereader_df[(ereader_df['user_demographics_gender'] == 'female') & (ereader_df['is mz'])].shape[0] / total_users
female_df = ereader_df[ereader_df['user_demographics_gender'] == 'female']
female_mz_only_ratio = female_df['is_mz'].mean()
result = pd.DataFrame({
'비율(%)': [female_ratio * 100, mz_ratio * 100, female_mz_ratio * 100, female_mz_only_ratio * 100]
}, index=[
'eReader 사용자 중 여성 비율',
'eReader 사용자 중 MZ 세대 비율',
'eReader 전체 사용자 중 여성 MZ 세대 비율',
'eReader 여성 사용자 중 MZ 세대 비율'
])
print(result)
print(result)
>>>
비율(%)
eReader 사용자 중 여성 비율 52.054795
eReader 사용자 중 MZ 세대 비율 54.794521
eReader 전체 사용자 중 여성 MZ 세대 비율 25.570776
eReader 여성 사용자 중 MZ 세대 비율 49.122807
Python
복사
•
분석결과
◦
eReader 사용자 중 여성 mz 세대의 비율은 절반이다.
•
인사이트
◦
mz 세대라고 eReader를 많이 사용하는 것은 아님
검색으로 유입된 사람들은 이탈률이 ㅅ낮을 것이다. 수민님
가설 오류
•
이탈률의 정의
이탈률은 (이탈한 사용자 수/전체 사용자 수)로 구할 수 있다. 현재 우리가 갖고 있는 데이터는 이탈한 사람들로만 이루어진 데이터이기에 이탈률을 구할 수 없다.
따라서 유입 채널 별 이탈자 수 분포를 구하는 것을 목표로 진행했다.
df['entry_channel'].value_counts(normalize=True)
>>>
entry_channel
추천 0.534
홈메인배너 0.210
검색 0.195
외부링크 0.061
Python
복사
•
분석 결과
◦
검색을 통해 유입된 사람의 비중은 비교적 낮다.
◦
추천을 통해 유입된 사람의 비중은 비교적 높다.
•
인사이트
◦
검색 유입자는 충성도 또는 완독 가능성이 높은 고객군으로 이탈 확률이 낮아질 수 있다.
◦
추천 시스템이 사용자의 선호를 파악하지 못해 이탈하는 것 같다.
◦
검색을 통해 유입된 사람의 비중은 비교적 낮다.
◦
추천을 통해 유입된 사람의 비중은 비교적 높다.
추천 시스템이 사용자의 선호를 파악하지 못해 이탈하는 것 같다.
•
추가적인 데이터 분석 : 사람들이 이탈하는 가장 큰 이유는 무엇일까?
df['dropout_reason_detail_filled'].value_counts(normalize=True)
>>>
dropout_reason_detail_filled
추천 실패 0.325
UX 불편 0.300
지루함 0.130
너무 김 0.130
급한일 0.065
기술 이슈 0.050
Python
복사
•
성별 별 이탈 상세 이유 : 여성
female = df[df['user_demographics_gender'] == 'female']
print(female['dropout_reason_detail_filled'].value_counts(normalize=True))
>>>
dropout_reason_detail_filled
추천 실패 0.318898
UX 불편 0.291339
너무 김 0.139764
지루함 0.137795
급한일 0.066929
기술 이슈 0.045276
Python
복사
•
성별 별 이탈 상세 이유 : 남성
male = df[df['user_demographics_gender'] == 'male']
print(male['dropout_reason_detail_filled'].value_counts(normalize=True))
>>>
dropout_reason_detail_filled
추천 실패 0.331301
UX 불편 0.308943
지루함 0.121951
너무 김 0.119919
급한일 0.063008
기술 이슈 0.054878
Python
복사
•
인사이트
◦
여성과 남성 모두 추천 실패가 가장 큰 이탈 사유였다.
◦
두 번째 이탈 사유는 UX 불편을 생각할 수 있다.
이탈 위치가 높을수록 이탈률이 줄어들 것 같다. 준영님
이탈 위치에 따라서는 이탈한 유저에 대한 이탈정도가 같다고 볼 수 있다
위에서 이미 이탈률에 대한 정의를 알려준 바가 있으며 현 데이터는 모두 이탈 고객에 대한 데이터이기에 정확한 이탈률은 구할 수 없다.
하지만 이탈 위치 즉, 독서율이 높은 고객들이 가장 최근까지 이용을 했을 수 있다고 가설을 해석해볼 수 있다.
filtered_df1 = df_merged[df_merged['exit_position_numeric'] >= 50]
filtered_df2 = df_merged[df_merged['exit_position_numeric'] < 50]
specific_date = datetime(2023, 12, 31)
last_access1 = round((specific_date - filtered_df1['last_access_timestamp_filled']).dt.days / 30, 2)
last_access2 = round((specific_date - filtered_df2['last_access_timestamp_filled']).dt.days / 30, 2)
print(last_access1.mean())
print(last_access2.mean())
5.9
6.0
Python
복사
두 그룹 모두 6개월로 비슷하다고 볼 수 있다.
월 구독을 한 사람들의 최종 접속일이 가장 최근일 것이다. 준영님
최종 접속일이 가장 최근인 구독권은 무료 체험자였다. 단권으로 빌리는 고객들은 이용을 덜 한다.
grouped_df = df_merged.groupby('subscription_plan')[['last_access_timestamp_filled']].max()
print(grouped_df)
last_access_timestamp_filled
subscription_plan
free_trial 2023-12-31 22:00:48
monthly 2023-12-31 13:15:06
pay_per_book 2023-12-30 13:55:11
Python
복사
결론적으로는 무료 체험자가 가장 최근에 접속을 했지만 그렇다면 세 구독 종류 중에서 평균적으로 가장 이탈기간이 긴 유형은 어디일까?
# 인원 수
filtered_df = df_merged[df_merged['subscription_plan'] == 'pay_per_book']
specific_date = datetime(2023, 12, 31)
filtered_df['dropout_date'] = round(((specific_date - filtered_df['last_access_timestamp_filled']).dt.days) / 30, 2).count()
print(filtered_df['dropout_date'])
# 평균
filtered_df = df_merged[df_merged['subscription_plan'] == 'pay_per_book']
specific_date = datetime(2023, 12, 31)
filtered_df['dropout_date'] = round(((specific_date - filtered_df['last_access_timestamp_filled']).dt.days) / 30, 2).mean()
print(filtered_df['dropout_date'])
#결론
free_trial 377명 5.692467개월
monthly 305명 5.955016개월
pay_per_book 318명 6.298365개월
Python
복사
전체 이용자들 중에서 평균적으로 가장 오랜 기간동안 이탈을 한 유저는 pay_per_book으로 평균 6.2개월임을 알 수 있다.
1020 사용자 중에는 pay per book 비중이 높아서 이탈률이 높을 것이다.
+ pay per book 구독 유형을 가진 사람들은 이탈률이 50% 미만일 것이고 최근 접속일이 가장 오래됐을 것이다. 준영님
pay_per_book을 이용한 10~20대 여성 고객들 중 50% 미만으로 읽으신 분이 평균적으로 이탈기간이 더 높음을 알 수 있었다.
#정확한 나이대를 알기 위해서는 특정 기준일에서 데이터 birthday 값을 빼야지만 알 수 있었다.
current_year = datetime.now().year
df_merged['age'] = current_year - pd.to_datetime(df_merged['birthday_filled']).dt.year
# 조건 필터링: 여성 유저 & 10~20대 & pay_per_book 구독
filtered_df = df_merged[(df_merged['user_demographics_gender'] == 'female') &
(df_merged['age'].between(10, 29)) &
(df_merged['subscription_plan'] == 'pay_per_book') &
(df_merged['exit_position_numeric'] >= 50)]
specific_date = datetime(2023, 12, 31)
filtered_df['dropout_date'] = round(((specific_date - filtered_df['last_access_timestamp_filled']).dt.days) / 30, 2)
# 여성, 10~20, pay_per_book, 정독률 50 미만일때 21명 35 (56) // 여성, 10~20, pay_per_book 56명 52[m], 55[ft], 56 total : (163)// 여성, 10~19 81명 20~29 82, 30~39 90, 40~49 79, 50~ 59 84, 60~69 81, 100~120 11
# 여성, 10~20, pay_per_book, 정독률 50 미만인 21명의 이탈 기간
# [6.9, 0.3, 6.5, 8.43, 1.63, 5.97, 5.47, 9.47, 11.27, 1.47, 0.17, 1.6, 9.7, 6.57, 5.7, 11.77, 7.17, 4.53, 8.97, 10.23, 1.8]
# 여성, 10~20, pay_per_book, 정독률 50 이상인 35명의 이탈 기간
# [5.63, 2.07, 12.0, 0.93, 5.87, 3.23, 8.47, 10.9, 5.97, 3.93, 11.6, 12.0, 0.13, 10.97, 5.57, 8.83, 6.07, 3.8, 4.53, 6.8, 1.33, 3.87, 2.43, 3.27, 7.23, 3.13, 10.17, 10.37, 0.3, 0.17, 9.83, 6.93, 5.7, 2.93, 1.3]
print(filtered_df['dropout_date'].tolist())
Python
복사
pay_per_book을 이용한 10~20대 여성 고객들 중 50% 미만으로 읽으신 분이 평균적으로 이탈률이 더 높음을 알 수 있었다.
Gruop1
독서율 50% 미만인 10~20대 여성 5.98개월
Gruop2
독서율 50% 이상인 10~20대 여성 5.66개월
추천을 받지 않고 소설을 본 사람들의 이탈률은 낮을 것이다. 시현님
[이탈률 기준 설정] 0-40 : 초반 | 40-60 : 중간 | 60-90 : 후반
→ 60 미만 이탈률 높다고 기준 (low = 이탈률
| high = 이탈률
)
[성별 기준] 여성 기준 (페르소나 설정)
# 여성만 추출
df_female = df.loc[df['user_demographics_gender']=='female']
# 추천을 받지 않고, 소설 장르이며, 중단 이탈이 60% 미만인 사람
df_female['is_exit_total_rate'] = (df_female['entry_channel'] != '추천') & \
(df_female['genre'] == '소설') & \
(df_female['exit_position_numeric'] < 60)
df_female['is_exit_total_rate']
# 장르와 유입경로별 이탈률
df_channel_novel_exit_rate = (df_female.groupby(['genre', 'entry_channel'])['is_exit_total_rate'] \
.value_counts(normalize=True) \
.unstack() \
.rename(columns={False: 'low', True: 'high'}))
df_channel_novel_exit_rate.round(2)
# 소설이 아닌 값은 NaN값이 나오므로 drop
df_channel_novel_exit_rate.dropna().round(2)
Python
복사
[Insight 도출]
가설과 달리 외부링크가 50:50인 것을 제외하면
추천을 받지 않고 소설을 선택해 읽은 사람들의 이탈률은 상대적으로 높은 편이다.
웹툰을 읽는 사람들의 이탈률은 더 낮을 것이다. 시현님
[이탈률 기준 설정] 0-40 : 초반 | 40-60 : 중간 | 60-90 : 후반
→ 60 미만 이탈률 높다고 기준 (low = 이탈률
| high = 이탈률
)
# 0-40 초반 | 40-60 중간 | 60-90 후반 60 이하 이탈률 높다고 기준
df['is_exit_rate'] = df['exit_position_numeric'] < 60
# 전체 장르별 이탈률
df_genre_exit_rate
= df.groupby('genre')['is_exit_rate'] \
.value_counts(normalize=True) \
.unstack() \
.rename(columns={False: 'low', True: 'high'})
df_genre_exit_rate.round(2)
Python
복사
# 여성만 추출
df_female = df.loc[df['user_demographics_gender']=='female']
# 60 이하 기준
df_female['is_exit_rate']
= df_female['exit_position_numeric'] < 60
# 여성 장르별 이탈률
df_genre_exit_rate
= df_female.groupby('genre')['is_exit_rate']
.value_counts(normalize=True) \
.unstack() \
.rename(columns={False: 'low', True: 'high'})
df_genre_exit_rate.round(2)
Python
복사
[Insight]
남여 성별 구분 없이 데이터 분석 시 경제/시사 다음으로 이탈률이 높다.
여성만 구했을 경우 웹툰 이탈률이 가장 낮다.
(60% 이상 읽은 비율이 44%로 가장 높다.)
홈 메인 베너 / 자기계발 + 소설을 본 사람들의 이탈률이 적을 것이다. 시현님
[이탈률 기준 설정] 0-40 : 초반 | 40-60 : 중간 | 60-90 : 후반
→ 60 미만 이탈률 높다고 기준 (low = 이탈률
| high = 이탈률
)
# 조건 설정 : 유입경로가 홈메인배너, 중단 위치가 60% 미만
df['is_exit_total_rate'] = (df['entry_channel'] == '홈메인배너') & \
(df['exit_position_numeric'] < 60)
# 이탈률
df_channel_genre_exit_rate = (df.groupby(['genre', 'entry_channel'])['is_exit_total_rate']
.value_counts(normalize=True)
.unstack()
.rename(columns={False: 'low', True: 'high'}))
df_channel_genre_exit_rate.round(2)
# NaN 값 drop
df_channel_genre_exit_rate.dropna().round(2)
Python
복사
소설, 자기계발 이탈률이 경제/시사와 비교하면 적은 편이다.
테마 모드가 customize / dark mode인 사용자들은 이탈률이 더 낮을 것이다. 문수님
•
사용자 경험(UX)에 관해 개인화 및 시각적 편안함이 사용자 유지에 긍정적 영향을 줄 것이다. 따라서 "theme_mode가 'customize' 또는 'dark'인 사용자들은 'light' 사용자보다 더 늦은 시점에서 독서를 중단할 것이다. exit_position_numeric 값이 더 높을 것.
# 'dark'과 'customize'를 하나의 그룹 'dark_or_custom'으로 묶고, 나머지('light')는 그대로 사용
df_merged['theme_group'] = df_merged['theme_mode'].apply(lambda x: 'dark_or_custom' if x in ['dark', 'custom'] else 'light')
print(f"# 그룹핑 된 결과 확인 : {df_merged['theme_group']}")
# 각 테마 그룹에 대해 이탈 시점(exit_position_numeric)의 통계치를 계산 : mean: 평균 이탈 시점이 높을수록 콘텐츠를 더 오래 읽음
summary = df_merged.groupby('theme_group')['exit_position_numeric'].agg(['count', 'mean', 'std', 'median']).reset_index()
print(f"\n테마 그룹별 이탈 시점 요약 : {summary}")
"""
결과 해석 :
테마 그룹별 이탈 시점 요약 : theme_group count mean std median
0 dark_or_custom 607 50.016474 28.843719 50.0
1 light 393 52.867684 29.529435 56.0
평균 :
dark_or_custom: 50.02% 에서 이탈
light: 52.87% 에서 이탈
→ light 사용자들이 조금 더 오래 읽고 이탈하는 경향
중앙값 :
dark_or_custom: 50.0
light: 56.0
→ dark_or_custom 사용자는 50.0% 지점에서 절반이 이탈한 반면, ligt 사용자는 56.0% 지점에서 더 늦게 절반이 이탈함
표준편차 :
dark_or_custom: 28.8
light: 29.5
→ 표준편차가 28~29면 상당히 다양한 시점에서 이탈하고 있다고 해석. 전체가 100이 최대니까 30이라는 분산은 전체 범위의 30%에 해당하는 수준
인사이트 요약 :
light 테마 사용자는 평균 52.9% 지점에서 이탈하며, dark/customize 테마 사용자(50.0%)보다 더 늦게 이탈하는 경향을 보인다.
light 테마 사용자가 콘텐츠를 더 오래 소비하고, 반대로 dark/custom 사용자들은 빠르게 판단하고 빠지는 유형일 수 있다.
"""
Plain Text
복사
모바일 사용/ 장르가 웹툰이 아닌 비웹툰 장르 / 중단 사유가 ‘UX 불편’에 해당하는 사람들의 이탈률이 높을 것이다. 문수님
•
모바일 사용자가 웹툰이 아닌 비웹툰 장르를 이용할 때, 화면 크기 제한으로 인해 UX(사용자 경험) 불편을 겪을 가능성이 높아 이탈률이 높을 것이다.
# 1. 1차 필터링 : 모바일 사용자 필터링
df_mobile = df_merged[df_merged['device_type'] == 'mobile']
# 2. 2차 필터링 : 모바일 사용자 중 웹툰 여부, 컬럼 추가 :genre가 ‘웹툰’인지 여부를 True/False로 담은 새로운 컬럼 is_webtoon
df_mobile['is_webtoon'] = df_mobile['genre'] == '웹툰'
# 3. 3차 필터링 : UX 불편으로 중단한 사용자 필터링 : 모바일 x 여러 장르 x ['is_webtoon] x UX 불편 -> 새로운 DataFrame 생성(df_ux_issue)
df_ux_issue = df_mobile[df_mobile['dropout_reason_category'] == 'UX 불편']
# 4. 웹툰 vs 비웹툰 독서 중단 위치 평균 계산 : 모바일 x UX 불편 x ['is_webtoon] : Ture(웹툰)/False(비웹툰) x ['exit_position_numeric']
exit_by_webtoon = df_ux_issue.groupby('is_webtoon')['exit_position_numeric'].mean().reset_index()
print(f"모바일 사용자 중 UX 불편을 겪는 사용자의 비웹툰/웹툰 별 독서 중단 위치 평균:")
print(exit_by_webtoon)
"""
결과 해석 :
is_webtoon exit_position_numeric
0 False 53.767857
1 True 46.469388
인사이트 요약 :
모바일에서 UX 불편을 겪은 사용자 중 비웹툰 장르가 웹툰보다 평균 독서 중단 위치가 더 높다.
비웹툰 장르 사용자들이 UX 불편에도 불구하고 웹툰 사용자보다 중단 시점이 늦다. 더 오래 읽었다.
따라서 "비웹툰에서 UX 불편으로 더 빨리 이탈할 것이다”라는 가설과는 정반대 결과를 얻음.
"""
Plain Text
복사











