Growth Marketing/Job Preparation

마케터 지망생의 데이터 분석 정복기 ①|Pandas로 이커머스 기업 퍼널분석 하기! 🚢

pamsyra 2026. 4. 18. 17:46

3월 마케팅 분석기법 파트가 끝나고

4월부터 데이터분석 파트가 시작되었는데 말이죠

그래서 TIL에서 알 수 있다시피.. pandas..python..sql..api..mcp..rss 크롤링..뭐라는거야

▼내용 참고
[GM4] 4월 TIL
 

'Growth Marketing/GM4' 카테고리의 글 목록

방과후 컴퓨터교실에서 배운 타자실력으로 디지털 노트 정리

pamsyra.tistory.com

 

마분기나 통계분석이랑 달리 이번에는 소화라도 해야겠다 싶어서 멋사에서 진행하는 야간 기초 스터디를 시작했습니다.

멋사는 참 친절한 것 같습니다. 저처럼 부족한 사람을 위해 나머지 학습도 만들어주고 흑흑

예상보다 스터디는 훨씬 만족스러운데 그 이유는 강사님의 강의 스타일이 저랑 맞아서..ㅎㅎ

배경과 이유를 상시 생각하고 알려주시는 게 저와 같은 입문찌끄레기에게 안성맞춤이라죠. 그리고 소수인게 마음에 들어요.

 

빛과 소금 같은 강사님이 주말 맞이 내주신 과제 2가지가 있는데 "퍼널분석"과 "리텐션분석"입니다.

하 이걸 나 혼자 한다면 스스로 뿌듯해서 행복할 것 같은데 자신은 없어요.

 

퍼널분석 과제부터 들어가겠습니다.

목표는 "a 기업의 병목 구간과 개선 아이디어 제안" ( + 자신감넘치게 심화버전 선택)

Attitude는 "with Gemini" 

 

바로 할 일을 정리해봅시다.

1. 과제 파악

2. 데이터셋 확인

3. 데이터 분석
- 데이터불러오기 / 데이터 파악 / 데이터 정제 / 분석을 위한 데이터 가공 / 마케팅 지표 집계 / 인사이트 도출

4. 개선 아이디어 제안


1. 과제 파악

■ 분석 상황 요약
1. 한 이커머스 사이트에서 2015년도에 1월 부터 4월까지 4개월간의 방문 데이터를 분석하고자 한다.
2. 첫주문 퍼널은 다음 4단계로 구성되어 있다
   : Home page → Search → Payment → Confirmation(결제 완료) 
3. 매월 신규가입한 유저들의 주문 횟수가 0~5회이다.

■ 산출물
병목 구간 찾고 개선 아이디어 도출 ( 퍼널 단계별 방문자 수 집계 및 단계별 전환율 포함)

 

우선 이 상황이 실무라면..

"00씨, 아 신규가입유저들 주문횟수가 시원찮은데? 전환율 올릴만한 개선안 좀 만들어봐"

"네니오"

 

2번에 홈페이지부터면 홈페이지를 이미 들어온 사람 대상으로만 퍼널분석하라는 거겠지?

전부 홈페이지 들어온 다음의 데이터를 의미하는거겠지?

3번은 뭔말인지? 주문 횟수를 왜 0~5회라고 미리 알려준거지? 이해가 안되는데 세상엔 이해안되는게 많으니까 차근차근..

 

분석 과업이 부여되면, 우선적으로 데이터셋 이해가 필요합니다.

자체해석하는 오류를 피하기 위해 데이터엔지니어나 백엔드 담당자로부터 데이터셋의 의미를 꼭 꼭 물어보라고 하셨고,

그래서 물어보면,


2. 데이터셋 확인

주어진 a기업의 데이터셋

음음 그렇구나 내 멋대로 해석하지 않고 이런 의미를 가진 데이터구나 라고 이해하고 넘어갑니다.


3. 데이터 분석

데이터 분석의 흐름은 5단계로 쪼갤 수 있습니다.

1) 데이터 불러오기 - pd.read_csv로 가져옵니다

2) 데이터 파악 - 어떤 데이터가 있는지 확인하는 과정으로 info, describe 쓰죠

3) 데이터 정제 - 999살 고객이 있으면 어떨 것 같으세요? 이상치/결측치 처리해야합니다.

4) 분석을 위한 데이터 기본 가공 - 파생변수 생성하는 단계입니다(제가 어려워하는 단계예요)

5) 마케팅 지표 집계 - group by를 이용해서 우리한테 필요한 지표로 산출합니다

6) 인사이트 도출 

 

1&2) 데이터 불러오기 & 데이터 파악

코랩 이용해서 할 거라서, 코랩 파일 있는 폴더에 다운로드 받은 데이터도 함께 넣어줍니다.

드라이브 마운트하고나서 경로복사해서 pd.read_csv() 사이에 경로와 인코딩 넣어줍니다.

이제 여러번 했다고 데이터 불러오고 파악하는 코드는 조금 익숙합니다.

심화버전 과제에는 csv파일이 총 5개 있는데, 파일 불러오면서 벌써 후회했어요. 그냥 기본과제할걸

 

무슨 데이터인지 head부터 쫘르륵 보고 테이블별로 info랑 describe 봐볼게요.-> 이게 효율적인진 모르겠습니다

head 보니까 users말고 전부 user_id 뿐이라 users 테이블 옆에 다 붙일 수 있겠네요.

head 확인

그런데 값이 user_id 뿐인데 describe해서 최소, 최대, 중앙, 평균 이런 값들 알 필요가 있나.. count만 의미있는게 아닌가 싶네요

info /describe 확인

3) 데이터 정제

결측치, 이상치 확인해봅니다. 

없네요..? 이거 미리 데이터 병합 한 다음에 결측치 확인해봐도 되려나요..안되겠지

 

4) 분석을 위한 데이터 기본 가공

4-1) 데이터 병합

4-2) 날짜 변환

4-3) 파생변수 생성 : 이탈률 / 전환율

 

4-1) 데이터 병합

다음은 퍼널 단계별로 집계 분석 하기 위해서 데이터를 병합할겁니다.

그런데, 이거 병합 어떻게 하지 기억이 안나는데.. 옛날 실습 찾아보니 로아스 구해서 컬럼 만드는  건 알아냈는데 df["ROAS"] = (df["매출액"] / df["광고비"] *100).round(2)  병합..sql에서 join 함수 써야 값 없는 건 null값 나오고 할텐데.. 판다스는 기억이 안나서 제미나이에게 물어봤습니다.

 

판다스에도 sql의 left join 같은 게 있네요.

merge라는 함수 써줄게요

 

 

잘 합쳐진 것 같습니다.

원래 users 컬럼 4개에 나머지 테이블 1개씩 해서 4개 합쳐졌으니 8컬럼이네요.

잘 합쳐진 merged_df를 df_funnel이란 변수에 깨끗ㅎㅏ게 담겠습니다. 그래야 다음 작업들이 쉬워지니까..

더보기

※ merge 첫 번째 시도 실패

- 컬럼 x, y 명이 중복돼서 오류가 났다...어쩌고 저쩌고.. suffixes 이용해서 컬럼명 중복되지 않도록 

 

그런데 오류 해결하고나니 컬럼명에 죄다 page가 들어가 있길래 merged_df에 붙여서 그런 것 같아요.

앞에 붙는 page 없애고 싶어서 물어봤더니 column지정하고 rename 지정하고 너무 복잡해지길래 merged_df 누적하지말고 하나씩 넣으면 안되냐니까 그러면 리셋돼서 안붙는다길래 그냥 포기합니다. page 다음 단계니까 page 있어도 된다며 자기합리화...

 

4-2) 날짜 변환

위에서 봤듯이 date가 object니까 이걸 날짜형식으로 변환하겠습니다. 날짜라고 인식시켜줘야 하니까요.

짜잔, object → datetime으로 바뀌었습니다

 

4-3) 파생변수 생성 : 이탈률 / 전환율

흑흑 드디어 이탈률, 전환율을 구할 수 있는 파생변수 만들어볼게요.

수업시간 때 전환율 구했던 데이터는 전환수와 클릭수가 있는 데이터였지만

지금은 user들의 수로 전환율, 이탈률을 구해야 합니다.

 

nun값 제외하고 셀 수 있도록 count 이용해서 분모, 분자 만들어주고요

cvr = ( 현단계유저수 / 전단계유저수 ) * 100 수식 사용해서 각 단계별로 cvr 지정합니다.

출력할 때는 소수점 첫번째자리까지 표시하라고 했으니 .1f로 하고 출력.

이탈률은 전환율의 반대니 churn 지정해서 100 - cvr 해줍니다.

전환율 / 이탈률

더보기

아니 어쩐지 전환율이 너무 이상해서 이게 맞나 멍때리다가 계산 실수 찾았습니다.

분모를 직전단계가 아니라 total로만 쓰고 있었네 ㅡㅡ

 

 

 

5) 마케팅 지표 집계

5-1) 장치별(device) 전환율

5-2) 성별별 전환율

5-3) 가입자의 device 분포

5-4) 가입자의 성별 분포

5-5) 월별 가입자수

 

이제 데이터를 조금 더 세분화해서 자세하게 분석해봅시다... 어떤 기기로 온 유저가 전환율이 안좋은지, 어떤 성별이 전환율이 안좋은지 확인해볼게요

 

group by를 써야할 것 같아요.

pandas랑 sql이랑 계속 헷갈리는데, 교안보면서 차근차근 해보겠습니다..

 

5-1) 장치별(device) 전환율

장치별로 전환율을 봐야하니 device로 groupby하면 되겠다고 어림짐작해봅니다🤔

그리고나서 새로운 표를 만들어서 그 표에서 퍼널단계별(열) 유저수(행)을 구한다고 생각해봅시다.

열에 들어갈 값들은 전부 df_funnel의 count 값들이니 집계함수를 여러개 쓸 수 있는 agg를 활용합니다.

모바일 전환율이 좋네요

 

5-2) 성별별 전환율

성별로 전환율 분석하는 것 또한 5-1의 장치별과 동일하게 진행합니다.

여성의 모든 단계별로 전환율이 조금 더 높네요

 

5-3 & 5-4) 가입자의 device 분포 / 성별 분포

가입자의 device 분포와 성별 분포보다 월별 가입자수 먼저 분석했는데요.

하면서 왜 이렇게 꼬았지라는 생각이 들면서... df_funnel말고 원래 df_users 테이블에서 그냥 device만 뽑아오면 되겠다는 생각이 들어서 간단하게 끝냅니다..

그룹화된 데이터를 세는 value_counts() 써줄게요

 

5-5) 월별 가입자수

월별 가입자수를 구하려면...date 컬럼을 묶어서 count 해야겠다는 생각이 들었는데요.

무슨 함수 쓸지 바로 떠오르진 않고 groupby나 loc써서 4개월 조건 걸어주면 되지 않을까 막연히 생각하면서 제미나이 한테 물어봤습니다.

 

groupby+agg를 추천하더군요

 

갑자기 반골기질이 발동해서 pd.cut으로 만들고 싶다고 했습니다.

실패했고요

 

돌고 돌아 month 컬럼 만들고 dt.month이용해서 value_counts()이용하는 걸로 채택되었습니다(?)

 

.dt.month을 써서 월 정보만 빼겠습니다

astype(str)을 써서 숫자(dt.month로 뺀 월정보)를 문자로 바꿔줄게요. 

+ '월'을 써서 바꿔준 문자뒤에 월 붙여서 1월, 2월, 3월 이렇게 보일 수 있도록 지정해주고,

sort_index() 써야 1월, 2월 순서대로 정렬됩니다. 없으면 가입자수가 제일 많은 컬럼순으로 나열될지도...

month_group 칼럼 만들고 value_counts()로 뽑았는데, 나중에 실무에서는 연도도 중첩될 수 있으니 제미나이가 처음에 추천한 dt.to_period('M')을 이용해서 월만 꺼내서 분류하라고 합니다...

아무리 샘플데이터라도 4개월간 가입자수 같으면 의심해요 안해요?

 

하 기껏 구했는데 결과값이 의심 가득하게 나왔습니다.

크로스체크하려고  loc 써서 월별로 조건문 만들었는데, 그래도 동일하게 나온걸 보면 코드는 잘 돌아간 것 같아요.

이럴거면 처음부터 내가 loc 써서 한다고 할 때 제미나이는 왜 말렸는가?

ㅠㅠ

월별 그룹 묶는데 할 수 있는 코드가 너무 많아요.

1. groupby + agg

2. loc

3. dt.month

4. dt.to_period

하나도 정확히 모르는 상황에서 하나 하다가 두번째 방법 듣고 두번째 방법 이해도 하기전에 세번째 방법듣고 이런식으로 방법만 몇 개 인풋되는건지? 😵‍💫😵‍💫😵‍💫😵‍💫

월별 이용자수 뽑는 데 체력 다 썼습니다. 꽥

 

더보기

미치게 어렵다

제미나이가 pd.to_period라는 새로운 코드 말하길래 그래도 배웠던 코드로 뽑아보고 싶잖아요?

pd.cut이용해서 age group만든것처럼 월별로 묶고 싶어서 해보는데 제미나이가 비효율적이라고 말해줬습니다.

어쩐지 bins 값에 넣을게 상상이 안되더라니 뭘 구할 때 뭘 써야 되는지 모르니까 이렇게 오래걸리네요

Q. count 와 value_counts() 차이가 뭐죠?

count로는 그룹화된 데이터의 빈도 셀 수가 없어서 value_counts()를 사용

6) 인사이트 도출 

인사이트 도출도 하기 전에 제 체력은 이미 끝..

 

자...이제 구해둔 전환율과 이탈률을 보면서 인사이트를 도출해보겠습니다.

퍼널단계 중 결제완료 구간에서 이탈률이 가장 높습니다.

무려 92.5% !

desktop에서는 99.8 % !! ;;; 머선129

 

구매의사가 확실한 주문버튼을 누른 고객들이 결제완료구간에서 이탈한다는 것은

결제 완료까지 너무 등록할 게 많다거나(주소지목록 연동 안됨, 개인정보 연동안됨, 쿠폰 적용 안됨 등)

결제서비스의 오류가 있을 수 있겠네요. pg사 연동이 안된다거나, pg사가 몇 개 없다거나, 완료버튼이 눌리지 않는다거나.. 등등

혹은 추가배송비를 결제완료구간에서 알게되어서 흥미가 떨어졌을 수도 있어요...(=나)

 

가입자의 장치 분포를 보면 desktop유저가 66.6%로 모바일보다 많은데, 이탈률은 모바일보다 높습니다.( 모바일도 99%높긴합니다만)

desktop으로 결제하려다가 이상한 팝업이 뜨거나 주문버튼이 화면에서 날라가거나 할 수도 있겠네요. 

 

제 생각에는 결제 시스템 오류 부터 점검하고 결제 프로세스를 간소화하는 방향으로 제안할 것 같습니다.

시스템 점검이 먼저일 것 같아요

망하는거 아니에요?


4. 개선 아이디어 제안

💡 고객 이탈률이 가장 높은 구간은 결제완료 구간으로 주문 이후 결제완료까지 이탈률 92.5%로 나타났다. 주문 버튼을 누른 유저들은 구매의사가 명확함에도 불구하고 해당 단계에서 결제완료를 하지 못했다는 것은 결제구간에서 pg서비스 관련 오류가 지속적으로 발생했을 수 있다. 결제 서비스 오류 점검 및 결제 프로세스 간소화 등의 개선이 필요하다.

 

더보기

kaggle 가입하다 크롬창 다 튕겨서 억울했어요...

제미나이 없이 저 혼자 고대로 복습해야겠어요... 본 수업 처럼 머릿속에 또 남는 게 없네 ..😂

강사님이 이거 40-50분 짜리랬는데 4시간 45분 걸렸습니다.