我有一个房价数据集,在这里我想找出具有目标变量(是连续变量)的分类变量的重要性。为此,我考虑过执行方差分析,但我是否应该将每个类别变量都视为一个单独的组而感到困惑:
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)
答案 0 :(得分:0)
由于您提到了目标变量并且似乎正在使用OLS模型,所以我假设您正在尝试执行多元线性回归。
您不需要手动执行ANOVA-几乎所有线性回归模型的实现都会自动计算与每个输入变量关联的p值(控制所有其他输入变量)。
此外,您的OLS模型需要在其中包含所有输入变量,然后才能调用fit()
方法。换句话说,您需要在将输入变量传递到模型之前将其放入一个单独的组中,这不是因为ANOVA(不需要),而是因为多元线性回归本身需要它。
使用伪代码:
target_var = put_your_target_series_here
input_vars = put_all_your_input_series_here
result = ols(target_var, input_vars).fit()
在您的情况下,target_var
可能是 pandas系列(= pandas DataFrame中的单个列)。
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
的列,因为我们假设Has excellent value
和Has good value
的房屋没有0值。
有关多元线性回归中分类数据的虚拟变量的更多详细说明,请参见this link。