資料依然是來自阿裡天池的銷售資料,上篇文章有寫
本來還想用用其它分析方法的,但是為了徹底了解這篇文章中的代碼搞了半天
是以說本來還準備分析的一部分内容如下:如果客戶是嬰兒的父母,隻考慮為了嬰兒購買商品的情況下,嬰兒出生日期、購買日期以及客戶留存時長,以及嬰兒在什麼年齡段需要購買哪種商品,我覺得是有相關性的,這個相關性分析留在下一篇文章吧
首先還是用Python讀取資料,用merge生成新表的時候,自動删除了一部分未比對到的資料,在資料庫連接配接中應該是内連接配接的方式就是取兩個表格的user_id的交集部分
import numpy as np
import pandas as pd
sales_data=pd.read_csv('sale_data.csv',parse_dates=['day'],
dtype={'user_id':str,'auction_id':str,
'cat_id':str,'cat1':str})
baby_data=pd.read_csv('baby_data.csv',parse_dates=['birthday'],
dtype={'user_id':str})
#對兩張表格以user_id為主鍵合并至sales_data中,生成新的new_data表格
new_data=pd.merge(sales_data,baby_data,on='user_id')
檢查資料是否有空值
new_data[new_data.isnull().values==True]
結果顯示如下
property是商品屬性,這一欄對之後的分析作用不大,先删去,生成一個新表名稱為shopping_data,并且檢查該表格是否有空值,重複值,結果顯示都沒有
shopping_data=new_data.drop(['property'],axis=1)
shopping_data[shopping_data.isnull().values==True]
shopping_data[shopping_data.isna().values==True]
shopping_data[shopping_data.duplicated().values==True]
通過上次的描述統計發現最晚購買商品的人是在2015年2月,是以最近一次購買時間就定為2015年3月1日減去購買時間,然後求RFM,求RFM主要使用了groupby和agg函數,groupby函數就是按照user_id分别對最近一次購買時間、購買行為以及購買數量分類(本來應該用購買金額的,但是沒有,就用購買數量代替了);agg函數就是對groupby分類的資料進行取值,min代表最小值,count代表總次數,sum代表總數量;最後用jion函數合并3個列
shopping_data['datediff']=(pd.to_datetime('20150301')-shopping_data['day'])
R_agg=shopping_data.groupby(by=['user_id'])['datediff']
Recency_buy=R_agg.agg([('最近一次消費','min')])
F_agg=shopping_data.groupby(by=['user_id'])['auction_id']
Frequency_buy=F_agg.agg([('總計消費頻次','count')])
M_agg=shopping_data.groupby(by=['user_id'])['buy_mount']
Allmount_buy=M_agg.agg([('總計消費數量','sum')])
RFM=Recency_buy.join(Frequency_buy).join(Allmount_buy)
然後,我事先看了一下資料,總計消費頻次和總計消費數量為1的占了很大一部分,是以就隻對最近一次消費進行了分數分類(還有一個原因就是資料右偏分布明顯)
bins = RFM.iloc[:,0].quantile(q=np.linspace(0,1,num=6),interpolation='nearest')
labels = np.arange(5,0,-1)
RFM['R'] = pd.cut(RFM.iloc[:,0],bins=bins,labels=labels,include_lowest=True)
對F和M用的是一般分類,右偏明顯是以分類稍微在左邊分的緊湊一些,右邊分散一些
bins = [1,3,5,12]
labels=np.arange(1,4)
RFM['F']=pd.cut(RFM['總計消費頻次'],bins=bins,labels=labels,include_lowest=True)
RFM['M']=pd.cut(RFM['總計消費數量'],bins=bins,labels=labels,include_lowest=True)
RFM.insert(4,'F',RFM.pop('F'))
RFM.insert(5,'M',RFM.pop('M'))
資料大緻展示如下
最後就進行了客戶分類
RFM_model=RFM.filter(items=['R','F','M'])
def rfm(x):
return x.iloc[0]*100+x.iloc[1]*10+x.iloc[2]*1
RFM_model['RFM']=RFM_model.apply(rfm,axis=1)
bins=RFM_model.RFM.quantile(q=np.linspace(0,1,num=6),interpolation='nearest')
labels=['流失客戶','一般維持客戶','潛力客戶','重要喚回客戶','重要價值客戶']
RFM_model['Label of Customer']=pd.cut(RFM_model.RFM,bins=bins,labels=labels,
include_lowest=True)
RFM_model.to_csv('RFM_model.csv',index=False)
因為一直沒搞懂怎麼用matplotlib.pyplot這個包顯示中文,是以最後還是把資料導出後,做了彙總以後做了一個餅圖