数据分析36计(25):微软开源 DoWhy 之因果分析快速入门
Pylady 2021-04-07 08:20:00 159 收藏 4
文章标签: 机器学习 人工智能 python 深度学习 大数据
版权
你认为做开源是理想主义吗?能否利用开源创业、实现开源变现?
做开源 VS 赚钱,能兼得吗?你怎么看
因果分析是在统计领域内建立因果关系的实验分析。在数据分析中,我们始终对因果关系问题感到困扰,通常从统计角度对可用数据进行分析。虽然知道因果关系的金钥匙是 A/B 测试,但是由于某些原因(例如时间限制,成本或只是没有数据)无法进行测试,该怎么办。在这里,我们可以应用因果分析来估计干预(功能)对结果的影响。因果分析在本质上与机器学习建模预测不同。虽然我们可以尝试通过学习数据模式来预测结果,但是我们永远不知道在数据维度之外会发生什么。试想一下,您明天可能会考试并决定连续学习两个小时。结果是在两个小时的学习干预下您的考试成绩,但是如果您只学习一小时怎么办?有什么效果吗?我们不能倒退时间。这就是为什么我们进行因果分析而不是机器学习预测的原因。这样的反事实数据不存在,这就是机器无法学习的原因。我们只能学习一个小时的结果是我们无法观察到的,因为我们无法倒带时间。这就是为什么这种情况称为“反事实”。这是因果分析的根本问题。我们只能近似预估因果效应。
近似预估因果效应的最佳库之一是 DoWhy 包。在本文中分享如何使用 DoWhy 来确定分析中的因果关系。
DoWhy的因果分析
根据 DoWhy 官方文档,因果关系分析共有以下 4 个步骤:
根据假设对因果推理问题进行建模
确定因果效应表述(“因果估计”)
使用统计方法(例如匹配或工具变量)估计
使用各种稳健性检验来验证估计有效性
- 定义问题
在开始分析数据之前,我们需要定义要解决的问题。在客户流失数据集中,假设我们正在与信贷部门合作,我们想知道信贷额度是否对客户流失具有因果关系。信贷部门限制,任何超过 20000 的信贷额度都被视为高额客户。在这种情况下问题为:“高额信贷会影响银行流失吗?”
import pandas as pd
df = 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)
- 创建因果模型
因果模型基于问题假设,这意味着该模型将基于我们的先验知识建立。我们可以在图中表示我们的先验知识。
training= df[['Customer_Age','Education_Level','Income_Category', 'High_limit', 'Churn' ]].copy()
从先验知识中,我们列出了会影响流失率和其他功能的假设:
高限制类别可能会影响客户流失,因为低限制类别的人可能不那么忠诚于银行。
收入类别影响信用额度上限。信用额度通常基于收入。收入类别本身可能会影响流失率。
受教育程度会影响收入类别。
客户年龄可能会影响他们所受的教育程度和收入类别。
不可观察的混杂因素正在影响收入类别,最高限额和客户流失。
将所有假设创建到图中,可以使用 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="cau