實戰:淘寶app SQL分析 + Excel可視化

分析框架:

 

數據集下載:天池競賽中有。

數據集網址:https://tianchi.aliyun.com/dataset/dataDetail?dataId=649&userId=1

將下載到的csv文件導入到mysql數據庫,請讀者自行百度。

正文:

拿到數據,先看一眼數據長啥樣,是否有null值,什麼樣的數據類型;

select * from tianchi_mobile_recommend_train_user limit 10;

user_id:用戶唯一標識

item_id:商品標識

behavior_type:用戶對商品行爲類型,{1,瀏覽;2,收藏;3,加入購物車;4,購買}

user_geohash:用戶位置空間標識,由經緯度通過保密算法生成

item_category:商品分類標識

time:行爲時間,精確到小時

說明:用戶位置空間大多爲null,難以補充和研究,本例不做地理分析;
商品分類暫時不做分析;

數據範圍:從2014年11月18號~2014年12月18號淘寶APP一個月的行爲數據;

select max(time),min(time) from tianchi_mobile_recommend_train_user;

 

select count(user_id) as pv,count(distinct user_id) as uv,count(distinct user_id) / count(user_id) as 'uv/pv'
from tianchi_mobile_recommend_train_user 
where behavior_type=1;

pv:統計週期內頁面瀏覽次數(不去重)

uv:統計週期頁面訪問用戶數(去重)

pv/uv:1155;平均每1155次瀏覽對應一個用戶。對比大盤,歷史基線看這個數據是否可以優化提高;

select count(user_id)
from ( select user_id
from tianchi_mobile_recommend_train_user
group by user_id
having count(behavior_type)=1 ) as A;
where 後不能接單行函數,而having可以;having要跟在group by後使用,對分組後數據執行篩選(一般用單行函數,比如計數,平均等);
子查詢給表起別名A是必須的,否則報語法錯誤!
count後不能有空格,真的煩唉;

查詢結果爲4,意味着只有4個用戶在30天內只瀏覽了頁面,佔比4/10000=0.04%(頁面跳失率=只點擊一次瀏覽的用戶數/總用戶數);說明淘寶app的粘性很大。

提問:如果將上述語言改爲以下,將會發生什麼?

select count(user_id)
from tianchi_mobile_recommend_train_user
group by user_id
having count(behavior_type)=1 

學會一個套路:

先篩選滿足條件的字段建立一個子查詢,然後對子查詢執行計數,平均等操作。

接下來對用戶行爲進行分析

評價各功能佔比:

select behavior_type,count(distinct user_id)
from tianchi_mobile_recommend_train_user
group by behavior_type;

瀏覽是用戶進入淘寶的第一交互,而第二個交互是收藏,加入購物車,還是直接購買,從數據上看都是可以的,也符合業務邏輯(比如小編本人拿到工資的時候,瀏覽--購買;等錢花的差不多的時候,就是瀏覽--加入購物車---(有錢後)購買)。

進入淘寶app的10000個用戶中,67.3%的用戶選擇了收藏,86.1%的用戶選擇了加入購物車,89%的用戶完成了購買。

進行路徑分析

不區分時間

select behavior_type,count( user_id)
from tianchi_mobile_recommend_train_user
group by behavior_type;

沒有去除重複值,統計的是點擊次數(一個人可以點擊多次);瀏覽次數11550581,收藏次數343564(收藏/佔比=2.9%),購物車次數242556(購物車/瀏覽=2.1%),下單次數120205(下單/瀏覽=1%)。

select count(distinct t1.user_id),count(distinct t2.user_id),count(distinct t3.user_id),count(distinct t4.user_id)
from (
select distinct user_id 
from tianchi_mobile_recommend_train_user
where behavior_type=1
)t1
left join (
	select distinct user_id
	from tianchi_mobile_recommend_train_user
	where behavior_type=2
)t2 on t1.user_id=t2.user_id
left join (
	select distinct user_id,
	from tianchi_mobile_recommend_train_user
	where behavior_type=3
)t3 on t2.user_id=t3.user_id
left join (
	select distinct user_id 
	from tianchi_mobile_recommend_train_user
	where behavior_type=4
)t4 on t3.user_id=t4.user_id

此爲漏斗模型,業務中經常使用left join統計漏斗數據---基於前端埋點。

漏斗模型畫法請讀取自行百度

對漏斗的說明:統計週期內,10000名瀏覽用戶中,有6730名用戶完成了收藏(完成一次就記錄,實際上可能同一用戶多次點擊收藏),收藏用戶中有6020名用戶添加了購物車,添加購物車用戶中有5730名用戶完成下單。下單率(完成下單用戶/進入app瀏覽用戶)爲57.3%。

不同時間尺度下的用戶行爲路徑分析

最開始我是這樣寫的,

select t1.date,count(distinct t1.user_id),count(distinct t2.user_id),count(distinct t3.user_id),count(distinct t4.user_id)
from (
select distinct user_id ,DATE_FORMAT(time,'%Y-%m-%d') as date
from tianchi_mobile_recommend_train_user
where behavior_type=1
)t1
left join (
	select distinct user_id,DATE_FORMAT(time,'%Y-%m-%d') as date
	from tianchi_mobile_recommend_train_user
	where behavior_type=2
)t2 on t1.user_id=t2.user_id
and t1.date=t2.date
left join (
	select distinct user_id,DATE_FORMAT(time,'%Y-%m-%d') as date
	from tianchi_mobile_recommend_train_user
	where behavior_type=3
)t3 on t2.user_id=t3.user_id
and t2.date=t3.date
left join (
	select distinct user_id,DATE_FORMAT(time,'%Y-%m-%d') as date
	from tianchi_mobile_recommend_train_user
	where behavior_type=4
)t4 on t3.user_id=t4.user_id
and t3.date=t4.date
GROUP BY t1.date
ORDER BY t1.date

12256906行*6列然後3個left join的數據用一臺16G的筆記本電腦想跑出結果---不存在的!(跑了20分鐘,沒出結果的我不想等了)。

代碼的原意是按天做漏斗,比如看2018-12-12這一天有多少用戶瀏覽,瀏覽的用戶中有多少收藏,收藏的用戶中有多少添加購物車,添加購物車的用戶中有多少願意下單。

月維度的用戶行爲分析

select DATE_FORMAT(time,'%Y-%m-%d'),sum(case when behavior_type=1 then 1 else 0 end ) as '瀏覽次數',
sum(case when behavior_type=2 then 1 else 0 end ) as '收藏次數',
sum(case when behavior_type=3 then 1 else 0 end) as '購物車次數',
sum(case when behavior_type=4 then 1 else 0 end) as '購買次數'
from tianchi_mobile_recommend_train_user
group by DATE_FORMAT(time,'%Y-%m-%d')
ORDER BY DATE_FORMAT(time,'%Y-%m-%d')

這個語句22s出結果。
實現的需求:知道某天有多少瀏覽量,多少收藏量,多少添加購物車,多少下單。
導出時注意設置格式。

從圖中發現:2014-12-12這天,各項指標都達到了高峯。背後原因是淘寶平臺雙十二做活動,拉高了各項指標。

其中,下單次數環比昨日上漲373%,添加購物車次數環比昨日上漲56.7%,收藏次數環比昨日上漲12.2%,瀏覽次數環比昨日上漲39.4%。活動當天,下單漲幅最大,是因爲很多用戶提前看好了產品,等活動上線就開買;收藏漲幅最低,是因爲用戶使用收藏的心理預期是下次再看看,這次不再自己購買物品清單內,優先級是最低的;添加購物車漲幅度也很大,是因爲用戶添加購物車可以使用批量付款的原因,這樣可以節省用戶的購買時間。四項指標中圍繞付款的瀏覽,添加購物車,下單都得到了較大的漲幅,只有收藏於下單相背離,漲幅較爲平穩。

建議:對用戶收藏的商品sku進行推薦,在雙十二活動結束後一週,二週密集推動高關聯商品sku,促進收藏商品下單轉化率。

分析框架:what---why--action模式。新手,老油子的區別就在於新手只會描述,老油子可以提出有洞察性的建議。

周維度的用戶行爲分析

我們取雙十二所在周,與雙十二之前相距較遠一週2014-11-24~2014-11-30對比分析

對比二三象限,平常周(三象限)週五是各項指標最低的時間點,雙十二(二象限)恰好在週五各項指標“逆風翻盤”。

對比一四象限,瀏覽次數、添加購物車次數、收藏次數同比周一~週日,各項指標都有所增加,雙十二週五瀏覽次數、添加購物次數同比它週週五強勢上漲;可見雙十二活動,提升當週其它時間點的效果還是很顯著的,背後體現的邏輯就是用戶在爲雙十二當天活動做前期準備;

從下單用戶上看,雙十二當週同比其它周,除了週五強勢上漲,其它時間都處於下跌的趨勢並且下單次數不如其它周;這從數據上解釋了雙十二的“下單吸血效應“現象是存在的。

對於一四象限本打算合成一張圖像,通過設置主次座標軸可以實現,但會造成一個視覺誤差:添加購物車次數曲線在瀏覽次數之上。---實際上,換算成百分比指標看趨勢效果會好些。

小時維度的用戶行爲分析

select hour(time),sum(case when behavior_type=1 then 1 else 0 end ) as '瀏覽次數',
sum(case when behavior_type=2 then 1 else 0 end ) as '收藏次數',
sum(case when behavior_type=3 then 1 else 0 end) as '購物車次數',
sum(case when behavior_type=4 then 1 else 0 end) as '購買次數'
from tianchi_mobile_recommend_train_user
where DATE_FORMAT(time,'%Y-%m-%d')='2014-12-12'
group by hour(time)
ORDER BY hour(time)

從圖中可以發現,四個指標趨勢一致;其中,雙十二當天零點,瀏覽、添加購物車、下單達到峯值A,此後持續到2點到B開始急劇下降,2~6點是各指標低谷;從6點開始上漲直到10點達到均衡B,10點到19點維持凌晨兩點級別的均衡B;19點之後開始上漲直到22點達到0點級別的峯值A,此後從22點到24點維持均衡A。

這條數據洞察與我們的生活作息規律是強相關的。

基於RFM模型尋找最有價值用戶

由於數據集中沒有消費金額這列數據,就只能找R(最近一次購買時間間隔),F(購買頻率)來尋找最有價值用戶!

關於R

統計週期爲1個月,最近購買時間區間1-30,將其分爲五檔,0-6,7-12,13-18,19-24,25-30分別對應0-4分

create view pay_b as 
select user_id,DATEDIFF(max(DATE_FORMAT(time,'%Y-%m-%d')),min(DATE_FORMAT(time,'%Y-%m-%d'))) as b--每一個用戶極端點購買時間之差
from tianchi_mobile_recommend_train_user 
where behavior_type=4
group by user_id;

select user_id,
(case when b BETWEEN 25 and 30 then 0
			when b BETWEEN 19 and 24 then 1
			when b BETWEEN 13 and 28 then 2
			when b BETWEEN 7 and 12 then 3
			when b BETWEEN 0 and 6 then 4
			else null
			end ) as R
from pay_b
order by R desc;

關於F

select min(a),max(a)
from (
select count(distinct time)  as a
from tianchi_mobile_recommend_train_user
where behavior_type=4
group by user_id
) as A;

訂單用戶消費次數從低到高爲1-227次,分爲五檔,1~45,46~90,91~136,137~182,183~227分別對應0-4

create view pay_a as 
select user_id,count(distinct time) as a
from tianchi_mobile_recommend_train_user 
where behavior_type=4
group by user_id;

select user_id,
(case when a BETWEEN 1 and 45 then 0
			when a BETWEEN 46 and 90 then 1
			when a BETWEEN 91 and 136 then 2
			when a BETWEEN 137 and 182 then 3
			when a BETWEEN 183 and 227 then 4
			else null
			end ) as F
from pay_a
order by F desc;

合併RFM得到:

select t1.user_id,t1.R,t2.F
from (
 select user_id,
(case when b BETWEEN 25 and 30 then 0
			when b BETWEEN 19 and 24 then 1
			when b BETWEEN 13 and 28 then 2
			when b BETWEEN 7 and 12 then 3
			when b BETWEEN 0 and 6 then 4
			else null
			end ) as R
from pay_b
)t1
inner join (
select user_id,
(case when a BETWEEN 1 and 45 then 0
			when a BETWEEN 46 and 90 then 1
			when a BETWEEN 91 and 136 then 2
			when a BETWEEN 137 and 182 then 3
			when a BETWEEN 183 and 227 then 4
			else null
			end ) as F
from pay_a
)t2
on t1.user_id=t2.user_id
group by t1.user_id
order by t1.R desc, t2.F desc

我們儘量選擇R,F分數靠前的用戶作爲優質用戶,然後拉活動,做投放,但要注意小成本試錯,先小範圍試點,再全量推廣;

對於R爲4,F爲0的用戶,用戶消費時間間隔短而付費次數少,運營活動可以重點針對這部分用戶,比如拼團打折,積分兌換,喚起這部分的購買熱情。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章