留存率計算

現(xiàn)有一份表格,記錄了用戶ID及其下單時間

我們使用navicat導入數(shù)據(jù)



選擇表格文件



選擇文件路徑

導入成功后,我們就可以正式開始了


首先,我們找出每個用戶的最小日期,即首次下單時間

select uid,min(date(time)) as mtime from active group by uid;

out:



接著,我們?nèi)ヒ幌轮?/p>

select DISTINCT uid,date(time) as t from active;

out:



關(guān)聯(lián)起來,由此我們可以得到用戶ID,下單時間,首次下單時間三個字段

select b.uid,b.t,a.mtime from 
(select uid,min(date(time)) as mtime from active group by uid) a,
(select DISTINCT uid,date(time) as t from active) b 
where a.uid=b.uid;

out:



然后我們可以求出1號的人在各個日期有多少人,這樣就很容易求出1號的次日留存率,3日留存率,4日留存率....
方法是按最小日期和下單時間分組

select mtime,t,count(uid) as c from 
(select b.uid,b.t,a.mtime from (select uid,min(date(time)) as mtime from active group by uid) a,(select DISTINCT uid,date(time) as t from active) b where a.uid=b.uid) d 
group by mtime,t;

out:



其實到這步我們已經(jīng)一目了然

如果時間差為1,則為次日留存人數(shù),為2,則為三日留存人數(shù),為6,則為七日留存人數(shù);次日留存人數(shù)/人數(shù),則為次日留存率

select mtime,sum(if(datediff(t,mtime)=0,c,0)) as '人數(shù)',
             sum(if(datediff(t,mtime)=1,c,0)) as '次日留存人數(shù)',
             sum(if(datediff(t,mtime)=2,c,0)) as '三日留存人數(shù)',
             sum(if(datediff(t,mtime)=6,c,0)) as '七日留存人數(shù)',
                         
             sum(if(datediff(t,mtime)=1,c,0)) /sum(if(datediff(t,mtime)=0,c,0)) as '次日留存率',
             sum(if(datediff(t,mtime)=2,c,0)) /sum(if(datediff(t,mtime)=0,c,0)) as '三日留存率',
             sum(if(datediff(t,mtime)=6,c,0)) /sum(if(datediff(t,mtime)=0,c,0)) as '七日留存率' 
                         
from (select mtime,t,count(uid) as c from (select b.uid,b.t,a.mtime from (select uid,min(date(time)) as mtime from active group by uid) a,(select DISTINCT uid,date(time) as t from active) b where a.uid=b.uid) d group by mtime,t order by mtime,t) f 
group by mtime;

out:


二、使用python

現(xiàn)有一份表,記錄了用戶ID,購買日期,購買數(shù)量,購買金額


數(shù)據(jù)源:https://pan.baidu.com/s/1pHa3KsS2IWg9ItSaehsgbw
提取碼:qza2
共69659條數(shù)據(jù),無缺失值

import pandas as pd

columns=['uid','time','order_products','order_amount']  #表頭為用戶ID,購買日期,購買數(shù)量,購買金額
df=pd.read_csv('CDNOW_master.txt',names=columns,sep='\s+')

我們只要用戶ID和下單時間這兩列信息,并且去重

#我們只要用戶ID和下單時間這兩列信息,并且去重
data=df[['uid','time']].drop_duplicates()
print(data.head())

out:



改時間列數(shù)據(jù)類型為時間

data['time']=pd.to_datetime(data['time'],format='%Y%m%d')    #修改時間列數(shù)據(jù)類型為時間
print(data.head())

out:



找出每個用戶的最小購買時間,即首次購買時間

#找出每個用戶的最小購買時間,即首次購買時間
data2=data['time'].groupby(data['uid']).min()
print(data2.head())

out:



把他們關(guān)聯(lián)起來,得到用戶ID,下單時間,首次下單時間

#把他們關(guān)聯(lián)起來,得到用戶ID,下單時間,首次下單時間
data3=pd.merge(data,data2,on='uid')
print(data3.head())
data3.columns=['uid','time','mtime']   #重命名列名

out:



計算留存人數(shù),按最小時間、下單時間分組

#計算留存人數(shù),按最小時間、下單時間分組
data4=data3.pivot_table('uid',index=['mtime','time'],aggfunc='count')
print(data4)

out:


現(xiàn)在我們可以清晰的看到1997-01-01的次日留存人數(shù)為3,留存率為3/209,三日留存人數(shù)為3,留存率為3/209,四日留存人數(shù)為2.......

#重置索引
data5=data4.reset_index()
print(data5)

out:



如果我們想看某一日的留存率,我們可以把它篩選出來

data6=data5[data5['mtime']=='1997-01-01']
print(data6)

out:


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容