因果推断

问题描述 投票:1回答:1

[我正在使用python软件包DoWhy,查看基于使用权和客户流失率之间是否存在因果关系;

我也有许多其他变量。

1-我想知道这是一种进行分析的写方法吗?

2-我不知道常见原因是什么,以及如何选择它们?

3-还有如何解释结果以及确定性如何?

预先感谢

python statistics inference
1个回答
1
投票

让我们一个个地回答您的问题。

1。这是正确的方法吗?

是,您的代码段是正确的,假设您想通过以tenureChurn为条件来估计nr_loginavg_movies的因果关系。

但是此方法将输出包含结果Churninterventional值的数据帧。即,搅动变量的值就好像权属已被更改,而与指定的常见原因无关。如果处理tenure是离散的,则可以做一个简单的图以可视化tenure的不同值的效果。类似于:

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方法(典型值是将治疗= 1与0进行比较) 。结果代码如下所示,如example notebook中所述(对于docs方法,另请参见do):

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达到相同结果的等效方法。

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估算器(this notebook中的完整示例):

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。如何选择共同原因?

共同原因是既导致治疗又导致结果的变量。因此,治疗与结果之间的相关性可能是由于治疗的因果关系,也可能是由于常见原因的影响(经典示例是冰淇淋销售与泳池会员资格相关,而一个不会导致另一个;炎热的天气是这里的常见原因)。因果推论的目的是以某种方式消除常见原因的影响,只返回治疗的效果。形式上,因果效应是当所有常见原因均保持不变时,治疗对结果的影响。有关更多信息,请查看此tutorial因果推理)

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

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

如上所述,因果效应的标准解释是当治疗方法每改变1单位,结果的改变(churn)。但是对于连续变量,这只是一个约定:您可以将因果效应定义为治疗的任意两个值的结果变化。]

为了估计不确定性,您可以估计置信区间和/或进行反驳测试。置信区间将告诉您有关统计的不确定性(大致来说,如果给您新的i.i.d.数据样本,您的估计值将发生多少变化?)。驳斥测试将量化因果假设导致的不确定性(如果您错过指定重要的共同原因,那么估计会发生多少变化?)。

这里是一个例子。您可以找到有关反驳方法here的更多信息。

# 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")
    
© www.soinside.com 2019 - 2024. All rights reserved.