#날짜 데이터 타입 변경 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)
#시작주와, 수강 주차별 기준으로 표 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()
#앞서 만든 피벗 테이블을 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은 행 방향으로 붙여넣기를 의미함