資料分析方法——使用者群組分析

LS96發表於2020-12-26

資料分析方法——使用者群組分析

內容摘要

一、群組分析方法介紹

  • 群組分析方法就是按照某個特徵對資料進行分組,通過分組比較得出結論並提供指導的方法。
  • 將使用者資料按照性別特徵,可以分成男生和女生;將使用者註冊時間作為特徵,按註冊的月不同可以進行分組。
  • 群組分析的方法常常用來分析使用者留存/流失問題,或者金融行業使用者還款逾期的問題,其根據月份分組等分析方式較為常見。
  • 群組分析主要目的是分析相似群體隨時間的變化,核心就是對比、分析不同時間群組的使用者在相同的週期下的行為差異,也稱同期群分析。
  • 群組分析的三個步驟:
    1、資料分組
    2、假設檢驗,針對問題提出假設進行檢驗
    3、相關性分析法,對比不同假設之間的相關性

本部落格以步驟一(資料分組)為主

二、專案背景及目的

某電商平臺有一批使用者消費記錄,包括使用者資訊,訂單資訊,金額,訂單日期等等。希望通過群組分析,檢視使用者留存率變化趨勢,分析不同時間群組的使用者在相同的週期下的行為差異,為後續針對不同使用者群體制定策略起到基礎性工作。

三、python實操

(1)資料匯入

  • 常規操作:匯入必備的pandas、numpy庫,本次資料存放在資料庫中,再匯入sqlalchemy庫
  • 使用sqlalchemy庫,呼叫資料庫
import pandas as pd
import numpy as np
import sqlalchemy

# 讀取資料
engine = sqlalchemy.create_engine('mysql+pymysql://**********@localhost:3306/froghd')
sql_cmd = "select * from groups_data"
# 執行sql語句,獲取資料
df = pd.read_sql(sql=sql_cmd, con=engine)
#資料展示
df.head()

在這裡插入圖片描述

  • 資料集如上圖所示,我們主要集中統計使用者數量(userid)、訂單數量(orderid)、訂單日期(orderdate)和總金額(totalcharges)

(2)資料處理

  • 本次群組分析的主要是針對每月的新使用者的留存率進行分析,因此需要以月為尺度進行整理資料。
  • 資料集中的訂單日期精確到了日,我們需要將其省略至月(這裡使用strftime函式進行提取)
# 生成一個新欄位,使用者訂單月份
df["orderperiod"] = df.orderdate.apply(lambda x:x.strftime("%Y-%m"))

在這裡插入圖片描述

  • 群組分析針對月份,首先要確定每個月的新使用者是多少,因此需要確定每個使用者的最早購買日期,也是使用者群組的標誌
  • 之後的分析是針對時間序列的,因此每個使用者每次購買的日期也需要
  • 因此考慮以使用者資訊(userid)為分組依據比較好,但是如果直接groupby的話,需要對其餘資訊進行聚集,如果對消費日期進行聚集則會出現缺失日期的情況,因此不能直接對userid分組
  • 主要思路是將每個使用者的最早消費日期與每一次的消費日期拼接在一起
  • (1)考慮將使用者資訊(userid)當作索引,再對索引分組
  • (2)新增加一列使用者的最早購買日期(即使用者群組)
  • (3)之後再通過重置索引列,將分組資料拆成獨立的資料
# 設定userid為索引
df.set_index("userid",inplace=True)
# 這裡的level=0表示第一層索引即userid,並且每次分組之後都會形成很多個dataframe
# 按照每個使用者的訂單的最早時期,生成使用者群組
df["cohortgroup"]=df.groupby(level=0)["orderdate"].min().apply(lambda x:x.strftime("%Y-%m"))
df.reset_index(inplace=True)
df.head()

在這裡插入圖片描述

  • 可以看出每一個使用者每一次消費的記錄後面都有兩個時間,一個是本次消費的時間,一個是該使用者最早的消費時間
  • 之後對使用者群組消費時間進行分組
# 根據使用者群組和月份欄位進行分組
grouped = df.groupby(["cohortgroup","orderperiod"])
# 求每個使用者群下每一個月份的使用者數量、訂單數量、購買金額
cohorts = grouped.agg({"userid":pd.Series.nunique,
                      "orderid":pd.Series.nunique,
                      "totalcharges":np.sum})
# 重新命名
cohorts.rename(columns={"userid":"totalusers",
                       "orderid":"totalorders"},inplace=True)
cohorts.head()

在這裡插入圖片描述

  • 隨後還可以對每一個使用者群組內的資料進行標籤簡化

  • 每一個使用者群組進行groupby並打標籤

# 把每個群組繼續購買的日期欄位進行改變
def cohort_period(df):
    # 給首次購買日期進行編號,第二次購買為2,第三次購買為3
    df["cohortperiod"] = np.arange(len(df)) + 1

    return df

# 注意的是apply後面傳入的是一個個dataframe
cohorts = cohorts.groupby(level=0).apply(cohort_period)

cohorts.head()

在這裡插入圖片描述

(3)使用者群組存留率計算

  • 使用者群組存留率計算的關鍵:每個使用者群組初始數量,利用隨後每一個月的留存量除以初始數量即可,其初始數量就是使用者群組(最早日期)跟群組內日期相同那組的使用者個數
  • 針對之前簡化後的資料可以進行索引的簡化
  • 調整groupby索引的方法:
    -(1)先將groupby資料拆解成DataFrame資料;利用reset_index
    -(2)再重新設定索引列;利用set_index([ ])
# 得到每個群組的使用者量
# 重新設定索引
cohorts.reset_index(inplace=True)
cohorts.set_index(["cohortgroup","cohortperiod"],inplace=True)
cohorts.head()

在這裡插入圖片描述

  • 統計每一個使用者群組初始數量:就是使用者群組(最早日期)跟群組內日期相同那組的使用者個數
# 得到每個群組的使用者量,就是第一天的使用者資料量,用作留存率的分母
cohort_group_size = cohorts["totalusers"].groupby(level=0).first()
cohort_group_size.head()

在這裡插入圖片描述

  • 將資料進行調整,groupby的資料旋轉過來,時間序列沿著橫軸,利用unstack函式
# 計算每個群組的留存
# unstack 是把index轉化為column
#unstack()中的序號表示要展示的列名
cohorts["totalusers"].unstack(0).head()

在這裡插入圖片描述

  • 留存率計算,每一月的除以初始數量
# 計算留存
user_retention = cohorts["totalusers"].unstack(0).divide(cohort_group_size,axis=1)
user_retention.head()
#這裡寫法不唯一,可以使用apply搭配lambda函式

在這裡插入圖片描述

(4)使用者群組存留率視覺化

  • 折線圖
# 折線圖展示
import matplotlib.pyplot as plt
import matplotlib as mpl
pd.set_option("max_columns",50)
mpl.rcParams["lines.linewidth"] = 2
%matplotlib inline
user_retention[["2009-01","2009-02","2009-03"]].plot(figsize=(5,3))
plt.title("user tetention")
plt.xticks(np.arange(1,12.1,1))
plt.xlim(1,12)
plt.ylabel("%of cohort")

在這裡插入圖片描述

  • 熱力圖
# 熱力圖展示
import seaborn as sns
sns.set(style="white")

plt.figure(figsize=(8,4))
plt.title("co:user retention")
sns.heatmap(user_retention.T,mask=user_retention.T.isnull(),annot=True,fmt=".0%")

在這裡插入圖片描述

四、總結

  1. 本次主要以理解使用者群組分析方法和python程式碼實操為主

  2. 使用者群組分析就是將使用者按照一定的特徵進行分組歸納,其中一部分有些類似資料分箱;但主要應用方面是對不同時期的使用者進行時間序列的分析,觀察留存率,新老使用者行為等等

  3. python實現時間上的使用者群組分析,需要注意如下幾點:
    (1)落腳點是使用者,需要對使用者進行groupby,但是要整合每個使用者的最早消費日期和每次消費日期,故需要將使用者資訊設定成索引從而保證資料的完整性;
    (2)將每個使用者的兩個時間整合好後,才開始進行使用者群組(相同的起始時間)分析,對其進行groupby分組;
    (3)留存率的分母是每一群組的起始使用者數量=兩個時間相同下的使用者資訊

  4. 對使用者群組進行分解整理後,為後續的假設檢驗和相關性分析打下基礎。

相關文章