|
|
51CTO旗下网站
|
|
移动端

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

本文使用的数据集包含了2014.11.18到2014.12.18之间,淘宝App移动端一个月内的用户行为数据。该数据有12256906天记录,共6列数据。

作者:千锋python学院来源:今日头条|2020-05-16 13:25

1、项目背景与分析说明

1)项目背景

网购已经成为人们生活不可或缺的一部分,本次项目基于淘宝app平台数据,通过相关指标对用户行为进行分析,从而探索用户相关行为模式。

2)数据和字段说明

本文使用的数据集包含了2014.11.18到2014.12.18之间,淘宝App移动端一个月内的用户行为数据。该数据有12256906天记录,共6列数据。

  • user_id:用户身份
  • item_id:商品id
  • behavior_type:用户行为类型(包括点击、收藏、加入购物车、支付四种行为,分别用数字1、2、3、4表示)
  • user_geohash:地理位置
  • item_category:品类id(商品所属的分类)
  • time:用户行为发生的时间

3)分析的维度

  • 流量指标分析
  • 用户行为分析
  • 漏斗流失分析
  • 用户价值RFM分析

4)电商常用分析方法

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

5)什么是漏斗分析?

“漏斗分析”是一套流程式数据分析,它能够科学反映用户行为状态,以及从起点到终点各阶段用户转化率情况的一种重要分析模型。

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

2、导入相关库

  1. import numpy as np 
  2. import pandas as pd 
  3. import matplotlib as  mpl 
  4. import matplotlib.pyplot as  plt 
  5. import seaborn as sns 
  6. import warnings 
  7. # 设置为seaborn绘图风格 
  8. sns.set(style="darkgrid",font_scale=1.5) 
  9.  
  10. # 用来显示中文标签 
  11. mpl.rcParams["font.family"] = "SimHei" 
  12.  
  13. # 用来显示负号 
  14. mpl.rcParams["axes.unicode_minus"] = False 
  15.  
  16. # 有时候运行代码时会有很多warning输出,像提醒新版本之类的,如果不想这些乱糟糟的输出,可以使用如下代码 
  17. warnings.filterwarnings('ignore'

3、数据预览、数据预处理

  1. # 注意:str是为了将所有的字段都读成字符串 
  2. df = pd.read_csv("taobao.csv",dtype=str) 
  3. df.shape 
  4. df.info() 
  5. df.sample(5) 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

1)计算缺失率

  1. # 由于地理位置的缺失值太多,我们也没办法填充,因此先删除这一列 
  2. df.apply(lambda x:sum(x.isnull())/len(x),axis=0) 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

2)删除地理位置这一列

  1. df.drop(["user_geohash"],axis=1,inplace=True

3)处理时间time列,将该列拆分为date日期列,和hour小时列

  1. df["date"] = df.time.str[0:-3] 
  2. df["hour"] = df.time.str[-2:] 
  3. df.sample(5) 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

4)将time、date列都变为标准日期格式,将hour列变为int格式

  1. df["date"] = pd.to_datetime(df["date"]) 
  2. df["time"] = pd.to_datetime(df["time"]) 
  3. df["hour"] = df["hour"].astype(int
  4. df.dtypes 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

5)将数据按照time列,升序排列

  1. df.sort_values(by="time",ascending=True,inplace=True
  2. df.head() 

解果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

6)删除原始索引,重新生成新的索引

  1. df.reset_index(drop=True,inplace=True
  2. df.head() 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

知识点:注意reset_index()中传入参数drop的这种用法。

7)使用describe()函数查看数据的分布,这里使用了一个include参数,注意一下

  1. # 查看所有object字符串类型的数据分布状况 
  2. df.describe(include=["object"]) 
  3. # describe()默认只会统计数值型变量的数据分布情况。 
  4. df.describe() 
  5. # 查看所有数据类型的数据分布状况 
  6. df.describe(include="all"

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

知识点:注意describe()函数中传入参数include的用法。

8)对时间数据做一个概览

  1. df["date"].unique() 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

4、模型构建

1)流量指标的处理

  • pv:指的是页面总浏览量。每个用户每刷新一次网页,就会增加一次pv。
  • uv:指的是独立访客数。一台电脑一个ip也就是一个独立访客。实际分析中,我们都是认为每个人只使用一台电脑,即每一个独立访客代表一个用户。

① 总计pv和uv

  1. total_pv = df["user_id"].count() 
  2. total_pv 
  3. total_uv = df["user_id"].nunique() 
  4. total_uv 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

结果分析:从图中可以看到,该网站页面的总浏览量为12256906次,该页面的独立访客数共有10000个。

② 日期维度下的uv和pv:uv表示页面总浏览量,pv表示独立访客数

  1. pv_daily = df.groupby("date")['user_id'].count() 
  2. pv_daily.head(5) 
  3. uv_daily = df.groupby("date")['user_id'].apply(lambda x: x.nunique()) 
  4. # uv_daily = df.groupby("date")['user_id'].apply(lambda x: x.drop_duplicates().count()) 
  5. uv_daily.head() 
  6. pv_uv_daily = pd.concat([pv_daily,uv_daily],axis=1) 
  7. pv_uv_daily.columns = ["pv","uv"
  8. pv_uv_daily.head() 
  9. # 绘图代码如下 
  10. plt.figure(figsize=(16,10)) 
  11. plt.subplot(211) 
  12. plt.plot(pv_daily,c="r"
  13. plt.title("每天页面的总访问量(PV)"
  14. plt.subplot(212) 
  15. plt.plot(uv_daily,c="g"
  16. plt.title("每天页面的独立访客数(UV)"
  17. #plt.suptitle("PV和UV的变化趋势"
  18. plt.tight_layout() 
  19. plt.savefig("PV和UV的变化趋势",dpi=300) 
  20. plt.show() 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

绘图如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

结果分析:从图中可以看出,pv和uv数据呈现高度的正相关。双12前后,pv和uv都在350000-400000之间波动,双十二的时候,页面访问量急剧上升,证明这次活动的效果很好。

③ 时间维度下的pv和uv

  1. pv_hour = df.groupby("hour")['user_id'].count() 
  2. pv_hour.head() 
  3. uv_hour = df.groupby("hour")['user_id'].apply(lambda x: x.nunique()) 
  4. uv_hour.head() 
  5. pv_uv_hour = pd.concat([pv_hour,uv_hour],axis=1) 
  6. pv_uv_hour.columns = ["pv_hour","uv_hour"
  7. pv_uv_hour.head() 
  8. # 绘图代码如下 
  9. plt.figure(figsize=(16,10)) 
  10. pv_uv_hour["pv_hour"].plot(c="steelblue",label="每个小时的页面总访问量"
  11. plt.ylabel("页面访问量"
  12.  
  13. pv_uv_hour["uv_hour"].plot(c="red",label="每个小时的页面独立访客数",secondary_y=True
  14. plt.ylabel("页面独立访客数"
  15. plt.xticks(range(0,24),pv_uv_hour.index
  16.  
  17. plt.legend(loc="best"
  18. plt.grid(True
  19.  
  20. plt.tight_layout() 
  21. plt.savefig("每个小时的PV和UV的变化趋势",dpi=300) 
  22. plt.show() 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

绘图如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

结果分析:从图中可以看出,晚上22:00-凌晨5:00,页面的访问用户数量和访问量逐渐降低,该时间段很多人都是处在休息之中。而从早上6:00-10:00用户数量逐渐呈现上升趋势,10:00-18:00有一个比较平稳的状态,这个时间段是正常的上班时间。但是18:00以后,一直到晚上22:00,用户剧烈激增,一直达到一天中访问用户数的最大值。运营人员可以参考用户的活跃时间段,采取一些促销活动。

2)用户行为指标

① 总计点击、收藏、添加购物车、支付用户的情况

  1. type_1 = df[df['behavior_type']=="1"]["user_id"].count() 
  2. type_2 = df[df['behavior_type']=="2"]["user_id"].count() 
  3. type_3 = df[df['behavior_type']=="3"]["user_id"].count() 
  4. type_4 = df[df['behavior_type']=="4"]["user_id"].count() 
  5. print("点击用户:",type_1) 
  6. print("收藏用户:",type_2) 
  7. print("添加购物车用户:",type_3) 
  8. print("支付用户:",type_4) 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

结果分析:从图中可以看到,用户进行页面点击–>收藏和加如购物车–>支付,逐渐呈现下降趋势。关于这方面的分析,将在下面的漏斗图中继续更为深入的说明。

② 日期维度下,点击、收藏、添加购物车、支付用户的情况

  1. pv_date_type = pd.pivot_table(df,index='date'
  2.                              columns='behavior_type'
  3.                              values='user_id'
  4.                              aggfunc=np.size
  5. pv_date_type.columns = ["点击","收藏","加入购物车","支付"
  6. pv_date_type.head() 
  7. # 绘图如下 
  8. plt.figure(figsize=(16,10)) 
  9. sns.lineplot(data=pv_date_type[['收藏''加入购物车''支付']]) 
  10.  
  11. plt.tight_layout() 
  12. plt.savefig("不同日期不同用户行为的PV变化趋势",dpi=300) 
  13. plt.show() 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

绘图如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

③ 时间维度下,点击、收藏、添加购物车、支付用户的情况

  1. pv_hour_type = pd.pivot_table(df,index='hour'
  2.                              columns='behavior_type'
  3.                              values='user_id'
  4.                              aggfunc=np.size
  5. pv_hour_type.columns = ["点击","收藏","加入购物车","支付"
  6. pv_hour_type.head() 
  7. # 绘图如下 
  8. plt.figure(figsize=(16,10)) 
  9. sns.lineplot(data=pv_hour_type[['收藏''加入购物车''支付']]) 
  10.  
  11. pv_hour_type["点击"].plot(c="pink",linewidth=5,label="点击",secondary_y=True
  12. plt.legend(loc="best"
  13.  
  14. plt.tight_layout() 
  15. plt.savefig("不同小时不同用户行为的PV变化趋势",dpi=300) 
  16. plt.show() 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

绘图如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

④ 支付次数前10的用户行为细分

  1. df["user_id1"] = df["user_id"
  2. buy_first = pd.pivot_table(df,index='user_id'
  3.                              columns='behavior_type'
  4.                              values='user_id1'
  5.                              aggfunc="count"
  6. buy_first.columns = ["点击","收藏","加入购物车","支付"
  7. buy_first_10 = buy_first.sort_values(by="支付",ascending=False)[:10] 
  8. buy_first_10 
  9. # 绘制图形如下 
  10. plt.figure(figsize=(16,10)) 
  11. plt.subplot(311) 
  12. plt.plot(buy_first_10["点击"],c="r"
  13. plt.title("点击数的变化趋势"
  14. plt.subplot(312) 
  15. plt.plot(buy_first_10["收藏"],c="g"
  16. plt.title("收藏数的变化趋势"
  17. plt.subplot(313) 
  18. plt.plot(buy_first_10["加入购物车"],c="b"
  19. plt.title("加入购物车的变化趋势"
  20.  
  21. plt.xticks(np.arange(10),buy_first_10.index
  22.  
  23. plt.tight_layout() 
  24. plt.savefig("支付数前10的用户,在点击、收藏、加入购物车的变化趋势",dpi=300) 
  25. plt.show() 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

绘图如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

结果分析:通过这个分析,我们可以看出,购买次数最多的用户,点击、收藏、加入购车的次数不一定是最多的,

⑤ ARPPU分析:平均每用户收入,即可通过“总收入/AU” 计算得出

  1. total_custome = df[df['behavior_type'] == "4"].groupby(["date","user_id"])["behavior_type"].count()\ 
  2.                 .reset_index().rename(columns={"behavior_type":"total"}) 
  3. total_custome.head() 
  4. total_custome2 = total_custome.groupby("date").sum()["total"]/\ 
  5.                  total_custome.groupby("date").count()["total"
  6. total_custome2.head(10) 
  7. # 绘图如下 
  8. x = len(total_custome2.index.astype(str)) 
  9. y = total_custome2.index.astype(str) 
  10.  
  11. plt.plot(total_custome2.values
  12. plt.xticks(range(0,30,7),[y[i] for i in range(0,x,7)],rotation=90) 
  13. plt.title("每天的人均消费次数"
  14.  
  15. plt.tight_layout() 
  16. plt.savefig("每天的人均消费次数",dpi=300) 
  17. plt.show() 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

绘图如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

⑥ 日ARPU分析:表示的是平均每用户收入。ARPU = 总收入/AU得到

  1. df["operation"] = 1 
  2. aa = df.groupby(["date","user_id",'behavior_type'])["operation"].count().\ 
  3.      reset_index().rename(columns={"operation":"total"}) 
  4. aa.head(10) 
  5. aa1 = aa.groupby("date").apply(lambda x: x[x["behavior_type"]=="4"]["total"].sum()/x["user_id"].nunique()) 
  6. aa1.head(10) 
  7. # 绘图如下 
  8. x = len(aa1.index.astype(str)) 
  9. y = aa1.index.astype(str) 
  10.  
  11. plt.plot(aa1.values
  12. plt.xticks(range(0,30,7),[y[i] for i in range(0,x,7)],rotation=90) 
  13. plt.title("每天的活跃用户消费次数"
  14.  
  15. plt.tight_layout() 
  16. plt.savefig("每天的活跃用户消费次数",dpi=300) 
  17. plt.show() 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

绘图如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

⑦ 付费率PUR = APA/AU,这里用【消费人数 / 活跃用户人数】代替

  1. rate = aa.groupby("date").apply(lambda x: x[x["behavior_type"]=="4"]["total"].count()/x["user_id"].nunique()) 
  2. rate.head(10) 
  3. # 绘图如下 
  4. x = len(rate.index.astype(str)) 
  5. y = rate.index.astype(str) 
  6.  
  7. plt.plot(rate.values
  8. plt.xticks(range(0,30,7),[y[i] for i in range(0,x,7)],rotation=90) 
  9. plt.title("付费率分析"
  10.  
  11. plt.tight_layout() 
  12. plt.savefig("付费率分析",dpi=300) 
  13. plt.show() 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

⑧ 复购情况分析(复购率)

  1. re_buy = df[df["behavior_type"]=="4"].groupby("user_id")["date"].apply(lambda x: x.nunique()) 
  2. print(len(re_buy)) 
  3. re_buy[re_buy >= 2].count() / re_buy.count() 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

3)漏斗分析

  1. df_count = df.groupby("behavior_type").size().reset_index().\ 
  2.            rename(columns={"behavior_type":"环节",0:"人数"}) 
  3.             
  4. type_dict = { 
  5.     "1":"点击"
  6.     "2":"收藏"
  7.     "3":"加入购物车"
  8.     "4":"支付" 
  9. df_count["环节"] = df_count["环节"].map(type_dict) 
  10.  
  11. a = df_count.iloc[0]["人数"
  12. b = df_count.iloc[1]["人数"
  13. c = df_count.iloc[2]["人数"
  14. d = df_count.iloc[3]["人数"
  15. funnel = pd.DataFrame({"环节":["点击","收藏及加入购物车","支付"],"人数":[a,b+c,d]}) 
  16.  
  17. funnel["总体转化率"] = [i/funnel["人数"][0] for i in funnel["人数"]] 
  18. funnel["单一转化率"] = np.array([1.0,2.0,3.0]) 
  19. for i in range(0,len(funnel["人数"])): 
  20.     if i == 0: 
  21.         funnel["单一转化率"][i] = 1.0 
  22.     else
  23.         funnel["单一转化率"][i] = funnel["人数"][i] / funnel["人数"][i-1] 
  24. # 绘图如下 
  25. import plotly.express as px 
  26. import plotly.graph_objs as go 
  27.  
  28. trace = go.Funnel( 
  29.     y = ["点击""收藏及加入购物车""购买"], 
  30.     x = [funnel["人数"][0], funnel["人数"][1], funnel["人数"][2]], 
  31.     textinfo = "value+percent initial"
  32.     marker=dict(color=["deepskyblue""lightsalmon""tan"]), 
  33.     connector = {"line": {"color""royalblue""dash""solid""width": 3}}) 
  34.      
  35. data =[trace] 
  36.  
  37. fig = go.Figure(data) 
  38.  
  39. fig.show() 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

绘图如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

结果分析:由于收藏和加入购车都是有购买意向的一种用户行为,切不分先后顺序,因此我们将其合并看作一个阶段。从上面的漏斗图和funnel表可以看出,从浏览到具有购买意向(收藏和加入购物车),只有5%的转化率,但是到了真正到购买的转化率只有1%,再看“单一转化率”,从具有购买意向到真正购买的转化率达到了20%。说明从浏览到进行收藏和加入购物车的阶段,是指标提升的重要环节。

4)客户价值分析(RFM分析)

  1. from datetime import datetime 
  2. # 最近一次购买距离现在的天数 
  3. recent_buy = df[df["behavior_type"]=="4"].groupby("user_id")["date"].\ 
  4.              apply(lambda x:datetime(2014,12,20) - x.sort_values().iloc[-1]).reset_index().\ 
  5.              rename(columns={"date":"recent"}) 
  6. recent_buy["recent"] = recent_buy["recent"].apply(lambda x: x.days) 
  7. recent_buy[:10] 
  8. # 购买次数计算 
  9. buy_freq = df[df["behavior_type"]=="4"].groupby("user_id")["date"].count().reset_index().\ 
  10.           rename(columns={"date":"freq"}) 
  11. buy_freq[:10] 
  12. # 将上述两列数据,合并起来 
  13. rfm = pd.merge(recent_buy,buy_freq,on="user_id"
  14. rfm[:10] 
  15. # 给不同类型打分 
  16. r_bins = [0,5,10,15,20,50] 
  17. f_bins = [1,30,60,90,120,900] 
  18. rfm["r_score"] = pd.cut(rfm["recent"],bins=r_bins,labels=[5,4,3,2,1],right=False
  19. rfm["f_score"] = pd.cut(rfm["freq"],bins=f_bins,labels=[1,2,3,4,5],right=False
  20. for i in ["r_score","f_score"]: 
  21.     rfm[i] = rfm[i].astype(float
  22. rfm.describe() 
  23. # 比较各分值与各自均值的大小 
  24. rfm["r"] = np.where(rfm["r_score"]>3.943957,"高","低"
  25. rfm["f"] = np.where(rfm["f_score"]>1.133356,"高","低"
  26. # 将r和f列的字符串合并起来 
  27. rfm["value"] = rfm["r"].str[:] + rfm["f"].str[:] 
  28. rfm.head() 
  29. # 自定义函数给用户贴标签 
  30. def trans_labels(x): 
  31.     if x == "高高"
  32.         return "重要价值客户" 
  33.     elif x == "低高"
  34.         return "重要唤回客户" 
  35.     elif x == "高低"
  36.         return "重要深耕客户" 
  37.     else
  38.         return "重要挽回客户" 
  39. rfm["标签"] = rfm["value"].apply(trans_labels) 
  40. # 计算出每个标签的用户数量 
  41. rfm["标签"].value_counts() 

结果如下:

Python:我的交易行为终于在分析1225万条淘宝数据,搞清楚了

【编辑推荐】

  1. 典型数据分析软件的简单介绍(MATLAB篇)
  2. 世界上最早数据统计分析软件SPSS简介
  3. 数据分析中SAS有什么优势
  4. Tableau 2020.2提供新的多源分析数据模型和KPI监测指标功能
  5. 快速完成数据分析的好帮手——豌豆BI
【责任编辑:未丽燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

从头解锁Python运维

从头解锁Python运维

多维度详解
共19章 | 叱诧少帅

330人订阅学习

Active Directory 架构规划实战

Active Directory 架构规划实战

4类AD架构规划
共15章 | wx5918591c0084b

320人订阅学习

庖丁解牛Ceph分布式存储

庖丁解牛Ceph分布式存储

云计算存储的基石
共5章 | Happy云实验室

192人订阅学习

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微