R語言數據分析筆記——Cohort 留存分析
相信經常做數據分析的小夥伴兒對Cohort 分析都很熟悉,特別是互聯網數據分析與運營中,用於分析客戶存留等場景,以往這種分析大都藉助SQL+Excel完成。
最近在嘗試學習 Cohort 用戶存留分析時,找到了國外一個數據分析愛好者留下的Cohort 存留分析Python版完整代碼,並且很良心的提供了練習數據,作為一個R比Python要熟練的菜鳥分析師,自然是首先想到如何把這個代碼翻譯成R版本。
http://www.gregreda.com/2015/08/23/cohort-analysis-with-python/
終於功夫不負有心人,忙活了一天用R語言還原了Cohort分析過程,這裡分享給大家,代碼拙劣之處,敬請見諒,只是一個demo,還沒有做封裝。
library(xlsx)library(ggplot2)library(dplyr)library(magrittr)library(tidyr)library(reshape2)
1、數據導入:
setwd("D:/R/File/")df <- read.xlsx(relay-foods.xlsx, sheetName = Purchase Data)
2、數據清洗:
存留分析使用到的欄位只有用戶購買日期、用戶ID等信息,分析月度存留,需要將日期規範化成年月形式,同時按照客戶id分組,計算出用戶首次購買的日期,代碼如下:
2.1 創建購買月份欄位
df$OrderPeriod = format(df$OrderDate,%Y-%m) #購買日期
2.2 創建用戶首次購買欄位
CohortGroup = df %>% group_by(UserId) %>% summarize( CohortGroup = min(OrderDate)) #計算用戶首購日期CohortGroup$CohortGroup <- CohortGroup$CohortGroup %>% format(%Y-%m) df <- df %>% left_join(CohortGroup,by = UserId) #將首購日期與原始訂單表合併對齊
2.3 分組(按照首購日期、購買日期)計算總用戶數、總訂單數、總支付金額(用戶ID要去重)
chorts <- df %>% group_by(CohortGroup,OrderPeriod) %>% summarize( UserId = n_distinct(UserId), OrderId = n_distinct(OrderId), TotalCharges = sum(TotalCharges) ) %>% rename(TotalUsers= UserId , TotalOrders = OrderId)
2.4 按照用戶首購日期分組並根據各個首購日期內的購買日期順序添加順序標籤
chorts <- chorts %>% arrange(CohortGroup,OrderPeriod) %>% group_by(CohortGroup) %>% mutate( CohortPeriod =row_number())
3、計算當月購買用戶數
cohort_group_size <- chorts %>% filter(CohortPeriod == 1) %>% select(CohortGroup,OrderPeriod,TotalUsers)user_retention <- chorts %>% select(CohortGroup,CohortPeriod,TotalUsers) %>% spread(CohortGroup,TotalUsers) #長錶轉換為寬表#將具體用戶數換算為占基準月份比率user_retention[,-1] <- user_retention[,-1] %>% t() %>% `/`(cohort_group_size$TotalUsers) %>% t() %>% as.data.frame()
寬錶轉為長表
user_retention1 <- user_retention %>% select(1:5) %>% melt( id.vars = CohortPeriod, variable.name = CohortGroup, value.name = TotalUsers )
4、存留曲線
ggplot(user_retention1,aes(CohortPeriod,TotalUsers)) + geom_line(aes(group = CohortGroup,colour = CohortGroup)) + scale_x_continuous(breaks = 1:15) + scale_colour_brewer(type = div)
這裡的留存曲線展示了2009-01~2009~04四個月份的用戶留存趨勢!
最終的存留熱力圖數據源:
user_retentionT <- t(user_retention) %>% .[2:nrow(.),] %>% as.data.frameuser_retentionT$CohortPeriod <- row.names(user_retentionT)row.names(user_retentionT) <- NULLuser_retentionT <- user_retentionT[,c(16,1:15)]user_retentionT1 <- user_retentionT %>% melt( id.vars = CohortPeriod, variable.name = CohortGroup, value.name = TotalUsers )
5、存留分析熱力圖:
library("Cairo")library("showtext")font_add("myfont","msyh.ttc")CairoPNG("C:/Users/RAINDU/Desktop/emoji1.png",1000,750)showtext_begin()ggplot(user_retentionT1 ,aes(CohortGroup,CohortPeriod,fill=TotalUsers))+ geom_tile(colour=white) + geom_text(aes(label = ifelse(TotalUsers != 0,paste0(round(100*TotalUsers,2),%),)),colour = blue) + scale_fill_gradient2(limits=c(0,.55),low="#00887D", mid =yellow, high="orange",midpoint = median(user_retentionT1$TotalUsers, na.rm =TRUE),na.value = "grey90") + scale_y_discrete(limits = rev(unique(user_retentionT1$CohortPeriod))) + scale_x_discrete(position = "top")+ labs(title="XXX產品Chort留存分析",subtitle="XXX產品在2019年1月至2010年三月中間的留存率趨勢")+ theme( text = element_text(family = myfont,size = 15), rect = element_blank() )showtext_end()dev.off()
留存熱力圖橫軸是留存時間(用戶實際購買日期)、縱軸是用戶首次購買發生時間,橫向可以看到用戶首次購買在之後各留存月份的留存情況,縱向可以看出單個留存月份,來自不同首購月份的留存情況。
存留分析是互聯網數據分析和運用中經常會用到分析工具,本節的R代碼是源於篇首Python代碼的思路,大家可以對比兩者的優劣,作為今後分析使用的參考資料。
寫在最後:
最近上線的新課程——R語言數據可視化與商務圖表,感興趣的小夥伴兒可以了解一下~
課程詳情,請點擊此鏈接:或者點擊閱讀原文進入:
https://edu.hellobi.com/course/264
推薦閱讀:
※使用pandas_datareader包獲取股票交易數據
※走出迷茫——數據分析實踐計劃
※泰坦尼克號倖存者特徵分析
※0基礎包教會 | 數據分析環境搭建:jupyter配置python & r kernel
※數據分析師面試怎麼做