利用Python实现用户群组分析!
本文中介紹的是一種數據分析方法:群組分析Cohort Analysis。
群組分析是用于研究用戶行為和提高增長的分析思路。在本文中,將結合一個數據集利用Python來實現該分析方法。
本文數據集下載地址:
https://www.kaggle.com/mkechinov/ecommerce-events-history-in-cosmetics-shop
一、什么是群組分析
群組分析Cohort Analysis,重點就是群/組,它是一種利用用戶分層和用戶建模的方法,主要分析的是相同用戶群體隨著時間延續的變化發展情況。
我們需要將獲取到的全部用戶分成一個個的組或者簇群,這樣的群或組的分層方式可以是日期、渠道或者其他特定的用戶為來劃分。總之,我們可以按照實際的需求和維度來進行用戶分層。
通過群組分析,我們可以看到不同組別的留存情況。群組分析Cohort Analysis圖表和留存曲線是最常用的留存工具。這些圖表主要是告訴我們用戶在我們產品的中的參與度如何,留存率是怎樣的情況,同時還可以分析用戶新增速度是否達到我們的要求。
目前市面上很多的BI工具都可以繪制群組分析的圖表和留存曲線,比如GrowingIO、神策大數據系統、PowerBI等。但是,如果想自定義一些分組或分群的維度,使用Python也是不二選擇。
二、Cohort 分析使用場景
用戶留存率分析
用戶流失率分析
用戶轉化率分析
廣告轉化率分析
上面是很常見的使用場景,還可以進行其他場合的延伸,比如電商網站用戶的交易支付數據,不同周期內獲取的用戶在交易頻次、客單價等的比較分析
三、用戶留存
用戶留存指的是隨著時間延續,用戶在某個周期內的存在情況。為什么要看留存?
了解一個渠道的質量:通常是日留存,衡量用戶的短期活躍情況
觀察整體的情況:用周留存或者月留存,衡量用戶在平臺上的黏性
留存又分為次日留存、7日留存、14留存等。下面通過一個案例來說明常見的7日留存計算規則。
問題:如何計算產品的7日留存?
3.1 算法1-7日日留存
第一種算法是:第7天活躍人數 / 第1天活躍人數 * 100%
3.2 算法2-7日內留存
第二種算法是:第2天~第7天去重后/第1天*100%
3.3 算法3-不同定義的7日日留存
上面的算法1中是把當前日直接記為Day1,還有一種計算方法將當前日當做Day0,然后再開始計算;
舉例說明一下算法3的使用,比如DAU=10剛好是星期2產生的數據:
如果使用算法1,7日日留存=下周1的數據/本周2的數據(10)
如果使用算法2,7日日留存=下周2的數據/本周2的數據(10)
說明:算法3在一定程度上能夠巧妙避開星期級別的影響
3.4 3種留存算法比較
四、本文數據
4.1 導入數據
本文中使用的一份數據集是從kaggle下載,主要是包含事件發生時間、類型(閱覽、加購、移除購物車和購買)、產品ID、分類ID、產品編碼、品牌、價格、用戶ID、用戶會話,總共7個屬性
import?numpy?as?np? import?pandas?as?pd? import?datetime?as?dt?import?matplotlib.pyplot?as?plt import?seaborn?as?sns#設置漢字格式:Trebuchet MS, Tahoma, Verdana, Arial, Helvetica,SimHei 中文的幼圓、隸書等等#?解決中文無法顯示問題 plt.rcParams['font.sans-serif']=['Songti?SC']??? #?解決保存圖像中負號'-'顯示為方塊問題 plt.rcParams['axes.unicode_minus']?=?False4.2 數據探索
主要查看的是數據類型、數據的行列數看大小、數據的缺失值情況
df.dtypes??#?數據類型#?結果 event_time????????object event_type????????object product_id?????????int64 category_id????????int64 category_code?????object brand?????????????object price????????????float64 user_id????????????int64 user_session??????object dtype:?objectdf.shape??#?數據的行列數 #?結果 (3533286,?9)df.isnull().sum()???#?字段缺失值情況 #?結果 event_time?????????????0 event_type?????????????0 product_id?????????????0 category_id????????????0 category_code????3474821????#?缺失值嚴重 brand????????????1510289 price??????????????????0 user_id????????????????0 user_session?????????779 dtype:?int64五、數據清洗
主要操作是挑選數據中價格大于和去重操作:
六、數據處理
在本文的案例中,群組分析是按照首次訪問的時間和每次的訪問來計算時間間隔,從而來計算留存情況,具體步驟為:
計算每個用戶的首次訪問時間min_day
記錄后續每次訪問時間和首次訪問時間的間隔day_gap
因為是12月份的電商數據,我們將一個月分成10份,時間周期為3天
因為上面的兩個因素都是和時間相關,所以必須導入Python中強大的datetime庫來處理時間處理的需求。
1、獲取event_time中的時間:年月日
def?get_time(datetime):"""函數作用:獲取時間中的年月日"""event_time?=?datetime.strip("?UTC")??#?傳進來的參數去掉?UTC部分#?dt表示datetime庫event_time?=?dt.datetime.fromisoformat(event_time)??#?生成一個YYYY-MM-DD的date對象y?=?dt.date(event_time.year,event_time.month,event_time.day)??#?取出年月日return?ydf2["event_day"]?=?df2["event_time"].apply(get_time) df22、根據每個用戶user_id來確定最早時間
#?用戶本月的最早登陸時間確定 grouping?=?df2.groupby("user_id")["event_day"] groupingdf2["min_day"]?=?grouping.transform("min") df2.head()3、計算訪問日event_day和最早訪問時間的間隔
#?計算用戶當日訪問event_day和最早訪問時間min_day之間的時間間隔 #?3為假定的用戶分組訪問周期df2["day_gap"]?=?(((df2["event_day"]?-?df2["min_day"])?//?3)?+?dt.timedelta(days=1)).apply(lambda?x:x.days) df24、按照首次訪問時間和時間間隔來統計用戶數
#??按照首次訪問時間和下一次訪問的間隔,統計用戶數 grouping1?=?df2.groupby(["min_day","day_gap"])#?根據用戶user_id去重統計每個組的用戶數 # grouping1["user_id"].apply(pd.Series.nunique):展示去重的總個數 #?grouping1["user_id"].apply(pd.Series.unique):?展示去重之后的具體元素 df3?=?grouping1["user_id"].apply(pd.Series.nunique).reset_index() df3.head()上面表中的數據表示的是和當前的時間間隔分別為1,2,3…的人數分別為17519,2591,2276等
5、生成數據透視表
有了上面分組統計的數據,我們可以生成透視表
#?數據透視部分 df4?=?df3.pivot(index="min_day",columns="day_gap",values="user_id") df4.head()6、改變數據形式:方便最終使用百分比顯示數據
一般情況下,我們習慣用百分比來表示用戶的留存,很清晰地看到用戶的留存比例。首先我們取出第一列的數據(全部行):
后面每個數據除以相應日期的第一個數據:
#?divide?函數 table?=?df4.divide(size,axis=0)??#?在行的方向上除以對應size中的值 table.head()保留3位小數,同時改變數據table的索引值:
#?保留3位小數并乘以100 table.round(3)?*?100#?索引重置,只取出年月日,后面的時分秒取消 table.index?=?table.index.date群組分析繪圖
繪制群組分析留存熱力圖:
#?解決中文無法顯示問題 plt.rcParams['font.sans-serif']=['Songti?SC']??? #?解決保存圖像中負號'-'顯示為方塊問題 plt.rcParams['axes.unicode_minus']?=?False??plt.figure(figsize=(15,8)) plt.title("群組分析留存圖")sns.heatmap(data=table,annot=True,fmt='.0%',vmin?=?0.0,vmax?=?0.2,cmap="BuPu_r") plt.show()從上面的數據中我們可以看到:前6天的留存情況還是很漂亮(顏色較淺,留存率相對較高)。
可能原因是這是整個12月份的全量數據,導致了多數的活躍用戶會被歸類為月初前幾天的新增活躍用戶。但是數據整體上到了月末,留存占比還是較少,月留存情況并不可觀。
-?END -
對比Excel系列圖書累積銷量達15w冊,讓你輕松掌握數據分析技能,可以在全網搜索書名進行了解:總結
以上是生活随笔為你收集整理的利用Python实现用户群组分析!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《魔兽世界怀旧服》密封的蓝袋子任务怎么做
- 下一篇: Excel中的单元格里换行与换行符