英国某电商运营数据和CRM分析(python-pandas&plt,附代码及原数据)
基于电商网站交易记录,使用python对网站一年内运营情况,客户地区分布,客户价值及活跃度进行分析,并基于分析结果为网站发展战略提出建议。代码见文末。
数据描述及预处理
原数据
原数据来自于 Kaggle E-com data, csv格式公开数据。包含客户ID,商品描述,价格,下单时间等。数据时间跨度为1年。格式如下表所示:
InvoiceNo | StockCode | Description | Quantity | InvoiceDate | UnitPrice | CustomerID | Country |
---|---|---|---|---|---|---|---|
536365 | 85123A | WHITE HANGING HEART T-LIGHT HOLDER | 6 | 2010-12-01 08:26:00 | 2.55 | 17850 | United Kingdom |
数据处理
删除无效数据(CustomerID为空)以及退单数据后总共392692条数据,每条数据为一个客户购买的一种商品。添加购物篮表格和客户表格,购物篮表格将每个客户一次购买的不同商品条目合并为一次下单,总共18439次下单交易;客户表格用于统计RFM信息,总共4345位客户。
一年内网站经营情况综述
区域分布
一年中,80%以上的成交金额来自英国,占GMV(总成交金额)的绝大部分,荷兰、爱尔兰、德国、法国紧随其后,由于商品邮寄的地域性限制主要市场为英国本土及周边国家。
2011年网站总成交金额变化趋势
网站每月GMV2011年上半年波动,8月至11月出现大幅度增长,本土订单成交金额与GMV变化趋势相同。下单数与GMV变化联系紧密,下半年的增长也主要由订单数的增长导致。
客单价分布
70%以上单次订单金额小于400磅,平均客单价为478磅。
尽管来自英国本土的成交金额占比很高,但这并不代表其他地区的客户价值低。如下图,10个其他国家平均客单价都高于英国,尤其如爱尔兰、法国、德国,平均客单价和下单数都相对较高,是非常有潜力的海外市场。
用户分析
用户流失情况
如果定义90天内未下单为用户流失,用户流失情况如下图。3月至年末用户流失量基本平稳,没有很大异常。当月下单用户数4-8月持续下降达到低谷,下半年反弹。值得注意的是12月份用户流失的大幅降低和下单用户的大幅上升,这可能与年终大规模促销活动有关。
下图为RFM的可视化图表,纵轴平均客单价代表该客户的‘Monetary Value’,横轴总成交次数代表该客户消费的‘Frequency’,点的颜色指示距离最近一次消费天数,代表‘Recency’。高价值区域(high M & high F,图中右上角)客户较少,大多数用户集中在较低价值区域(左下角)。忠诚度高(high F) 的用户最近大多有消费行为,忠诚度低的用户流失较为严重。
由于数据非常有限,所做的判断和相关建议未必符合真实情况。仅基于现有交易数据,此次分析的主要洞察和建议如下:
- 周边国家海外市场具有潜在价值,值得进行战略拓展
- 积极引导用户向高价值方向发展,挽留/唤醒流失用户的重点应放在具有中高价值的用户。
- 年终营销活动对于用户留存激活有明显效果,衡量成本情况下可考虑一年内多次实施,维持用户持续增长。
数据处理代码
import pandas as pd
deals = pd.read_csv('e-commerce data.csv',encoding="ISO-8859-1",dtype={
'CustomerID': str,'InvoiceID': str})
deals.InvoiceDate = pd.to_datetime(deals.InvoiceDate)
deals = deals.assign(total = deals.UnitPrice * deals.Quantity)
count_null = pd.DataFrame(deals.isnull().sum()).T.rename(index = {
0: 'null values'})
print(count_null)
deals = deals.dropna( subset = ['CustomerID'] , how = 'any')
deals = deals.drop_duplicates()
## deals contains cancelled deals, with negative payments, here we only
## consider purchases that have been made regardless whether it is cancelled later
deals_cancelled = deals.loc[deals.total < 0, :]
deals = deals.loc[deals.total >0, :]
## 每单交易表
grouped_deals = deals.groupby([deals['CustomerID'], deals['Country'],deals['InvoiceDate']], group_keys = True)
basket = grouped_deals['total'].sum()
basket = basket.reset_index()
basket = basket.drop(0,axis = 0)
## create customer table with recency, frequency, monetry value
now = max(deals.InvoiceDate)
customers_g = basket.groupby(['CustomerID','Country'])
customers = pd.DataFrame({
'last_date' : customers_g['InvoiceDate'].max() ,