////////
Search
Duplicate
🍯

독서 시점/시간대 분석

Tags
Archive
ETA
2025/06/18
Main Task
Sub Task
담당자
메모
상태
Done
생성 일시
2025/06/13 03:02
우선 순위
진행률 %
Task :
- 장기 미접속자(6개월 이상)의 이탈사유와 전체 이탈 사유가 동일 할 것이다. => 장기간 미접속 이유와 전기간 이탈사유가 다르다는 것은 그 문제가 결정적인 이탈사유라고 할 수 있을 것 같다. * - 독서에 시간 투자를 못하는 현대 사회인(20-50)들이 많을 것이다 => 일반적인 사회인들의 근무 시간 9-6시에 접속수가 적을 것이다. => 10대의 이용률이 높을 것이다. 주말이 제일 완독률이 높을 것이다. => 주중/ 주말 완독률 비교
Plain Text
복사
실행 및 진행 사항 정리
1.
미접속 사용자 기준 정하기
# 1. 월 컬럼 생성 cleaned_df['month'] = cleaned_df['last_access_timestamp'].dt.month # 2. 월별 접속자 수 집계 monthly_counts = cleaned_df['month'].value_counts().sort_index() #출력 print("월별 접속자 수 ",monthly_counts)
Plain Text
복사
1.
2.
# 6개월 이상 미접속 사용자 이탈 사유 대분류
2.
# 전체 사용자 이탈 사유 대분류
total_users = len(cleaned_df) dropout_reason_counts_all = cleaned_df['dropout_reason_category'].value_counts() dropout_reason_ratio_all = (dropout_reason_counts_all / total_users * 100).round(1) dropout_reason_all_df = pd.DataFrame({ 'dropout_reason_category': dropout_reason_counts_all.index, 'count': dropout_reason_counts_all.values, 'ratio (%)': dropout_reason_ratio_all.values }) print("전체 사용자 이탈 사유 대분류:") print(dropout_reason_all_df)
Plain Text
복사
3.
# 전체 기간 자발적 이탈자의 상세 사유 분포
voluntary_all_df = cleaned_df[cleaned_df['dropout_reason_category'] == '자발적'] total_voluntary_all = len(voluntary_all_df) voluntary_all_detail_counts = voluntary_all_df['dropout_reason_detail'].value_counts() voluntary_all_detail_ratio = (voluntary_all_detail_counts / total_voluntary_all * 100).round(1) voluntary_all_df_summary = pd.DataFrame({ 'dropout_reason_detail': voluntary_all_detail_counts.index, 'count': voluntary_all_detail_counts.values, 'ratio (%)': voluntary_all_detail_ratio.values }) print("\n 전체 기간 자발적 이탈 상세 사유 분포:") print(voluntary_all_df_summary)
Plain Text
복사
4.
6개월 이상 미접속 사용자 중 자발적 이탈 상세 사유 비율
voluntary_dropout_details = inactive_users[ inactive_users['dropout_reason_category'] == '자발적' ]['dropout_reason_detail'].value_counts() # 총 자발적 이탈자 수 total_voluntary = voluntary_dropout_details.sum() # 비율 계산 voluntary_dropout_ratio = (voluntary_dropout_details / total_voluntary * 100).round(1) # 데이터프레임으로 정리 voluntary_dropout_df = pd.DataFrame({ 'dropout_reason_detail': voluntary_dropout_details.index, 'count': voluntary_dropout_details.values, 'ratio (%)': voluntary_dropout_ratio.values }) print(" 6개월 이상 미접속 사용자 - 자발적 이탈 상세 사유 비율:") print(voluntary_dropout_df)
Plain Text
복사
5.
요일별 접속자 수
# 요일별 컬럼 생성 cleaned_df['weekday'] = cleaned_df['last_access_timestamp'].dt.dayofweek # 요일별 접속 횟수 집계 weekday_counts = cleaned_df['weekday'].value_counts().sort_index() # 요일 이름 매핑 weekday_name_map = { 0: '월요일', 1: '화요일', 2: '수요일', 3: '목요일', 4: '금요일', 5: '토요일', 6: '일요일' } weekday_counts.index = weekday_counts.index.map(weekday_name_map) # 요일별 비율 계산 weekday_ratio = (weekday_counts / weekday_counts.sum() * 100).round(1) # 출력 print("요일별 접속자 수:") print(weekday_counts.sort_values(ascending=False)) print("\n요일별 접속 비율 (%):") print(weekday_ratio.sort_values(ascending=False))
Plain Text
복사
6.
# 요일별 평균 이탈 위치 계산
weekday_avg_exit = ( cleaned_df.groupby('weekday')['exit_position_numeric'] .mean() .reset_index() ) # 요일 이름 매핑 weekday_avg_exit['weekday_name'] = weekday_avg_exit['weekday'].map(weekday_name_map) # 정렬 weekday_avg_exit_sorted = weekday_avg_exit.sort_values(by='exit_position_numeric', ascending=False) # 출력 print("요일별 평균 이탈 위치:") print(weekday_avg_exit_sorted[['weekday_name', 'exit_position_numeric']])
Plain Text
복사
7.
#시간대별 접속 수
7.#시간대별 접속 수
# 각 나이대별 시간(hour)별 접속 수 집계 age_hour_counts = cleaned_df.groupby(['age_group', 'hour']).size().reset_index(name='count') # 나이대별로 가장 많이 접속한 시간 구하기 peak_hour_per_age_group = age_hour_counts.sort_values('count', ascending=False).drop_duplicates('age_group') # 정렬 peak_hour_per_age_group = peak_hour_per_age_group.sort_values('age_group') print("각 나이대별 가장 많이 접속한 시간:") print(peak_hour_per_age_group)
Plain Text
복사
결과
9-12월에 좀더 많은 접속이 이루어있으나 대부분 크게 다르지 않음
⇒ 최근 3개월을 제외한 나머지는 비교하기에는 9/12월에 많은 접속이 이루어져 잡기가 불확실함
⇒ 최근 9개월을 제외한 나머지를 비교하기엔 표본이 너무 작아짐
⇒ 평균적으로 비슷한 추이를 갖고 있고 마케팅/ 통계에서도 상반기 하반기로 분석하는 경우가 많음
⇒ 6개월 이상 미접속 사용자를 장기이탈자로 분류
장기간 이탈자 전체 사용자의 이탈 사유의 비율에서 ux불편, 기술불편은 감소하고 자발적 이유가 증가하는 것을 알 수 있다. 즉 리디 이탈의 가장 중요한 요인은 자발적 요인이라고 할 수 있다.
3.+4.
⇒ 전체 미접속 사용자 957명 중 466명이 6개월 이상 미접속 사용자 거의 절반에 해당한다. 미접속 사용자 관리에 있어 장기 미접속 사용자에 대한 특별한 전략이 필요하다. 6개월 간 구매 이역이 없는 이들을 대상으로한 무료 구독 이벤트, 이벤트 쿠폰 제공 등으로 다시 재유입 시켜야한다.
⇒ 전체 사용자와 6개월 이상 미접속 사용자의 이탈사유는 크게 다르지 않다.
5+6
주말이 더 이탈 위치/ 접속률/ 완독률 이 더 높을 것이라는 기대와는 달리 아예 다른 결과가 나왔다. 이 둘의 수치에 비례하는 상관관계 또한 보이지 않는다. 그러나 월요일이 제일 접속률은 높고 이탈위치가 제일 낮다는 것은 사람들이 책을 읽으려 시도하는 날짜가 월요일이 가장 빈도수가 높지만, 하루에 1권을 다 완독하는 것이 아니라 며칠에 걸쳐 책을 읽었다고 해석 할 수 있다. 반면, 수요일은 접속자가 세 번째로 많으면서 이탈 위치가 가장 높아, 이 날 접속한 사용자들이 상대적으로 책을 끝까지 가까이 읽는 경향이 두르러지는 것을 보여준다.
⇒ 요일별 완독률을 구했을떄 목-화-수가 가장 완독률이 높았다.
⇒ 연속적인 독서를 할 수 있는 행사 진행을 통해 이탈을 막을 수 있을 것 같다.
전체적인 접속 비율은 10시-2시가 높고 그 뒤를 7-8시가 뒤따른다.
⇒ 전체 이용자들 중 10대의 비율이 높은데 이들의 주요 활동 시간이 10시에서 2시 사이라 접속 비율이 높은 것 같음
독서에 시간 투자를 못하는 현대 사회인(20-50)들이 많을 것이라고 가설을 세워 일반적인 사회인들의 근무 시간 9-6시에 접속 수가 적을 것이라고 예상했으나 50대를 제외한 20-40는 근무 시간에 접속률이 높았다.
⇒ 시간대별 이벤트를 통해 이탈율을 줄일 수 있지 않을까
‘2023년 국민 독서 실태조사’
출처 : 투데이신문(https://www.ntoday.co.kr)
에 따르면 성인의 독서율은 43프로 그중 종이책은 32으로고 학생들의 독서율은 약 96프로 종이책은 93이다
⇒ 플랫폼의 10대 비율이 19프로로 많았으나 독서의 시간을 투자 못하는 현대인들이 많아서 접속이 낮다라는 해석이 어려울 것 같다.
⇒ 표본자체가 적어서 일반적인 분포/ 상관관계가 안나오는 것 같다.