如何对数据集执行方差分析?



我有一个房价数据集,我想找出目标变量(连续变量(的分类变量的重要性。为此,我考虑过执行方差分析,但我感到困惑的是,我是否应该将每个分类变量视为一个单独的组:

mod1 = ols("SalePrice ~ SaleCondition", data = data_cat).fit()
anov_table1 = sm.stats.anova_lm(mod1)
mod2 = ols("SalePrice ~ Neighborhood", data = data_cat).fit()
anov_table1 = sm.stats.anova_lm(mod2)
mod3 = ols("SalePrice ~ HouseStyle", data = data_cat).fit()
anov_table1 = sm.stats.anova_lm(mod3)
mod4 = ols("SalePrice ~ OverallQual", data = data_cat).fit()
anov_table1 = sm.stats.anova_lm(mod4)

或者我应该将所有分类变量放在一个组中,然后执行方差分析:

mod = ols("SalePrice ~ SaleCondition + Neighborhood + HouseStyle + OverallQual", data = data_cat).fit()
anov_table = sm.stats.anova_lm(mod)

由于您提到了目标变量并且似乎正在使用 OLS 模型,因此我假设您正在尝试执行多元线性回归

您无需手动执行方差分析 - 几乎所有线性回归模型的实现都会自动计算与每个输入变量关联的 p 值(控制所有其他输入变量(。

此外,在调用fit()方法之前,OLS 模型需要包含所有输入变量。换句话说,在将输入变量传递给模型之前,您需要将它们放在单个组中,不是因为方差分析需要这个(您不需要(,而是因为多元线性回归本身需要这个

在伪代码中:

target_var = put_your_target_series_here
input_vars = put_all_your_input_series_here
result = ols(target_var, input_vars).fit()

在您的情况下,target_var可能是熊猫系列(= 来自熊猫数据帧的 sigle 列(。

input_vars可以是pandas 系列(这意味着您只有一个输入变量 - 这是一个简单的线性回归(或pandas DataFrame(在这种情况下,每列都被解释为一个输入变量 - 您正在执行多元线性回归(。

变量result中的对象包含模型中所有输入变量的 p 值 - 请参阅所用包的文档以检查如何提取它们。

但是,由于您的输入变量是类别,因此您必须使用虚拟变量。假设您有以下数据:

|House | Neighborhood value|
|------|-------------------|
|01    | Good              |
|02    | Bad               |
|03    | Bad               |
|04    | Excellent         |
|05    | Good              |

线性回归需要有数字,而不是类别。您可以将这些类别转换为数字,例如:

|House | Neighborhood value|
|------|-------------------|
|01    | 1                 |
|02    | 0                 |
|03    | 0                 |
|04    | 2                 |
|05    | 1                 |

但这隐含地告诉你的模型,一个Excellent邻域值的价值是Good值的 2 倍 - 这可能是真的,也可能不是真的!此外,对于颜色等类别,这没有任何意义。

真正的解决方案是使用虚拟变量,例如:

|House | Has excellent value | Has good value|
|------|---------------------|---------------|
|01    | 0                   | 1             |
|02    | 0                   | 0             |
|03    | 0                   | 0             |
|04    | 1                   | 0             |
|05    | 0                   | 1             |

这避免了我上面描述的问题。

请注意,我们不需要Has bad value列,因为我们假设没有 0 的房子Has excellent valueHas good value一定有一个坏值。

有关多元线性回归中分类数据的虚拟变量的更深入说明,请参阅此链接。

最新更新