5-python數據分析-用戶對於購買商品的行為分析


加載數據

數據來源阿里天池: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}]

總結:可以看出點擊量高的購買量不一定高,推薦的商品顧客並不喜歡購買,由於高瀏覽量並沒有帶來購買,所以轉化率低。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM