利用Python分析电商用户消费行为

2020-02-27 257浏览

  • 1.利用 Python 分析电商用户消费行为 2017/11/10 一、项目背景 在处理数据量较大的数据时,非常灵活易用,远比Excel和SQL快。在此项目中,由于处理的数据相对较大,用Excel处理多有不便,所以需要使用Python来 进行分析。 1.Python 此项目涉及电商消费的多个关键指标,实战意义较大,有利于自身熟悉数据背后的运营知识。 2. 数据说明:数据来源于某CD电商销售数据,数据字段共涉及:客户ID,客户下单时间,客户购买量,客户购买金额4个数据字段。 3. 二、项目结论 ¶ 通过观察销量与销售金额,可得出此次分析的数据截取的是在跟某个时间段初次消费的消费数据。 1. (时间窗口为月)用户回购率高于复购率,回购率波动大,以月为窗口前提下的该产品回购率波动大,按月消费的频次较低。 2. 用户分层分析中,结合回流用户和活跃用户看,在后期的消费用户中,67%是回流用户,33%是活跃用户(连续消费用户),消费用户整体质量还好。 3. 用户质量符合28倾向,17%的用户贡献了60%左右的消费金额,需要狠抓高质量用户。 4. 在 个月为基础的数据中,消费1次以上的所有用户平均生命周期为134天,2倍低于消费两次以上的用户平均生命周期为276天,所以可以考虑用户首次消费后应 该花费更多的引导使其进行多次消费,提供生命周期。 5. 18 file:///Users/CZH/Desktop/%E5%88%A9%E7%94%A8Python%E5%88%86%E6%9E%90%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E6%B6%88%E8%B4%B9%E8%A1%8C%E4%B8%BA.html1/35
  • 2.2017/11/10 利用 Python 分析电商用户消费行为 结合用户留存率和平均消费周期,可得出该产品非高频消费产品,需要在60天的平均消费周期上考虑召回,培养忠诚度。 6. 三、加载必要库 加载必要的库包,其中涉及数据整理,数据可视化,时间格式数据处理库 1. In [1]: import pandas as pd import numpy as np import matplotlib.pyplot as plt from datetime import datetime %matplotlib inline plt.style.use('ggplot') import seaborn as sns 加载所要分析的数据,数据字段需要重新命名 2. In [2]: columns = ['user_id','order_dt','order_products','order_amount'] df = pd.read_table('CDNOW_master.txt',names = columns,sep='\s+') 四、数据预处理 首先先观察数据,如下:可看出数据中,时间这一列后续我们应该将其转换为时间格式的数据 1. file:///Users/CZH/Desktop/%E5%88%A9%E7%94%A8Python%E5%88%86%E6%9E%90%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E6%B6%88%E8%B4%B9%E8%A1%8C%E4%B8%BA.html2/35
  • 3.利用 Python 分析电商用户消费行为 2017/11/10 In [3]: df.head() Out[3]: user_id order_dt order_products order_amount 0 1 19970101 1 11.77 1 2 19970112 1 12.00 2 2 19970112 5 77.00 3 3 19970102 2 20.76 4 3 19970330 2 20.76 查看是否有空数据的情况,如下:可看出数据整体情况很好,没有任何缺失值。可为我们数据清洗带来很大便利 2. In [4]: df.info()RangeIndex:69659 entries, 0 to 69658 Data columns (total 4 columns): user_id 69659 non-null int64 order_dt 69659 non-null int64 order_products 69659 non-null int64 order_amount 69659 non-null float64dtypes:float64(1), int64(3) memoryusage:2.1 MB 接下来对时间数据进行格式转换,将月份作为消费行为的主要时事件窗口,选择哪种时间窗口取决于消费频率,并将同一个月的时间全部转换为月初的形式 3. file:///Users/CZH/Desktop/%E5%88%A9%E7%94%A8Python%E5%88%86%E6%9E%90%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E6%B6%88%E8%B4%B9%E8%A1%8C%E4%B8%BA.html3/35
  • 4.利用 Python 分析电商用户消费行为 2017/11/10 In [5]: df['order_date'] = pd.to_datetime(df.order_dt,format= '%Y%m%d') df['month'] = df['order_date'].values.astype('datetime64[M]') df.head(3) Out[5]: user_id order_dt order_products order_amount order_date month 0 1 19970101 1 11.77 1997-01-01 1997-01-01 1 2 19970112 1 12.00 1997-01-12 1997-01-01 2 2 19970112 5 77.00 1997-01-12 1997-01-01 数据清洗基本完成,可以开始进行相关数据分析 4. In [6]: df.info()RangeIndex:69659 entries, 0 to 69658 Data columns (total 6 columns): user_id 69659 non-null int64 order_dt 69659 non-null int64 order_products 69659 non-null int64 order_amount 69659 non-null float64 order_date 69659 non-null datetime64[ns] month 69659 non-null datetime64[ns]dtypes:datetime64[ns](2), float64(1), int64(3) memoryusage:3.2 MB 五、初步分析-观察用户消费金额与购买量 从每位用户的粒度去查看消费行为,如下:可得到用户平均消费金额(客单价)100元,标准差240,结合分位数和最大值看,平均值才和75分位数接近,意味着 有75%的用户消费金额是小于106的,所以肯定存在小部分高额消费用户。 1. file:///Users/CZH/Desktop/%E5%88%A9%E7%94%A8Python%E5%88%86%E6%9E%90%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E6%B6%88%E8%B4%B9%E8%A1%8C%E4%B8%BA.html4/35
  • 5.利用 Python 分析电商用户消费行为 2017/11/10 In [7]: user_grouped = df.groupby('user_id').sum() user_grouped.describe() Out[7]: order_dt order_products order_amount count 2.357000e+04 23570.000000 23570.000000 mean 5.902627e+07 7.122656 106.080426 std 9.460684e+07 16.983531 240.925195 min 1.997010e+07 1.000000 0.000000 25% 1.997021e+07 1.000000 19.970000 50% 1.997032e+07 3.000000 43.395000 75% 5.992125e+07 7.000000 106.475000 max 4.334408e+09 1033.000000 13990.930000 按每月销量查看销售数据,绘图如下,产品在初期销量很大,后期趋于平稳 2. file:///Users/CZH/Desktop/%E5%88%A9%E7%94%A8Python%E5%88%86%E6%9E%90%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E6%B6%88%E8%B4%B9%E8%A1%8C%E4%B8%BA.html5/35
  • 6.2017/11/10 利用 Python 分析电商用户消费行为 In [8]: df.groupby('month').order_products.sum().plot() Out[8]:再按销售金额查看,绘图如下:金额同样出现早起销售颇多,后期平稳下降的趋势。猜测因为3个问题: 3. 初期有卖单价较高的产品?-----需要查看产品的单价! a. 初期存在用户购买了大量的产品?----需要查看用户购买量的分布情况! b. 此次数据只是截取了部分用户数据,用户均为前三月加入的用户?---需要查看用户的初次购买时间和最后一次购买时间。 c. file:///Users/CZH/Desktop/%E5%88%A9%E7%94%A8Python%E5%88%86%E6%9E%90%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E6%B6%88%E8%B4%B9%E8%A1%8C%E4%B8%BA.html6/35
  • 7.2017/11/10 利用 Python 分析电商用户消费行为 In [9]: df.groupby('month').order_amount.sum().plot() Out[9]:为了解决a疑问,绘制订单数量与订单金额的散点图,由图中可观察得到,订单消费金额和订单商品量呈现较强的线性关系,10元的商品居多,订单的极值较少, 超出1000元的就几个,显然不是某些产品单价过高的原因。 4. file:///Users/CZH/Desktop/%E5%88%A9%E7%94%A8Python%E5%88%86%E6%9E%90%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E6%B6%88%E8%B4%B9%E8%A1%8C%E4%B8%BA.html7/35
  • 8.2017/11/10 利用 Python 分析电商用户消费行为 In [10]: df.plot.scatter(x = 'order_products',y = 'order_amount') Out[10]:为了解决b疑问,绘制基于用户id分组的购买量跟购买金额的关系,可看出用户也很健康,没有几个买的数量很大,金额非常高的,规律性比订单更强,很明显的 线性关系 5. file:///Users/CZH/Desktop/%E5%88%A9%E7%94%A8Python%E5%88%86%E6%9E%90%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E6%B6%88%E8%B4%B9%E8%A1%8C%E4%B8%BA.html8/35
  • 9.2017/11/10 利用 Python 分析电商用户消费行为 In [11]: df.groupby('user_id').sum().plot.scatter(y = 'order_amount',x = 'order_products') Out[11]:再绘制订单金额分布直方图和基于每位用户的销量分布图,得出以下结论: 6. 从左边的图可看出,高消费用户在途中几乎显示不出来,大部分用户的单笔消费金额不超过200元; a. 从右边的图可看出,大部分用户购买数量集中在少数部分。 b. 以上,更加可以判断不存在异常用户购买了大量产品,也不存在单价很高的产品,导致单笔订单消费金额很高。 file:///Users/CZH/Desktop/%E5%88%A9%E7%94%A8Python%E5%88%86%E6%9E%90%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E6%B6%88%E8%B4%B9%E8%A1%8C%E4%B8%BA.html9/35
  • 10.利用 Python 分析电商用户消费行为 2017/11/10 In [12]: plt.figure(figsize=(12,4)) plt.subplot(121) df.order_amount.hist(bins = 30) plt.subplot(122) df.groupby('user_id').order_products.sum().hist(bins=30) Out[12]:排除了a和b的原因,我们接下来考虑c,观察用户消费的时间节点,统计初次消费如下:可以看出用户消费行为中的初次消费全部无一例外都集中在前3个月!我们 可以认为,案例中的订单数据,只是选择了某个时间段消费的用户的18个月内的消费行为。 7. In [13]: df.groupby('user_id').month.min().value_counts() Out[13]: 1997-02-01 8476 1997-01-01 7846 1997-03-01 7248Name:month,dtype:int64 观察用户的最后一次消费,绝大多数也是在前面三个月,后续的时间段里,依然有客户在消费,但是在缓慢减少。所以数据异常的原因获得解释。 8. file:///Users/CZH/Desktop/%E5%88%A9%E7%94%A8Python%E5%88%86%E6%9E%90%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E6%B6%88%E8%B4%B9%E8%A1%8C%E4%B8%BA.html10/35
  • 11.2017/11/10 利用 Python 分析电商用户消费行为 In [14]: df.groupby('user_id').month.max().value_counts() Out[14]: 1997-02-01 4912 1997-03-01 4478 1997-01-01 4192 1998-06-01 1506 1998-05-01 1042 1998-03-01 993 1998-04-01 769 1997-04-01 677 1997-12-01 620 1997-11-01 609 1998-02-01 550 1998-01-01 514 1997-06-01 499 1997-07-01 493 1997-05-01 480 1997-10-01 455 1997-09-01 397 1997-08-01 384Name:month,dtype:int64 六、计算复购率 接下来求复购率,按照定义,复购率的定义是在某时间窗口内消费两次及以上的用户在总消费用户中的占比。这里的时间窗口是月,如果一个用户在同一天下了两 笔订单,这里也将他算作复购用户。 1. 首先通过pandas数据透视表的功能查看每位用户每个月的订单数,如下: 2. file:///Users/CZH/Desktop/%E5%88%A9%E7%94%A8Python%E5%88%86%E6%9E%90%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E6%B6%88%E8%B4%B9%E8%A1%8C%E4%B8%BA.html11/35
  • 12.利用 Python 分析电商用户消费行为 2017/11/10 In [15]: pivoted_counts = df.pivot_table(index = 'user_id',columns = 'month', values = 'order_dt',aggfunc = 'count').fillna(0) columns_month = df.month.sort_values().astype('str').unique() pivoted_counts.columns = columns_month pivoted_counts.head() Out[15]: 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1998- 1998- 1998- 1998- 1998- 199801-01 02-01 03-01 04-01 05-01 06-01 07-01 08-01 09-01 10-01 11-01 12-01 01-01 02-01 03-01 04-01 05-01 06-01 user_id 1 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3 1.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 4 2.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 5 2.0 1.0 0.0 1.0 1.0 1.0 1.0 0.0 1.0 0.0 0.0 2.0 1.0 0.0 0.0 0.0 0.0 0.0 然后,定义函数,如果用户消费两次以上记为1, 消费一次记为0, 从来没有消费记为NaN,并将函数应用的透视表中的每一个元素, 可以利用applymap函数 3. In [16]: pivoted_counts_transf = pivoted_counts.applymap(lambda s : 1 if s > 1 else 0 if s == 1 else np.NaN) file:///Users/CZH/Desktop/%E5%88%A9%E7%94%A8Python%E5%88%86%E6%9E%90%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E6%B6%88%E8%B4%B9%E8%A1%8C%E4%B8%BA.html12/35
  • 13.利用 Python 分析电商用户消费行为 2017/11/10 In [17]: pivoted_counts_transf.head() Out[17]: 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1998- 1998- 1998- 1998- 1998- 199801-01 02-01 03-01 04-01 05-01 06-01 07-01 08-01 09-01 10-01 11-01 12-01 01-01 02-01 03-01 04-01 05-01 06-01 user_id 1 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 3 0.0 NaN 0.0 0.0 NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN 0.0 NaN 4 1.0 NaN NaN NaN NaN NaN NaN 0.0 NaN NaN NaN 0.0 NaN NaN NaN NaN NaN NaN 5 1.0 0.0 NaN 0.0 0.0 0.0 0.0 NaN 0.0 NaN NaN 1.0 0.0 NaN NaN NaN NaN NaN 最后,计算复购率,并且绘图如下:由下图可以看出复购率在早期,因为有大量初次购买的新客户,新客的复购率并不高,在1月份,新客的复购率直有6%左右, 而在后期,剩下来的用户都是比较忠实的老客,复购率比较稳定在20%以上。 4. 下面的函数利用了sum和count函数忽略NaN的特性,sum函数自然统计的是重复购买两次以上的客户,count函数主要统计的是所有购买过商品的用户,均排除了没 过任何消费的客户——NaN file:///Users/CZH/Desktop/%E5%88%A9%E7%94%A8Python%E5%88%86%E6%9E%90%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E6%B6%88%E8%B4%B9%E8%A1%8C%E4%B8%BA.html13/35
  • 14.2017/11/10 利用 Python 分析电商用户消费行为 In [18]: (pivoted_counts_transf.sum()/pivoted_counts_transf.count()).plot(figsize = (10,4)) Out[18]:七、计算回购率 计算回购率,按回购率定义:指的是在当前时间窗口进行消费,接下来如果下一个时间窗口也进行了消费了的用户,那么这些用户就是回购用户,回购用户数占当 前消费用户总数的比率即位回购率。 1. 回购率与复购率的区别在于,复购率是同一个时间窗口内消费两次以上的用户占比,而回购率是连续两个时间窗口均消费的用户占第一个时间窗口消费数的百分 比。总的来说,回购率更加滞后于复购率。 2. 首先将消费金额进行数据透视,aggfunc使用的是计算平均值。 3. In [19]: pivoted_amount = df.pivot_table(index='user_id',columns = 'month', values = 'order_amount',aggfunc = 'mean').fillna(0) #columns_month = df.month.sort_values().astype('str').unique() pivoted_amount.columns = columns_month file:///Users/CZH/Desktop/%E5%88%A9%E7%94%A8Python%E5%88%86%E6%9E%90%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E6%B6%88%E8%B4%B9%E8%A1%8C%E4%B8%BA.html14/35
  • 15.利用 Python 分析电商用户消费行为 2017/11/10 然后,再次用applymap(可以作用在元素上)+lambda转换数据,只要有过购买,即有购买金额,记为1,否则记为0 4. In [20]: pivoted_purchase = pivoted_amount.applymap(lambda s : 1 if s > 0 else 0) pivoted_purchase.head() Out[20]: 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1998- 1998- 1998- 1998- 1998- 199801-01 02-01 03-01 04-01 05-01 06-01 07-01 08-01 09-01 10-01 11-01 12-01 01-01 02-01 03-01 04-01 05-01 06-01 user_id 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 4 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 5 1 1 0 1 1 1 1 0 1 0 0 1 1 0 0 0 0 0 再然后,因为回购用户统计比复购要复杂一些,所以需要通过定义以下函数,将回购用户标记出来,如下:利用apply将所定义的函数作用到一维向量上,此处为 行向量。将连续两个月购买的用户标记为1(回购用户),一次都还没购买的标记为np.NaN,最后一个月无法统计回购率,统一标记为np.NaN. 5. In [21]: def purchase_return(data): status = [] for i in range(17): if data[i] == 1: if data[i+1] == 1: status.append(1) if data[i+1] == 0: status.append(0)else:status.append(np.NaN) status.append(np.NaN) return status pivoted_purchase_return = pivoted_purchase.apply(purchase_return,axis=1) file:///Users/CZH/Desktop/%E5%88%A9%E7%94%A8Python%E5%88%86%E6%9E%90%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E6%B6%88%E8%B4%B9%E8%A1%8C%E4%B8%BA.html15/35
  • 16.利用 Python 分析电商用户消费行为 2017/11/10 In [22]: pivoted_purchase_return.head(5) Out[22]: 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1997- 1998- 1998- 1998- 1998- 1998- 199801-01 02-01 03-01 04-01 05-01 06-01 07-01 08-01 09-01 10-01 11-01 12-01 01-01 02-01 03-01 04-01 05-01 06-01 user_id 1 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 3 0.0 NaN 1.0 0.0 NaN NaN NaN NaN NaN NaN 0.0 NaN NaN NaN NaN NaN 0.0 NaN 4 0.0 NaN NaN NaN NaN NaN NaN 0.0 NaN NaN NaN 0.0 NaN NaN NaN NaN NaN NaN 5 1.0 0.0 NaN 1.0 1.0 1.0 0.0 NaN 0.0 NaN NaN 1.0 0.0 NaN NaN NaN NaN NaN 最后,绘图如下,从下图可看出,用户的回购率高于复购率,基本平稳在30%左右,波动性较强。新用户的回购率也在15%左右,和老客的差异不大。 综合比较回购率与复购率,新客的整体质量低于老客,老客的忠诚度(回购率)表现较好,消费频次稍次(回购率波动大),这是CDNOW网站用户的消费特征。 6. In [23]: (pivoted_purchase_return.sum()/pivoted_purchase_return.count()).plot(figsize=(10,4)) Out[23]:file:///Users/CZH/Desktop/%E5%88%A9%E7%94%A8Python%E5%88%86%E6%9E%90%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E6%B6%88%E8%B4%B9%E8%A1%8C%E4%B8%BA.html16/35
  • 17.2017/11/10 利用 Python 分析电商用户消费行为 八、对用户进行用户分层 用户分层定义:新用户定义——第一次消费;活跃用户定义——连续两个时间窗口内有过消费;不活跃用户定义——时间窗口内没有过消费的老客(所谓老客即是 在上面的某个时间窗口内已经有过消费);回流用户定义——在上一个时间窗口内没有消费,而在当前时间窗口内有过消费(且不是第一次消费)。以上的时间窗 口为按月统计。 1. 举例说明: 某用户在1月第一次消费,那么他在1月份的用户分层就是新用户; 他在2月份消费过,则是活跃用户; 在3月没有消费,则是不活跃用户; 在4月再次 消费,则是回流用户; 在5月还是消费则是活跃用户。 2. 因此,首先根据以上判断,定义用户分层函数如下:并将分层函数应用到此前定义的用户消费透视表pivoted_purchase中,如下表,通过函数将每个用户的状态划 分,其中:unreg-未注册用户;new-第一次消费的新客;active-活跃用户;unactive-不活跃用户;return-回流用户。 3. file:///Users/CZH/Desktop/%E5%88%A9%E7%94%A8Python%E5%88%86%E6%9E%90%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E6%B6%88%E8%B4%B9%E8%A1%8C%E4%B8%BA.html17/35
  • 18.利用 Python 分析电商用户消费行为 2017/11/10 In [24]: def active_status(data): status = [] for i in range(18): # if data[i] == 0: if len(status) > 0: # if status[i-1] == 'unreg': status.append('unreg')else:'>else: