* 수강 강의명: 데이터 분석 종합반 - 5주차
[요약]
* 5주차 앞단 내용은 https://datananalysis.tistory.com/21 참고
1. 프로덕트 개선은 정말 도움이 되었을까
- 가설 : - 8월 2주차부터 프로덕트가 개편되었으므로, 3주차 이후 강의 완주율이 현저히 떨어졌을 것이다.
- 이후 액션: 3주차 이후 완주율이 떨어졌다면 이전의 커리큘럼으로 돌아가고, 아니라면 다른 요인을 찾는다.
#라이브러리 불러오기
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
plt.rc('font', family='NanumBarunGothic')
sparta_data = pd.read_table('/content/cohort_data.csv',sep=',')
#날짜 데이터 타입 변경
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)
#시작 week 구하기
sparta_data['start_week']= sparta_data['start_time'].dt.isocalendar().week
#시작 주 범위 알기
category_range = set(sparta_data['start_week'])
#범주화할 데이터
progress_rate = list(sparta_data['progress_rate'])
#범주를 구분하는 기준
bins 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=labes)
cuts = pd.DataFrame(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"]
#시작주와, 수강 주차별 기준으로 표 grouping 하기
grouping = sparta_data.groupby(['start_week','week'])
#시작주와, 수강 주차별에 해당하는 수강생 수 구하기
cohort_data = grouping['user_id'].apply(pd.Series.nunique)
cohort_data = pd.DataFrame(cohort_data)
#각 주차별 수강한 수강생 총 합 구하기
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
#각 주(week) 별 최초 수강생 수만 가져오기
cohort_sizes = cohort_counts.iloc[:,0]
cohort_sizes.head()
# 최초 수강생 수를 각 데이터에 나눠주기
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.xlabel('주차', fontsize=14,labelpad=30)
plt.ylabel('개강일', fontsize=14,rotation=360,labelpad=30)
plt.yticks(rotation=360)
plt.show()
- 결론 : 4주차 이후 완주율이 전체적으로 감소 추이를 보이고 있어 프로덕트 개편의 영향이라고 보기 어렵다.
[정리]
1) 어떤 문제가 있었나
SQL 코드카타 55번 문제가 계속 오답으로 체크됨
2) 내가 시도해본 건 무엇인가
group by having x 서브쿼리 절을 with 절로 바꿔서 다시 추출해봄
--- 내가 쓴 쿼리문 ---
①
SELECT USER_ID,
NICKNAME,
CONCAT(CITY,STREET_ADDRESS1,STREET_ADDRESS2) "전체주소",
CONCAT(SUBSTRING(TLNO,1,3), '-',SUBSTRING(TLNO,4,4), '-',SUBSTRING(TLNO,8,4)) "전화번호"
FROM USED_GOODS_USER
WHERE (USER_ID) IN (SELECT WRITER_ID
FROM USED_GOODS_BOARD
GROUP BY 1
HAVING (COUNT(*) >=3))
ORDER BY 1 DESC
②
WITH TABLE1 AS (SELECT WRITER_ID
FROM USED_GOODS_BOARD
GROUP BY 1
HAVING (COUNT(*) >=3))
SELECT T.WRITER_ID USER_ID,
NICKNAME,
CONCAT(CITY,STREET_ADDRESS1, STREET_ADDRESS2) "전체주소",
CONCAT(SUBSTRING(TLNO,1,3), '-',SUBSTRING(TLNO,4,4), '-',SUBSTRING(TLNO,8,4)) "전화번호"
FROM TABLE1 T
3) 어떻게 해결했나
다른 사람 강의를 통해 주소 내용을 결합하는 과정에서 중간에 띄어쓰기가 필요한 것을 알게 되어, CONCAT의 칼럼 사이에 " " 값을 넣어줌
4) 무엇을 새롭게 알았나
- 여러 문자 열을 합쳐주는 CONCAT 함수 외에, 특정 구분자를 넣을 수 있는 CONCAT_WS가 있음
CONCAT_WS(구분자, 칼럼1, 칼럼2 ... ): 사용자가 지정한 구분자(문자열)로 각 칼럼을 결합해주는 함수
ex. CONCAT_WS("/",year,month,day) = 2023/06/08
* cf) CONCAT 함수는 NULL이 포함된 부분을 NULL로 출력하나 CONCAT_WS 함수는 NULL을 무시하고 출력함
- 파이썬에서 CONCAT 함수 사용시 axis=1은 열방향, axis=0은 행 방향으로 붙여넣기를 의미함
'TIL' 카테고리의 다른 글
[231219] SQL: 코드카타 60~65 (0) | 2023.12.19 |
---|---|
[231218] SQL: 코드카타 55~59 (1) | 2023.12.18 |
[231214] Phython: 실습 - 타깃, 동기 부여 서비스 분석 (0) | 2023.12.14 |
[231213] Phython: 실습 - 광고 효율, 상품 기획, 할인율 분석 (0) | 2023.12.13 |
[231212] Phython: 요일/시간대/지역별 데이터 분석 및 지도 라이브러리 활용법 (0) | 2023.12.12 |