python数据分析实战-在线零售业务的交易-电商平台零售数据分析(附源代码)电商平台零售数据分析
前⾯的博客中已经有使⽤在线零售业务数据进⾏数据分析,但是在这⼀篇,我们以不同的⾓度重新对这些数据进⾏分析。
数据来源及数据结构
国外的在线零售业务的交易数据,
现在以表格的形式解释⼀下⾥⾯的字段:
字段说明
InvoiceNo订单编号,含有6个整数,退货订单编号开头有字母C
StockCode产品编号,由5个整数构成
Description产品描述
Quantity产品数量,有负号表⽰退货
InvoiceDate订单⽇期和时间
UnitPrice单位 英镑 单位产品的价格
CustomerID客户编号,由5位数字组成
Country国家的名称 每个客户所在的国家/地区的名称
分析⽬的
⽤户分类(RFM模型),对⽐分析不同⽤户体在时间、地区等维度下交易量,交易⾦额指标,并根据分析结果提出优化建议R:最近⼀次消费时间(最近⼀次消费到参考时间的长度)
F:消费的频次(单位时间内消费多少次)
M:消费的⾦额(单位时间内总消费⾦额)
⾸先说⼀下思路:
1、清洗数据,去除掉退单的数据和异常值
2、按照RFM模型公式,计算各个模块的数值
3、 通过数据的划分,将模型的三个模块按照重要性进⾏划分。
4、 通过⾃定义函数,将模型进⾏整理
5、 通过柱状图和饼状图对模型所划分的区域进⾏展⽰。
下⾯来看代码,⾥⾯有详细代码注释:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import plotly as py
import aph_objects as go
import seaborn as sns
sns.set_style('darkgrid')
data = pd.read_csv('data/data.csv')
# print(data.head(10))
#进⾏数据清洗
# print(data.info())
#从输出信息上来看,CustomerID 发现⼤量缺失,Description发现少量缺失
#去除掉重复值的值
data = data.drop_duplicates()
#通过描述信息查看是否出现异常值
print(data.describe())
#通过结果发现,UnitPrice出现负值,我们只需要正值并且退货数据必须剔除掉
data=data[(data['UnitPrice']>0)&(data['Quantity']>0)]
#接下来将缺失的CustomerID归为⼀类代号U
data['CustomerID'].fillna('U',inplace=True)
#统计最近⼀次消费时间【-----
#时间格式转化成datatime 这⾥我们暂时不需要具体的时间,所以只留下年⽉⽇
data['Data']=[i[0]for i in data['InvoiceDate'].str.split(' ')]
data['InvoiceDate']= pd.to_datetime(data['Data'],errors='coerce')
#增加三列分别记录年、⽉、⽇
data['Year']= data['InvoiceDate'].dt.year
源代码1080p在线data['Month']= data['InvoiceDate'].dt.month
data['Day']= data['InvoiceDate'].dt.day
#我们以所有订单的最新⽇期为参考时间
Customerdata =data['InvoiceDate'].max()- upby('CustomerID')['InvoiceDate'].max()
R_Customer = Customerdata.dt.days
# print(Customerdata.describe())#统计均值标准差最⼤最⼩值
plt.hist(R_Customer,bins=30)
plt.title("统计最近⼀次消费时间")
# plt.show()
#---】
#统计消费的频次也就是每个客户购买的订单数
F_Custumer = upby('CustomerID')['InvoiceNo'].nunique()
#统计消费的⾦额
data['Amount']= data['UnitPrice']*data['Quantity']
M_Custumer = upby('CustomerID')['Amount'].sum()
#好了我们需要统计的都统计完了接下来就进⾏分组和数据可视化
R_bins =[0,30,90,180,360,720]
F_bins =[1,2,5,10,20,5000]
M_bins =[0,500,2000,5000,10000,200000]
R_score = pd.cut(R_Customer,R_bins,labels=[5,4,3,2,1],right=False)#right=False 所划分区间是左闭右开F_score = pd.cut(F_Custumer,F_bins,labels=[1,2,3,4,5],right=False)
M_score = pd.cut(M_Custumer,M_bins,labels=[1,2,3,4,5],right=False)
rfm = pd.concat([R_score,F_score,M_score],axis=1)
#从结果中看到,列名默认是采⽤原数据⾃带的列名这⾥我们做⼀下修改
print(rfm.describe())# 通过查看平均值来对⽤户进⾏分级
#R_scpre-mean():3.82
#F_score-mean():2.02
#M_score-mean():1.88
rfm['R_score']= np.where(rfm['R_score']>3.82,'⾼','低')
rfm['F_score']= np.where(rfm['F_score']>2.02,'⾼','低')
rfm['M_score']= np.where(rfm['M_score']>1.88,'⾼','低')
#将这三个拼接到⼀块
rfm['All']= rfm['R_score'].str[:]+rfm['F_score'].str[:]+rfm['M_score'].str[:]
rfm['All']= rfm['All'].str.strip()
def CheckClass(x):
if(x=='⾼⾼⾼'):
return'重要价值客户'
elif x=='⾼低⾼':
return'重要发展客户'
elif x=='⾼⾼低':
return'⼀般价值⽤户'
elif x=='⾼低低':
return'⼀般发展客户'
elif x=='低⾼⾼':
return'重要保持客户'
elif x=='低⾼低':
return'重要发展客户'
elif x=='低低⾼':
return'重要挽留客户'
elif x=='低低低':
return'⼀般挽留客户'
rfm['⽤户等级']= rfm['All'].apply(CheckClass)
#⽤户等级数量可视化-
Bar = go.Bar(x=rfm['⽤户等级'].value_counts().index,y=rfm['⽤户等级'].value_counts(),opacity=0.5,marker=dict(color='orange')) layout = go.Layout(title ="不同⽤户等级柱状图")
fig = go.Figure(data=[Bar],layout=layout)
py.offline.plot(fig,filename='CustomerNumber.html')
#将⽤户等级可视化-饼状图
Pie = go.Pie(labels=rfm['⽤户等级'].value_counts().index,values=rfm['⽤户等级'].value_counts())
layout = go.Layout(title ="不同⽤户等级")
fig = go.Figure(data=[Pie],layout=layout)
py.offline.plot(fig,filename='CustomerClass.html')
输出两个结果图:
结论和总结
本次实践主要是简单描述⽤户画像,对⽤户进⾏分层。从图表中我们可以看到,重要价值客户和重要发展客户占⽐最多,对于前者,由于其购买时间间隔⽐较长,可以采取优惠卷或者相应打折⼒度,增加这种⽤户的回购频率;对于后者客户,除了购买时间间隔长之外,还存在购买频率⽐较低的问题,对于这客户,同样可以策划相应的活动。此数据还可以从另外⾓度分析,⽐如 按⽉份进⾏订单量统计,并对⽐去年同期数据,查看是否出现⼤的波动等等。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论