내일배움캠프(QC,QA_5기)

[내일배움캠프] QA/QC 5기 - 5일차 _ 데이터분석종합 4강

qc-standard 2026. 3. 13. 21:50

2026/03/13 Fri.

  • (오전) 커리어 스터디 수정 사항 전달
  • 데이터 분석 종합 4강
  • 데이터 분석 종합 5강
  • 데이터 분석 복습

⊙ 데이터 분석 종합반_4강_(1)

문제 정의 게임종합반 구매 전환률을 높여라
데이터 불러오기 및 데이터 확인
#판다스 선언
import pandas as pd

#데이터 불러오기
sparta_data = pd.read_csv('/content/user_db1.csv')
#데이터 잘 불러왔는지 확인
sparta_data.head()
한글 깨짐 방지 - 폰트설치 +새코드
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf

+기존 코드에
import pandas as pd
import matplotlib.pyplot as plt
#한글 폰트 깨짐 주의
plt.rc('font', family='NanumBarunGothic')
 
sparta_data = pd.read_csv('/content/user_db1.csv')
sparta_data.head()
가설 설정
문제 : 게임종합반 구매 전환률을 높여라

게임 종합반 구매 전환률을 높이기 위해 기존에 해오던 광고에 대해 매체별 효율을 비교해
광고 효율이 낮은 매체 비용을 광고 효율이 높은 매체에 집행한다면 기존 대비 50%광고 효율 증대 전망
데이터 읽기

데이터 전처리
#표의 상단 5개 데이터 읽기
sparta_data.head()
#표의 마지막 5개의 정보를 보려면, tail()이라는 것도 이용할 수 있어요!
sparta_data.tail()


#데이터 전처리
#데이터확인
sparta_data.info()
#전반적으로 column별 데이터가 어떻게 들어갔는지 통계로 나태냄
#discounted만 5000개

#결측치확인
#null이 가치 없는 이라는 뜻
#isnull().sum() : 결측치 갯수를 세는 함수
sparta_data.isnull().sum()


→ discounted 결손치가 2474개 나온다는걸 알 수 있음


#결측치 제거 dropna
sparta_data = sparta_data.dropna()
sparta_data.info()

데이터 분석
#각 매체별 유저 사용량
#수업 신청 경로 기준 수강생수 합계
#groupby 그룹으로 묶는 것
#매체별 수강생 groupby count
#access media를 그룹으로 묶을 때 유저아이디로 묶어야하고
#유저아이디는 카운터-숫자를 세야 함
access_media = sparta_data.groupby('access_media')['user_id'].count()
#access 미디어 출력
access_media
데이터 분석 결과
인스타그램>페이스북>>>>>>>>>>오프라인 광고
인스타그램 유입이 가장 많은 반면 오프라인 광고 유입이 가장 적음
데이터 시각화
#시각화 선언
import matplotlib.pyplot as plt
import numpy as np
#한글 깨짐 방지
plt.rc('font', family='NanumBarunGothic')

#plt.figure(width, height) : 넓이와 높이 만큼 이미지를 생성한다는 것을 말해줍니다!
plt.figure(figsize=(10,6))

#각각 어떤 값이 들어가야 하는지 입력해 볼까요?
#plt.bar(X축값, Y축값)
plt.bar(access_media.index, access_media)

#그래프의 제목
plt.title('수강생 별 수강 신청 경로')

#그래프의 x축 라벨 이름
plt.xlabel('수강 신청 경로')

#그래프의 y축 라벨 이름
plt.ylabel('수강생 수')

#x축 눈금의 글씨의 각도 변경을 위해 plt.xticks(rotation="원하는 각도")를 이용
plt.xticks(rotation=360)

#그래프를 화면에 나타나도록 합니다.
plt.show()

#access media 수치만 보기
access_media





최종결과 도출
#효율계산
print((1711 - 260)/260)
#인스타그램 광고가 오프라인 광고의 558% 정도의 효율을 낸다

오프라인 광고가 쓰는 돈에 비해 효율을 내지 못하고 있는 반면 인스타그램의 광고 효율은 좋은 편이다
그래서 오프라인 광고보다 인스타그램 광고에 비중을 더 두면 게임 개발 종합반 매출을 증대 할 수 있을 것으로 기대됩니다
 
데이터 시각화
+ 미감 
plt.bar(access_media.index, access_media)
#그래프 컬러 변경
plt.bar(access_media.index,access_media.values,color="green")



#그래프마다 컬러 변경
#컬러에 리스트 값을 넣을 수 있음  인덱스마다 컬러를 정할 수 있다는 말
#alpha는 색의 투명도를 조절
#hex나 rgb로도 색상 표현도 가능 #rgb는 red green blue로 표시 #hex는 #00000 #ff로 표
plt.bar(access_media.index,access_media.values, color = ['gold', 'b', '#FF0000', 'green','orange','red','#000000'], alpha = 0.3)
#edgecolor = '원하는 색상', linewidth = 원하는 두께
#각 바의 테두리 색상과 두께 변경를 뜻함
plt.bar(access_media.index,access_media.values, color = ['gold', 'b', '#FF0000', 'green','orange','red','#000000'], alpha = 0.3,edgecolor = 'gray', linewidth = 5)

#width=원하는 두께로 그래프의 바 너비를 변경 할 수 있어요! 기본 값은 0.8입니다!
plt.bar(access_media.index,access_media.values, width=2)

#fontsize="원하는 크기"로 폰트 사이즈를 조절 할수 있어요!
plt.title('수강생 별 수강 신청 경로',fontsize=원하는사이즈)
#그래프를 bar라는 변수에 넣고,
bar = plt.bar(access_media.index,access_media.values)
#for 반복문으로,
for rect in bar:
    #각 바의 세로길이 값을 구하고,
    height = rect.get_height()
    #bar의 가장 정 가운데 x 좌표 구하기 : get_x()로 x축의 가장 왼쪽 부분 + get_width의 절반 값
    plt.text(rect.get_x() + rect.get_width()/2.0, height, '%.1f' % height, ha='center', va='bottom', size = 12)
#plt.barh를 이용하면, 서로 축 변경이 가능 하답니다 :)
plt.barh(access_media.index,access_media.values, color="g")

 

 

- 예제 1

문제 정의 및 가설 설정 → 데이터 기본 세팅 → 데이터 가공 및 분석 → 분석 결과 시각화 → 최종 결론 도출
문제 정의 및 가설설정 문제 파악 : 현재 게임 개발 종합반이 다른 패키지에 포함된 강의보다 구매 전환율이 저조한 상황
추가 정보 : 이전 웹개발 종합반과 SQL 패키지 상품 기획하여 각각 40% 구매 전환율 높아진 사례 있음
원하는 결과 : 게임 개발 종합반이 포함된 매력적인 패키지 상품을 기획하여 게임 개발 종합반 구매 전환율을 높이고자 한다

좋은 가설?
1) 풀고자 하는 문제의 방향성과 일치하는 가설
2) 테스트 가능한 가설
3) 액션으로 이어질 수 있는 가설

게임 개발 종합반 구매한 사람의 구매 데이터 살펴본다
웹 / 앱 / SQL 중 무엇을 추가 구매했는데 살펴본다
게임 개발 종합반을 구매한 사람 중 추가 구매한 과목의 순위를 매겨
가장 많이 추가 구매한 과목과 패키지 전환하여 구매전환율 올릴 수 있을 듯

가장 인기인 "웹 개발 종합반"과 게임 개발 종합반을 패키지로 했을시 30% 구매 전환율 발생하지 않을까?
데이터 기본 세팅
&
데이터 확인
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rc('font', family='NanumBarunGothic') #한글 깨짐 방지 글꼴 설정
+새코드
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf


#분석할 데이터 불러오기
sparta_data = pd.read_table('/content/user_registered_class.csv',sep=',')
sparta_data


 0은 해당 강의를 듣지 않았다 / 1은 해당 강의를 들었다


데이터 가공=전처리 & 분석
 각 강의를 들은 사람 수 파악해야 함


# 각 수업의 수강 수
number_of_students = sparta_data[sparta_data==1].count()
number_of_students
 user_id가 0인 이유 : 아이디는 0/1 숫자가 아닌 문자로 되어 있으므로 셀 수 없음



#각 수업에서 1(수강 신청) 한 사람의 수 세기
sum_of_students_by_class = sparta_data[sparta_data==1].count()
#테이블.drop("삭제할 행/열") userid는 카운트 할 필요없는 데이터이므로 삭제
sum_of_students_by_class = sum_of_students_by_class.drop('user_id')
sum_of_students_by_class
데이터 시각화
#그래프 사이즈 설정
plt.figure(figsize=(10,5))

#각각 어떤 값이 들어가야 하는지 입력해 볼까요?
#plt.bar(X축값, Y축값)
plt.bar(sum_of_students_by_class.index,sum_of_students_by_class)

#그래프 타이틀
plt.title('게임개발 종합반 신청한 학생 수강이력')

#x축 레이블
plt.xlabel('강의')

#y축 레이블
plt.ylabel('수강생(명)')

#그래프 보여주기
plt.show()

최종 결론 도출 결과 APP>Web>SQL 순으로
게임 개발 종합반과 함게 가장 많이 수강한 강의는 APP이라는걸 알 수 있다

애초의 가설이었던 게임 개발 종합반 + Web강의 패키지가 아닌
게임 개발 종합반+APP 강의를 패키지를 구성하면 게임 개발 종합반 구매율이 높아질 것으로 전망된다

애초의 가설은 잘못된 것을 알 수 있다

 

 

 

- 예제 2

문제 정의 및 가설 설정 → 데이터 기본 세팅 → 데이터 가공 및 분석 → 분석 결과 시각화 → 최종 결론 도출
문제 정의

가설설정
APP 개발 종합반 신청자가 게임 종합반을 다른 과목에 비해 신청이 많은 것을 확인했다
왜? APP개발 종합반 신청자가 게임 종합반에 관심이 많은가??

강의를 수강할때 마다 목적을 기입하게 되어 있음 - 강의를 들음으로써 이루고자 하는 목표

App 개발 종합반 목적별 수강생 수 VS 게임 개발 종합반 목적별 수강생 수를 비교하여
둘의 공통점을 살펴본다

가설 : 게임 개발 종합반과 App 개발 종합반 모두 부수입 창출이 목적일 것이다
데이터 세팅 및 확인
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rc('font', family='NanumBarunGothic') #한글 깨짐 방지 글꼴 설정

#수강 데이터 가지고 오기
sparta_data_app = pd.read_table('/content/user_db_app.csv',sep=',')
sparta_data_game = pd.read_table('/content/user_db_game.csv',sep=',')
#수강 데이터 읽기
sparta_data_app.head()

데이터 가공(전처리)

데이터 분석
goal을 카테고리 별로 나눠 App 개발 goal 수와 게임 개발 goal 수를 비교하는 것
그러려면 user id에 대한 goal 수를 알아야하므로 그룹을 만들어야 한다
#수강 신청 이유별 학생수를 구하려면 그룹으로 묶어 수를 세어야 한다
#수업 신청 목표 기준으로 수강생 수 합계
#goal로 그룹을 나누고 goal에 해당하는 user를 카운트한다

#app 수업 신청 목표 기준으로 수강생 수 합계
app_users_goal= sparta_data_app.groupby('goal')['user_id'].count()
app_users_goal



#게임 수업 신청 목표 기준으로 수강생 수 합계
game_users_goal= sparta_data_game.groupby('goal')['user_id'].count()
game_users_goal
분석결과 시각화
#그래프 크기 설정 (인치)
plt.figure(figsize=(8,6))

#x축 y축 설정을 동일하게 해주고, color와, label을 추가 해주시면 됩니다. 참 쉽죠?

#app 종합반 수강생 관심 분야
plt.plot(app_users_goal.index ,app_users_goal,color="red", label="app")
#game 종합반 수강생 관심 분야
plt.plot(game_users_goal.index ,game_users_goal,color="blue", label="game")


#각 그래프의 범례는 .legend()을 이용하여 만들어 줍니다! :)
plt.legend()

#그래프 타이틀
plt.title("앱 종합반, 게임 종합반 수강생의 관심사")
#x축 레이블
plt.xlabel('수강 목적')
#y축 레이블
plt.ylabel('수강생 수')

#그래프 보여주기
plt.show()



최종결론도출 앱과 게임을 듣는 사람들이 각각 부수입 창출을 원했다
→ 수강 목적이 "부수입 창출"로 같아 수강 인원이 겹쳤을 것

초기 가설이 옮았으며
패키지를 구성할때 "부수입 창출"을 주요 키워드로 사용하면 좋을 듯하다


 

 

 

- 예제 3

문제 정의 및 가설 설정 → 데이터 기본 세팅 → 데이터 가공 및 분석 → 분석 결과 시각화 → 최종 결론 도출
문제 정의

가설 설정
게임 개발 종합반의 매출을 위해서,,,
결제 페이지에서 이탈률이 높은 상황

높은 금액에서 나가지 않고 결제로 이어질 수 있도록 쿠폰을 지급하는데
쿠폰이 유효하게 쓰여 결제로 이어져 구매 전환율이 높아 질 것이다

쿠폰 지급 그룹 VS 쿠폰 미지급 그룹을 비교했을 때
가설 : 쿠폰이 결제 전환율에 영향을 미쳤을 것이다
데이터 세팅

데이터 확인
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rc('font', family='NanumBarunGothic') #한글 깨짐 방지 글꼴 설정

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

group + discounted 집중해서 봐야함

gruop : 쿠폰은 받으면 1 // 쿠폰을 받지 않으면 0

discounted : 할인을 받았다면 얼마의 할인율을 받았는지
→ 추후 할인이 유효하다면 극대화되는 범위를 알아보기 위함

그룹 1 // 그룹 0 사이에 구매전환율 차이가 있는지 없는지


데이터 가공(전처리)

데이터 분석
12,000명을 두개의 그룹으로 나눔 → 쿠폰 O // X 그룹으로

sparta_data = pd.read_table('/content/user_db1.csv',sep=',')
#data head를 지워야함

#sparta_data['group'] ==1 조건에서 user의 수
#groupby()는 해당 column 모든 값의 유형에 따라 유형에 해당하는 user의 수
#group이 1인 user의 수
#이때의 ==은 우리가 알고 있는 "equal" = 과 동일한 뜻입니다!
(파이선에서 = 는 변수 지정 할때만 쓰입니다. 소곤소곤)

#할인 혜택 받은 사람의 결제 수
sum_of_students_by_discounted = sparta_data[sparta_data['group']==1]['user_id'].count()
sum_of_students_by_discounted

# 동일한 방법으로 할인혜택을 받지 않는 고객의 수
#이때의 ==은 우리가 알고 있는 "equal" = 과 동일한 뜻입니다!
#할인 혜택 받지 않 사람의 결제 수
sum_of_students_by_not_discounted = sparta_data[sparta_data['group']==0]['user_id'].count()
sum_of_students_by_not_discounted
데이터 분석 결과 12,000명의 group 할인 받은 사람은 5,000명 결제
할인 받지 않은 사람은 2,474명이 결제
→ 할인 받은 사람들의 결제 전환율이 높다
 할인 쿠폰이 결제 전환에 유의미한 영향을 미친
데이터 가공(전처리)

데이터 분석 2
#각 결제 인원에서 실제 실험 인원인 12000명을 나 각 퍼센테이지 구하기
percent_of_students_by_not_discounted = sum_of_students_by_not_discounted/12000 *100
percent_of_students_by_discounted = sum_of_students_by_discounted/12000 *100
print(percent_of_students_by_not_discounted , percent_of_students_by_discounted )




데이터 분석 결과 2
 할인 받지 않은 그룹의 결제 비율 : 20.6%
 할인 받은 그룹의 결제 비율 : 47.1%
 할인의 유무가 결제 비율의 약2배 차이난다
분석 결과 시각화
#그래프 사이즈
plt.figure(figsize=(10,5))
#x 그룹 지정하기
x_list =["정가 구입 그룹", "할인 적용 그룹"]
#y 값
#각각 어떤 값이 들어가야 하는지 입력해 볼까요?
y_list = [percent_of_students_by_not_discounted ,percent_of_students_by_discounted]

#x,y값 설정
plt.bar(x_list, y_list)
#그래프 타이틀
plt.title('할인 여부 결제 전환율 비교 분석')
#x축 레이블
plt.xlabel('할인 적용 여부')
#y축 레이블
plt.ylabel('결제 전환율')
#그래프 보여주기
plt.show()



최종 결론 도출 결제 페이지에서의 이탈률 원인이 가격 때문인지 확인하기 위해
가격 허들이 낮아질 경우 결제 진행에 긍정적 영향을 미치는지에 대하여
할인 쿠폰 제공 여부로 테스트를 진행했는데요

해당 내용 결과 공유 드립니다

그룹 A : 할인 쿠폰 제공
그룹 B : 할인 쿠폰 미제공 = 정가 구매 유도

할인 쿠폰을 제공한 그룹의 구매 전환률이 월등히 높다는 것을 알 수 있습니다

가격이 결제 페이지의 허들로 작용하며
결제 페이지에서 할인 프로모션을 하면 많은 수강생을 확보 할 수 있다는 결론에 도달할 수 있습니다

 

 

 

- 과제

문제 정의 및 가설 설정 → 데이터 기본 세팅 → 데이터 가공 및 분석 → 분석 결과 시각화 → 최종 결론 도출
문제 정의

가설 설정
결제 페이지에서 할인이 결제 전환율 증가로 이어지는 유의미한 결과를 도출했다
그렇다면 얼마의 할인이 결제 전환율을 극대화 할 수 있는지

가설 : 할인율이 높으면 높을수록 결제 전환율도 높을 것이다

데이터 세팅

데이터 확인
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rc('font', family='NanumBarunGothic') #한글 깨짐 방지 글꼴 설정

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


데이터 가공(전처리)

데이터 분석
#디스카운티드 별 수강생 수를 구해야할 듯
#디스카운티드를 그룹으로 묶고 할인율 별 학생수를 구해야할 듯
students_discounted = sparta_data.groupby('discounted')['user_id'].count()
students_discounted


데이터 분석 결과
30000>20000>10000 순의 결과값이 나온다
→ 할인율이 클수록 많은 사람이 수강 결제 한다
분석 결과 시각화 Ver 1
#그래프 크기 설정 (인치)
plt.figure(figsize=(8,6))
#할인율 별 학생수
plt.plot(students_discounted.index, students_discounted)
#그래프 타이틀
plt.title("할인율 별 결제 전환수")
#x축 레이블
plt.xlabel('할인율')
#y축 레이블
plt.ylabel('결제 수강생 수')
#그래프 보여주기
plt.show()



Ver 2
#그래프 사이즈
plt.figure(figsize=(10,5))
x_list =["1만원 쿠폰 그룹", "2만원 쿠폰 그룹", "3만원 쿠폰 그룹"]
#x,y값 설정
plt.bar(x_list, students_discounted.values)
#그래프 타이틀
plt.title('할인 율 별 수강 신청 자 수')
#x축 레이블
plt.xlabel('할인 적용 범위')
#y축 레이블
plt.ylabel('수업 신청한 수강생')
#그래프 보여주기
plt.show()


최종 결론 도출
할인금액이 클수록 수업 신청한 수강생의 수 그래프 경사가 높아지는 걸 알 수 있다

초기가설인 '할인율이 높으면 높을수록 결제 전환율도 높을 것이다'이 옳다는걸 알 수 있다