开始前的准备工作
开始分析之前先进行导入库文件和数据的准备工作,首先导入分析过程中需要使用的库文件,用于对数据进行计算和格式转换,这里不再赘述,请见下面的代码。
#导入所需的库文件
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
然后分别导入订购明细和用户明细数据,并对数据表进行进行联结。组成用于分析的完整数据表。
with open(u"G:/Jupyter/lianxi/订购明细.txt", "rb") as f:
dgmx=pd.read_table(filepath_or_buffer=f, sep=",")
dgmx.columns
Index([u'订单编号', u'订购日期', u'用户ID', u'产品', u'单价(元)', u'数量', u'订购金额'], dtype='object')
dgmx.shape
(340523, 7)
dgmx.head()
![](https://img.haomeiwen.com/i1400428/bf04e1b84e5792a5.png)
yhmx = pd.read_table(u"用户明细.txt",sep=",")
yhmx.columns
Index([u'用户ID', u'省份', u'性别', u'年龄', u'注册日期'], dtype='object')
yhmx.shape
(59101, 5)
yhmx.head()
![](https://img.haomeiwen.com/i1400428/74d446bcdb2fa218.png)
mx=pd.merge(dgmx,yhmx,how='left',on='用户ID')
mx.dropna()
mx.head()
![](https://img.haomeiwen.com/i1400428/d75b93a9e003339c.png)
各省订单数数量
sf=mx.groupby("省份")["订单编号"].count().order(ascending=False)
#sf1=mx.groupby("省份")["订单编号"].agg(len)
sf.index
Index([u'上海', u'北京', u'广东', u'江苏', u'天津', u'海南', u'四川', u'湖南', u'河南', u'重庆',
u'甘肃', u'吉林', u'内蒙古', u'安徽', u'河北', u'新疆', u'贵州', u'广西', u'浙江', u'山西',
u'辽宁', u'陕西', u'山东', u'湖北', u'黑龙江', u'福建', u'宁夏', u'江西', u'云南', u'青海',
u'西藏'],
dtype='object', name=u'省份')
#sf.values
#图表中文标签显示
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
index = np.arange(31)
plt.figure(figsize=(15,5))
plt.bar(index,sf.values,0.5,color='#FFA07A',label= u'订单数')
plt.xticks(index,[u'上海', u'北京', u'广东', u'江苏', u'天津', u'海南', u'四川', u'湖南', u'河南', u'重庆',
u'甘肃', u'吉林', u'内蒙古', u'安徽', u'河北', u'新疆', u'贵州', u'广西', u'浙江', u'山西',
u'辽宁', u'陕西', u'山东', u'湖北', u'黑龙江', u'福建', u'宁夏', u'江西', u'云南', u'青海',
u'西藏'])
plt.xlabel(u'省份')#plt.xlabel('时间',fontproperties = 'SimHei',fontsize = 20)
plt.ylabel(u'数量')
plt.legend([u'订单数量',],loc='upper right')#元组加逗号 使图例显示完整
plt.title(u'各省份订单数量')
plt.grid(color='#95a5a6',linestyle='--', linewidth=1,axis='y',alpha=0.5)
plt.show()
![](https://img.haomeiwen.com/i1400428/e128b25c914f22fe.png)
各省消费
单从订单数量不足以看出各省的消费实力,消费金额是反映消费能力的直接指标。我们首先对订购金额数据按照省份进行汇总,之后再计算各省份的人均消费额。
sfxf=mx.groupby("省份")["订购金额"].sum().order(ascending=False)
sfxf.index
Index([u'上海', u'北京', u'广东', u'海南', u'河南', u'湖南', u'江苏', u'四川', u'内蒙古', u'甘肃',
u'天津', u'吉林', u'重庆', u'新疆', u'河北', u'广西', u'贵州', u'安徽', u'山西', u'山东',
u'陕西', u'辽宁', u'湖北', u'福建', u'浙江', u'黑龙江', u'江西', u'宁夏', u'云南', u'青海',
u'西藏'],
dtype='object', name=u'省份')
index = np.arange(31)
plt.figure(figsize=(15,5))
plt.bar(index,sfxf.values,0.5,color='#FFA07A',label= u'订单数')
plt.xticks(index,[u'上海', u'北京', u'广东', u'海南', u'河南', u'湖南', u'江苏', u'四川', u'内蒙古', u'甘肃',
u'天津', u'吉林', u'重庆', u'新疆', u'河北', u'广西', u'贵州', u'安徽', u'山西', u'山东',
u'陕西', u'辽宁', u'湖北', u'福建', u'浙江', u'黑龙江', u'江西', u'宁夏', u'云南', u'青海',
u'西藏'])
plt.xlabel(u'省份')#plt.xlabel('时间',fontproperties = 'SimHei',fontsize = 20)
plt.ylabel(u'消费金额')
plt.legend([u'消费金额',],loc='upper right')#元组加逗号 使图例显示完整
plt.title(u'各省消费金额')
plt.grid(color='#95a5a6',linestyle='--', linewidth=1,axis='y',alpha=0.5)
plt.show()
![](https://img.haomeiwen.com/i1400428/caf1e2c7a2e2e962.png)
从分析可以看出,北上广相对其他省份总消费额遥遥领先。接下来分析一下各省用户人均消费水平。
首先统计各省份消费用户数量。可以看出各省的消费者数量与总消费额排名基本一致。
sfxf_num=yhmx.groupby("省份")["用户ID"].count().order(ascending=False)
sfxf_num
![](https://img.haomeiwen.com/i1400428/c56df53888667a53.png)
sfxf_avg=(mx.groupby("省份")["订购金额"].sum()/yhmx.groupby("省份")["用户ID"].count()).order(ascending=False)
sfxf_avg.index
Index([u'河南', u'内蒙古', u'湖南', u'北京', u'海南', u'吉林', u'上海', u'甘肃', u'新疆', u'河北',
u'广东', u'福建', u'江西', u'山东', u'宁夏', u'重庆', u'四川', u'西藏', u'陕西', u'山西',
u'云南', u'湖北', u'江苏', u'广西', u'黑龙江', u'青海', u'辽宁', u'贵州', u'天津', u'安徽',
u'浙江'],
dtype='object', name=u'省份')
![](https://img.haomeiwen.com/i1400428/a67e9bbb8384bde1.png)
从各省人均消费额来看海南省的用户人均消费额最高,浙江最低,消费差距将近1000元,对于人均消费低的的省份可进一步细分,哪些用户消费低,采取适当的运营手段,促进消费,提高消费水平。
消费品类
cp=mx.groupby("产品")["订单编号"].count()
cp.index
Index([u'产品A', u'产品B', u'产品C', u'产品D', u'产品E', u'产品F'], dtype='object', name=u'产品')
names=[u'产品A',u'产品B',u'产品C',u'产品D',u'产品E',u'产品F']
colors=['coral','orangered','saddlebrown','chocolate','goldenrod','peachpuff']
plt.pie(cp,labels=names,colors=colors,autopct='%1.1f%%')
plt.title(u'各品类销售比')
plt.figure(figsize=(6,6))
plt.show()
![](https://img.haomeiwen.com/i1400428/ca9414f8f3db19fe.png)
以上可知,产品A的订单数量是最多的,但是产品贡献度往往需要考虑销售额,所以我们需要进一步对各个产品的销售额做帕累托分析,结果显示产品D,产品A,产品B三种产品的总销售额就达到了所有品类产品销售总额的86%。
cp1=mx.groupby("产品")["订购金额"].sum().sort_values(ascending=False)
cp1
产品
产品D 188385600
产品A 80390400
产品B 52498600
产品E 30681600
产品F 11327000
产品C 10096800
Name: 订购金额, dtype: int64
index = np.arange(6)
plt.figure(figsize=(12,5))
plt.bar(index,cp1.values,0.5,color='darkseagreen')
plt.xticks(index,[u'产品D', u'产品A', u'产品B', u'产品E', u'产品F', u'产品C'])
plt.xlabel(u'品类')#plt.xlabel('时间',fontproperties = 'SimHei',fontsize = 20)
plt.ylabel(u'订购金额')
#plt.legend([u'各品类订购金额',],loc='upper right')#元组加逗号 使图例显示完整
plt.title(u'各品类订购金额')
p1=1.0*cp1.values.cumsum()/cp1.values.sum()
p2=pd.Series(p1)
p2.plot(color='#FFA07A',secondary_y=True,style='-o',linewidth=2)
plt.ylabel(u'订购金额比例')
plt.annotate(format(p2[2], '.4%'), xy = (2, p2[2]), xytext=(2*0.9, p2[2]*0.9), arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
plt.grid(color='#95a5a6',linestyle='--', linewidth=1,axis='y',alpha=0.5)
plt.show()
![](https://img.haomeiwen.com/i1400428/b2e4ac360ee6ff30.png)
知道了各产品对销售额的贡献度,我们还可以再进一步分析,各省份的不同品类产品的订购情况,分析一下每个省份的用户购买品类是否有偏好。
mx_pivot=pd.pivot_table(mx,index=["省份"],values=["订购金额"],columns=["产品"],aggfunc=[np.sum],fill_value=0)
ind=mx_pivot['sum']['订购金额'].index
ind
Index([u'上海', u'云南', u'内蒙古', u'北京', u'吉林', u'四川', u'天津', u'宁夏', u'安徽', u'山东',
u'山西', u'广东', u'广西', u'新疆', u'江苏', u'江西', u'河北', u'河南', u'浙江', u'海南',
u'湖北', u'湖南', u'甘肃', u'福建', u'西藏', u'贵州', u'辽宁', u'重庆', u'陕西', u'青海',
u'黑龙江'],
dtype='object', name=u'省份')
mx_pivot_va=mx_pivot['sum']['订购金额'].values
frame1 = pd.DataFrame(mx_pivot_va,index=[u'上海', u'云南', u'内蒙古', u'北京', u'吉林', u'四川', u'天津', u'宁夏', u'安徽', u'山东',
u'山西', u'广东', u'广西', u'新疆', u'江苏', u'江西', u'河北', u'河南', u'浙江', u'海南',
u'湖北', u'湖南', u'甘肃', u'福建', u'西藏', u'贵州', u'辽宁', u'重庆', u'陕西', u'青海',
u'黑龙江'],columns=['A', 'B', 'C','D','E','F'])
import seaborn as sns
cm = sns.light_palette("red", as_cmap=True)
s = frame1.style.background_gradient(cmap=cm)
s
![](https://img.haomeiwen.com/i1400428/2326b6efc67bbb2c.png)
消费者年龄
将消费者年龄分段,统计各年龄段人数,发现21岁到30岁年龄段用户为主要消费群体,其次为31岁到40岁年龄段,40岁以上消费人群较少。
bins=[-1,20,30,40,130]
labels_age=[u'0-20岁',u'21-30岁',u'31-40岁',u'41岁及以上']
yhmx['年龄分组']=pd.cut(yhmx['年龄'],bins,labels=labels_age)
yl=yhmx.groupby('年龄分组')['用户ID'].agg(len)
yl
年龄分组
0-20岁 8437
21-30岁 27037
31-40岁 17093
41岁及以上 6534
index=np.arange(1,5)
plt.bar(index,yl,0.38,color='darkseagreen')
plt.xticks(index,[u'0-20岁',u'21-30岁',u'31-40岁',u'41岁及以上'])
plt.xlabel(u'年龄分组')
plt.ylabel(u'人数')
plt.title(u'各年龄组人数')
plt.legend([u'人数',],loc='upper right')
plt.show()
![](https://img.haomeiwen.com/i1400428/10c71d8fc18c103a.png)
24小时订购趋势
通过对订购日期进行重采样,统计24小时订购趋势,结果显示,从下午11点以后订单订购量开始下降,知道第二天6点后订单数量开始稳步升高,下午2点到3点之间有一个微小下降后,又稳步上升,直至11点达到当日购物高峰。其中有几个时间下午1点到3点,6点是消费降低点,这与人们平常的作息和工作时间吻合,分别为午休和下班时间。
sj=pd.DataFrame((x.split(' ') for x in mx['订购日期']),index=mx.index,columns=['日期','时间'])
mx= pd.concat([mx,sj], axis=1)
mx
![](https://img.haomeiwen.com/i1400428/13c3796d7ae64358.png)
mx['时间']=pd.to_datetime(mx['时间'])
mx= mx.set_index(pd.DatetimeIndex(mx['时间']))
mx_sj=mx.resample('H').count()
mx_sj=mx_sj['订单编号']
index=np.arange(1,25)
plt.plot(index,mx_sj.values,'o-',color='#FA8072',label=u'订单总数')
plt.xlabel(u'时间')
plt.ylabel(u'订单总数')
plt.title(u'不同时间订单数量')
plt.grid( color='#95a5a6',linestyle='--', linewidth=1 ,axis='y',alpha=0.4)
plt.show()
![](https://img.haomeiwen.com/i1400428/b54c9cfc74d359b5.png)
不同月份注册用户的消费情况
数据不完整,此分析仅供参考,通过分析不同时间注册用户的消费情况,可以帮助我们了解每一批注册用户的质量,从分析可以看出,2月份注册用户的消费最高,说明该月注册用户质量更高,可进一步分析当月获客渠道和运营手段。
mx['注册日期']=pd.to_datetime(mx['注册日期'])
mx= mx.set_index(pd.DatetimeIndex(mx['注册日期']))
mx_mon=mx["订购金额"].resample('M').sum()
index=np.arange(1,10)
plt.plot(index,mx_mon.values,'o-',color='darkseagreen',label=u'订单总数')
plt.xlabel(u'月份')
plt.ylabel(u'订购金额')
plt.title(u'不同月份订购金额')
plt.grid( color='#95a5a6',linestyle='--', linewidth=1 ,axis='y',alpha=0.4)
plt.show()
![](https://img.haomeiwen.com/i1400428/8426b1a197e41ac3.png)
用户消费帕累托分析
通过用户消费金额的帕累托图可以知道59101个用户中,约前27000个用户的总消费额就占了当月总消费额的80%,这些客户都是重要价值客户。
mx_yh=mx.groupby("用户ID")["订购金额"].sum().order(ascending=False)
print mx_yh.shape
#(59101L,)
index=np.arange(1,59102)
p = 1.0*mx_yh.values.cumsum()/mx_yh.values.sum()
plt.figure(figsize=(10,5))
plt.bar(index,p,0.5,color='darkseagreen')
plt.axhline(0.8,color = "#FA8072")
plt.xlabel(u'人数')
plt.ylabel(u'累积订购金额百分比')
plt.title(u'消费帕累托')
plt.show()
![](https://img.haomeiwen.com/i1400428/662cf8f96abb16b2.png)
网友评论