實戰|淘寶用戶行為分析案例
- 2020 年 3 月 9 日
- 筆記
一、項目背景
本數據報告以淘寶app平台為數據集,通過行業的指標對淘寶用戶行為進行分析,從而探索淘寶用戶的行為模式,具體指標包括:日PV和日UV分析,付費率分析,復購行為分析,漏斗流失分析和用戶價值RFM分析。
二、數據來源
https://tianchi.aliyun.com/dataset/dataDetail?dataId=46&userId=1
三、提出問題
1.日PV有多少
2.日UV有多少
3.付費率情況如何
4.復購率是多少
5漏斗流失情況如何
6.用戶價值情況
四、理解數據
本數據集共有104萬條左右數據,數據為淘寶APP2014年11月18日至2014年12月18日的用戶行為數據,共計6列字段,列字段分別是:
user_id:用戶身份,脫敏
item_id:商品ID,脫敏
behavior_type:用戶行為類型(包含點擊、收藏、加購物車、支付四種行為,分別用數字1、2、3、4表示)
user_geohash:地理位置
item_category:品類ID(商品所屬的品類)
time:用戶行為發生的時間
五、數據清洗
In [1]:
import pandas as pd
import numpy as py
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
data_user = pd.read_csv('你的數據集位置')
In [2]:
#缺失值處理
missingTotal = data_user.isnull().sum()
missingExist = missingTotal[missingTotal>0]
missingExist = missingExist.sort_values(ascending=False)
In [3]:
print(missingExist)
user_geohash 8334824 dtype: int64
In [4]:
print(missingTotal)
user_id 0 item_id 0 behavior_type 0 user_geohash 8334824 item_category 0 time 0 dtype: int64
存在缺失值的是User_geohash,有717785條,不能刪除缺失值,因為地理信息在數據集收集過程中做過加密轉換,因此對數據集不做處理。
In [5]:
data_user.head()
Out[5]:
|
user_id |
item_id |
behavior_type |
user_geohash |
item_category |
time |
---|---|---|---|---|---|---|
0 |
98047837 |
232431562 |
1 |
NaN |
4245 |
2014-12-06 02 |
1 |
97726136 |
383583590 |
1 |
NaN |
5894 |
2014-12-09 20 |
2 |
98607707 |
64749712 |
1 |
NaN |
2883 |
2014-12-18 11 |
3 |
98662432 |
320593836 |
1 |
96nn52n |
6562 |
2014-12-06 10 |
4 |
98145908 |
290208520 |
1 |
NaN |
13926 |
2014-12-16 21 |
In [6]:
#一致化處理
import re
#拆分數據集
data_user['date'] = data_user['time'].map(lambda s: re.compile(' ').split(s)[0])
In [7]:
data_user['hour']=data_user['time'].map(lambda s:re.compile(' ').split(s)[1])
data_user.head()
Out[7]:
|
user_id |
item_id |
behavior_type |
user_geohash |
item_category |
time |
date |
hour |
---|---|---|---|---|---|---|---|---|
0 |
98047837 |
232431562 |
1 |
NaN |
4245 |
2014-12-06 02 |
2014-12-06 |
02 |
1 |
97726136 |
383583590 |
1 |
NaN |
5894 |
2014-12-09 20 |
2014-12-09 |
20 |
2 |
98607707 |
64749712 |
1 |
NaN |
2883 |
2014-12-18 11 |
2014-12-18 |
11 |
3 |
98662432 |
320593836 |
1 |
96nn52n |
6562 |
2014-12-06 10 |
2014-12-06 |
10 |
4 |
98145908 |
290208520 |
1 |
NaN |
13926 |
2014-12-16 21 |
2014-12-16 |
21 |
In [8]:
#查看data_user數據集數據類型:
data_user.dtypes
Out[8]:
user_id int64 item_id int64 behavior_type int64 user_geohash object item_category int64 time object date object hour object dtype: object
In [9]:
#發現time列和date列應該轉化為日期類數據類型,hour列應該是字符串數據類型。
#數據類型轉化
data_user['date']=pd.to_datetime(data_user['date'])
data_user['time']=pd.to_datetime(data_user['time'])
data_user['hour']=data_user['hour'].astype('int64')
data_user.dtypes
Out[9]:
user_id int64 item_id int64 behavior_type int64 user_geohash object item_category int64 time datetime64[ns] date datetime64[ns] hour int64 dtype: object
In [10]:
#異常值處理
data_user = data_user.sort_values(by='time',ascending=True)
data_user = data_user.reset_index(drop=True)
data_user.describe()
Out[10]:
|
user_id |
item_id |
behavior_type |
item_category |
hour |
---|---|---|---|---|---|
count |
1.225691e+07 |
1.225691e+07 |
1.225691e+07 |
1.225691e+07 |
1.225691e+07 |
mean |
7.170732e+07 |
2.023084e+08 |
1.105271e+00 |
6.846162e+03 |
1.481799e+01 |
std |
4.122920e+07 |
1.167397e+08 |
4.572662e-01 |
3.809922e+03 |
6.474778e+00 |
min |
4.913000e+03 |
6.400000e+01 |
1.000000e+00 |
2.000000e+00 |
0.000000e+00 |
25% |
3.584965e+07 |
1.014130e+08 |
1.000000e+00 |
3.721000e+03 |
1.000000e+01 |
50% |
7.292804e+07 |
2.021359e+08 |
1.000000e+00 |
6.209000e+03 |
1.600000e+01 |
75% |
1.073774e+08 |
3.035405e+08 |
1.000000e+00 |
1.029000e+04 |
2.000000e+01 |
max |
1.424559e+08 |
4.045625e+08 |
4.000000e+00 |
1.408000e+04 |
2.300000e+01 |
通過觀察數據集的四分位數,總數,平均值,方差等,發現數據集並無異常值存在。
六、用戶行為分析
(1)pv和uv分析
PV(訪問量):即Page View, 具體是指網站的是頁面瀏覽量或者點擊量,頁面被刷新一次就計算一次。
UV(獨立訪客):即Unique Visitor,訪問您網站的一台電腦客戶端為一個訪客。
1)日訪問量分析
In [11]:
#pv_daily記錄每天用戶操作次數,uv_daily記錄每天不同的上線用戶數量
pv_daily=data_user.groupby('date')['user_id'].count().reset_index().rename(columns={'user_id':'pv'})
uv_daily=data_user.groupby('date')['user_id'].apply(lambda x:x.drop_duplicates().count()).reset_index().rename(columns={'user_id':'uv'})
fig,axes=plt.subplots(2,1,sharex=True)
pv_daily.plot(x='date',y='pv',ax=axes[0])
uv_daily.plot(x='date',y='uv',ax=axes[1])axes[0].set_title('pv_daily')
Out[11]:
Text(0.5, 1.0, 'pv_daily')

結果顯示如上圖所示,在雙十二期間,pv和uv訪問量達到峰值,並且可以發現,uv和pv兩個訪問量數值差距比較大,同時,因為數據集總人數大約是10000人左右,因此,通過nv值可以分析出雙十二期間淘寶用戶的日活躍大概是45%浮動。
In [12]:
#小時訪問量分析#pv_hour記錄每小時用戶操作次數,uv_hour記錄每小時不同的上線用戶數量
pv_hour=data_user.groupby('hour')['user_id'].count().reset_index().rename(columns={'user_id':'pv'})
uv_hour=data_user.groupby('hour')['user_id'].apply(lambda x:x.drop_duplicates().count()).reset_index().rename(columns={'user_id':'uv'})
fig,axes=plt.subplots(2,1,sharex=True)
pv_hour.plot(x='hour',y='pv',ax=axes[0])uv_hour.plot(x='hour',y='uv',ax=axes[1])
axes[0].set_title('pv_hour')
axes[1].set_title('uv_hour')
Out[12]:
Text(0.5, 1.0, 'uv_hour')

圖表顯示:pv和uv在凌晨0-5點期間波動情況相同,都呈下降趨勢,訪問量都比較小,同時在晚上18:00左右,pv波動情況比較劇烈,相比來看uv不太明顯,因此晚上18:00以後是淘寶用戶訪問app的活躍時間段。
In [13]:
#不同行為類型用戶pv分析
pv_detail=data_user.groupby(['behavior_type','hour'])['user_id'].count().reset_index().rename(columns={'user_id':'total_pv'})
fig,axes=plt.subplots(2,1,sharex=True)
sns.pointplot(x='hour',y='total_pv',hue='behavior_type',data=pv_detail,ax=axes[0])
sns.pointplot(x='hour',y='total_pv',hue='behavior_type',data=pv_detail[pv_detail.behavior_type!=1],ax=axes[1])
axes[0].set_title('pv_different_behavior_type')
axes[1].set_title('pv_different_behavior_type_except1')
Out[13]:
Text(0.5, 1.0, 'pv_different_behavior_type_except1')

有圖表顯示:點擊這一用戶行為相比較於其他三類用戶行為,pv訪問量較高,同時四種用戶行為的波動情況基本一致,因此晚上這一時間段不管哪一種用戶行為,pv訪問量都是最高的。從圖2可以看出,加入購物車這一用戶行為的pv總量高於收藏的總量,因此在後續漏斗流失分析中,用戶類型3應該在2之前分析。
七、用戶消費行為分析
In [14]:
#(1)用戶購買次數情況分析
data_user_buy=data_user[data_user.behavior_type==4].groupby('user_id')['behavior_type'].count()
sns.distplot(data_user_buy,kde=False)plt.title('daily_user_buy')
Out[14]:
Text(0.5, 1.0, 'daily_user_buy')

圖表顯示:淘寶用戶消費次數普遍在10次以內,因此需要重點關注購買次數在10次以上的消費者用戶群體。
(2)日ARPPU
ARPPU(average revenue per paying user)是指從每位付費用戶身上獲得的收入,它反映的是每個付費用戶的平均付費額度。
ARPPU=總收入/活躍用戶付費數量
因為本數據集中沒有消費金額,因此在計算過程中用消費次數代替消費金額
人均消費次數=消費總次數/消費人數
In [21]:
data_use_buy1=data_user[data_user.behavior_type==4].groupby(['date','user_id'])['behavior_type'].count().reset_index().rename(columns={'behavior_type':'total'})
data_use_buy1.groupby('date').apply(lambda x:x.total.sum()/x.total.count()).plot()
plt.title('daily_ARPPU')
Out[21]:
Text(0.5, 1.0, 'daily_ARPPU')

圖表顯示:平均每天消費次數在1-2次之間波動,雙十二期間消費次數達到最高值。
In [23]:
#(3)日ARPU#ARPU(Average Revenue Per User) :平均每用戶收入,可通過 總收入/AU 計算得出。它可以衡量產品的盈利能力和發展活力。#活躍用戶數平均消費次數=消費總次數/活躍用戶人數(每天有操作行為的為活躍)
data_user['operation']=1
data_use_buy2=data_user.groupby(['date','user_id','behavior_type'])['operation'].count().reset_index().rename(columns={'operation':'total'})
data_use_buy2.groupby('date').apply(lambda x:x[x.behavior_type==4].total.sum()/len(x.user_id.unique())).plot()
plt.title('daily_ARPU')
Out[23]:
Text(0.5, 1.0, 'daily_ARPU')

In [24]:
#(4)付費率#付費率=消費人數/活躍用戶人數
data_use_buy2.groupby('date').apply(lambda x:x[x.behavior_type==4].total.count()/len(x.user_id.unique())).plot()
plt.title('daily_afford_rate')
Out[24]:
Text(0.5, 1.0, 'daily_afford_rate')

In [25]:
#(5)同一時間段用戶消費次數分佈
data_user_buy3=data_user[data_user.behavior_type==4].groupby(['user_id','date','hour'])['operation'].sum().rename('buy_count')
sns.distplot(data_user_buy3)
print('大多數用戶消費:{}次'.format(data_user_buy3.mode()[0]))
大多數用戶消費:1次

八、復購情況分析
In [26]:
#復購情況,即兩天以上有購買行為,一天多次購買算一次#復購率=有復購行為的用戶數/有購買行為的用戶總數
date_rebuy=data_user[data_user.behavior_type==4].groupby('user_id')['date'].apply(lambda x:len(x.unique())).rename('rebuy_count')
print('復購率:',round(date_rebuy[date_rebuy>=2].count()/date_rebuy.count(),4))
復購率: 0.8717
In [29]:
#所有復購時間間隔消費次數分佈
data_day_buy=data_user[data_user.behavior_type==4].groupby(['user_id','date']).operation.count().reset_index()
data_user_buy4=data_day_buy.groupby('user_id').date.apply(lambda x:x.sort_values().diff(1).dropna())
data_user_buy4=data_user_buy4.map(lambda x:x.days)data_user_buy4.value_counts().plot(kind='bar')
plt.title('time_gap')
plt.xlabel('gap_day')
plt.ylabel('gap_count')
Out[29]:
Text(0, 0.5, 'gap_count')

多數用戶復購率為0.4693,消費次數隨着消費時間間隔的增加而不斷下降,在1-10天之內復購次數比較多,10天之後復購次數淘寶用戶很少在進行復購,因此需要重視10天之內的淘寶用戶復購行為,增加用戶復購。不同用戶平均復購時間呈正態分佈,但是總體來看,呈現逐漸下降趨勢。多數淘寶用戶平均復購時間集中在1-5天時間間隔內。
九、漏斗流失分析
漏斗分析是一套流程式數據分析,它能夠科學反映用戶行為狀態以及從起點到終點各階段用戶轉化率情況的重要分析模型。
In [30]:
data_user_count=data_user.groupby(['behavior_type']).count()data_user_count.head()
pv_all=data_user['user_id'].count()
print(pv_all)
12256906
In [31]:
#十、用戶行為與商品種類關係分析#不同用戶行為類別的轉化率
data_category=data_user[data_user.behavior_type!=2].groupby(['item_category','behavior_type']).operation.count().unstack(1).rename(columns={1:'點擊量',3:'加入購物車量',4:'購買量'}).fillna(0)
data_category.head()
Out[31]:
behavior_type |
點擊量 |
加入購物車量 |
購買量 |
---|---|---|---|
item_category |
|
|
|
2 |
3.0 |
0.0 |
0.0 |
3 |
3.0 |
0.0 |
0.0 |
4 |
1.0 |
0.0 |
0.0 |
6 |
10.0 |
0.0 |
0.0 |
8 |
976.0 |
4.0 |
4.0 |

本文所有代碼都通過運行!
希望本文對你有所幫助,如果覺得這篇文章有用的話,歡迎收藏和轉發