본문 바로가기

TIL

[231215] Phython: 실습 - 프로덕트 개선

* 수강 강의명: 데이터 분석 종합반 - 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은 행 방향으로 붙여넣기를 의미함