一.項目背景
本數(shù)據(jù)報告以淘寶app平臺為數(shù)據(jù)集,通過行業(yè)的指標對淘寶用戶行為進行分析,從而探索淘寶用戶的行為模式,具體指標包括:日PV和日UV分析,付費率分析,復購行為分析,漏斗流失分析和用戶價值RFM分析。
二.數(shù)據(jù)來源
https://tianchi.aliyun.com/dataset/dataDetail?dataId=46&userId=1
三.提出問題
1.日PV有多少
2.日UV有多少
3.付費率情況如何
4.復購率是多少
5.漏斗流失情況如何
6.用戶價值情況
四.理解數(shù)據(jù)
本數(shù)據(jù)集共有104萬條左右數(shù)據(jù),數(shù)據(jù)為淘寶APP2014年11月18日至2014年12月18日的用戶行為數(shù)據(jù),共計6列字段,列字段分別是:
user_id:用戶身份,脫敏
item_id:商品ID,脫敏
behavior_type:用戶行為類型(包含點擊、收藏、加購物車、支付四種行為,分別用數(shù)字1、2、3、4表示)
user_geohash:地理位置
item_category:品類ID(商品所屬的品類)
time:用戶行為發(fā)生的時間
五.數(shù)據(jù)清洗
#導入庫
import pandas as pd
import numpy as np
import seaborn as sns
%matplotlib inline
import matplotlib.pyplot as plt
#導入數(shù)據(jù)
path = 'D:/辦公/數(shù)據(jù)分析/taobao1920/taobao2014.csv'
data_user = pd.read_csv(path,encoding='utf-8',engine='python')
data_user.head()
輸出:
#缺失值處理
missingTotal = data_user.isnull().sum()
missingExist = missingTotal[missingTotal>0]
missingExist = missingExist.sort_values(ascending = False)
print(missingTotal)
輸出:
user_id 0
item_id 0
behavior_type 0
user_geohash 8334824
item_category 0
time 0
dtype: int64
print(missingExist)
輸出
user_geohash 8334824
dtype: int64
- 存在缺失值的是user_geohash,有717785條,不能刪除缺失值,因為地理信息在數(shù)據(jù)集收集過程中做過加密轉(zhuǎn)換,因此對數(shù)據(jù)集不做處理。
#一致化處理
import re
#拆分time數(shù)據(jù)為date日期和hour小時兩個數(shù)據(jù)
data_user['date'] = data_user.time.map(lambda s: re.compile(' ').split(s)[0])
data_user['hour'] = data_user.time.map(lambda s: re.compile(' ').split(s)[1])
data_user.head()
輸出:
#查看data_user數(shù)據(jù)集的數(shù)據(jù)類型
data_user.dtypes
輸出:
user_id int64
item_id int64
behavior_type int64
user_geohash object
item_category int64
time object
date object
hour object
dtype: object
發(fā)現(xiàn)time列和date列應(yīng)該轉(zhuǎn)化為日期類數(shù)據(jù)類型,hour列應(yīng)該是字符串數(shù)據(jù)類型。
#數(shù)據(jù)類型轉(zhuǎn)化
data_user['time'] = pd.to_datetime(data_user['time'])
data_user['date'] = pd.to_datetime(data_user['date'])
data_user['hour'] = data_user['hour'].astype('int64')
data_user.dtypes
#查看數(shù)據(jù)集統(tǒng)計描述檢查異常值是否存在
data_user = data_user.sort_values(by = 'time',ascending=True)
data_user = data_user.reset_index(drop=True)
data_user.describe()
輸出:
- 通過觀察數(shù)據(jù)集的四分位數(shù),總數(shù),平均值,方差等,發(fā)現(xiàn)數(shù)據(jù)集并無異常值存在。
六、用戶行為分析
(1)pv和uv分析
PV(訪問量):即Page View, 具體是指網(wǎng)站的是頁面瀏覽量或者點擊量,頁面被刷新一次就計算一次。
UV(獨立訪客):即Unique Visitor,訪問您網(wǎng)站的一臺電腦客戶端為一個訪客。
1)日訪問量分析
#pv_daily記錄每天用戶操作次數(shù),uv_daily記錄每天不同的上線用戶數(shù)量
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')
axes[1].set_title('uv_daily')
plt.savefig('日訪問pv-uv對比圖.png')
輸出:
- 結(jié)果顯示如上圖所示,在雙十二期間,pv和uv訪問量達到峰值,并且可以發(fā)現(xiàn),uv和pv兩個訪問量數(shù)值差距比較大,同時,因為數(shù)據(jù)集總?cè)藬?shù)大約是10000人左右,因此,通過uv值可以分析出雙十二期間淘寶用戶的日活躍大概是45%浮動。
2)小時訪問量分析
#pv_hour記錄每小時用戶操作次數(shù),uv_hour記錄每小時不同的上線用戶數(shù)量
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')
plt.savefig('小時訪問pv-uv對比圖.png')
輸出:
- 可以看出pv和uv都在0點開始下降,一直到凌晨5點到達最低點然后隨著時間開始上升。同時在晚上18:00左右,pv波動情況比較劇烈,相比來看uv不太明顯,因此晚上18:00以后是淘寶用戶訪問app的活躍時間段。
3)不同行為類型用戶pv分析
#不同行為類型用戶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)#建立2*1的圖共享x軸
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')
plt.tight_layout()#控制兩個圖之間的距離,更美觀
plt.savefig('不同行為類型用戶pv圖.png')
輸出:
- 由圖表顯示:點擊這一用戶行為相比較于其他三類用戶行為,pv訪問量較高,同時四種用戶行為的波動情況基本一致,因此晚上這一時間段不管哪一種用戶行為,pv訪問量都是最高的。從圖2可以看出,加入購物車這一用戶行為的pv總量高于收藏的總量,因此在后續(xù)漏斗流失分析中,用戶行為類型3應(yīng)該在2之前分析。
七.用戶消費行為分析
(1)用戶購買次數(shù)情況分析
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')
plt.savefig('用戶購買次數(shù)柱狀圖.png')
輸出:
- 圖表顯示:淘寶用戶消費次數(shù)普遍在10次以內(nèi),因此需要重點關(guān)注購買次數(shù)在10次以上的消費者用戶群體。
(2)日ARPPU
ARPPU(average revenue per paying user)是指從每位付費用戶身上獲得的收入,它反映的是每個付費用戶的平均付費額度。
ARPPU=總收入/活躍用戶付費數(shù)量
因為本數(shù)據(jù)集中沒有消費金額,因此在計算過程中用消費次數(shù)代替消費金額
人均消費次數(shù)=消費總次數(shù)/消費人數(shù)
data_user_buy1 = data_user[data_user.behavior_type==4].groupby(['date','user_id'])['behavior_type'].count().reset_index().rename(columns={'behavior_type':'total'})
data_user_buy1.groupby('date').apply(lambda x: x.total.sum()/x.total.count()).plot()
plt.title('daily_ARPPU')
plt.savefig('日ARPPU.png')
輸出:
- 圖表顯示:平均每天消費次數(shù)在1-2次之間波動,雙十二期間消費次數(shù)達到最高值。
(3)日ARPU
- ARPU(Average Revenue Per User) :平均每用戶收入,可通過 總收入/AU 計算得出。它可以衡量產(chǎn)品的盈利能力和發(fā)展活力。
#活躍用戶數(shù)平均消費次數(shù)=消費總次數(shù)/活躍用戶人數(shù)(每天有操作行為的為活躍)
data_user['operation'] = 1
data_user_buy2 = data_user.groupby(['date','user_id','behavior_type'])['operation'].count().reset_index().rename(columns={'operation':'total'})
data_user_buy2.groupby('date').apply(lambda x: x[x.behavior_type==4].total.sum()/len(x.user_id.unique())).plot()
plt.title('daily_ARPU')
plt.savefig('日ARPU.png')
輸出:
- 由圖表顯示,日ARPU最高點接近2.0,在每個月的11-13號。其他時間ARPU在0.4-0.6之間平緩波動。
(4)付費率
付費率=消費人數(shù)/活躍用戶人數(shù)
data_user_buy2.groupby('date').apply(lambda x: x[x.behavior_type==4].total.count()/len(x.user_id.unique())).plot()
plt.title('daily_afford_rate')
plt.savefig('付費率圖.png')
輸出:
- 可以看到付費率的曲線與ARPU曲線基本一致,最高點也是在11-13號之間達到0.5,其他時間則在0.20-0.25之間波動。
(5)同一時間段用戶消費次數(shù)分布
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)
plt.savefig('同一時間段用戶消費次數(shù)分布圖.png')
print('大多數(shù)用戶消費:{}次'.format(data_user_buy3.mode()[0]))
輸出:大多數(shù)用戶消費:1次
八.復購情況分析
復購情況,即兩天以上有購買行為,一天多次購買算一次
復購率=有復購行為的用戶數(shù)/有購買行為的用戶總數(shù)
data_rebuy = data_user[data_user.behavior_type==4].groupby('user_id')['date'].apply(lambda x: len(x.unique())).rename('rebuy_count')
print('復購率:',round(data_rebuy[data_rebuy>=2].count()/data_rebuy.count(),4))
輸出:
復購率: 0.8717
從復購率0.8717來看,用戶的復購率還是很高的。
#所有復購時間間隔消費次數(shù)分布
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.astype('timedelta64[D]')
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')
plt.savefig('復購時間間隔消費次數(shù)分布圖.png')
輸出:
多數(shù)用戶消費次數(shù)隨著消費時間間隔的增加而不斷下降,在1-10天之內(nèi)復購次數(shù)比較多,10天之后復購次數(shù)淘寶用戶很少在進行復購,因此需要重視10天之內(nèi)的淘寶用戶復購行為,增加用戶復購。不同用戶平均復購時間呈正態(tài)分布,但是總體來看,呈現(xiàn)逐漸下降趨勢。多數(shù)淘寶用戶平均復購時間集中在1-5天時間間隔內(nèi)。
#不同用戶平均復購時間分析
sns.distplot(data_user_buy4.reset_index().groupby('user_id').date.mean())
plt.savefig('不同用戶平均復購時間分析圖.png')
輸出:
不同用戶平均復購時間呈正態(tài)分布,但是總體來看,呈現(xiàn)逐漸下降趨勢。多數(shù)淘寶用戶平均復購時間集中在1-5天時間間隔內(nèi)。
九.漏斗流失分析
漏斗分析是一套流程式數(shù)據(jù)分析,它能夠科學反映用戶行為狀態(tài)以及從起點到終點各階段用戶轉(zhuǎn)化率情況的重要分析模型。
data_user_count=data_user.groupby(['behavior_type']).count()
data_user_count.head()
輸出:
pv_all=data_user['user_id'].count()
liushi_dianji = round((pv_all-data_user_count.iloc[0,0])/pv_all,4)
liushi_gouwuche = round((data_user_count.iloc[0,0]-data_user_count.iloc[2,0])/data_user_count.iloc[0,0],4)
liushi_shoucang = round((data_user_count.iloc[2,0]-data_user_count.iloc[1,0])/data_user_count.iloc[2,0],4)
liushi_buy = round((data_user_count.iloc[1,0]-data_user_count.iloc[3,0])/data_user_count.iloc[1,0],4)
print('瀏覽-點擊流失率:',liushi_dianji,'\n點擊-加入購物車流失率:',liushi_gouwuche,'\n購物車-收藏流失率:',liushi_shoucang,'\n收藏-購買流失率',liushi_buy)
輸出:
瀏覽-點擊流失率: 0.0576
點擊-加入購物車流失率: 0.9703
購物車-收藏流失率: 0.294
收藏-購買流失率 0.5044
十.用戶行為與商品種類關(guān)系分析
#不同用戶行為類別的轉(zhuǎn)化率
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()
輸出:
#轉(zhuǎn)化率計算
data_category['轉(zhuǎn)化率']=data_category['購買量']/data_category['點擊量']
data_category.head()
輸出:
data_category = data_category.fillna(0)
data_category = data_category[data_category['轉(zhuǎn)化率']<=1]#小于1的轉(zhuǎn)化率才是正常值
sns.distplot(data_category['轉(zhuǎn)化率'])
plt.savefig('用戶行為轉(zhuǎn)化率圖.png')
輸出:
sns.distplot(data_category[data_category['轉(zhuǎn)化率']>0]['轉(zhuǎn)化率'],kde=False)
輸出:
圖表顯示:基本上各種用戶行為類型轉(zhuǎn)換率都在0.1以內(nèi),同時絕大多數(shù)用戶都沒有購買情況,需要重點關(guān)注出現(xiàn)該現(xiàn)象的原因進行分析改進。
data_category['感興趣比率'] = data_category['加入購物車量']/data_category['點擊量']
data_category.head()
輸出:
#異常值處理,感興趣比率繪圖
data_category = data_category[data_category['感興趣比率']<=1]
sns.distplot(data_category['感興趣比率'])
sns.distplot(data_category[data_category['感興趣比率']>0]['感興趣比率'],kde=False)
輸出:

圖表顯示:感興趣比率和轉(zhuǎn)化率類似,基本也是0.1以內(nèi),說明用戶點擊的絕大多數(shù)商品并非感興趣,需要重視推薦系統(tǒng)的調(diào)整。
#將轉(zhuǎn)化率分三類查看各類占比例
data_convert_rate = pd.cut(data_category['轉(zhuǎn)化率'],[-1,0,0.1,1]).value_counts()
data_convert_rate = data_convert_rate/data_convert_rate.sum()
data_convert_rate
輸出:
(0.0, 0.1] 0.502693
(-1.0, 0.0] 0.476885
(0.1, 1.0] 0.020422
Name: 轉(zhuǎn)化率, dtype: float64
#將感興趣比率分三類查看各類占比例
data_interest_rate = pd.cut(data_category['感興趣比率'],[-1,0,0.1,1]).value_counts()
data_interest_rate = data_interest_rate/data_interest_rate.sum()
data_interest_rate
輸出:
(0.0, 0.1] 0.538487
(-1.0, 0.0] 0.390373
(0.1, 1.0] 0.071140
Name: 感興趣比率, dtype: float64
根據(jù)以上輸出顯示:轉(zhuǎn)化率達到0.1以上僅僅只有2%的用戶,有47%的用戶幾乎不會發(fā)生購買行為。同時從感興趣比率來看:有40%的用戶對商品不感興趣。
十一.二八理論分析
二八定律:在任何一組東西中,最重要的只占其中一小部分,約20%,其余80%盡管是多數(shù),卻是次要的,因此又稱二八定律。
#二八理論和長尾理論
data_category = data_category[data_category['購買量']>0]
value_8 = data_category['購買量'].sum()*0.8
value_10 = data_category['購買量'].sum()
data_category = data_category.sort_values(by='購買量',ascending=False)
data_category['累計購買量'] = data_category['購買量'].cumsum()
data_category['分類'] = data_category['累計購買量'].map(lambda x:'前80%' if x<=value_8 else '后20%')
data_category.head()
輸出:
data_category.groupby('分類')['分類'].count()/data_category['分類'].count()
輸出:
分類
前80% 0.155727
后20% 0.844273
Name: 分類, dtype: float64
圖表顯示:前80%銷量有15%左右的商品品類承包,接近二八原則。但我們也看出有15%的銷量由85%的商品品類提供。
對于傳統(tǒng)零售行業(yè),因為成本高,因此只能局限于這前15%的商品提供利潤;
對于電子商務(wù),空間成本吉減少乃至為0,使后85%的商品也可以銷售出去,因此將長尾部分的商品優(yōu)化推薦好,能夠給企業(yè)帶來更大的收益。
十二.用戶價值度RFM模型分析
RFM的含義:
- R(Recency):客戶最近一次交易時間的間隔。R值越大,表示客戶交易發(fā)生的日期越久,反之則表示客戶交易發(fā)生的日期越近。
- F(Frequency):客戶在最近一段時間內(nèi)交易的次數(shù)。F值越大,表示客戶交易越頻繁,反之則表示客戶交易不夠活躍。
- M(Monetary):客戶在最近一段時間內(nèi)交易的金額。M值越大,表示客戶價值越高,反之則表示客戶價值越低。
RFM分析就是根據(jù)客戶活躍程度和交易金額的貢獻,進行客戶價值細分的一種方法。

from datetime import datetime
datenow=datetime(2014,12,20)
#每位用戶最近購買時間
recent_buy_time = data_user[data_user.behavior_type==4].groupby('user_id').date.apply(lambda x: datetime(2014,12,20)-x.sort_values().iloc[-1]).reset_index().rename(columns={'date':'recent'})
recent_buy_time.recent = recent_buy_time.recent.map(lambda x:x.days)
#每個用戶消費頻率
buy_freq=data_user[data_user.behavior_type==4].groupby('user_id').date.count().reset_index().rename(columns={'date':'freq'})
rfm=pd.merge(recent_buy_time,buy_freq,left_on='user_id',right_on='user_id',how='outer')
#將各維度分成兩個程度,分數(shù)越高越好
rfm['recent_value']=pd.qcut(rfm.recent,2,labels=['2','1'])
rfm['freq_value']=pd.qcut(rfm.freq,2,labels=['1','2'])
rfm['rfm']=rfm['recent_value'].str.cat(rfm['freq_value'])
rfm.head()
輸出:
表格顯示:因為本數(shù)據(jù)集沒有提供消費金額,因此只能R和F進行用戶價值分析,通過RF用戶價值分析,對于22用戶,為重點用戶需要關(guān)注;對于21這類忠誠度高而購買能力不足的,可以可以適當給點折扣或捆綁銷售來增加用戶的購買頻率。對于12這類忠誠度不高而購買能力強的,需要關(guān)注他們的購物習性做精準化營銷。