데이터리안 SQL 데이터 분석 캠프 입문반 3주차 복습
이번 글에서는 3주차 학습 내용을 python으로 복습하겠습니다.
EDA, RFM, 피봇 테이블 등 이론적인 내용들은 아래 글을 확인해주시면 감사하겠습니다.
[SQL 입문반 33기] 3주차 복습(SQL ver)-1
데이터리안 SQL 데이터 분석 캠프 입문반 3주차 복습3주차 후기 글에서 확인할 수 있듯이 3주차에 학습한 내용은 EDA, RFM 분석, 피봇 테이블, 데이터 연결입니다.이번 글에서는 EDA의 개념과 실습,
whda.tistory.com
[SQL 입문반 33기] 3주차 복습(SQL ver)-2
데이터리안 SQL 데이터 분석 캠프 입문반 3주차 복습이번 글에서는 피봇 테이블, 데이터 연결에 대해서 복습해보겠습니다. 0. 데이터 설명이번에는 이전에 사용했던 타이타닉 데이터와 데이콘
whda.tistory.com
0. 데이터 설명
이전에 사용했던 타이타닉 데이터와 데이콘의 이커머스 데이터를 같이 활용하겠습니다.
onlinesales 데이터
변수명 | 정의 |
customer_id | 고객 고유 ID |
order_id | 거래 고유 ID |
date | 거래가 이루어진 날짜 |
product_id | 제품 고유 ID |
category | 제품이 포함된 카테고리 |
quantity | 주문한 품목 수 |
avg_cost | 수량 1개당 가격 (단위: 달러) 동일 상품이어도 세부 옵션에 따라 가격이 다를 수 있음 |
shipping_fee | 배송비용 (단위: 달러) |
coupon_status | 할인쿠폰 적용 상태 |
customers 데이터
변수명 | 정의 |
customer_id | 고객 고유 ID |
sex | 고객 성별 |
local | 고객지역 |
period | 가입기간 (단위: 월) |
discount 데이터
변수명 | 정의 |
month | 월(Month) 정보 |
category | 제품이 포함된 카테고리 |
coupon_code | 쿠폰코드 |
discount_rate | 해당 쿠폰에 대한 할인율 |
데이터 출처: https://dacon.io/competitions/official/236222/data
이커머스 고객 세분화 분석 아이디어 경진대회 - DACON
분석시각화 대회 코드 공유 게시물은 내용 확인 후 좋아요(투표) 가능합니다.
dacon.io
1. EDA 실습
Q. onlinesales 테이블 데이터 10개 추출하세요.
onlinesales.head(10)
Q. customers 테이블 데이터 10개 추출하세요.
customer.head(10)
Q. onlinesales 테이블의 결측치를 확인하세요.
onlinesales.isnull().sum()
Q. onlinesales 테이블의 데이터 수집 기간을 확인하세요.
onlinesales['date'].agg(['min', 'max'])
Q. onlinesales 테이블의 총 매출과 평균 매출을 확인하세요.
onlinesales['sales'] = onlinesales['quantity'] * onlinesales['avg_cost']
onlinesales['sales'].agg(['sum', 'mean']).astype(int)
Q. onlinesales 테이블의 총 배송비와 평균 배송비를 확인하세요.
onlinesales['shipping_fee'].agg(['sum', 'mean']).astype(int)
Q. onlinesales 테이블의 쿠폰 상태 컬럼에 무슨 값들이 있는지 확인하세요.
onlinesales['coupon_status'].unique()
Q. onlinesales 테이블의 카테고리 컬럼에 무슨 값들이 있느지 확인하세요.
onlinesales['category'].unique()
2. RFM 실습
Q. onlinesales 테이블의 고객별 Recency 계산하세요. (19년 12월 주문까지는 'recent', 그 이전은 'past'입니다.)
1단계: 'customer_status'라는 별도의 데이터프레임 생성하여 고객별 마지막 주문일 확인합니다.
customer_status = onlinesales.groupby('customer_id')['date'].agg('max').reset_index() # 요약 데이터프레임 활용
customer_status = customer_status.rename(columns={'date':'last_order_date'}) # 컬럼명 변경
customer_status.head()
2단계: 'rfm' 데이터프레임을 생성하고 데이터 numpy의 where 함수를 사용하여 19년 12월 주문까지는 'recent', 그 이전은 'past'로 설정합니다.
import numpy as np
rfm = customer_status.copy()
rfm['Recency'] = np.where(customer_status['last_order_date'] >= '2019-12-01', 'recent', 'past')
rfm.head()
Q. onlinesales 테이블의 고객별 Frequency 계산하세요. (주문횟수가 30번 이상이면 'high', 아니면 'low'입니다.)
1단계: ' customer_status ' 데이터프레임에 고객별 주문 횟수를 확인합니다.
customer_status['cnts_order'] = onlinesales.groupby('customer_id')['order_id'].agg('nunique').reset_index()['order_id']
customer_status.head()
2단계: 'rfm' 데이터프레임에 주문횟수가 30번 이상이면 'high', 아니면 'low'로 설정합니다.
rfm['cnts_order'] = customer_status['cnts_order']
rfm['Frequency'] = np.where(customer_status['cnts_order'] >= 30, 'high', 'low')
rfm.head()
Q. onlinesales 테이블의 고객별 Monetary 계산하세요. (총 비용이 $1500 이상이면 'high', 아니면 'low'입니다.)
1단계: ' customer_status ' 데이터프레임에 고객별 총 비용을 확인합니다.
onlinesales['sales'] = onlinesales['quantity'] * onlinesales['avg_cost']
customer_status['sum_sales'] = onlinesales.groupby('customer_id')['sales'].agg('sum').reset_index()['sales']
customer_status.head()
2단계: 'rfm' 데이터프레임 총 비용이 $1500 이상이면 'high', 아니면 'low'로 설정합니다.
rfm['sum_sales'] = customer_status['sum_sales']
rfm['Monetary'] = np.where(customer_status['sum_sales'] >= 1500, 'high', 'low')
rfm.head()
Q. Recency별 고객 수 확인하세요.
rfm.groupby('Recency')['customer_id'].count()
Q. Frequency별 고객 수 확인하세요.
rfm.groupby('Frequency')['customer_id'].count()
Q. Monetary별 고객 수 확인하세요.
rfm.groupby('Monetary')['customer_id'].count()
Q. RFM별 고객 수 확인하세요.
rfm_new = customer_status[['customer_id']].copy()
rfm_new['Recency'] = np.where(customer_status['last_order_date'] >= '2019-12-01', 'recent', 'past')
rfm_new['Frequency'] = np.where(customer_status['cnts_order'] >= 30, 'high', 'low')
rfm_new['Monetary'] = np.where(customer_status['sum_sales'] >= 1500, 'high', 'low')
rfm_new = rfm_new.groupby(['Recency', 'Frequency', 'Monetary']).size().reset_index(name='customers')
rfm_new
이상으로 python을 통해 EDA와 RFM 분석을 해봤습니다.
파이썬을 해보니 많이 어렵네요...
이후에 진행할 이커머스 프로젝트에서 더욱 제대로 EDA와 EFM 분석을 해보겠습니다.
전체 소스코드가 궁금하다면 아래 깃허브 주소를 참고해주세요.
https://github.com/HSYhrae/TIL/tree/master/MySQL/Datarian
TIL/MySQL/Datarian at master · HSYhrae/TIL
Today I Learned. Daily commit. Contribute to HSYhrae/TIL development by creating an account on GitHub.
github.com
본 내용은 데이터리안 'SQL 데이터 분석 캠프 입문반' 을 수강하며 작성한 내용입니다.