2026/03/16 Mon.
발표 준비 돕기? 및 KPT 회고, 팀 회고데이터 분석 종합 4강데이터 분석 종합 5강- 데이터 분석 복습
⊙ 데이터 분석 종합반_5강
문제 정의 및 가설 설정 → 데이터 기본 세팅 → 데이터 가공 및 분석 → 분석 결과 시각화 → 최종 결론 도출
상황 : 지난 8월 중순부터 웹 개발 종합반 완주율이 떨어지고 있는 상황
수강생 완주율에 영향을 미치는 요인 분석
완주율을 높일 수 있는 방법 찾기
떨어진 수강 완주율의 원인을 찾고 개선해보자!!
[ 수강 여정 ]
1. 강의를 들을 수 있는 시간적 여유가 생긴다
: 타겟한 사람에게 진정성있는 도움을 그리지 못했다는 것
2. 강의를 들어야겠다고 마음을 먹는다.
: 동기부여 시키는 구간 → 측정 가능한 부분
3. 강의를 듣기 위해 콘텐츠에 접근한다.
: 접근 과정에 문제가 없도록, 시스템 오류가 없도록 → 이번에는 수강 오류가 없다고 가정
4. 콘텐츠를 2에서 목표한 부분까지 듣는다.
: 흥미도, 실용성
→ 1,2,4번을 살펴보면 개선 주안점을 찾을 수 있는지
💡 좋은 가설이란?
1. 풀고자 하는 문제의 방향성과 일치하는 가설 → 무슨 문제를 풀고자 하는지 명확히 알 것
2. 테스트 가능한 가설 → 데이터로 확인이 가능한 가설을 세울 것
3. 액션으로 이어질 수 있는 가설 → 가설 검증 후 결과에 따라 특정 액션으로 유도될 수 있을 것
- 예제 1
| 문제 정의 및 가설 설정 |
애초에 시간이 없어 듣지 못하는 고객의 경우, 애초에 만족할 수 없는 고객에 판매한 것이니 장기적 관점에서 포지셔닝 변경이 필요 → 포지셔닝 변경이 정말 필요할지 데이터를 살펴봄 🤔 현재 상황 1️⃣ 스파르타코딩클럽 광고의 메인 타겟은 2-30대입니다. 2️⃣ 2-30대의 구매 건수는 다른 나이대에 비해 높은 편입니다. 3️⃣ 이번에 완주 후 퀴즈를 제출하는 이벤트에서 2-30대의 참여율이 저조했습니다. 4️⃣ 퀴즈에 참여하지 않은 인원의 전화인터뷰에서 “바빠서”라는 답변이 압도적으로 많았습니다. 💡 문제 상황 - 8월 중순부터 웹 개발 종합반의 완주율이 크게 떨어진 이유를 밝힌다 - 완주 가능한 수강생들이 수강할 수 있도록 적절한 포지셔닝을 고민해야 한다 💡 상황을 보고 예측할 수 있는 것 - 2-30대가 우리 프로덕트에 관심이 있다 - 2-30대가 완주율이 다른 나이대에 비해 낮을 가능성이 있다 - 2-30대가 완주율이 낮은 이유는 다른 나이대에 비해 바쁘기 때문일 수 있다. → 집단적으로 관심은 있었는데 지속적으로 수강을 할 수 없는 것은 애초에 시간 부족 등의 이유로 참여하기 어려운 상황이었을 확률이 높습니다. 가설 : 다른 연령대에 비해 바쁜 20~30대의 수강 완주율이 상대적으로 낮을 것이다. 생각 정리 검증 방법 : 나이대별 완주율을 비교한다 이후 액션 : 2-30대가 실제로 완주율이 낮을 경우 프로덕트가 적절한 고객에게 가지 못해 불만족이 발생하고 있는 상황이므로 프로덕트를 개선하거나 광고 메인 타겟을 변경할 수 있다. |
| 데이터 세팅 및 데이터 확인 |
import pandas as pd
import matplotlib.pyplot as plt
plt.rc('font', family='NanumBarunGothic') #한글 깨짐 방지 설정
sparta_data = pd.read_csv('/content/sparta_data.csv')
sparta_data.head()
![]() id : 회원 고유 아이디 created_at : 수강 등록 시점 updated_at : 최근 수강 완료 시점 name : 회원 이름 marketing : 마케팅 수신동의 managed : 찐한 관리 여부 gender : 성별 age : 나이대 progress_rate : 진도율 |
| 데이터 가공(전처리) 및 데이터 분석 |
#각 나이대-age 별 진도율-progress rate의 평균을 알아야 함
#나이대별로 수강률 합 구하기
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
average
![]() |
| 분석 결과 시각화 |
#시각화
#plt.figure(width, height) : 넓이와 높이 만큼 이미지를 생성한다는 것을 말해줍니다!
plt.figure(figsize=(6, 6))
#그래프의 x축 눈금 설정
plt.xticks([10,20,30,40,50])
#plt.bar(X축값, Y축값)
plt.bar(average.index, average.values)
#그래프의 바에 각 수치율을 추가 해 볼까요?
bar = plt.bar(average.index, average.values,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)
#그래프의 제목
#타이틀과 그래프와의 간격은 pad= 수치 로 나타내어요!
plt.title('[나이대 별 평균 수강율]',fontsize=15,pad=20)
#그래프의 x축 라벨 이름
#labelpad 파라미터는 축 레이블의 여백을 지정합니다.
plt.xlabel('나이',fontsize=12,labelpad=20)
#그래프의 y축 라벨 이름
plt.ylabel('수강생(명)',fontsize=14,rotation=360,labelpad=35)
#그래프를 화면에 나타나도록 합니다.
plt.show()
![]() |
| 최종 결론 도출 | 데이터 분석 결과 실제 20대의 완주율이 높게 나왔다. 잘못된 고객들한테 타겟팅을 하고 있었던 것이 아니었다. → 해결해야할 문제 1,2,4번 중 1번 문제에 집중하지 않아도 된다. |
- 예제 2
| 문제 정의 및 가설 설정 |
여유가 생겼을 때 코딩 수업을 들어야겠단 마음이 들었을 때, 꾸준한 수강을 할 수 있도록 "찐한관리" 서비스가 고객 완주에 도움이 되나? 🤔 현재 상황 : 최근 3개월간 찐한관리 신청 비율과 완주율이 모두 감소하고 있다. 💡 문제 상황 - 8월 중순부터 웹 개발 종합반의 완주율이 크게 떨어진 이유를 밝힌다 - 고객이 수강을 완료할 수 있도록 적절한 동기부여를 주어야 한다 💡 상황을 보고 예측할 수 있는 것 - 찐한 관리와 완주율이 동시에 감소했으므로 연관이 있을 가능성 가설 : 찐한관리를 받은 인원이 그렇지 않은 인원보다 완주율이 높을 것이다. 생각 정리 검증 방법 : 찐한관리 집단 VS 하지 않는 집단을 나누어 완주율 비교해볼 수 있다 이후 액션 : 찐한관리 인원의 완주율이 높을 경우 - 찐한관리 신청 비율 높이기 : 찐한관리 하지 않는 인원 완주율이 높을 경우 - 다른 동기부여 방법 고안하기 |
| 데이터 세팅 및 데이터 확인 |
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
plt.rc('font', family='NanumBarunGothic')
sparta_data = pd.read_csv('/content/sparta_data.csv')
sparta_data.head()
![]() |
| 데이터 가공(전처리) 및 데이터 분석 |
📌 "찐한관리" 유무 그룹으로 나눠 그룹별 진도율 평균을 구해야 한다 managed: 찐한관리 유무 progress_rate: 진도율 #데이터 수정
#true, false를 문자값으로 변환해 데이터를 읽을 수 있도록 전처리
managed = ['TRUE','FALSE']
managed
#찐한관리 유무에 따른 수강 완료율 평균 구하기
#찐한관리 유무로 그룹을 나누고
#각 그룹의 완주율 평균을 구한다
managed_data_avg = sparta_data.groupby('managed')['progress_rate'].sum()/sparta_data.groupby('managed')['_id'].count()
managed_data_avg
![]() |
| 분석 결과 시각화 |
#시각화
#높이와 넓이
plt.figure(figsize=(10,5))
#plt.bar(X축값, Y축값)
plt.bar("x축 기입" ,"y축 기입")
#그래프의 바에 각 수치율을 추가 해 볼까요?
bar = plt.bar(managed_data_avg.index , managed_data_avg)
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)
#그래프의 x축 라벨 이름
plt.xlabel('평균 완주율',fontsize=12)
#x축 눈금 레이블 지정하기
#기존의 0,1이라는 x축 레이블을, labels =["..."]로 변경 가능 합니다 :)
plt.xticks([0,1], labels=["찐한관리 비 신청자","찐한관리 신청자"])
#그래프의 y축 라벨 이름
plt.ylabel('찐한관리 여부',fontsize=12,rotation=360,labelpad=35)
#x축 눈금의 글씨를 360도 회전
plt.xticks(rotation=360)
#y축 눈금의 글씨를 360도 회전
plt.yticks(rotation=360)
#그래프를 화면에 나타나도록 합니다.
plt.show()
![]() |
| 최종 결론 도출 | 찐한관리 신청한 사람이 그렇지 않은 사람에 비해 수강 완주율이 30% 이상 높다. 찐한관리가 완주율에 유의미한 영향을 끼치고 있다. 찐한관리 신청자 비율이 낮아지고 있는 상황이지만 지금 당장 완주율을 높이기 위해서 찐한관리 신청 독려를 위한 액션을 취해야 한다 |
- 예제 3
| 문제 정의 및 가설 설정 |
콘텐츠가 충분히 흥미있고 유익해서 수강완료 해야겠다고 생각이 드는지에 대한 부분 8월 콘텐츠 개편이 된 상황 8월 완주율이 꺽인 시점과 유사한 시기 🤔 현재 상황 : 8월 2주 차 개강반부터 새로 제작된 3주차 콘텐츠를 듣기 시작했다. 💡 문제 상황 - 고객이 수강을 완료할 수 있도록 흥미롭고 유익한 콘텐츠를 제공해야한다 - 8월 중순부터 완주율이 크게 떨어진 이유를 밝혀야 한다 💡 상황을 보고 예측할 수 있는 것 - 8월 중순부터 완주율이 크게 떨어졌으므로, 비슷한 시기 진행한 프로덕트 개선이 영향을 미쳤을 가능성이 있어 보인다 가설 : 8월 둘째주 부터 변경된 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=',')
sparta_data.info()
![]() → 4개의 컬럼이 있고 1736개의 데이터가 있음을 알 수 있음 sparta_data = pd.read_table('/content/cohort_data.csv',sep=',')
#테이블 하위 5개의 정보 확인
sparta_data.tail()
![]() ⇒ user_id: 수강생 고유 id ⇒ created_at: 수강 등록 시점 : 개강반이 언제냐 : 개강반이 언제냐에 대한 것으로 변환해야 한다 ⇒ name: 수강생 이름 ⇒ progress_rate: 진도율 : 수치로 퍼센트 : 지금 현재 몇주차에 머무르고 있다로 변환해야한다 |
| 데이터 가공(전처리) 및 데이터 분석 |
#개강일로부터 몇주차 개강반인지 구해야하고
#각 수강생의 진도율로 이 사람이 현재 몇 주차에 머무르고 있는지 구해야한다
#일 단위로 하면 데이터가 너무 많아 한 눈에 파악하기 힘들다
#그래서 데이터를 묶는 과정이라고 생각하면 됨
#각 고개별 최초 수강 week 구하기
#년,월,일로 이루어진 것을 1년 중 "몇주차"에 해당하는지 알아보기
#파이썬의 type()함수를 쓰면, 데이터의 종류를 확인 할수 있어요 :)
print(type(sparta_data['created_at'][1]))
#sparta_date 정보에서 access_date 열에서 데이터 첫번째 부분만 확인 하면 되겠죠?
우리가 원하는 데이터는 날짜&시간인데 "str-문자"로 표현되어 있다 날짜 형태로 지정하기 %Y : 년도 %m : 월 %d : 일 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=',')
sparta_data.head()
format = "%Y. %m. %d"
sparta_data['start_time'] = pd.to_datetime(sparta_data['created_at'], format='mixed')
sparta_data.tail()
![]() format = "%Y. %m. %d"
sparta_data['start_time'] = pd.to_datetime(sparta_data['created_at'], format='mixed')
sparta_data.info()
![]() → to datetime() : 날짜 시간 데이터로 변경해주는 함수 → start_time은 str이 아닌 datetime 형태로 되어 있다 #몇주차 개강반인지 알아보는
#수강 시작 주 구하고, 테이블의 열로 추가 하기
sparta_data['start_week']= sparta_data['start_time'].dt.isocalendar().week
sparta_data.tail()
![]() → 2022/08/22가 34주차라고 나타냄 → 2022/08/22로 부터 2주 뒤가 36주차라고 나타냄 → 1년 중 몇주차인지를 알려준다 #주차별 개강반이 몇개인지 구해봐야할듯
#start data에 포함된 데이터가 총 몇개인지
#이전에 배웠듯이 set()은 set안의 데이터는 순서가 정해져있지 않고
#중복되지 않는 고유한 요소를 가져옵니다
category_range = set(sparta_data['start_week'])
category_range
![]() #지금 현재 진도율을 통해서 몇주차까지 들었는지 계산하는
![]() #지금 현재 진도율을 통해서 몇주차까지 들었는지 계산하는
#범주화 할 데이터 리스트 만들기
progress_rate = list(sparta_data['progress_rate'])
progress_rate
![]() #진도율-강의주차 범례를 판다스에게 알려주는 과정
#범주를 구분하는 기준 bins 처음(0)과 끝(100) 잊지 말고 기입 해주세요!
bins = [0,4.11,26.03,41.10,61.64,80.82,100]
#구분한 범주의 라벨 labels
labels=[0,1,2,3,4,5]
#범주화에 사용하는 함수 pd.cut
cuts = pd.cut(progress_rate,bins, right=True,include_lowest=True, labels=labels)
cuts
![]() #범주화 결과물을 테이블로 변경하기
cuts = pd.DataFrame(cuts)
cuts.tail()
![]() #기존 테이블에 병합하기
#concat() 함수를 이용하여, sparta_data 테이블과, cuts 테이블 병합 가능
sparta_data = pd.concat([sparta_data,cuts],axis=1, join='inner')
sparta_data.head()
![]() #6번째 컬럼의 0이 현재 몇주차에 대한 데이터
#current week에 대한 데이터이므로 컬럼 이름 바꾸
#sparta_data.columns[6]="weeks" 이렇게 변경하면 오류 발생
#그래서, 원하는 컬럼의 이름을 다 작성해야 함
sparta_data.columns=['created_at','user_id','name','progress_rate','start_time','start_week',"week"]
sparta_data.head()
![]() → 1️⃣ created_at 기준으로 현재 몇 주차인지를 계산해서 첨부 → 2️⃣ progress_rate 기준으로 현재 몇 주차에 머무르고 있는지 계산해서 첨부 #33주차에 개강한 사람이 현재 몇주차에 머무르고 있는지 계산해야 함 #32주차에 개강한 사람이 현재 몇주차에 머무르고 있는지 계산해야 함 → groupby #기존의 테이블을 start week와 week로 묶어준다
grouping = sparta_data.groupby(['start_week','week'])
grouping.head()
![]() → count() // sum()이 없어 결과물에 변화는 없어 보이나 → start week로 그룹핑 → (같은 그룹 내) week로 한번 더 그룹 ![]() → 총 179개로 그룹핑 #user id별 값으로 코호트 데이터 만들겠다
cohort_data = grouping['user_id'].apply(pd.Series.nunique)
cohort_data = pd.DataFrame(cohort_data)
cohort_data.head(5)
![]() → 31주차 개강한 사람 중 0주차에 머무는 사람 : 5명 → 31주차 개강한 사람 중 1주차에 머무는 사람 : 14명 → 31주차 개강한 사람 중 2주차에 머무는 사람 : 14명 → 31주차 개강한 사람 중 3주차에 머무는 사람 : 16명 → 31주차 개강한 사람 중 4주차에 머무는 사람 : 14명 cohort_data = grouping['user_id'].apply(pd.Series.nunique) cohort_data = pd.DataFrame(cohort_data)
cohort_data.head(20)
![]() #수강 주차별 수강한 총 인원 구하기
#첫 주가 31주니 변수를 하나 만들어 줍니다!
f=31
#처음 수강 시작한 주의 범위가 {31,32,33,34,35,36} 이니 range 6으로
for i in range(6):
#5주차의 강의가 마지막이고, 0주차까지 이니, 시작은 5에서 시작해 1씩 0까지 감소 시킬수 있어요!
for j in range(5, 0, -1):
cohort_data.at[(f,j-1), 'user_id'] = int(cohort_data.at[(f,j),'user_id']) + int(cohort_data.at[(f,j-1),'user_id'])
#주차는(31부터 32 33..) 1씩 늘어나죠?
f=f+1
cohort_data.head()
![]() #인덱스 새롭게 설정하기
cohort_data = cohort_data.reset_index()
cohort_data.head()
![]() cohort_data = cohort_data.reset_index()
cohort_data.head(20)
![]() |
| 데이터 시각화 |
#피벗테이블 만들기
cohort_counts = cohort_data.pivot(index="start_week",
columns="week",
values="user_id")
cohort_counts
![]() #리텐션 테이블 만들기
#퍼센테이지를 구할 때, 필요한 수강 첫 주 총 인원 구하기
# 앞서 만든 피벗 테이블을 retention 변수에 저장하기
retention = cohort_counts
#각 주(week) 별 최초 수강생 수만 가져오기 (나눠줄때, 분모가 되는 부분!)
cohort_sizes = cohort_counts.iloc[:,0]
cohort_sizes.head()
![]() # 각 주당 수강생 수강율 구하기
# 표의 단일 데이터에 최초 수강생의 수를 나누어, 각 주당 수강생 수강율 나타내기!
retention = cohort_counts.divide(cohort_sizes, axis=0)
retention.head()
![]() #수강율 퍼센트로 바꾸기
#각 수치 퍼센트로 변경하기
#round 함수로 3자리 수에서 반올림 한 후, 100을 곱해 줍니다!
retention.round(3)*100
![]() #히트맵 기본 문법
#seeborn 라이브러리에서 제공
#테이블 크기 설정 하기
plt.figure(figsize=(10,8))
sns.heatmap(data=retention,
annot=True, #각 cell의 데이터 표기 유무를 나타냅니다!
fmt='.0%', #values(데이터의 값) 값의 소수점 표기
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()
![]() |
| 최종 결론 도출 | 8월 둘째주부터 3주차 커리큘럼이 바껴서 이것이 완주율에 영향을 주지 않았는가? 3주차에 문제가 있었으면 4주차의 도달하는 인원이 적어졌을 것 → 4주차 색이 옅어졌을 것 실제 그래프를 보면 (32주 = 8월 2주차) 8월 2주차, 3주차의 색은 옅어졌으나 이후 색이 다시 짙어지는 걸 알 수 있다 32~36 column = 8월 4주차이기에 그 컬럼에 집중해야 함 이 컬럼 전체가 연하게나오면 우리의 가설이 옳지만 실제 그래프는 옅어졌다 진해졌다 하므로 커리큘럼 변경이 완주율에 영향을 주었다고 확답할 수 없다 |
- 예제 3_용어 정리
- 코호트 : 소비자를 시간의 흐름과 사용하는 서비스의 단계 등으로 나누어 같은 성질의 집단으로 구분한 것
- 코호트 차트 : 소비자의 전환율을 시간의 흐름과 서비스의 단계나 재사용 등 두가지 요인을 복합적으로 보여줄 수 있는 차트
[코호트 분석 방법]
1. 가설 세우기
2. 데이터 가져오기
3.데이터 전처리하기
(1) 데이터 로딩 및 결측치 제거
(2) 필요한 데이터 가공하기
a. 각 고객별 최초 수강 주(week) 구하기
b. 진도율을 강의 주차로 변경 하기
4. 데이터 분석하기
(1) 수강 시작 주와 수강 주차에 각 해당하는 수강생 수를 내용으로 테이블 만들기
(2) 수강 주차별 수강 총인원 구하기
5. 데이터 시각화하기
(1) 고객 수강 유지율을 알 수 있는 피벗테이블 구하기
a. 아래 세 가지를 한 눈에 볼 수 있는 피벗테이블 구하기
행 → 수강 시작 주차
열
행과 열 사이의 정보
b. 각 수강 시작 주(week) 당 초기 고객 수 구하기
c. 피벗테이블의 각 데이터를 초기 고개수로 나눠서, %로 나타내기
(2) 히트맵으로 특정 기간동안 고객의 수강율 나타내기
6. 결론 도출
- 리텐션 테이블 : retention () : 고객이 우리 제품이나 서비스를 지속적으로 소비하는 것을 의미
- 과제
| 문제 정의 및 가설 설정 |
![]() |
| 데이터 세팅 및 데이터 확인 |
#라이브러리 불러오기
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
plt.rc('font', family='NanumBarunGothic')
# 한글깨짐 방지
plt.rc('font', family='NanumBarunGothic')
sparta_data = pd.read_table('/content/cohort_data.csv',sep=',')
sparta_data.tail()
#날짜 데이터 타입 변경
format='%Y-%m-%dT%H:%M:%S.%f'
sparta_data['start_time'] = pd.to_datetime(sparta_data['created_at'], errors='coerce')
sparta_data.tail()
#시작 week 구하기
sparta_data['start_week']= sparta_data['start_time'].dt.isocalendar().week
sparta_data.tail()
#시작 주 범위 알기
category_range = set(sparta_data['start_week'])
category_range
# 범주화 하기
#번주화할 데이터
progress_rate = list(sparta_data['progress_rate'])
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
cuts = pd.DataFrame(cuts)
cuts.tail()
# 표 합치기
sparta_data = pd.concat([sparta_data,cuts],axis=1, join='inner')
sparta_data.head()
#표 인덱스 변경하기
sparta_data.columns=['created_at','user_id','name','progress_rate','start_time','start_week',"week"]
sparta_data.head()
#시작주와, 수강 주차별 기준으로 표 grouping 하기
grouping = sparta_data.groupby(['start_week','week'])
grouping.head()
#시작주와, 수강 주차별에 해당하는 수강생 수 구하기
cohort_data = grouping['user_id'].apply(pd.Series.nunique)
cohort_data = pd.DataFrame(cohort_data)
cohort_data.head(10)
#각 주차별 수강한 수강생 총 합 구하기
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_data.head()
cohort_counts = cohort_data.pivot(index="start_week",
columns="week",
values="user_id")
cohort_counts
# 앞서 만든 피벗 테이블을 retention 변수에 저장하기
retention = cohort_counts
#각 주(week) 별 최초 수강생 수만 가져오기
cohort_sizes = cohort_counts.iloc[:,0]
cohort_sizes.head()
# 최초 수강생 수를 각 데이터에 나눠주기
retention = cohort_counts.divide(cohort_sizes, axis=0)
retention
#각 수치 퍼센트로 변경하기
retention.round(3)*100
#주차별 수강 전환율 구하기
w=31
for i in range(6):
for j in range(1, 6):
if retention.at[(w, j - 1)] != 0:
retention.at[(2, j)] = retention.at[(w, j)] / retention.at[(w, j- 1)]
w=w+1
retention
#주차별 수강 전환율 히트맵
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()
|
| 데이터 가공(전처리) 및 데이터 분석 |
|
| 분석 결과 시각화 | |
| 최종 결론 도출 | 34 개강일은 3주차보다 4주차 수강률이 높다 |
와,,, 이건 복습한다고 내가 알 수 있을까??

팀 스크럼을 진행할 때마다 무언가를 배우는듯 하다
내가 발전할 수 있는 방향성 찾고
완성도 높은 결과
밀도있는 시간 보내기 위해
뭔가를 해야하는데,,,
5강 복습하다 세월이 끝날거 같다
도메인 관련 강의 완강하고
영어 기본적인 점수를 갖추고
데이터 자격증 취득 등 해야하는데,,,
'내일배움캠프(QC,QA_5기)' 카테고리의 다른 글
| [내일배움캠프_QA/QC 5기] 8일차 _ 파이썬 2강 (0) | 2026.03.18 |
|---|---|
| [내일배움캠프] QA/QC 5기 - 7일차 _ 파이썬 1강 (0) | 2026.03.17 |
| [내일배움캠프] QA/QC 5기 - 6일차 (1) _ 팀회고 (1) | 2026.03.16 |
| [내일배움캠프] QA/QC 5기 - 5일차 _ 데이터분석종합 4강 (1) | 2026.03.13 |
| [내일배움캠프] QA/QC 5기 - 4일차 _ (0) | 2026.03.13 |


































