23.12.28. D8

예진·2023년 12월 28일
0

TIL

목록 보기
8/68
post-thumbnail

데이터 분석하기

(1)  수강 시작 주와, 수강 주차에 각 해당하는 수강생 수를 내용으로 테이블 만들기

(2) 수강 주차 별, 수강한 총 인원 구하기

데이터 전처리

#데이터 분석 기본 세팅
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
plt.rc('font', family='NanumBarunGothic')
sparta_data = pd.read_table('파일 경로',sep=',')
sparta_data.tail()

#수강 완료 하는데 어마만큼 걸렸나?
`created_at`: 수강 등록 시점
`progress_rate`: 진도율

고객의 수강시점을 일에서 주단위로, 각 수강생의 진도율을 강의 주차로 변경

1. 각 고객별 최초 수강 주 구하기

#데이터 종류 확인 (created_at함수)
print(type(sparta_data['created_at'][1]))
#sparta_date 정보에서 access_date 열에서 데이터 첫번째 부분만 확인

#날짜 데이터로 변경하기
format='%Y-%m-%dT%H:%M:%S.%f'
sparta_data['start_time'] = pd.to_datetime(sparta_data['created_at'], format=format,infer_datetime_format=True)
sparta_data.tail()

#수강 시작 주 구하고, 테이블의 열로 추가 하기
sparta_data['start_week']= sparta_data['start_time'].dt.isocalendar().week
sparta_data.tail()

#처음 수강 시작한 주 범위 확인하기
#이전에 배웠듯이 set()set안의 데이터는 순서가 정해져있지 않고, 중복되지 않는 고유한 요소를 가져옵니다!
category_range = set(sparta_data['start_week'])
category_range

2. 진도율을 강의 주차로 변경하기
0주차 : 0 ~4 .11%
1주차 : 4.12% ~ 26.03%
2주차 : 26.04% ~ 41.10%
3주차 : 41.11% ~ 61.64%
4주차 : 61.65% ~ 80.82%
5주차 : 80.83% ~ 100%

#범주화할 데이터 리스트 만들기
progress_rate = list(sparta_data['progress_rate'])

#범주를 구분하는 기준 및 라벨 만들기
#범주를 구분하는 기준 bins 처음(0)(100) 잊지 말고 기입 해주세요!
bins = [0,4.11,26.03,41.10,61.64,80.82,100]
#구분한 범주의 라벨 labels
labes=[0,1,2,3,4,5]

#범주화하기 : 사용하는 함수 pd.cut
cuts = pd.cut(progress_rate,bins, right=True,include_lowest=True, labels=labels)
cuts

#결과물을 테이블로 변경하기
cuts = pd.DataFrame(cuts)
cuts.tail()

#기존 테이블에 현재 수강 주차 테이블 합치기
#concat() 함수를 이용하여, sparta_data 테이블과, cuts 테이블 병합 할수 있습니다 :)
sparta_data = pd.concat([sparta_data,cuts],axis=1, join='inner')
sparta_data.head()

#테이블 컬럼 이름 바꾸기
sparta_data.columns=['created_at','user_id','name','progress_rate','start_time','start_week',"week"]
sparta_data.head()

데이터 분석하기

데이터를 분석하기 전 필요한 전처리 마무리하기

1. 수강 시작 주와 수강 주차를 기준을 테이블 만들기

#기존의 테이블을, start_week와, week로 묶어줍니다!
grouping = sparta_data.groupby(['start_week','week'])
grouping.head()

2. 수강 시작 주와 수강 주차에 해당하는 수강생 수 구하고 테이블로 변경하기

#수강 수 구하기, 테이블로 변경하기
cohort_data = grouping['user_id'].apply(pd.Series.nunique)
cohort_data = pd.DataFrame(cohort_data)
cohort_data.head(5)

3. 수강 주차 별, 수강한 총 인원 구하기

#첫 주가 31주니 변수를 하나 만들어 줍니다!
f=31
#처음 수강 시작한 주의 범위가 {31,32,33,34,35,36} 이니, range(6)으로 합시다!
for i in range(6):
	#5주차의 강의가 마지막이고, 0주차까지 이니, 시작은 5에서 시작해 10까지 감소 시킬수 있어요!
  for j in range(5, 0, -1):
    cohort_data.at[(f,j-1), 'user_id'] = int(cohort_data.at[(f,j),'user_id']) +  int(cohort_data.at[(f,j-1),'user_id'])
	#주차는(31부터 32 33..) 1씩 늘어나죠?
  f=f+1

4. cohort_data에 인덱스 설정하기

cohort_data = cohort_data.reset_index()
cohort_data.head()
  • 프로덕트 개선은 정말 도움이 되었을까_시각화

피벗 테이블이란?

기존의 데이터를 바탕으로 필드를 재구성해, 데이터 통계를 보다 쉽게 파악 할수 있도록 만든 테이블

#피벗테이블 만들기
cohort_counts = cohort_data.pivot(index="start_week",
                                  columns="week",
                                  values="user_id")
cohort_counts

리텐션 테이블

리텐션이란? 고객이 우리 제품이나 서비스를 지속적으로 소비하는 것을 의미!

1. 리텐션 테이블 생성 및 각 데이터에 나워줄 수강 시작 주 총 인원 구하기

#수강 첫 주 총 인원 구하기
# 앞서 만든 피벗 테이블을 retention 변수에 저장하기
retention = cohort_counts

#각 (week) 별 최초 수강생 수만 가져오기 (나눠줄때, 분모가 되는 부분!)
cohort_sizes = cohort_counts.iloc[:,0]
cohort_sizes.head()

2. 각 데이터에 수강 시작 주의 총 인원 나눠주기

# 각 주당 수강생 수강율 나타내기
# 표의 단일 데이터에 최초 수강생의 수를 나누어, 각 주당 수강생 수강율 나타내기! 
retention = cohort_counts.divide(cohort_sizes, axis=0)
retention.head()

3. 각 데이어 퍼센테이지로 변경하기

#수강율을 %로 바꾸기
#각 수치 퍼센트로 변경하기
#round 함수로 3자리 수에서 반올림 한 후, 100을 곱해 줍니다!
retention.round(3)*100



코호트 분석 히트맵으로 시각화 하기
profile
Data Analysis / 맨 땅에 헤딩

0개의 댓글