天天看点

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这个包显示中文,所以最后还是把数据导出后,做了汇总以后做了一个饼图