加载数据
数据来源阿里天池:https://tianchi.aliyun.com/dataset/dataDetail?dataId=649
数据信息:
数据量级达到一亿,考虑到电脑性能问题,故随机抽样其中的100万左右数据作为本次分析的原始数据.
import numpy as np import pandas as pd import time from pandas import Series,DataFrame import matplotlib.pyplot as plt %matplotlib inline behavior = pd.read_csv('./电商用户行为案例数据/UserBehaviorSample.csv', engine='python')
# 删除没用的'Unnamed: 0'列 behavior.drop(labels='Unnamed: 0',axis=1, inplace=True) # 设置列索引 behavior.columns = ['user_id','item_id','category_id','behavior_type','timestamp']
查看是否存在重复的行数据
behavior.duplicated(keep='first').sum() 0
无重复数据
查看列中是否存在缺失数据
behavior.isnull().any(axis=0)
user_id False
item_id False
category_id False
behavior_type False
timestamp False
dtype: bool
无缺失数据
将时间戳转换为时间序列类型
time.strftime("%Y-%m-%d", time.localtime(1511572885))
# 方式一 因为数据有异常时间导致无法转化我们用第二种 def change_time(s): return time.strftime("%Y-%m-%d", time.localtime(s)) behavior['timestamp'] = behavior['timestamp'].apply(change_time) # 方式二 behavior['timestamp'] = pd.to_datetime(behavior['timestamp'],unit='s') behavior['timestamp'] = behavior['timestamp'].astype('datetime64[D]')
添加一列为月份
behavior['month'] = behavior['timestamp'].dt.month
查看数据的时间范围,如有异常值将其删除
只保留2017-11-25到2017-12-3的数据
# 通过数据最大值和最小值确定数据范围,发现有异常数据 behavior['timestamp'].min(),behavior['timestamp'].max() (Timestamp('1920-10-09 00:00:00'), Timestamp('2025-10-24 00:00:00')) # 通过条件限定取出指定区间的数据并赋值给原数据,去掉异常数据 behavior = behavior.loc[(behavior['timestamp'] > '2017-11-24') & (behavior['timestamp'] < '2017-12-4')]
对所有用户的不同购买行为进行数量统计且求得不同购买行为的百分比,以柱状图进行展示
# 对用户行为分组,分别求出去重后的用户四种行为数 a = behavior.groupby(by='behavior_type')['user_id'].nunique() behavior_type buy 19667 cart 50941 fav 26115 pv 489981 Name: user_id, dtype: int64 # 对用户行为分组,求去重后用户行为总数 b = behavior.groupby(by='behavior_type')['user_id'].nunique().sum() 586704 # 求出各行为所占百分比 s_persent = a / b * 100 behavior_type buy 3.352116 cart 8.682572 fav 4.451137 pv 83.514174 Name: user_id, dtype: float64 # 绘制柱状图 plt.bar(s_persent.index, s_persent.values)
发现用户点击量占据83.51%,而购买量仅占所有数据的3.35%,,用户从浏览到购买的转化率只有4.01%,那是什么原因导致的转化率低呢?
分析出每个用户对商品的不同行为
# 采用one-hot编码,将用户行为变如下格式 one_hot_df = pd.get_dummies(behavior['behavior_type'])
# 通过级联将原数据中的user_id和item_id列与one-hot合并,得到用户商品行为表 user_item_behavior_df = pd.concat((behavior[['user_id','item_id']], one_hot_df), axis=1)
分析出每个用户对商品的不同行为次数的汇总
# 获取各个用户的行为和 pv_sum = user_item_behavior_df.groupby('user_id')['pv'].sum() buy_sum = user_item_behavior_df.groupby('user_id')['buy'].sum() cart_sum = user_item_behavior_df.groupby('user_id')['cart'].sum() fav_sum = user_item_behavior_df.groupby('user_id')['fav'].sum() # 汇总,这里需要将表转置,否者很难看 user_behavior_total = DataFrame(data=[pv_sum,buy_sum,cart_sum,fav_sum]).T
通过用户对商品的不同行为次数的汇总表求得各个行为的总数
# 点击量:所有用户的总点击量 user_behavior_total['pv'].sum() 885741 # 点击-购买:用户点击后无加购和收藏的情况下直接参与购买的行为统计 user_behavior_total.query('pv > 0 & buy > 0 & cart == 0 & fav == 0').shape[0] 9854 # 点击-加购:点击后,无收藏情况下的加购行为 user_behavior_total.query('pv > 0 & buy == 0 & cart > 0 & fav == 0').shape[0] 30268 # 点击-加购-购买:点击后无收藏情况下的加购和购买行为 user_behavior_total.query('pv > 0 & buy > 0 & cart > 0 & fav == 0').shape[0] 927 # 点击-收藏:点击后,无加购情况下的收藏行为 user_behavior_total.query('pv > 0 & buy == 0 & cart == 0 & fav > 0').shape[0] 15959 # 点击-收藏-购买:点击后,无加购情况下的收藏和购买行为 user_behavior_total.query('pv > 0 & buy > 0 & cart == 0 & fav > 0').shape[0] 405 # 点击-收藏-加购:点击后的收藏和加购行为 user_behavior_total.query('pv > 0 & buy == 0 & cart > 0 & fav > 0').shape[0] 1006 # 点击-收藏-加购-购买:点击后的收藏架构和购买的行为 user_behavior_total.query('pv > 0 & buy > 0 & cart > 0 & fav > 0').shape[0] 41 # 点击-流失:点击后无购买无加购无收藏的行为 user_behavior_total.query('pv > 0 & buy == 0 & cart == 0 & fav == 0').shape[0] 431521
- 直接购买转化率:点击--购买 / 点击量
- 加购购买转换率:点击--加购+购买 / 点击--加购
- 收藏购买转换率:点击--收藏--购买 / 点击--收藏
- 加购收藏购买转换率:点击--加购+收藏--购买 / 点击--加购+收藏
- 流失率:点击--流失 / 点击量
直接购买转化率低于加购和收藏等行为之后的综合转换率,因此需要从产品交互界面、营销机制等方面让用户去多加购,多收藏。
转化率低的原因分析
- 提出假设:推荐机制不合理,给用户推荐的都是不喜欢的商品,造成转化率低
- 这里可以通过分析高浏览量商品与高购买量商品之间是否存在高度重合,如果是的,那就说明推荐的商品是用户喜欢,假设就不成立,如果不是则证明假设成立。
分析出点击量前10的商品
# user_item_behavior_df.groupby(by='item_id')['pv'].sum().sort_values().tail(10) pv_sum_item_10 = user_item_behavior_df.groupby(by='item_id')['pv'].sum().sort_values(ascending=False)[:10] pv_sum_item_10 item_id 812879 285.0 3845720 245.0 138964 211.0 2032668 195.0 2338453 193.0 1591862 191.0 59883 176.0 1535294 176.0 3031354 172.0 3371523 171.0 Name: pv, dtype: float64
购买量前10的商品
buy_sum_item_10 = user_item_behavior_df.groupby(by='item_id')['buy'].sum().sort_values(ascending=False)[:10] buy_sum_item_10 item_id 3031354 9 3189426 9 2560262 9 3122135 8 5062984 8 3964583 8 4011044 7 222342 7 740947 7 1397311 7 Name: buy, dtype: uint8
查看点击量高且购买量也高的商品类别个数
# append级联俩表,求索引重复存在的就是点击量高且购买量也高的商品 pv_sum_item_10.append(buy_sum_item_10).index.value_counts() 3031354 2 1397311 1 3189426 1 4011044 1 2560262 1 3964583 1 5062984 1 222342 1 59883 1 812879 1 740947 1 1535294 1 138964 1 2338453 1 1591862 1 3122135 1 3845720 1 2032668 1 3371523 1 Name: item_id, dtype: int64
计算点击量前10的商品的购买量
pv_10_buy_list = [] for index in pv_sum_item_10.index: pv_buy_sum = user_item_behavior_df.loc[user_item_behavior_df['item_id']==index]['buy'].sum() dic = { 'item_id': index, 'pv_buy_sum': pv_buy_sum, } pv_10_buy_list.append(dic) [{'item_id': 812879, 'pv_buy_sum': 2}, {'item_id': 3845720, 'pv_buy_sum': 2}, {'item_id': 138964, 'pv_buy_sum': 0}, {'item_id': 2032668, 'pv_buy_sum': 2}, {'item_id': 2338453, 'pv_buy_sum': 1}, {'item_id': 1591862, 'pv_buy_sum': 0}, {'item_id': 59883, 'pv_buy_sum': 0}, {'item_id': 1535294, 'pv_buy_sum': 5}, {'item_id': 3031354, 'pv_buy_sum': 9}, {'item_id': 3371523, 'pv_buy_sum': 0}]
计算购买量前10的点击量
buy_10_pv_list = [] for index in buy_sum_item_10.index: buy_pv_sum = user_item_behavior_df.loc[user_item_behavior_df['item_id']==index]['pv'].sum() dic = { 'item_id': index, 'buy_pv_sum': buy_pv_sum, } buy_10_pv_list.append(dic) [{'item_id': 3031354, 'buy_pv_sum': 172}, {'item_id': 3189426, 'buy_pv_sum': 40}, {'item_id': 2560262, 'buy_pv_sum': 86}, {'item_id': 3122135, 'buy_pv_sum': 27}, {'item_id': 5062984, 'buy_pv_sum': 37}, {'item_id': 3964583, 'buy_pv_sum': 62}, {'item_id': 4011044, 'buy_pv_sum': 13}, {'item_id': 222342, 'buy_pv_sum': 30}, {'item_id': 740947, 'buy_pv_sum': 66}, {'item_id': 1397311, 'buy_pv_sum': 9}]
总结:可以看出点击量高的购买量不一定高,推荐的商品顾客并不喜欢购买,由于高浏览量并没有带来购买,所以转化率低。