[내배캠] 데이터분석 6기/프로젝트 기록

[본캠프 27일차] 부록: [chap 2] 기초 프로젝트 준비④

물맨두 2025. 3. 26. 22:45

 

 

프로젝트 준비하면서 계속 할 일을 하는데 왜 일이 끝이 없지..? 나는 오늘은 개인적으로 필요한 부분을 공부를 할 수 있을 줄 알았는데, 그랬는데...

 


데이터 분석에 사용한 코드 검토 및 취합하기

250326 말하다보니 이 일을 피할 수 없음을 알아버린 나..

혼자서 EDA를 하면서 코드를 작성했던 파일은 낙서장처럼 갈겨쓴 수준이라 공유하기 어렵겠다 싶었다. 어떤 수준이냐면 데이터 분석을 위해 주어진 데이터들로 만들 각종 테이블들이 존재하고(이 중 절반은 결국 분석 시 사용하지 않음), 코드의 경우에도 한 번 돌려보고 나오는 결과가 이상하면 해당 코드를 지우고서 새로 쓰는 게 아니라 잘못된 코드도 다시 쓸 일이 있지 않을까 싶은 마음에 그 코드는 #을 붙여서 주석 처리하고서 그 밑에 수정한 코드를 적어 놓고, 테이블의 경우에도 컬럼을 만들었는데 결과 테이블을 조회해보니 NaN값이 난무해서 그 컬럼을 그러면 지워야 하는데 귀찮아서 지우지 않았다든가, 아무데나 inplace=True를 써버린다든가...

 

아무튼, 여러모로 지저분한 파일을 공유할 순 없어서 공유할 파일을 새로 파서 그곳에 분석 시 사용한 코드들을 정리하기로 했다. 

 

코드 정리 중 이전의 계산 값이 달라진 부분이 발생

250326 어제와 오늘 방문횟수별 총 소비 금액을 컬럼인 total_sum의 값이 달라짐

조에서 발표할 때 분석 방향을 커머스에서 중요하게 보는 지표 중 하나인 재구매/재방문에 대한 부분을 중심으로 데이터를 살펴보기로 했기 때문에 방문 횟수별 고객들의 분석하고자 이런 피벗 테이블을 만들어 살펴보았다.

 

그래서 코드를 정리하던 중 방문횟수별 해당 고객군의 총 지출 금액을 구한 컬럼인 total_sum의 값들이 달라지면서 해당 컬럼을 이용해 값을 구하는 다른 컬럼들(total_sum(%), AOV)도 값이 달라졌다.

 

이 상황에서 우선 지금 작성한 코드 내용이 맞는지를 확인해봤다.

# 방문 횟수 집계 (방문 횟수: 해당 고객이 2019년 동안 자사에서 구매한 일자를 중복값 없이 집계)
trapt_visitcnt = tra.pivot_table(index='customer_id', values='t_dat', aggfunc='nunique')
trapt_visitcnt.rename(columns={'t_dat':'visit_cnt'}, inplace=True)
# 고객ID별 방문횟수를 구한 테이블
trapt_visitcnt

# 고객ID별 2019년 총 소비 금액 구하기
amount_id = pd.DataFrame(tra.groupby('customer_id')['price3_KRW'].sum())
amount_id = amount_id.reset_index()
# 고객ID별 2019년 총 소비 금액을 구한 테이블
amount_id


# 기존의 transactions 테이블에 고객의 방문 횟수에 대한 컬럼 ['visit_cnt'], ['id_amount'] 추가
tra1 = pd.merge(tra, trapt_visitcnt, how='left', left_on='customer_id', right_on='customer_id')
tra1 = pd.merge(tra1, amount_id, how='left', left_on='customer_id', right_on='customer_id')
tra1.rename(columns={'price3_KRW_x':'price3_KRW', 'price3_KRW_y':'id_amount'}, inplace=True)
tra1
# 1. 방문횟수별 총 판매액(['total_sum']) 구하기
pivot_visitcnt = tra1.pivot_table(index=['visit_cnt'], values=['price3_KRW'], aggfunc='sum').reset_index()

tra1 테이블은 기존의 transactions 테이블에서 customer_id별로 2019년 방문 횟수를 집계한 컬럼 'visit_cnt', 그리고 2019년 총 구매액을 계산한 컬럼 'amount_id'가 추가된 테이블이다.

이 tra1 테이블로 visit_cnt를 인덱스로 하여 price3_KRW 컬럼의 값을 더한 것이 total_sum 컬럼이다. 아무리 봐도 오늘 정리하면서 작성한 코드가 맞는 것 같아 이전에는 어떻게 계산했길래 이런 차이가 발생했는지 확인했더니,

  • transactions 테이블에서 customer_id별로 2019년 총 구매액의 값을 구한 컬럼 total_sum을 만듦
  • 위의 테이블을 transactions 복사복에 customer_id를 기준으로 merge함
  • 이렇게 되면 당연히 transactions 테이블 해당 customer_id의 거래내역 건마다 total_sum 값이 붙음
    • 이 상태에서 total_sum을 .sum()으로 집계하면 2019년 총 판매액보다 더 큰 금액이 나옴
    • 당연함. customer_id에 해당하는 그 사람의 2019년 총 구매액이 여러 번 들어갔으니까.

이런 상황에서 문제가 생겼던 듯하고, 어제 구했던 내용이 틀렸고 오늘 새로이 정리한 부분이 맞다는 것을 점검했다.

그러면 해당 컬럼의 값이 바뀌면서 영향을 받는 부분이 또 하나 있다.

 

데이터에서 파레토 법칙을 확인 가능한지에 대한 여부

250326 방문횟수별 총 구매액이 값이 달라지면서 어제의 분석과 달리 파레토 법칙이 적용되지 않음

어제까지만 해도 방문횟수를 기준으로 방문 횟수가 3회 이상인 고객이 전체 고객 중 20%를 차지하는데 총 판매액에서 80%를 차지하는 비중을 보인다는 것을 확인할 수 있었는데, 달라진 피벗 테이블로 해당 부분을 원 그래프로 다시 시각화하니 총 판매액 비중에 있어서 1~2회 방문한 고객군과 3회 이상 방문한 고객군이 비등하게 차지함을 확인할 수 있었다.

250326 그 와중에 노션이 말썽이어서 업데이트가 안 되는 상황이라 급하게 스크린샷으로 공유한 모습.. (진짜...)

이에 해당 부분을 반영하여 분석 내용을 일부 수정해야 할 것 같아 빠르게 해당 상황을 팀원들과 공유해 다음과 같은 방향으로 이를 해석하는 것을 제안했다.

  • 이전과 동일한 부분 
    • 파레토 법칙이 우리에게 주어진 데이터에서 적용되는지 확인하고, 이 법칙이 확인된다면 해당 내용을 바탕으로 매출의 80%를 만들어내는 20%의 고객을 정의하기로 함
    • CRM 마케팅에서 한 고객이 브랜드에 신뢰 관계가 형성되는 시점을 3회 이상 재구매가 나타났을 때라는 점을 바탕으로 현재 데이터를 분석한 내용에서도 방문횟수가 2회 이하 고객은 80%, 3회 이상은 20%로 나타남
    • 그래서 3회 이상 방문한 20%의 고객군이 총 판매액에서 80%의 비중을 차지하는지 확인하기로 함
  • 이전과 달라진 부분: 파레토 법칙이 보여지지 않음
    • ➡️ 실제로 총 판매액에서 차지하는 비중을 보니 2회 이하 방문한 고객군과 3회 이상 방문한 고객군이 비등함을 확인함
    • ➡️ 이에 3회 이상 방문한 고객군만을 타겟으로 삼아 재구매 전략을 수립하기보다, 1~2회 방문 고객 역시 자사 서비스의 판매 비중이 높다는 점에서 이들을 고려한 재구매 전략 역시 필요함을 확인함
    • ➡️ 그래서 고객 등급 산정 시 하위 등급은 1회 내지는 2회 방문만을 해도 혜택을 주고, 상위 등급은 방문 횟수보단 총 구매액에 따른 등급 산정 기준을 마련하기로 함 (방문 횟수와 총 구매액 모두 활용하기로)

최종적으로 취합한 코드 파일 공유하기

250326 지금에서야 알아차린 건데, 내가 지금 파이썬으로 보고서를 쓴 건가..?
250326 분석한 코드를 정리한 ipynb 파일 중 일부

해당 내용들을 포함해 파일에 정리하는데 단순히 주석 처리로만 줄줄줄 첨언하기엔 받아보시는 분들이 볼 때 별로일 것 같아서 주피터 노트북의 마크다운에 대한 단축키들을 좀 찾아서 중간중간 제목과 설명글을 작성하면서 코드를 정리했다. 확실히 마크다운을 사용하니 좌측 메뉴에서 OUTLINE으로 목차로 한눈에 확인할 수도 있고 좋다.

[참고] [Markdown] Jupyter Notebook :: 주피터 노트북 마크다운 정리

 

사용한 코드 정리한 글:

 

[본캠프 28일차] 부록: [chap 2] 기초 프로젝트 준비⑤

(코드 정리. 공유를 위한 ipynb 파일의 내용을 혹시 몰라 티스토리에도 남겨 놓는다) 라이브러리 및 데이터 불러오기# 라이브러리import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as

maandoo.tistory.com

 


이제 PPT 나왔으니 내일은 발표 대본 써야 한다..... 왜 할 일은 끝이 없는가....