TIL_20231212 (파이썬 숙제풀이)

0

데이터 분석 종합반 강의를 마지막 주차까지 마무리하게 되었다.
마지막이라 그런지 지금까지 배운 내용에 추가적인 내용까지 머릿 속이 너무 복잡해져서 풀이를 설명해보며 복습하려한다.

# 데이터 불러오기
sparta_data = pd.read_csv('저장 경로 입력', sep=',')

# str데이터를 시간 데이터로 설정하기
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

# start_week의 열에다 index를 부여한 함수
category_range = set(sparta_data['start_week'])

# 수강율을 리스트로 함수에 저장
progress_rate = list(sparta_data['progress_rate'])

# 수강율 구간별 표시
bins = [0,4.11,26.03,41.10,61.64,80.82,100]

# 수강 주차를 표시한 라벨 함수
labels=[0,1,2,3,4,5]

# cut 함수를 사용하여 progress_rate에 bins 구간별 labels 표시
cuts = pd.cut(progress_rate,bins, right=True,include_lowest=True, labels=labels)
cuts = pd.DataFrame(cuts)
cuts

# 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"]

# sparta_week, week 컬럼을 그룹화
grouping = sparta_data.groupby(['start_week','week'])
grouping.head()

# grouping 함수에 user_id 열의 nunique한 값을 지정
cohort_data = grouping['user_id'].apply(pd.Series.nunique)
cohort_data = pd.DataFrame(cohort_data)
cohort_data.head(10)

# (어려움) 데이터셋에 시작 주차가 31주차부터여서 k가 31이며 for문으로 돌려서 0(week 컬럼)주차 기준으로 한 순서대로 주차별 user_id 수를 합산함
k=31
for i in range(6):
  for j in range(5, 0, -1):
    cohort_data.at[(k,j-1), 'user_id'] = int(cohort_data.at[(k,j),'user_id']) +  int(cohort_data.at[(k,j-1),'user_id'])
  k=k+1
  
 # 인덱스를 재부여함
cohort_data = cohort_data.reset_index()

# 피봇 사용
cohort_counts = cohort_data.pivot(index="start_week",
                                  columns="week",
                                  values="user_id")

# 새로운 retention 함수로 지정함
retention = cohort_counts

# 모든 로우에 0번째 행을 가지고 함수 지정
cohort_sizes = cohort_counts.iloc[:,0]

# 0~5주차까지 사이즈를 열로 넣어주고 소숫점 3자리까지 표기
retention = cohort_counts.divide(cohort_sizes, axis=0)
retention.round(3)*100

# 히트맵 호출
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()

숙제가 너무 어려웠어서 다시 한번 복습하는 마음으로 작성했는데 처음부터 혼자 하라고 하면 아직도 머리에서 잘 그려지지 않는다. 데이터 전처리 과정을 좀더 세심하게 공부할 필요가 있을 것 같다.

profile
Data analyst를 향해 도전하는 이야기

0개의 댓글