辛普森悖论

Python 中级回归:使用 statsmodels

Maarten Van den Broeck

Content Developer at DataCamp

一个巧妙的悖论!

当整体数据集上的模型趋势与各子集上的模型趋势大不相同时,即出现辛普森悖论。

trend = 斜率系数

Python 中级回归:使用 statsmodels

合成的辛普森数据

x y group
62.24344 70.60840 D
52.33499 14.70577 B
56.36795 46.39554 C
66.80395 66.17487 D
66.53605 89.24658 E
62.38129 91.45260 E
  • 5 个数据组,标记为"A"到"E"
1 https://www.rdocumentation.org/packages/datasauRus/topics/simpsons_paradox
Python 中级回归:使用 statsmodels

线性回归

整体数据集

mdl_whole = ols("y ~ x", 
                 data=simpsons_paradox).fit()

print(mdl_whole.params)
Intercept           -38.554  
x                     1.751  

按组

mdl_by_group = ols("y ~ group + group:x + 0",
                   data = simpsons_paradox).fit()

print(mdl_by_group.params)
  groupA    groupB    groupC    groupD    groupE  
 32.5051   67.3886   99.6333  132.3932  123.8242  
groupA:x  groupB:x  groupC:x  groupD:x  groupE:x  
 -0.6266   -1.0105   -0.9940   -0.9908   -0.5364
Python 中级回归:使用 statsmodels

绘制整个数据集

sns.regplot(x="x",
            y="y",
            data=simpsons_paradox,
            ci=None)

辛普森悖论数据集的散点图,合并所有组。整体趋势为正.png

Python 中级回归:使用 statsmodels

按组绘图

sns.lmplot(x="x",
           y="y",
           data=simpsons_paradox,
           hue="group",
           ci=None)

按组着色的辛普森悖论数据集散点图。每组内趋势为负.png

Python 中级回归:使用 statsmodels

解释差异

有益建议

如有可能,请绘制数据集。

常见建议

无法一概而论地选出最佳模型——取决于数据集与要回答的问题。

更多建议

在建模前先明确问题。

Python 中级回归:使用 statsmodels

测试分数示例

scatter-video-games-whole.png

scatter-video-games-by-group.png

Python 中级回归:使用 statsmodels

传染病示例

scatter-cities-whole.png

scatter-cities-by-group.png

Python 中级回归:使用 statsmodels

解释差异

  • 通常(但不总是)分组模型信息量更大。
  • 是否缺少解释变量?
  • 语境很重要。
Python 中级回归:使用 statsmodels

真实数据中的辛普森悖论

  • 在真实数据中悖论通常不明显。
  • 可能看到零斜率,而非方向完全相反。
  • 可能并非每个组都出现。
Python 中级回归:使用 statsmodels

开始练习吧!

Python 中级回归:使用 statsmodels

Preparing Video For Download...