mysql复购率_Mysql与Pyhton实现复购率和回购率
一、復購率
復購率:一段時間內,購買2次及以上客戶人數,占該時間段內購買過的總人數的比重。
例如:一個月以內,購買該商品超過兩次的人有50個人,一個月內買過該商品的人有100個人,該月內復購率就是50%。復購率計算是要剔除那些沒有該買一次的客戶。
1) python實現復購率
1.建立pivot_table,index為user_id,columns為月份,value為order_dt(其他只要代表消費的字段都可以),aggfunc='count'。這里的月份是已經轉化成為月的值了,
df['month']=df.order_date.values.astype('datetime64[M]')
pivot_table可以實現兩列不重復的字段繪制成表格,可以對表中的值進行聚合操作。和excel有點像。
關于pivote_table:pivote_table
pivoted_counts=df.pivot_table(index='user_id',columns='month',
values='order_dt',aggfunc='count').fillna(0)
#columns_month=df.month.sort_values().astype('str').unique()
pivoted_counts.head()
結果.png
2、計算購買次數>=2的客戶,這里利用的是applymap,將值進行判斷轉化。
applymap函數沒有elif,所以要用兩次if else。如果是0,則是NaN,這樣在count的時候就不會計算進去了。
pivoted_counts_transf=pivoted_counts.applymap(lambda x:1 if x>1
else np.NaN if x==0
else 0)
'''這里是如果購買次數大于1,則計數1;若沒有購買則為NaN;\
購買一次,計數為0'''
pivoted_counts_transf.head()
結果2.png
3、最后進行計算。按照columns取出當月的sum,除以當月的count。
pivoted_counts_transf.sum()/pivoted_counts_transf.count()
image.png
2) mysql實現復購率
首先加一列為月度數據:
select date_format(order_dt,'%Y-%m-01')
篩選出每個月的order_dt的數量,用月份和order_id去group
select order_id,date_format(order_dt,'%Y-%m-01') ordermonth,count(order_dt) c from mmy.cd
group by order_id,ordermonth;
結果.png
這里面的所有購買都是至少一次,因為我們是從月份去選取,如果為0就不會出現這個值了,所以不需要過濾。
再通過這個子查詢,用條件if來選出符合條件的個數,如果不符合就是null,就不會記錄到count里面,同時將其除以當月的總數。這里不用where是因為where會過濾掉不符合條件的日期,這樣計算的count(c)就不是總數了。
這里cast(column as decimal(4,4))是設置數值的格式。
select ordermonth,count(if(c>1,1,null)),cast(count(if(c>1,1,null))/count(c) as decimal(4,4)) as '復購率' from (
select order_id,date_format(order_dt,'%Y-%m-01') ordermonth,count(order_id) c from mmy.cd
group by order_id,ordermonth) d
group by ordermonth
order by ordermonth;
image.png
結果如上圖所示,發現算出來和python算出來的是一致的。
二、回購率
回購率:在一定時間段內,購買的過的客戶在下一個時間段內還會購買的比例。例如:1月消費用戶1000個,他們中有300個2月依然消費,回購率是30%。與復購率的區別是兩個時間窗口,而復購率是一個時間窗口的多次購買行為。
Mysql實現:
思路:
首先建立一個臨時表,和復購率一樣,將月度數據的格式整理一下date_format,然后按照不同的客戶、不同的月度數據進行分組。
然后我們要兩次用到這張臨時表,需要內部join一次,然后利用DATE_SUB函數找到間隔為1月的數據,其實這個時候用where進行過濾表格,再用count找到每個月的符合回購行為的人數,就可以直接算出每個月的回購人數。代碼如下:
with t0 as (select order_id,date_format(order_dt,'%Y-%m-01') t from mmy.cd
group by order_id,t)
select A.t,count(A.t) as '回購人數'
from t0 A
join t0 B
on A.order_id=B.order_id
where A.t=DATE_SUB(B.t,interval 1 month)
group by A.t
order by A.t;
回購人數
如果要求回購率,直接算出來百分比的話,還是要利用if函數,不能用where過濾,因為過濾之后進行count就不能得到所有當月購物的人數總數了。
這里還是利用count(if(A.t=DATE_SUB(B.t,interval 1 month),1,null))進行條件篩選。
而被除數記得要distinct一下,因為我們join的表格是有多個相同的order_id的行,需要去重。代碼如下:
with t0 as (select order_id,date_format(order_dt,'%Y-%m-01') t from mmy.cd
group by order_id,t)
select A.t,count(if(A.t=DATE_SUB(B.t,interval 1 month),1,null)) as '重復購買的人',
count(if(A.t=DATE_SUB(B.t,interval 1 month),1,null))/count(distinct A.order_id) as '回購率'from t0 A
join t0 B
on A.order_id=B.order_id
group by A.t
order by A.t;
回購率
python實現下次補充,先把結果放在這,與mysql差不多:
python實現回購率的結果
為什么有一點區別,是因為這張表格有些事order_product不為0,但是amount為零,所以我在做python的時候是以amount金額不為零認為該用戶有沒有消費的,而不是order_dt等,所以有一點區別。
amount為0的結果.png
總結
以上是生活随笔為你收集整理的mysql复购率_Mysql与Pyhton实现复购率和回购率的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: android 彻底 关 亮度,Andr
- 下一篇: IP地址转换函数 inet_pton、i
