내일배움캠프(QA,QC_5기)

[내일배움캠프] QA/QC_5기 ( 5일차 )

lshxkwh 2026. 3. 13. 20:16

불타는 금요일!!! 이번주를 잘 마무리 해보자?

 


데이터 분석 종합반 ( 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()

 

............ 이해하는데 꽤 오랜시간이 걸리겠지..... ㅜㅜ

오늘 강의 정리는 여기서 끝!!!