加載數據
數據來源阿里天池: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}]
總結:可以看出點擊量高的購買量不一定高,推薦的商品顧客並不喜歡購買,由於高瀏覽量並沒有帶來購買,所以轉化率低。