spp666
# 订单维度
# 首先将mydata_finall按订单号进行分组,对商品数量quantity和总价sumcost进行分组求和
invoiceno_grouped = mydata_finall.groupby(\'InvoiceNo\')[[\'Quantity\',\'SumCost\']].sum()
invoiceno_grouped.describe()
# 根据得到的结果可以发现,均单有279件商品,说明订单多以批发为主,订单均值超过均值,
# 说明订单总体差异较大,存在购买力极强的用户,这些用户应该得到重点关注


Quantity    SumCost
count    19960.000000    19960.000000
mean    279.179359    533.171884
std    955.011810    1780.412288
min    1.000000    0.380000
25%    69.000000    151.695000
50%    150.000000    303.300000
75%    296.000000    493.462500
max    80995.000000    168469.600000

y = invoiceno_grouped[invoiceno_grouped.Quantity <2000][\'Quantity\']
sns.distplot(y,bins = 50,color="b", kde = False)
plt.title("Quantity Distribtion Of Orders (Below 2000)")
plt.ylabel(\'Frequency\')
plt.xlabel("Quantity")
plt.show()

 


#订单内的商品数量呈现出很典型的长尾分布,大部分订单的商品数量在250件内,商品数量越多,订单数相对越少


 


#绘制订单金额的分布


 

x = invoiceno_grouped[invoiceno_grouped.SumCost < 1000][\'SumCost\']
sns.distplot(x,bins=100,color=\'b\',kde=False)
plt.title(\'SumCost Distribution of Orders(Below 1000)\')
plt.ylabel(\'Frequency\')
plt.xlabel(\'SumCost\')
plt.show()

 

 #可以看到订单额集中在500以内,而350有一个峰值。


#客户维度

#由于之前在清洗数据的时候把很多nan替换成0,所以客户id为零的实际不能分析出太多东西,所以仅针对customerid不为0的进行分析

sales_useful = sales_normal[sales_normal.CustomerID != 0].copy()

#对客户id和订单编号进行分组,索引会发生变化,所以重设索引,然后对同笔订单的金额和数量进行求和,然后在按照customerid分组展示

customer_grouped = sales_useful.groupby([\'CustomerID\',\'InvoiceNo\'])[[\'Quantity\',\'SumCost\']].sum().reset_index()
#对于groupby的内容使用函数需要使用agg参数,,由于有多个参数,所以我采用了字典
customer_grouped = customer_grouped.groupby(\'CustomerID\').agg({\'InvoiceNo\':np.size, \'Quantity\':np.sum, \'SumCost\':np.sum})
customer_grouped.describe()

 

 #通过这个描述性统计我们可以得到人均购买4笔同一种商品,25%的客户买完意见商品以后就没有留存下来,人均购买1187件商品,甚至超过了Q3的购买量,最多购买196915件商品,人均消费4338英镑,也同样超过了Q3,最多消费280206英镑。

 

#消费金额分布(分组以后的金额)

x = customer_grouped[customer_grouped[\'SumCost\']<=5000][\'SumCost\']
sns.distplot(x,bins=50,color=\'b\',kde=False)
plt.title(\'SumCost Distribution of Customers (Below 5000)\')
plt.ylabel(\'Frequency\')
plt.xlabel(\'SumCost\')
plt.show()

 

 #通过这个图像我们可以发现的订单金额相对集中,大多在1000以内。

 

#商品维度

#商品对应的是stackcode,发现不同客户购买同一商品的价格不一致

#下边就是要考虑商品的平均价格,商品的平均价格要按照商品来分组,然后求和Quantity和Sumcost,然后再用求和以后的SumCost 除以Quantity

product_grouped = sales_normal.groupby([\'StockCode\'])[[\'Quantity\',\'SumCost\']].sum()
product_grouped[\'avg_price\'] = stock_grouped[\'SumCost\']/stock_grouped[\'Quantity\']
product_grouped.head()

 

#查看价格分布

x = product_grouped[product_grouped[\'avg_price\']<=100][\'avg_price\']
sns.distplot(x,bins=100,kde=False)
plt.title(\'avg_price Distribution(avg_price Below 100)\')
plt.ylabel(\'Frequency\') plt.xlabel(\'avg_price\')
plt.show()

 

# 能够看到绝大多数的商品价格在20英镑以内,可知该网站销售的商品大多是价格比较低的

果然无论是哪个国家的人民都更偏向于低价商品,低价商品在成交量以及成交金额上面都是占据了非常大的部分,而价格较高的商品的销量远低于低价商品,那么可以进一步把平台作为一个走量的平台,就如唯品会。

 

#时间维度

#按照有效订单分组

time_grouped = sales_useful.groupby(\'InvoiceNo\').agg({\'date\':np.min, \'Month\':np.min,\'Quantity\':np.sum,\'SumCost\':np.sum}).reset_index()
sns.set_style(\'white\')
month = time_grouped.groupby(\'Month\').agg({\'Quantity\': np.sum, \'SumCost\': np.sum, \'InvoiceNo\': np.size}).plot(secondary_y = \'InvoiceNo\', x_compat=True, figsize = (12, 4))
month.set_ylabel(\'Quantity & SumCost\')
month.right_ax.set_ylabel(\'Order quantities\')
plt.show()

 

 

#区域维度

#对于区域维度的处理主要是按照客户id和国家分类,然后在把两张表合并在一起

#提取客户id和国家关系表
sales_country = sales_normal.drop_duplicates(subset=[\'CustomerID\',\'Country\'])


按客户分组,然后计算总金额
country_grouped = sales_useful.groupby(\'CustomerID\')[[\'SumCost\']].sum()


两张表合并
country_grouped = country_grouped.merge(sales_country,on=[\'CustomerID\'])


合并以后按照国家在分组,计算消费金额和客户总数
country_grouped = country_grouped.groupby(\'Country\').agg({\'SumCost\':np.sum, \'CustomerID\':np.size})

country_grouped.head()

 

 

发现这里的sumcost已经变成了sumcost_x,重命名

country_grouped.rename(columns={\'SumCost_x\':\'SumCost\'},inplace=True)
country_grouped.head()

 

 

为这个数据集添加一个新的字段,即avgamount 即人均消费。avg_amount = sumcost/cutomerid
country_grouped[\'avg_amount\'] = country_grouped[\'SumCost\']/country_grouped[\'CustomerID\']
country_grouped.head(30)

 

 

这里可以发现除了英国以外其他国家的购买人数都很少

我们来按照avg_amount从大到小排列一下

country_grouped.sort_values(by=\'avg_amount\',ascending=False).head(20)

 

 

能够看到虽然其他国家购买人数较少,但是人均购买量很可观,可以考虑吧筛选出具体的客户id然后取得联习给予适当的优惠和配备专属客服。

 

#生命周期

我们知道一个网站能够长久的生存下去,那么客户的生命周期是一个很重要的因素。

由于该数据集的统计对象为2010年12月1日至2011年12月9日的全部订单,所以我们就只能统计这一段时间内的消费情况

首先筛选出id为0的客户

sales_useful = sales_normal[sales_normal.CustomerID != 0].copy()

按照客户id分组,然后找到客户第一次购买和最后一次购买的时间差
#客户第一次购买的时间
min_date = sales_useful.groupby(\'CustomerID\')[[\'date\']].min()
#客户最后一次购买的时间
max_date = sales_useful.groupby(\'CustomerID\')[[\'date\']].max() (max_date - min_date).head(20)
 

 

 

可以看到好多的留存天数很多还是天数是0天,0天代表的是没有留存。

lifetime = max_date - min_date
lifetime.describe()

 

 

总共有4338个客户,平均留存时间130days,最小值是0天就是没有留存,前25%是0天说明有4分之一的用户是直接流失掉的,50%是93天,说明平均流失时间为93天,可以考虑在90天左右给予优惠促使客户完成购买然后留存下来,前75%是252天,最多的是留存373天。生命周期呈现两极分化的状态。

由于这个timedelta的类型不能绘制图形,所以转换成datetime的形式
life_time[\'life_time\'] = life_time[\'date\'].dt.days
life_time[\'life_time\'].hist(bins = 20, color = \'c\')
plt.title(\'Life Time Distribution\')
plt.ylabel(\'Customer number\')
plt.xlabel(\'Life time (days)\')
plt.show()

 

 

可以看到绝大多数都是没有留存,可以考虑增加购买初体验。而且发现在350天左右又有了一个新的高峰

# 将分组增多至100,并拉宽图表的尺寸
life_time[life_time[\'life_time\'] > 0].life_time.hist(bins = 100, figsize = (12, 6), color = \'c\')
plt.title(\'Life Time Distribution without One-time Deal Hunters\')
plt.ylabel(\'Customer number\')
plt.xlabel(\'Life time (days)\')
plt.show()


 

 

这个图有很多可以讨论的东西,用户会在75-150天左右有一个显著的下滑,那么我觉得可以考虑给这一部分即将流失的用户发放优惠券等,因为可以看到在170天以后的用户就很活跃了,用户粘性也较高,而且在300天以后的客户激增说明这一部分客户是平台的优质客户,要及时和这些客户沟通,询问客户的意见和建议。



结论:

  1. 订单维度:该电商网站在2010年12月1日-2011年12月9日内共产生有效订单19960笔,笔单价为533.17英镑,人均购买约279件商品,说明用户群体多以批发商为主,且订单交易金额和订单内商品件数,其均值都高于中位数;订单交易金额的均值甚至高于Q3分位数。说明订单总体差异大,存在部分购买力极强的客户
  2. 客户维度:通过这个描述性统计我们可以得到人均购买4笔同一种商品,25%的客户买完意见商品以后就没有留存下来,人均购买1187件商品,甚至超过了Q3的购买量,最多购买196915件商品,人均消费4338英镑,也同样超过了Q3,最多消费280206英镑
  3. 商品维度:能够看到绝大多数的商品价格在20英镑以内,可知该网站销售的商品大多是价格比较低的,且价格越低对应的购买量越高,商品整体是较低价的平民商品
  4. 时间维度:总共有4338个客户,平均留存时间130days,最小值是0天就是没有留存,前25%是0天说明有4分之一的用户是直接流失掉的,50%是93天,说明平均流失时间为93天,可以考虑在90天左右给予优惠促使客户完成购买然后留存下来,前75%是252天,最多的是留存373天。生命周期呈现两极分化的状态。
  5. 区域维度:绝大多数的客户是来自英国本土,其他国家的客户较少,但是却多为优质客户,可以对这些客户进行深挖予以物流上面的支持
 
 


 
 
 
 
 
 
 
 
 
 
 







 




 

参考:https://www.zhihu.com/people/gao-na-zi/posts

分类:

技术点:

相关文章: