Python數據分析案例—淘寶用戶行爲分析

今天的數據分析小項目~
數據來源於https://tianchi.aliyun.com/dataset/dataDetail?dataId=46&userId=1
分析參考https://www.kesci.com/home/project/5df87bc02823a10036aca279/code
總之就是參考大佬的分析在學習,奧裏給!
進入正文:

一、項目背景

本數據報告以淘寶app平臺爲數據集,通過行業的指標對淘寶用戶行爲進行分析,從而探索淘寶用戶的行爲模式,具體指標包括:日PV和日UV分析,付費率分析,復購行爲分析,漏斗流失分析和用戶價值RFM分析
在這裏插入圖片描述

二、提出問題

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:用戶行爲發生的時間
在這裏插入圖片描述

四、數據清洗

import pandas as pd
import numpy as np
data=pd.read_csv(r'C:/Users/smile/Desktop/taobao/tianchi_mobile_recommend_train_user.csv')
data.head()
data.shape   #(1048575, 6)
data.info()

在這裏插入圖片描述
1)缺失值處理

data.isnull().sum()

在這裏插入圖片描述
可以看到,這個數據集中的各變量值比較完整,user_geohash缺失較多,有717785條,不能刪除缺失值,因爲地理信息在數據集收集過程中做過加密轉換,因此對數據集不做處理。
2)一致化處理
觀察數據集,發現’time’列數據既包括年月日,也包括了小時數,因此在數據類型轉化前,需要對講’time’列數據拆分爲’date’列和’hour’列,輸出結果如下:

import re
data['date']=data['time'].map(lambda s:re.compile(' ').split(s)[0])
data['hour']=data['time'].map(lambda s:re.compile(' ').split(s)[1])
data['time']=pd.to_datetime(data['time'])
data['date']=pd.to_datetime(data['date'])
data.head()

在這裏插入圖片描述

data.dtypes

在這裏插入圖片描述
歐了
3)異常值處理
查看數據:

data.describe()

在這裏插入圖片描述
通過觀察數據集的四分位數,總數,平均值,方差等,發現數據集並無異常值存在。
**??**究竟是怎麼觀察的,這些都沒有具體量化範圍,你說沒有異常值就沒有異常值吧,我還不用去處理了呢。不過從behavior_type中還是能看出些東西的,用戶行爲集中在1,即點擊行爲方面。

data['behavior_type'].value_counts()

在這裏插入圖片描述
像是個漏斗行爲,這一數據結構也符合大家的認知。
下面就是分析重頭戲了:

五、用戶行爲分析

(1)pv和uv分析
PV(訪問量):即Page View, 具體是指網站的是頁面瀏覽量或者點擊量,頁面被刷新一次就計算一次。
UV(獨立訪客):即Unique Visitor,訪問您網站的一臺電腦客戶端爲一個訪客。
1)日訪問量分析

pv_daily=data.groupby('date')['user_id'].count().reset_index().rename(columns={'user_id':'pv'})
pv_daily.head()

在這裏插入圖片描述

uv_daily=data.groupby('date')['user_id'].apply(lambda x:x.drop_duplicates().count()).reset_index().rename(columns={'user_id':'uv'})
uv.daily.head()

在這裏插入圖片描述

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
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')

在這裏插入圖片描述
從上圖可以看出,在雙十二期間,pv和uv訪問量達到峯值,並且可以發現,uv和pv這兩個訪問量數值差距較大。

data['user_id'].unique
len(data['user_id'].unique()) #8477

在這裏插入圖片描述
個人看法—{數據集共有8477個user_id。因此,從uv值可以分析出雙十二期間淘寶用戶的日活躍大約是67.2%(5693/8477)}
因爲數據集總人數大約是10000人左右,因此,通過nv值可以分析出雙十二期間淘寶用戶的日活躍大概是45%(4500/10000)浮動。
(2)小時訪問量分析

df1=data.groupby('hour')['user_id'].count().reset_index().rename(columns={'user_id':'pv'})
df1.head()

在這裏插入圖片描述

df2=data.groupby('hour')['user_id'].apply(lambda x:x.drop_duplicates().count()).reset_index().rename(columns={'user_id':'uv'})
df2.head()

在這裏插入圖片描述

fig,axes=plt.subplots(2,1,sharex=True)
df1.plot(x='hour',y='pv',ax=axes[0])
df2.plot(x='hour',y='uv',ax=axes[1])
axes[0].set_title('pv_daily_visit')
axes[1].set_title('uv_daily_visit')

在這裏插入圖片描述
[一點看法:凌晨0點-5點訪問量基本處於一天中的最低點,說明大家作息時間還是挺健康的。而晚上18點-23點訪問量較高且逐漸上升,是用戶活躍時間段鴨]
圖表顯示:pv和uv在凌晨0-5點期間波動情況相同,都呈下降趨勢,訪問量都比較小,同時在晚上18:00左右,pv波動情況比較劇烈,相比來看uv不太明顯,因此晚上18:00以後是淘寶用戶訪問app的活躍時間段。
3)不同行爲類型用戶pv分析

beha_anlyise=data.groupby('behavior_type')['user_id'].count().reset_index().rename(columns={'user_id':'pv'})
beha_anlyise

在這裏插入圖片描述

pv_detail=data.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')

在這裏插入圖片描述
圖顯示:

  • 點擊這一用戶行爲相比較於其他三類用戶行爲,pv訪問量較高;
    -同時四種用戶行爲的波動情況基本一致,因此晚上這一時間段不管哪一種用戶行爲,pv訪問量都是最高的。
  • 加入購物車這一用戶行爲的pv總量高於收藏的總量,因此在後續漏斗流失分析中,用戶類型3應該在2之前分析。

六、用戶消費行爲分析

(1)用戶購買次數情況分析

data_user_buy=data[data.behavior_type==4].groupby('user_id')['behavior_type'].count()
sns.distplot(data_user_buy,kde=False)
plt.title('daily_user_buy')

在這裏插入圖片描述
在這裏插入圖片描述
圖表顯示:淘寶用戶消費次數普遍在10次以內,因此需要重點關注購買次數在10次以上的消費者用戶羣體
(2)日ARPPU
ARPPU(average revenue per paying user)是指從每位付費用戶身上獲得的收入,它反映的是每個付費用戶的平均付費額度。
ARPPU=總收入/活躍用戶付費數量
因爲本數據集中沒有消費金額,因此在計算過程中用消費次數代替消費金額
人均消費次數=消費總次數/消費人數

data_use_buy1=data[data['behavior_type']==4].groupby(['date','user_id'])['behavior_type'].count().reset_index().rename(columns={'behavior_type':'total'})
data_use_buy1

在這裏插入圖片描述

data_use_buy1.groupby('date').apply(lambda x:x.total.sum()/x.total.count()).plot()
plt.title('daily_ARPPU')

在這裏插入圖片描述
圖表顯示:平均每天消費次數在1-2次之間波動,雙十二期間消費次數達到峯值。

(3)日ARPU
ARPU(Average Revenue Per User) :平均每用戶收入,可通過 總收入/AU 計算得出。它可以衡量產品的盈利能力和發展活力。
活躍用戶數平均消費次數=消費總次數/活躍用戶人數(每天有操作行爲的爲活躍)

data['operation']=1
data_use_buy2=data_user.groupby(['date','user_id','behavior_type'])['operation'].count().reset_index().rename(columns={'operation':'total'})
data_use_buy2

在這裏插入圖片描述

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')

在這裏插入圖片描述
圖表顯示,淘寶活躍用戶(有過操作行爲的用戶)平均每天消費次數比較低,在0.075次左右,雙十二期間達到最高值,有0.225左右。
(4)付費率
付費率=消費人數/活躍用戶人數

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')

在這裏插入圖片描述
圖表顯示:每天活躍用戶人羣中,大概6%的用戶具有消費行爲,在雙十二期間消費用戶人數最多。
(5)同一時間段用戶消費次數分佈

data_user_buy3=data[data.behavior_type==4].groupby(['user_id','date','hour'])['operation'].sum().rename('buy_count')
data_user_buy3

在這裏插入圖片描述

sns.distplot(data_user_buy3)
print('大多數用戶消費:{}次'.format(data_user_buy3.mode()[0]))

在這裏插入圖片描述

七、復購情況分析

復購情況,即兩天以上有購買行爲,一天多次購買算一次
復購率=有復購行爲的用戶數/有購買行爲的用戶總數

date_rebuy=data[data['behavior_type']==4].groupby('user_id')['date'].apply(lambda x:len(x.unique())).rename('rebuy_count')
date_rebuy

在這裏插入圖片描述

print('復購率:',round(date_rebuy[date_rebuy>=2].count()/date_rebuy.count(),4))
sns.distplot(date_rebuy-1)

在這裏插入圖片描述

#所有復購時間間隔消費次數分佈
data_day_buy=data[data.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')

在這裏插入圖片描述

#不同用戶平均復購時間分析
sns.distplot(data_user_buy4.reset_index().groupby('user_id').date.mean())

在這裏插入圖片描述
不同用戶平均復購時間呈正態分佈,但是總體來看,呈現逐漸下降趨勢。多數淘寶用戶平均復購時間集中在1-5天時間間隔內。

八、漏斗流失分析

漏斗分析是一套流程式數據分析,它能夠科學反映用戶行爲狀態以及從起點到終點各階段用戶轉化率情況的重要分析模型。
在這裏插入圖片描述

data_user_count=data.groupby(['behavior_type']).count()
data_user_count.head()
pv_all=data['user_id'].count()
print(pv_all)

在這裏插入圖片描述

pv_all=data['user_id'].count()
print(pv_all) #1048575

總瀏覽量—點擊量 流失率:5.79%
[(1048575-987911)/1048575]
點擊量-加入購物車量 流失率:97.02%
[(987911-29427)/29427]
加入購物車量-收藏量 流失率:28.65%
[(29427-20997)/20997]
收藏量-購買量 流失率:51.23%
[(20997-10240)/10240]
通過流失率情況的計算和分析,重視每一環節流失率可能發生的情況。

九、用戶行爲與商品種類關係分析

#不同用戶行爲類別的轉化率
data_category=data[data.behavior_type!=2].groupby(['item_category','behavior_type']).operation.count().unstack(1).rename(columns={1:'點擊量',3:'加入購物車量',4:'購買量'}).fillna(0)
data_category.head()

在這裏插入圖片描述

#轉化率計算
data_category['轉化率']=data_category['購買量']/data_category['點擊量']
data_category.head()

在這裏插入圖片描述

#異常值處理
data_category=data_category.fillna(0)
data_category=data_category[data_category['轉化率']<=1]
#轉化率繪圖
sns.distplot(data_category['轉化率'])

在這裏插入圖片描述

sns.distplot(data_category[data_category['轉化率']>0]['轉化率'],kde=False)

在這裏插入圖片描述
圖表顯示:基本上各種用戶行爲類型轉換率都在0.1以內,同時絕大多數用戶都沒有購買情況,需要重點關注出現該現象的原因進行分析改進。

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)

圖表顯示:感興趣率和轉化率類似,基本也是0.1以內,說明用戶點擊的絕大多數商品並非感興趣,需要重視推薦系統的調整。

##將轉化率分三類查看各類佔比例
data_convert_rate=pd.cut(data_category['轉化率'],[-1,0,0.1,1]).value_counts()
data_convert_rate=data_convert_rate/data_convert_rate.sum()
data_convert_rate
#輸出結果
(-1.0, 0.0]    0.708268
(0.0, 0.1]     0.255443
(0.1, 1.0]     0.036289
Name: 轉化率, 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.539153
(-1.0, 0.0] 0.390855
(0.1, 1.0] 0.069992
Name: 感興趣比例, dtype: float64

圖表顯示:轉化率達到0.1以上僅僅只有3.6%的用戶,有超過70%的用戶幾乎不會發生購買行爲。同時從感興趣比率來看:有40%的用戶對商品不感興趣。

十、二八理論分析

二八定律:在任何一組東西中,最重要的只佔其中一小部分,約20%,其餘80%儘管是多數,卻是次要的,因此又稱二八定律。

#二八理論和長尾理論
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.3043920%    0.69561
Name: 分類, dtype: float64

圖表顯示:前80%銷量有30%左右的商品品類承包,接近二八原則。但我們也看出有接近20%的銷量由70%的商品品類提供。

對於傳統零售行業,因爲成本高,因此只能侷限於這前20%的商品提供利潤;

對於電子商務,空間成本減少乃至爲0,使後80%的商品也可以銷售出去,因此將長尾部分的商品優化推薦好,能夠給企業帶來更大的收益。

十一、用戶價值度RFM模型分析

RFM的含義:
R(Recency):客戶最近一次交易時間的間隔。R值越大,表示客戶交易發生的日期越久,反之則表示客戶交易發生的日期越近。
F(Frequency):客戶在最近一段時間內交易的次數。F值越大,表示客戶交易越頻繁,反之則表示客戶交易不夠活躍。
M(Monetary):客戶在最近一段時間內交易的金額。M值越大,表示客戶價值越高,反之則表示客戶價值越低。
RFM分析就是根據客戶活躍程度和交易金額的貢獻,進行客戶價值細分的一種方法。
在這裏插入圖片描述

from datetime import datetime
datenow=datetime(2014,12,20)
#每位用戶最近購買時間
recent_buy_time=data[data.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[data.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')
#將各維度分成兩個程度,分數越高越好
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()

在這裏插入圖片描述
表格顯示:因爲本數據集沒有提供消費金額,因此只能R和F進行用戶價值分析,通過RF用戶價值分析,對於22用戶,爲重點用戶需要關注;對於21這類忠誠度高而購買能力不足的,可以可以適當給點折扣或捆綁銷售來增加用戶的購買頻率。對於12這類忠誠度不高而購買能力強的,需要關注他們的購物習性做精準化營銷。

發佈了14 篇原創文章 · 獲贊 2 · 訪問量 324
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章