数据分析36计(25):微软开源 DoWhy 之因果分析快速入门

article/2025/5/10 20:24:30

因果分析是在统计领域内建立因果关系的实验分析。在数据分析中,我们始终对因果关系问题感到困扰,通常从统计角度对可用数据进行分析。虽然知道因果关系的金钥匙是 A/B 测试,但是由于某些原因(例如时间限制,成本或只是没有数据)无法进行测试,该怎么办。在这里,我们可以应用因果分析来估计干预(功能)对结果的影响。因果分析在本质上与机器学习建模预测不同。虽然我们可以尝试通过学习数据模式来预测结果,但是我们永远不知道在数据维度之外会发生什么。试想一下,您明天可能会考试并决定连续学习两个小时。结果是在两个小时的学习干预下您的考试成绩,但是如果您只学习一小时怎么办?有什么效果吗?我们不能倒退时间。这就是为什么我们进行因果分析而不是机器学习预测的原因。这样的反事实数据不存在,这就是机器无法学习的原因。我们只能学习一个小时的结果是我们无法观察到的,因为我们无法倒带时间。这就是为什么这种情况称为“反事实”。这是因果分析的根本问题。我们只能近似预估因果效应。

近似预估因果效应的最佳库之一是 DoWhy 包。在本文中分享如何使用 DoWhy 来确定分析中的因果关系。

DoWhy的因果分析

根据 DoWhy 官方文档,因果关系分析共有以下 4 个步骤:

根据假设对因果推理问题进行建模
确定因果效应表述(“因果估计”)
使用统计方法(例如匹配或工具变量)估计
使用各种稳健性检验来验证估计有效性

1、定义问题

在开始分析数据之前,我们需要定义要解决的问题。在客户流失数据集中,假设我们正在与信贷部门合作,我们想知道信贷额度是否对客户流失具有因果关系。信贷部门限制,任何超过 20000 的信贷额度都被视为高额客户。在这种情况下问题为:“高额信贷会影响银行流失吗?”

import pandas as pddf = pd.read_csv('BankChurners.csv')
df.info()  #Creating the High_Limit attribute
df['High_limit'] = df['Credit_Limit'].apply(lambda x: True if x > 20000 else False)
#Creating True or False columns from the Attrition flag for the churn column
df['Churn'] = df['Attrition_Flag'].apply(lambda x: True if x == 'Attrited Customer' else False)
2、创建因果模型

因果模型基于问题假设,这意味着该模型将基于我们的先验知识建立。我们可以在图中表示我们的先验知识。

training= df[['Customer_Age','Education_Level','Income_Category', 'High_limit', 'Churn' ]].copy()

从先验知识中,我们列出了会影响流失率和其他功能的假设:

  1. 高限制类别可能会影响客户流失,因为低限制类别的人可能不那么忠诚于银行。

  2. 收入类别影响信用额度上限。信用额度通常基于收入。收入类别本身可能会影响流失率。

  3. 受教育程度会影响收入类别。

  4. 客户年龄可能会影响他们所受的教育程度和收入类别。

  5. 不可观察的混杂因素正在影响收入类别,最高限额和客户流失。

将所有假设创建到图中,可以使用 DoWhy 包。

#Creating the 
causal_graph = """
digraph {
High_limit;
Churn;
Income_Category;
Education_Level;
Customer_Age;
U[label="Unobserved Confounders"];
Customer_Age -> Education_Level; Customer_Age -> Income_Category;
Education_Level -> Income_Category; Income_Category->High_limit;
U->Income_Category;U->High_limit;U->Churn;
High_limit->Churn; Income_Category -> Churn;
}
"""from dowhy import CausalModel
from IPython.display import Image, display
model= CausalModel(data = training,graph=causal_graph.replace("\n", " "),treatment='High_limit',outcome='Churn')
model.view_model()
display(Image(filename="causal_model.png"))

得到如下的因果关系图:

3、确定因果关系

因果分析的定义是,如果除干预外的其他变量不变时,干预的改变将影响结果。使用 DoWhy 因果模型确定因果效应。

#Identify the causal effect
estimands = model.identify_effect()
print(estimands)

这是根据我们之前的假设所做的估算。

4、基于统计方法估算因果效应

干预对结果的因果关系基于干预变量值的变化。统计因果效应的方法有很多,常用的有以下几种:

  1. 倾向得分匹配

  2. 倾向得分分层

  3. 基于倾向得分的逆概率加权法

  4. 线性回归

  5. 广义线性模型(例如,逻辑回归)

  6. 工具变量

  7. 断点回归

这里我将使用“基于倾向得分的逆概率加权”方法。

#Causal Effect Estimation
estimate = model.estimate_effect(estimands,method_name = "backdoor.propensity_score_weighting")
print(estimate)

从上面的结果中,我们得到的平均估计值为 -0.095,相当于说当客户拥有较高的信用额度时,流失的可能性降低了约 9%。

5、稳健性检验

因果效应估计是基于数据统计估计,但因果关系本身并不基于数据;而是基于我们之前的假设。

使用 DoWhy 包,我们可以通过多次稳健性检验来测试我们的假设有效性。这些是可用于检验假设的一些方法:

  1. 添加随机生成的混杂因素

  2. 添加与干预和结果相关的混杂因素

  3. 安慰剂(随机)变量代替干预

  4. 选取数据随机子集

随机共同因子

将独立随机变量作为共同影响因子添加到数据集;如果原假设是正确的,则估计不应改变。

refutel = model.refute_estimate(estimands,estimate, "random_common_cause")
print(refutel)

数据子集

用随机选择的子集替换给定的数据集;如果假设是正确的,则估计值不应有太大变化。

refutel = model.refute_estimate(estimands,estimate, "data_subset_refuter")
print(refutel)

安慰剂干预

用独立的随机变量代替真实的干预变量;如果假设是正确的,则估计值应接近零。

refutel = model.refute_estimate(estimands,estimate, "placebo_treatment_refuter")
print(refutel)

基于上面的 refutal 方法;可以支持我们的假设是正确的,即信用额度上限对客户流失具有因果关系。

6、结论

因果分析是在统计领域内建立因果关系的实验分析。它从根本上与机器学习预测不同,因为我们尝试根据反事实来近似估计干预效应。使用 Microsoft 开源的 DoWhy 包,使用四个步骤来估计因果关系:

  1. 建立因果模型

  2. 识别效应

  3. 估计效应

  4. 证实有效性

   数据链接:https://github.com/cornelliusyudhawijaya/Churn_Causality_Analysis/blob/main/BankChurners.csv


http://chatgpt.dhexx.cn/article/6GVuGEt0.shtml

相关文章

4大方法,因果关系分析的总结,都在这了

因果关系推断,可以说是数据分析领域最难的问题之一,争吵很多年也没有定论。经常同学们被问到:“到底这个问题的原因是什么!”都会觉得分析起来很挠头,今天我们系统讲解下。 1 常见方法1:拆解法 最常见的…

TRIZ创新方法——因果链分析

TRIZ创新方法——因果链分析 1. 什么是因果链分析2. 缺点的种类3. 关键缺点的解决4. 分析案例1:消除静电危害5. 分析案例2:油漆溢出问题6. 课后习题 1. 什么是因果链分析 2. 缺点的种类 关键缺点对应的问题即为关键问题 3. 关键缺点的解决 解决缺点5能够…

中介分析(四)- 因果中介分析

引入 首先我们需要明确相关性和因果推断本质上有什么区别? 最大的区别是是否控制了混杂因素。(理论上,当回归控制了所有可观测和不可观测的混杂因素,就可以探究因果关系),Causal analysis可以简单理解为 regression a…

因果分析系列5--因果分析中的偏差

因果分析系列5--因果分析中的偏差 1.混杂偏差2.选择偏差小结在上一节中,介绍了现实中常见的三种因果图结构: 链结构(chain)A->B->C; 叉结构(fork)A<-B->C; 对撞结构(collider)A->B<-C。 不管多复杂的结构都可拆解为其中的一种或某几种。基于三种常见的结…

社会经济学中的因果分析思想初探

社会经济学中的因果分析思想初探 目录1.因果是什么2.因果关系和相关关系3.因果推断的三个层级4.经典因果推断模型5.社会经济学中的因果实证分析5.1随机控制实验5.2自然实验5.3准实验5.3.1准实验--双重差分法5.3.2准实验--工具变量法5.3.3准实验--断点回归法5.3.4准实验--匹配法…

因果分析

Causality Problems(相关不一定是因果)&#xff1a; 伪关系&#xff1a;Y和X只是恰巧同时发生&#xff0c;实际上没有明显的逻辑上的关联&#xff0c;如巧克力销量和诺奖得主数量遗漏变量偏差&#xff1a;存在既影响X也影响Y的混淆变量&#xff0c;如年龄混淆了年收入和罹患癌…

史上最全因果推断合集-14(因果分析在贝壳的探索实践)

因果推断的应用范围十分广泛&#xff0c;例如气候变暖、新药研发、物理研究、经济学等。AI领域&#xff0c;特别是互联网产业&#xff0c;如何科学的进行因果分析&#xff0c;是一个重要的议题。本次分享的主题是因果分析在贝壳的探索和实践。 今天的介绍会围绕下面三点展开&a…

史上最全因果推断知识合集-4(快手因果推断与实验设计)

导读&#xff1a;理解和识别用户行为指标的相互关系是实验分析的目标。在社区氛围下&#xff0c;影响用户行为的因素更为复杂&#xff0c;关系识别更为困难&#xff0c;如何使用各种学科的方法&#xff0c;对社区进行宏观或微观的建模分析&#xff0c;系统性的评估各种策略的长…

因果分析与相关

在现实场景中我们常被要求回答“如果”的问题&#xff0c;经济学家称之为反事实。如果我现在要的不是这个价格&#xff0c;而是另一个价格&#xff0c;会发生什么&#xff1f;如果我不吃低脂饮食&#xff0c;而是吃低糖饮食会怎么样&#xff1f;如果你在银行工作&#xff0c;提…

因果分析.科学实验评估

目录 1. A/B Test原理 2. 实验分组划分 3.实验指标设计 4. 实验效果评估 5.离线指标测算 6.实验结果分析 不是每个想法都是好的&#xff0c;大部分想法都是不好的。 在互联网背景下&#xff0c;快速试错已经成为产品持续迭代的必备能力。借鉴传统行业(医学等)成熟的实验…

因果关系分析方法

因果关系推断&#xff0c;可以说是数据分析领域最难的问题之一&#xff0c;争吵很多年也没有定论。经常同学们被问到&#xff1a;“到底这个问题的原因是什么&#xff01;”都会觉得分析起来很挠头&#xff0c;今天我们系统讲解下。 1 常见方法1&#xff1a;拆解法 最常见的用…

因果分析来了!

我是小z&#xff0c;也可以叫我阿粥~ 本文的分享主题为观测数据因果推断&#xff0c;希望通过本文可以让大家对观测数据因果推断有一个整体的了解&#xff0c;明晰当前观测数据因果推断的困境和主要处理方法&#xff0c;以及在特定问题中的一套通用解法。 具体将围绕以下3部分展…

因果分析:原理、方法论、应用

什么是因果分析&#xff1f; 因果分析(Causal Analysis)是分析彼此之间的因果关系。 因果推断(Causal Inference)是基于原因推结果&#xff0c;是因果分析的一部分。 因果分析是数据分析、数据科学中重要的方法&#xff0c;广泛应用于A/B实验&#xff0c;异常分析&#xff0…

C语言有负号的除法以及求余运算规则

举例说明 abc…d 1753…2 被除数除数商…余数 有负号的运算规则 求: -17除以5的商和余数17除以-5的商和余数-17除以-5的商和余数 答: abc…d 用a代表被除数,用b代表除数,用c代表商,用d代表余数. c的数值是|a|/|b|,c是正号还是负号由a和b的负号数量决定;d的正负号和a相同…

C语言取余问题

如果 % 左边的操作数是正数&#xff0c;则取余的结果为正数或零&#xff1b;如果 % 左边的操作数是负数&#xff0c;则取余的结果为负数或零。 例如代码运行如下&#xff1a; 主代码&#xff1a; #include<iostream> using namespace std; int main() {cout<<(13…

c语言怎么对大数求余,C语言:大数取余

大数取余数(数组) 今天做学校的oj时遇到一题&#xff0c;问题可见一下截图&#xff1a; 查遍各大论坛&#xff0c;都没有遇到合适的方法&#xff0c;普通方法不可用&#xff0c;要采用数组的形式。 被除数超过long long类型&#xff0c;不能采用常规思路&#xff0c;否则会出现…

C语言--求余问题

C在线工具 | 菜鸟工具 在c语言中&#xff0c;如果 a为一个四位数 那么a%1000/100是啥&#xff1f; 假设a的值为1345&#xff0c;那么当计算a%1000时&#xff0c;值为345 #include <stdio.h>int main() {int a 1345;int b a%1000;printf("%d",b); } 而345/…

软件开发流程图

文件下载https://download.csdn.net/download/weixin_43250197/12243113

嵌入式软件开发的特点和流程

嵌入式软件就是嵌入在硬件中的操作系统和开发工具软件&#xff0c;被广泛应用于工业控制、消费电子、医疗、通信等领域&#xff0c;我们常见的手机、电脑、数码相机等都运用到了嵌入式软件技术。为了确保嵌入式系统的运行&#xff0c;嵌入式软件迅速崛起&#xff0c;在整个软件…

一套完整的软件开发流程是怎样的?

​做什么事都需要一个流程&#xff0c;软件开发也不例外。 那么&#xff0c;一个软件从无到有到底是怎么开发的&#xff1f;一个软件产品的结果为什么是这样&#xff1f;为什么开发的速度不能再快一点。为什么程序员大多秃顶&#xff1f;他们有那么忙吗&#xff1f;完整的软件…