데이터분석 실습 | 주차 간 전환율로 리텐션 테이블, 히트맵 만들기

    728x90

     

    [참고 게시글]

    [IT 교육/데이터 분석] - 데이터분석 | 완주율을 높이는 요인 | 적절한 타겟 설정 | 프로덕트 개선

     

    데이터분석 | 완주율을 높이는 요인 | 적절한 타겟 설정 | 프로덕트 개선

    수강 완주율 개선 0. 가설 설정하기 ▶ 가설1 : 우리는 적절한 타겟에게 판매를 하고 있을까? 다른 연령대에 비해 바쁜 20~30대의 수강 완주율이 상대적으로 낮을 것 완주가 가능한 수강생들이 수

    nasena.tistory.com

    >> 위 게시물과 이어지는 실습


    0. 가설 설정

     

    ▶ 가설

     

    [참고게시글]의 마지막 파트에서 구했던 {개강 주차 별-수강 주차}의 비율

    해당 개강 주차(개강일)의  첫 주차 대비 그 이후 모든 주차의 수강률이 어떤지 구해줬었음

    (= 해당 주차 수강생 수 / 첫 주차 수강생 수)

    그래서 왼쪽 그림과 같이 주차를 거듭할수록(시간이 갈수록) 수강률이 점차 떨어지는 히트맵이 나옴

    하지만 이건 너무 당연한 결과를 보여주는 것에 불과함

    따라서, 오른쪽 그림과 같이 직전 주차 대비 다음 주차 수강률이 어떤지 구해보고자 함

     (= 해당 주차 수강생 수 / 직전 주차 수강생 수)


    1. 분석할 데이터 가져오기

     

    ▶ 한글 깨짐 방지 코드

    !sudo apt-get install -y fonts-nanum
    !sudo fc-cache -fv
    !rm ~/.cache/matplotlib -rf

     

    ▶ 라이브러리 가져오기

    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    plt.rc('font', family='NanumBarunGothic')

     

    ▶ [참고게시글]의 '가설3' 내용 코드 가져오기

    : 여기에서 무엇을 추가해야 직전 주차 대비 해당 주차 수강생 비율을 구할 수 있을까?

    sparta_data = pd.read_table('/content/cohort_data.csv',sep=',')
    #spart_data.info()
    
    # 'created_at 데이터를 문자->날짜 데이터로 변경하기
    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['start_week']= sparta_data['start_time'].dt.isocalendar().week
    sparta_data.tail()
    
    # set() 함수로 고유한 요소 가리기
    category_range = set(sparta_data['start_week'])
    
    # 범주화할 데이터 리스트로 만들기
    progress_rate = list(sparta_data['progress_rate'])
    
    # bins = 진도율 리스트(0주차 수강 시 생성되는 진도율 -> 0 ~ 4.11% ,, 이런 식)
    bins = [0, 4.11, 26.03, 41.10, 61.64, 80.82, 100]
    # 구분한 범주의 라벨
    labels=[0,1,2,3,4,5]
    
    # 범주화에 사용하는 함수 pd.cut
    cuts = pd.cut(progress_rate, bins, right=True, include_lowest=True, labels=labels)
    
    # 결과물을 테이블로 변경하기
    cuts = pd.DataFrame(cuts)
    
    # concat() 함수로 sparta_data 테이블 + cuts 테이블 병합
    sparta_data = pd.concat([sparta_data, cuts], axis=1, join='inner')
    
    # 컬럼 이름 작성(바꾸고 싶은 컬럼 뿐만 아니라 모든 컬럼 이름 다 적어줘야 함)
    sparta_data.columns=['created_at','user_id','name','progress_rate','start_time','start_week',"week"]
    
    
    # 기존의 테이블을, start_week와, week로 묶어줍니다!
    grouping = sparta_data.groupby(['start_week','week'])
    
    cohort_data = grouping['user_id'].apply(pd.Series.nunique)
    cohort_data = pd.DataFrame(cohort_data)
    
    
    # 첫 주 = 31, 수강 시작 주 범위는 {31,32,33,34,35,36}
    # 총 5주차 수업임
    f=31
    
    for i in range(6):
      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'])
      f=f+1
    
    # cohort_data 인덱스 설정하기
    cohort_data = cohort_data.reset_index()
    
    
    # 피벗테이블 만들기
    cohort_counts = cohort_data.pivot(index="start_week",
                                      columns="week",
                                      values="user_id")
    
    # 수강 첫 주 총 인원 구하기
    # 앞서 만든 피벗 테이블을 retention 변수에 저장하기
    retention = cohort_counts
    
    # 각 주(week) 별 최초 수강생 수만 가져오기 (나눠줄때, 분모가 되는 부분!)
    cohort_sizes = cohort_counts.iloc[:,0]  # iloc(모든행, 0번째 열)
    
    
    # 최초 수강생 수를 각 데이터에 나눠주기
    retention = cohort_counts.divide(cohort_sizes, axis=0)
    
    
    #각 수치 퍼센트로 변경하기
    retention.round(3)*100

    retention

    >> 최초 수강생 대비 해당 주차 별 현재 잔존하고 있는 수강생의 비율(퍼센트)


    2. 데이터 분석하기 (상단 코드 뒤에 추가될 부분)

     

    ▶ 직전 주차 대비 해당 수강생 비율 구하기

    : 주차 별 수강 전환율 구하기

    : 이미 퍼센트는 위에서 구해놨으니 바로 각 주차 별 전환율을 직전 주차 전환율로 나누면 됨

    : 현재 잔존하고 있는 수강생은 직전 주차에 비해 몇 퍼센트인지 구하는 것

    w=31
    for i in range(6):
      for j in range(5, 1, -1):
        retention.at[(w,j)] = retention.at[(w,j)]/retention.at[(w,j-1)]
      w=w+1
      
    retention

    3. 데이터 시각화하기

     

    ▶ 분석한 데이터 시각화하기

    #주차별 수강 전환율 히트맵
    plt.figure(figsize = (10,8))
    
    sns.heatmap(data = retention,
               annot = True,
               fmt = '.0%',
               vmin = 0,
               vmax = 1,
               cmap = "BuGn")
    
    
    
    plt.title('개강일별 주차 간 전환율', fontsize=20)
    plt.xlabel('주차', fontsize=14,labelpad=30)
    plt.ylabel('개강일', fontsize=14,rotation=360,labelpad=30)
    plt.yticks(rotation=360)
    
    plt.show()


    5. 최종 결론

     

    ▶ 결론

    [참고 게시글] 가설을 참고해보면

    32주차 개강반의 3주차 강의 교안이 바뀐 것 때문에 4주차부터 수강생 수가 줄었다고 생각해서 이런 분석을 실시하게 됨.

    그런데 위의 결과를 살펴보니 32주차 개강반의 4주차 수강생 수줄었지 그 이후의 32주차부터 36주차 개강반의 4주차 수강생의 수오히려 더 많았음.

    즉, 3주차 강의 교안이 바뀐 것은 수강생 비율과 관련이 없기 때문에 그대로 두고 사용해도 됨.

    728x90

    댓글