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()
![]() |
| 최종 결론 도출 | 할인금액이 클수록 수업 신청한 수강생의 수 그래프 경사가 높아지는 걸 알 수 있다 초기가설인 '할인율이 높으면 높을수록 결제 전환율도 높을 것이다'이 옳다는걸 알 수 있다 |
'내일배움캠프(QC,QA_5기)' 카테고리의 다른 글
| [내일배움캠프] QA/QC 5기 - 6일차 (2) _ 데이터분석종합 5강 (0) | 2026.03.16 |
|---|---|
| [내일배움캠프] QA/QC 5기 - 6일차 (1) _ 팀회고 (1) | 2026.03.16 |
| [내일배움캠프] QA/QC 5기 - 4일차 _ (0) | 2026.03.13 |
| [내일배움캠프] QA/QC 5기 - 3일차 _ 데이터종합분석 3강 (1) | 2026.03.11 |
| [내일배움캠프] QA/QC 5기 - 2일차 _ 데이터분석종합 2강 (1) | 2026.03.10 |
























