본문 바로가기

TIL

[231214] Phython: 실습 - 타깃, 동기 부여 서비스 분석

* 수강 강의명: 데이터 분석 종합반 - 5주차 

 [요약] 

1. 실습 미션 및 가설

- 미션 : 8월 중순부터 강의 완주율이 크게 떨어졌다. 그 이유는? 

- 수강 여정에 따른 가설 설정  

① 강의를 들을 수 있는 시간적 여유가 생긴다.  >  타깃별 완주율 > 주요 컨텐츠 및 마케팅 타깃이 맞는지 검토
② 강의를 들어야겠다고 마음을 먹는다. > 동기부여 서비스 여부에 따른 완주율 > 서비스 강화 필요성 검토 
③ 강의를 듣기 위해 콘텐츠에 접근한다. > 시스템 오류 여부 확인 (본 실습에서는 이슈 없었다고 가정)

④ 콘텐츠를 에서 목표한 부분까지 듣는다. > 강의 개편 전후에 따른 완주율 > 개편 강의 유지 여부 검토

 

2. 우리는 적절한 타겟에게 판매를 하고 있을까? 

- 가설 : 다른 연령대에 비해 바쁜 20~30대의 수강 완주율이 상대적으로 낮을 것이다.

- 이후 액션: 2-30대가 실제로 완주율이 낮을 경우 프로덕트가 적절한 고객에게 가지 못해 불만족이 발생하고 있는 상황이므로 프로덕트를 개선하거나 광고 메인 타겟을 변경할 수 있다.

#라이브러리 불러오기
import pandas as pd
import matplotlib.pyplot as plt
plt.rc('font', family='NanumBarunGothic')

sparta_data = pd.read_table('/content/sprata_data.csv', sep = ',')

#나이대별 수강율 평균 구하기
progress_rate_by_age = sparta_data.groupby('age')['progress_rate'].sum()
progress_rate_by_age
number_people_by_age = sparta_data.groupby('age')['_id'].count()
number_people_by_age
average = progress_rate_by_age/number_people_by_age

#그래프 그리기 
plt.figure(figsize=(6,6))

#그래프의 x축 눈금 설정
plt.xticks([10,20,30,40,50])
plt.bar(average.index, average,width=8)

#그래프의 바에 각 수치율을 추가하기
bar = plt.bar(average.index, average,width=8)
for rect in bar:
    height = rect.get_height()
    plt.text(rect.get_x() + rect.get_width()/2.0, height, '%.1f' % height, ha='center', va='bottom', size = 12)


plt.title('[나이대별 평균 수강율]',fontsize=15,pad=20)
plt.xlabel('나이',fontsize=12,labelpad=20)
plt.ylabel('수강생(명)',fontsize=14,rotation=360,labelpad=35)
plt.show()

 

- 결론 : 메인 타깃인 20-30대 완주율은 우수한 편으로 프로덕트 개선 및 광고 주요 타겟 변경은 배제해도 될 것이다. 

 

3. 찐한관리를 하면 완주율이 높아질까?

- 가설 : 찐한관리를 받은 인원이 그렇지 않은 인원보다 완주율이 높을 것이다.

- 이후 액션 : 찐한관리를 받는 인원의 완주율이 높다면, 찐한관리 신청 비율 높이는 방법을 고안하고, 찐한관리를 받지 않는 인원의 완주율이 높다면 다른 동기부여 방법을 개발한다. 

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

sparta_data = pd.read_table('/content/sparta_data.csv',sep=',')
sparta_data = sparta_data.dropna
sparta_data.tail()

managed = ['TRUE','FALSE'] 
managed_data_avg = sparta_data.groupby('managed')['progress_rate'].sum()/sparta_data.groupby('managed')['_id'].count()

plt.figure(figsize=(6,6)) 
plt.bar(managed_data_avg.index,managed_data_avg.values)
bar = plt.bar(managed_data_avg.index,managed_data_avg.values)

#그래프의 바에 각 수치율을 추가
for rect in bar:
    height = rect.get_height()
    plt.text(rect.get_x() + rect.get_width()/2.0, height, '%.1f' % height, ha='center', va='bottom', size = 12)

plt.title('찐한관리 유무에 따른 평균 완주율',fontsize=14)
plt.xlabel('평균 완주율',fontsize=12) 
plt.xticks([0,1], labels=["찐한관리 비 신청자","찐한관리 신청자"])
plt.ylabel('찐한관리 여부',fontsize=12,rotation=360,labelpad=35) 
plt.xticks(rotation=45)
plt.yticks(rotation=360)
plt.show()

 

 - 결론 : 찐한 관리를 받은 그룹의 수강 완주율은 68.5%로, 찐한 관리를 받지 않은 그룹의 수강 완주율 38.6%보다 월등히 높아, 동기 부여 서비스 신청을 독려할 필요가 있다. 

 

[정리]

1) 어떤 문제가 있었나

SQL 코드카타에서 윈도우 함수 중 하나인 RANK 를 활용하지 않고, MAX 값의 카테고리별 값을 뽑아내는 방법을 알게 됨

 

2) 내가 시도해본 건 무엇인가

다른 사람이 쓴 쿼리 구조를 뜯어보고 다시 새롭게 적어 봄  

 

--- 내가 쓴 쿼리문 --- 
SELECT CATEGORY, PRICE, PRODUCT_NAME
FROM 
(SELECT CATEGORY, PRICE, PRODUCT_NAME, 
       rank() over (partition by CATEGORY order by PRICE desc) ranking
  from FOOD_PRODUCT) A
WHERE ranking = 1
  and CATEGORY in ('과자', '국', '김치', '식용유')
Order by 2 DESC

-- 다른 사람 쿼리문 --- 
SELECT CATEGORY, PRICE, PRODUCT_NAME
  FROM FOOD_PRODUCT 
  WHERE (CATEGORY, PRICE) IN 
(SELECT CATEGORY, MAX(PRICE) MAX_PRICE
FROM FOOD_PRODUCT 
GROUP BY 1)
 AND CATEGORY in ('과자', '국', '김치', '식용유')
ORDER BY 2 DESC


3) 어떻게 해결했나

유사한 내용을 묻는 다른 문제에서는 RANK가 아닌 WHERE & IN (서브쿼리)를 이용해 추가 정답을 제출하여 새로운 문법을 숙지함 

 

4) 무엇을 새롭게 알았나

- SQL에서 WHERE 절에 복수의 칼럼을 넣고, IN에 서브쿼리로 신규 테이블을 넣어 매칭되는 값만 추출할 수 있음

 - 7팀 마무리 미팅에서 파이썬 코딩 시 Colab 외에 주피터 노트북을 많이 활용함 > 익일 설치 예정