首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >观测数据中的因果推理

观测数据中的因果推理
EN

Stack Overflow用户
提问于 2020-04-16 10:58:07
回答 1查看 1.2K关注 0票数 0

我正在使用python包DoWhy来查看基于本站的保有权和流失之间是否存在因果关系。

代码语言:javascript
复制
# TREATMENT = TENURE
    causal_df = df.causal.do('tenure', 
                             method = 'weighting', 
                             variable_types = {'Churn': 'd', 'tenure': 'c', 'nr_login',  'c','avg_movies': 'c'
                                              },
                             outcome='Churn',common_causes=['nr_login':'c','avg_movies': 'c'])

我还有很多其他的变量。

  1. 这是做分析的正确方法吗?
  2. 什么是共同的原因,以及如何选择它们?
  3. 我如何能够解释结果,并以什么确定性?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-18 12:57:13

让我们逐一回答你的问题。

1.这条路对吗?

是的,您的代码片段是正确的,假设您希望通过对tenureavg_movies进行条件调整来估计nr_loginavg_movies的因果效应。

然而,该方法将输出包含结果Churn的介入值的数据。也就是说,搅拌变量的值就好像所有权已经独立于指定的公共原因被改变了一样。如果治疗tenure是离散的,您可以做一个简单的绘图来可视化不同tenure值的效果。类似于:

代码语言:javascript
复制
causal_df = df.causal.do('tenure', 
                          method = 'weighting', 
                          variable_types = {'Churn': 'd', 'tenure': 'd', 'nr_login',  'c','avg_movies': 'c'},
                          outcome='Churn',common_causes=['nr_login':'c','avg_movies': 'c']).groupby('tenure').mean()

然而,为了计算平均因果效应,一个更直接的过程是对要计算效果的两个治疗值运行两次do方法(典型的值是比较treatment=1与0)。生成的代码如下所示(也请参阅示例笔记本方法的文档 ):

代码语言:javascript
复制
df_treatment1 = df.causal.do({'tenure': 1}, 
                                method = 'weighting', 
                                variable_types = {'Churn': 'd', 'tenure': 'd', 'nr_login',  'c','avg_movies': 'c'},
                                outcome='Churn',common_causes=['nr_login':'c','avg_movies': 'c'])

df_treatment0 = df.causal.do({'tenure': 0}, 
                                method = 'weighting', 
                                variable_types = {'Churn': 'd', 'tenure': 'd', 'nr_login',  'c','avg_movies': 'c'},
                                outcome='Churn',common_causes=['nr_login':'c','avg_movies': 'c'])
causal_effect = (df_treatment1['churn'] - df_treatment0["churn"]).mean()

还有一种使用主DoWhy API实现相同结果的等效方法。

代码语言:javascript
复制
model= CausalModel(
        data=df,
        treatment='tenure',
        outcome='churn',
        common_causes=['nr_login', 'avg_movies'])` 
identified_estimand = model.identify_effect()
model.estimate_effect(identified_estimand, method="backdoor.propensity_score_weighting")

也就是说,根据您的数据集,可能有其他更适合的估计方法。例如,考虑到共同原因的可能值,如果其中一个治疗值不太可能,则“加权”方法预计会有很大的差异。此外,如果您有有限的数据,这种方法可能不能很好地连续处理,因为它是一个非参数的方法,将有很高的方差在一般情况下。在这些情况下,您可以使用其他的估计方法,如double-ML,它们使用参数假设来减少估计中的方差(代价是可能的偏差)。您可以调用double-ML或其他类似于此的高级EconML估值器(这个笔记本中的完整示例):

代码语言:javascript
复制
model.estimate_effect(identified_estimand, 
                       method_name="backdoor.econml.dml.DMLCateEstimator",
                       control_value = 0,
                       treatment_value = 1,
                       confidence_intervals=False,
                       method_params={"init_params": 
                                        {'model_y':GradientBoostingRegressor(),
                                         'model_t': GradientBoostingRegressor(),
                                         "model_final":LassoCV(),                    
                                         'featurizer':PolynomialFeatures(degree=1, 
                                                         include_bias=True)
                                        },
                                      "fit_params":{}
                                     })

2.如何选择common_causes?

常见的原因是导致治疗和结果的变量。因此,治疗和结果之间的相关性可以归因于治疗的因果效应,也可以简单地归因于共同原因的影响(经典的例子是,冰淇淋销售与游泳池会员身份相关,但其中一个并不导致另一个;炎热的天气是这里常见的原因)。因果推理的目的是在某种程度上理清常见原因的影响,只返回治疗的效果。在形式上,因果效应是指在所有共同原因不变的情况下,治疗对结果的影响。要了解更多信息,请查看这个因果推理的教程 )

因此,在您的示例中,您可能希望包含所有变量,这些变量既可以导致客户拥有较高的任期,又可以减少客户流失的机会(例如,他们每月的使用情况、对平台的信任等)。这些是需要纳入模型的常见原因或混淆因素。

3.如何解释结果及其不确定性?

如前所述,因果效应的标准解释是当治疗改变一个单位时,结果的变化(churn)。然而,对于一个连续变量,这只是一个惯例:您可以将因果效应定义为对治疗的任何两个值的结果的变化。

对于估计不确定性,您可以估计置信区间和/或进行反驳测试。置信区间会告诉你统计的不确定性(粗略地说,如果给你一个新的I.D,你的估计会有多大的变化。)数据样本?)。反驳测试将量化由因果假设引起的不确定性(如果您没有指定一个重要的共同原因,那么估计值会发生多大的变化?)

下面是一个例子。您可以找到更多关于反驳方法的这里

代码语言:javascript
复制
# Confidence intervals
est = model.estimate_effect(identified_estimand, method="backdoor.propensity_score_weighting",
confidence_intervals=True)
# Refutation test by adding a random common cause
model.refute_estimate(identified_estimand, est, method_name="random_common_cause")
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61248565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档