Starbucks Customer Data
Starbucks customer dataset
www.kaggle.com
스타벅스 프로모션 데이터를 분석하여, 고객 세그멘테이션을 하고 이에 맞는 마케팅 인사이트를 도출하는 것이 이번 분석의 목표였다.
주어진 데이터셋은 총 3개이다.
- portfolio.csv - 고객에게 프로모션 오퍼를 보낸 기록이 있는 데이터 (10 offers x 6 columns)
- profile.csv - 고객들의 인구통계학적 자료가 담긴 데이터 (17,000 customers x 5 columns)
- transcript.csv - (306,648 events x 4 columns)
1. ERD
분석하기 앞서 ERD를 만들어보았다.
관계도에서 발견할 수 있는 주요사항은 아래와 같았다.
- profile → transcript
1:N의 관계로 종속관계이다. profile 테이블의 id가 transcript테이블의 person 필드와 연결되어 있다.
즉, 한 명의 회원이 여러 이벤트에 참여할 수 있다는 의미이다.
- portfolio → transcript
1:N의 관계로 종속관계이다. portfolio테이블의 id가 transcript value열 안의 offer id와 연결된다.
즉, 하나의 프로모션은 여러 사람이 참여할 수 있다.
- transcript테이블은 profile과 portfolio테이블 모두에 종속되어 있다.
2. 데이터 출력
# JSON 문자열을 딕셔너리로 변환
df_transcript['value_dict'] = df_transcript['value'].apply(lambda x: json.loads(x.replace("'", '"')))
keys_list = set()
df_transcript['value_dict'].apply(lambda x: keys_list.update(x.keys()))
print(keys_list)
for key in keys_list:
df_transcript[key] = df_transcript['value_dict'].apply(lambda x: x.get(key, None))
#string으로 문자열을 자름
df_transcript[df_transcript["event"] == 'transaction']
df_transcript["amount"] = df_transcript["value"].str[11:-1]
df_transcript
데이터를 불러오고 데이터 형식과 컬럼들을 확인해보았다. head로 상위 다섯 개 행만 출력해보았다.
(1) transcript
(2) profile
(3) Portfolio
portfolio를 promotion으로 데이터프레임 명을 변경해서 불렀다.
3. 데이터 클렌징
#결측값 제거
df_transcript = df_transcript.dropna(subset=['amount'])
df_transcript.rename(columns = {'time' : 'hours_since_start'}, inplace = True)
df_transcript.head(1)
#amount의 통계값 구하기
df_transcript["amount"] = pd.to_numeric(df_transcript["value"].str[11:-1], errors='coerce')
tra_sum = df_transcript[df_transcript['event'] == 'transaction'].groupby(by='person')['amount'].sum()
tra_sum.describe()
#테이블 합치기
all_starbucks = pd.merge(df_profile, df_transcript, on='person', how = "left")
all_starbucks.head(20)
4. JSON 데이터 정리
import json
#JSON 데이터를 딕셔너리 형태로 변환
import ast
df_transcript['value'] = df_transcript['value'].apply(ast.literal_eval)
5. RFM 구하는 중
# 조건부 카운트 (fpoint 처리)
all['is_transaction'] = (all['event'] == 'transaction').astype(int)
# groupby를 활용한 집계
rfm = all.groupby('person').agg(
rpoint=('time', 'count'), # time의 합계 / Recency
fpoint=('is_transaction', 'count'), # transaction 이벤트 개수 / Frequency
mpoint=('amount', 'sum') # amount의 합계 / Monetary
).reset_index()
# total_point 계산
rfm['total_point'] = rfm['rpoint'] + rfm['fpoint'] + rfm['mpoint']
# 데이터 그룹화 및 집계
df = pd.DataFrame(rfm)
# 총 점수 계산
rfm['total_point'] = rfm['rpoint'] + rfm['fpoint'] + rfm['mpoint']
# 사분위수를 기준으로 각 값들을 1, 2, 3, 4로 변환하는 함수
def quadrant_values(column):
q1 = column.quantile(0.25)
q2 = column.quantile(0.50)
q3 = column.quantile(0.75)
# 값 변환
return column.apply(
lambda x: 1 if x <= q1 else (2 if x <= q2 else (3 if x <= q3 else 4))
)
# rpoint, fpoint, mpoint 사분위수 변환
rfm["rpoint"] = quadrant_values(rfm["rpoint"])
rfm["fpoint"] = quadrant_values(rfm["fpoint"])
rfm["mpoint"] = quadrant_values(rfm["mpoint"])
# total_point 계산
rfm["total_point"] = rfm["rpoint"] + rfm["fpoint"] + rfm["mpoint"]
rfm
어딘가 미묘하게 팀원과 값이 다르다..아마 기준치를 잘못 잡아서 그런 것 같은데, 다시 한 번 해봐야 겠다.
회고
스타벅스 데이터를 가지고 본격적으로 분석을 시작해보았다. 막상 분석을 시작해보니, 어려운 점들이 많았다.
데이터를 추출하고, 결측치를 확인하고, 컬럼명을 변경하고 등등 괄호와 컴마를 찍는 것이 헷갈렸다.
코랩에서 코드를 보면서 짤 때는 다 아는 것 같은 기분이 들었는데, 혼자 코딩을 작성해보니 헷갈리는 것들이 많아 강의안을 보면서 느릿느릿 코드를 작성하고 있었다. 하나씩 코드가 완성되어 내가 보고자 하는 데이터가 추출되니 뿌듯하고 내가 조금씩 성장하고 있음이 느껴졌다. 팀원들도 다들 자신의 맡은 부분들을 잘 해주어서 비교적 순조롭게 프로젝트가 진행된 것 같다. 그리고 파이썬을 잘 하는 팀원이 없었더라면....프로젝트를 제 시간 안에 끝내지 못했을 것 같다는 생각이 들었다. 좋은 팀원들을 만난 것에 다시 한 번 감사하는 한 주였다.
이번 실습 프로젝트를 통해서 판다스, 파이썬에 조금 더 친숙해진 것 같은 느낌적 느낌,,,,,,하하하
그리고 우수 TIL로 내 포스팅이 선정되었는데, 매우 뿌듯하다. 부족한 글이었는데 좋게 봐주신덕에 스파르타에 글이 포스팅 될 수 있는 기회를 얻을 수 있었다. 사소해보이지만 작은 성취를 얻은 것 같아서 기쁘다. 이런 성취들이 모여서 앞으로 나아가는 추진력이 될 것 같다. 그리고 나의 기록이 새로운 분야를 공부하는 누군가에게 도움이 될 수 있으면 좋겠다.
내일배움캠프 우수 TIL | 데이터분석 4, 5기 12월 3, 4주차 - 내일배움캠프 블로그
TIL 작성 방법이 궁금한가요? 내일배움캠프 수강생들의 우수 TIL을 참고해 보세요. | 📕수강생 학습일지
nbcamp.spartacodingclub.kr
'데이터분석캠프 TIL' 카테고리의 다른 글
250113 TIL 데이터분석과정 TIL(머신러닝 주차 시작) (1) | 2025.01.13 |
---|---|
250110 TIL 데이터 분석과정 (QCC만 하다가 하루가 끝난...) (2) | 2025.01.10 |
241220 TIL 데이터분석과정 (1) | 2024.12.26 |
241224 TIL 데이터분석과정 (1) | 2024.12.24 |
241219 TIL 데이터 분석 과정 (3) | 2024.12.19 |