
불타는 금요일!!! 이번주를 잘 마무리 해보자?
데이터 분석 종합반 ( 5주차 )
( 역대급으로 어려우니 안전벨트 꽉 매고.. 가보자..)
- 어떤 "요소" 들이 완주율에 영향을 미칠 것인가에 대한 주제로 파이썬 데이터 분석 해보기!!
Mission 01. 8월 중순부터 완주율이 크게 떨어졌다. 이유를 찾아서 개선하자.
1. 데이터 분석하기
(1). 데이터 분석 기본 세팅하기
- Pandas 선언하기 : import Pandas as Pd
- 데이터 가져오기 : 변수= pd.read_table(' 파일경로 ', sep=',')
- 데이터 살펴보기 : 변수.head() , 변수.tail()
- 데이터 가공하기
※ 한글 깨짐 방지 설정 : plt.rc('font', family='NanumBarunGothic')
(2). 데이터 세팅하기


2. 가설 및 데이터 시각화 하기
(1), 가설 : 다른 연령대에 비해 바쁜 20~30대의 수강 완주율이 상대적으로 낮을 것이다.
※ 여기서 잠깐! 좋은 가설이란?
1. 풀고자 하는 문제의 방향성과 일치하는 가설
2. 데이터로 가능한 가설
(2). 데이터 불러오기
(3). 데이터 분석하기 - goupby()와 count () 적절히 사용
- 나이대 별 완주율 합 구하기
- progress_rate_by_age = sparta_data.groupby('age')['progress_rate'].sum()
- 나이대 별 수강생 수 구하기
- number_people_by_age = sparta_data.groupby('age')['_id'].count()
- 나이대 별 완주율 평균 구하기
- 나이대 별 완주율 합 / 나이대 별 수강생 수 = 평균
(4) . 시각화 하기
| #plt.figure(width, height) : 넓이와 높이 만큼 이미지를 생성한다는 것을 말해줍니다! plt.figure(figsize=(6,6)) #그래프의 x축 눈금 설정 plt.xticks([10,20,30,40,50]) #plt.bar(X축값, Y축값) plt.bar("x축", "y축") #그래프의 바에 각 수치율을 추가 해 볼까요? bar = plt.bar("x축", "y축",width="너비") 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() |
![]() |
< 결론 >
2-30대의 완주율 평균이 다른 나이대와 비슷한 비율이라는 점을 확인했다
프로덕트 개선이나 광고 메인 타겟을 변경 등은 고려에서 배제해도 좋을 것 같다
Mission 02 . 찐한관리를 하면 완주율이 높아 질까?
1. 가설하기
(1). 가설 : 찐한 관리를 한 인원이 그렇지 않은 인원보다 완주율이 높을 것이다.
2. 데이터 불러오기 ( Pandas , Matplotlib , numpy 선언하기 )
3. 데이터 전처리 하기
4. 데이터 분석 및 시각화 하기
| #plt.figure(width, height) : 넓이와 높이 만큼 이미지를 생성한다는 것을 말해줍니다! plt.figure(figsize=(6,6)) #각각 어떤 값이 들어가야 하는지 입력해 볼까요? #plt.bar(X축값, Y축값) plt.bar("x축 기입" ,"y축 기입") #그래프의 바에 각 수치율을 추가 해 볼까요? bar = plt.bar("x축 기입" ,"y축 기입") 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축 눈금의 글씨를 45도 회전 plt.xticks(rotation=45) #y축 눈금의 글씨를 360도 회전 plt.yticks(rotation=360) #그래프를 화면에 나타나도록 합니다. plt.show() |
![]() |
< 결론 >
찐한관리를 받은 그룹의 완주율이 월등히 높은 것을 확인할 수 있었습니다.
[ 코호트 차트 ]

-----> 요런거!
5주차 Project
1) 개강일별 주차 간 전환율 구하기
2) 주차 간 전환율 그래프로 나타내기
| #라이브러리 불러오기 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('파일경로',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() |
![]() |
............ 이해하는데 꽤 오랜시간이 걸리겠지..... ㅜㅜ

오늘 강의 정리는 여기서 끝!!!
'내일배움캠프(QA,QC_5기)' 카테고리의 다른 글
| [내일배움캠프] QA/QC_5기 ( 7일차 ) (0) | 2026.03.17 |
|---|---|
| [내일배움캠프] QA/QC_5기 ( 6일차 ) (1) | 2026.03.16 |
| [내일배움캠프] QA/QC_5기 ( 4일차 ) (0) | 2026.03.12 |
| [내일배움캠프] QA/QC_5기 ( 3일차 ) (0) | 2026.03.11 |
| [내일배움캠프] QA/QC_5기 ( 2일차 ) (0) | 2026.03.10 |


