摘要:兩個函數之間的關系生存分析與新用戶行為然而,生存分析的定義本身讓它和很多用戶行為事件本身發生聯系。在此我們只做性別和用戶年齡的回歸分析。結語這里,我們用生存分析解決并使用在用戶行為分析中。
生存分析的來歷
生存分析(Survival Analysis)來源于基礎醫學領域,最早用來研究各種治療方案對病人壽命的影響。而壽命則用一個end event(死亡)的方式衡量。基本定義如下:
T為標記事件發生的時間。
生存函數(Survival Function)。用來描述未發生end event的樣本的比例隨時間變化的趨勢。
$S(t) = P(T > t)$
Hazard函數(Hazard Function)。描述end event發生的概率變化率。
$lambda (t) = {lim}_{h o 0} frac{P(t le T < t + h | T ge t)}{h}$
兩個函數之間的關系:
$S(t) = e^{-int_{0}^t lambda (s)ds}$
生存分析與新用戶行為然而,生存分析的定義本身讓它和很多用戶行為事件本身發生聯系。譬如,用戶流失和生存分析研究的概念完全一致,而常見的流失分析,可能會存在以下問題:
無法提供每一個時刻流失發生的概率
很難具有預測性
多個產品/A-B testing時很難互相做出定量比較。
而生存分析本身就會對以上三個內容做出預測,此外,對Customer Lifetime Value能提出一些更有價值的洞識。
但本文試圖擴展生存分析的試用范圍,任何具有觸發時間特征的事件,都可以采用生存分析的方式做出分析,譬如:
用戶留存
用戶轉化
用戶點擊
...
本文以常見的購買行為的轉化為例,介紹生存分析的某些應用。
用戶轉化代碼以jupyter notebook的形式放在github這里。前期構思
本實例是研究,用戶從注冊時開始,隨時間變化其轉化率會有何種變化,考慮屆時提供一些運營策略。常規計算本任務轉化率的方式是:
轉化率 = # 轉化用戶數 / # 總用戶數數
這個轉化率往往很難提供更多的洞識,我們無法給出自動化運營可以介入的時間要素。而生存分析從本質上說,恰恰是研究一個發生事件的概率隨時間發生的變化,在此項任務中,事件顯然就是轉化。基于這種思想,我們做出如下分析。
數據樣例生存分析需要以一個用戶為單位,提取參與實驗的時間(這里就是注冊時間),終止實驗/end event發生時間(這里就是指數據采集的截止日期和用戶發生轉化的時間),以及最后是否發生end event的標記。
因此我們采集了如下數據。其中sex,birth_year,province三個字段用以后面的分析,duration則是到事件發生時總共花費的時間,即test_last_time - signup_time。
user_id | signup_time | end_time | test_last_time | buy_time | sex | birth_year | province | have_bought | duration | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 513336 | 2017-10-30 21:58:04.323000 | 2017-10-30 22:03:54.430000 | 2018-06-01 00:00:00 | 2017-10-30 22:03:54.430000 | 女 | 1991 | 山東 | True | 0.00405216 |
1 | 513340 | 2017-10-30 22:14:35.853000 | 2017-10-30 22:45:10.243000 | 2018-06-01 00:00:00 | 2017-10-30 22:45:10.243000 | 男 | 1988 | 安徽 | True | 0.0212314 |
2 | 513353 | 2017-10-31 07:29:04.293000 | 2018-06-01 00:00:00 | 2018-06-01 00:00:00 | NaT | nan | nan | nan | False | 212.688 |
3 | 513370 | 2017-10-31 10:45:45.586000 | 2018-06-01 00:00:00 | 2018-06-01 00:00:00 | NaT | 女 | 1979 | 河南 | False | 212.552 |
4 | 513387 | 2017-10-31 13:00:32.360000 | 2017-10-31 13:09:38.100000 | 2018-06-01 00:00:00 | 2017-10-31 13:09:38.100000 | 女 | 1992 | 山東 | True | 0.00631644 |
Python比較完整的支持生存分析的包是Liflines和scikit-survival。兩者之間,對分析友好的方案是前者,我們在本博文中,也主要采用該模塊進行分析。
from lifelines import NelsonAalenFitter, CoxPHFitter, KaplanMeierFitter from lifelines.statistics import logrank_test
首先,我們需要查看用戶的未轉化率(有點繞口),這直接可以用生存分析本身的定義來實現。
kmf = KaplanMeierFitter() kmf.fit(df["duration"], event_observed=df["have_bought"], label="all") kmf.plot()
image-20180805225520337.png
顯然,我們可以發現,在50天后,基本上變化不明顯了,最初的50天內,用40%多的用戶發生轉化。當然,這一圖示并不直觀,我們可以用1 - 未轉化率=轉化率的方式來重新繪制轉化率曲線。
(1 - kmf.survival_function_).plot()
image-20180805230116015.png
顯然,這張圖已經可以參與到運營決策中取了,圖中顯示,用戶會在前10天內轉化,后期變化不在明顯。但我們可以通過生存分析得到更多有意思的結論。
一個例子就是分析不同產品的生存曲線圖來分析產品之間的好壞(在此不做示范),一個就是用戶本身特征對轉化的影響。在此,我們以性別為例,分析性別對用戶更早決定購買產品/轉化之間有何有何關系。
ax = subplot(111) t = np.linspace(0, 50, 51) kmf.fit(df[df["sex"] == "男"]["duration"], event_observed=df[df["sex"] == "男"]["have_bought"], timeline=t, label="male") ax = kmf.plot(ax=ax) kmf.fit(df[df["sex"] == "女"]["duration"], event_observed=df[df["sex"] == "女"]["have_bought"], timeline=t, label="female") ax = kmf.plot(ax=ax) plt.ylim(0,1) plt.title("not buying rate between two gender");
image-20180805230614522.png
ax = subplot(111) t = np.linspace(0, 50, 51) kmf.fit(df[df["sex"] == "男"]["duration"], event_observed=df[df["sex"] == "男"]["have_bought"], timeline=t, label="male") ax = (1 - kmf.survival_function_).plot(ax=ax) kmf.fit(df[df["sex"] == "女"]["duration"], event_observed=df[df["sex"] == "女"]["have_bought"], timeline=t, label="female") ax = (1 - kmf.survival_function_).plot(ax=ax) plt.ylim(0,1) plt.title("conversion rate between two gender");
image-20180805230718723.png
顯然,我們從圖中可以發現,女性更傾向于更快相信此產品,更早時間并且更多比例的發現轉化。接下來,我們可以利用自帶的log-rank test對兩者是否差異顯著做預測。
logrank_test(event_times_A=df[df["sex"]=="男"]["duration"], event_observed_A=df[df["sex"]=="男"]["duration"], event_times_B=df[df["sex"]=="女"]["duration"], event_observed_B=df[df["sex"]=="女"]["duration"])
顯然,差異是顯著的。
分析轉化率的變化率在此,我們使用Nelson Aslen方法分析轉化率的變化率隨時間的變化(即Hazard函數)。
naf = NelsonAalenFitter() naf.fit(df["duration"], event_observed=df["have_bought"], timeline=t, label="all") naf.plot_hazard(bandwidth=20)
image-20180805231451494.png
圖中可以看出,轉化率的變化在前5天內略微提高,隨后斷崖式減少,大概在20天左右區域和緩。換用運營的術語,前五天內用戶對產品的信任度略微增加,使得更有可能購買產品;但超過五天還沒有購買意愿的人,購買發生的可能性隨時間遞減。
一個可能的運營策略就是在第5天做出一些行為,增加用戶的購買意愿,從而達到提高用戶的生命周期的總價值。
當然,我們如同上面板塊一樣,也不叫一下性別差異。
image-20180805231922162.png
顯然,女性建立信任的速度更快,但是大致都是以5天為界,在5天時沒有發生購買行為,后期發生的概率會越來越小。
生存分析的回歸分析在此,我們還介紹一種對于不同變量對生存曲線影響的分析方法,并可以作為預測用戶是否可能發生轉化的模型——Cox PH模型。其基本假設是:
$lambda (t, X) = lambda_0(t) exp(eta X)$
即假設待研究的變量不影響到生存模型的形狀,而形狀只有獨立的$$lambda_0(t)$$決定(即只和時間有關)。對此,我們需要對變量進行形狀上的驗證來判斷該模型的有效性。在此我們只做性別和用戶年齡的回歸分析。
上面已經驗證過性別的轉化率的形狀,我們使用雙對數繪制對年齡(出生年)的影響。
kmf0 = KaplanMeierFitter() kmf0.fit(cph_train_df[cph_train_df["birth_year"] == 1960]["duration"], event_observed=cph_train_df[cph_train_df["birth_year"] == 1960]["have_bought"]) kmf1 = KaplanMeierFitter() kmf1.fit(cph_train_df[cph_train_df["birth_year"] == 1970]["duration"], event_observed=cph_train_df[cph_train_df["birth_year"] == 1970]["have_bought"]) fig, axes = plt.subplots() kmf0.plot_loglogs(ax=axes) kmf1.plot_loglogs(ax=axes) axes.legend(["1960", "1970"]) plt.show()
image-20180805233353267.png
結果不是很符合預設,但由于演示需要,假設數據符合我們的假定,而且我們僅做線性模型。
cph = CoxPHFitter() cph.fit(cph_train_df, duration_col="duration", event_col="have_bought", show_progress=True) cph.print_summary()
n=10000, number of events=7683 coef exp(coef) se(coef) z p lower 0.95 upper 0.95 birth_year -0.0084 0.9916 0.0010 -8.7945 0.0000 -0.0103 -0.0066 *** sex -0.1676 0.8457 0.0241 -6.9492 0.0000 -0.2149 -0.1203 *** --- Signif. codes: 0 "***" 0.001 "**" 0.01 "*" 0.05 "." 0.1 " " 1 Concordance = 0.528 Likelihood ratio test = 124.891 on 2 df, p=0.00000
我們可以發現,sex影響的項更大,參數都是顯著的。之后,我們就可以用cph的相關函數對數據進行預測。我們在此用plot_covariate_group函數來展示不同屬性的影響:
cph.plot_covariate_groups("birth_year", [1960, 1970, 1980, 1990]) cph.plot_covariate_groups("sex", [0, 1])
image-20180805234322978.png
image-20180805234340974.png
顯然,年齡越大、性別為女性越容易信任平臺,更早的做出購買行為。
結語這里,我們用生存分析解決并使用在用戶行為分析中。給出更多可能有助于運營以及理解用戶畫像的洞識結論。
References and Recommending Reading ListTristan Boudreault | Survival analysis for conversion rates
Playtime Measurement with Survival Analysis https://arxiv.org/pdf/1701.02359
Using Survival Analysis to Predict Sample Retention Rates https://www.bls.gov/ore/pdf/st060060.pdf
Lifelines doc | readthedocs.io
scikit-survival | github
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42136.html
摘要:古希臘哲學家畢達哥拉斯曾說,萬物的起源是數字。作為崇拜數字的始祖,畢達哥拉斯如果目睹現代人對數據的崇拜應該多少有些欣慰,數字聯通世界似乎正在踐行著他的古老哲學。古希臘哲學家畢達哥拉斯曾說,萬物的起源是數字。數字和數學與萬物的起源有什么關系呢?在他看來,探討萬物起源這個問題上,形式比質料占有優先地位。在他之前,最先思考這一哲學問題的哲學家認為萬物起源是火、是水,亦或是氣,但無論什么,都是有形可...
閱讀 1096·2021-11-24 10:24
閱讀 2584·2021-11-22 13:54
閱讀 992·2021-09-24 09:55
閱讀 3592·2019-08-30 15:54
閱讀 1311·2019-08-30 15:44
閱讀 1089·2019-08-30 14:23
閱讀 3195·2019-08-29 13:45
閱讀 1267·2019-08-29 11:19