天天看點

python分析保險銷售資料_用Python整理銷售資料

資料依然是來自阿裡天池的銷售資料,上篇文章有寫

本來還想用用其它分析方法的,但是為了徹底了解這篇文章中的代碼搞了半天

是以說本來還準備分析的一部分内容如下:如果客戶是嬰兒的父母,隻考慮為了嬰兒購買商品的情況下,嬰兒出生日期、購買日期以及客戶留存時長,以及嬰兒在什麼年齡段需要購買哪種商品,我覺得是有相關性的,這個相關性分析留在下一篇文章吧

首先還是用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這個包顯示中文,是以最後還是把資料導出後,做了彙總以後做了一個餅圖