python - 如何对数据集执行方差分析?
问题描述
我有一个房价数据集,我想在其中找出分类变量与目标变量(这是一个连续变量)的重要性。为此,我考虑过执行方差分析,但我很困惑是否应该将每个分类变量视为一个单独的组:
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 模型,因此我假设您正在尝试执行多元线性回归。
您不需要手动执行 ANOVA - 几乎所有线性回归模型的实现都会自动计算与每个输入变量关联的 p 值(控制所有其他输入变量)。
fit()
此外,在调用该方法之前,您的 OLS 模型需要在其中包含所有输入变量。换句话说,您需要将输入变量放在一个组中,然后再将它们传递给模型,这不是因为您需要将其用于 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 Series(这意味着您只有一个输入变量 - 这是一个简单的线性回归)或pandas DataFrame(在这种情况下,每一列都被解释为一个输入变量 - 您正在执行多重线性回归)。
变量中的对象result
包含模型中所有输入变量的 p 值 - 请参阅您正在使用的包的文档以检查如何提取它们。
但是,由于您的输入变量是类别,您将不得不使用 dummy variables。假设您有以下数据:
|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
邻域价值的价值是价值价值的 2 倍Good
——这可能是真的,也可能不是!此外,对于颜色等类别,这没有任何意义。
真正的解决方案是使用虚拟变量,例如:
|House | Has excellent value | Has good value|
|------|---------------------|---------------|
|01 | 0 | 1 |
|02 | 0 | 0 |
|03 | 0 | 0 |
|04 | 1 | 0 |
|05 | 0 | 1 |
这避免了我上面描述的问题。
请注意,我们不需要列 for,Has bad value
因为我们假设没有 0 的房子,Has excellent value
并且Has good value
必须具有错误的值。
有关多元线性回归中分类数据的虚拟变量的更深入解释,请参阅此链接。
推荐阅读
- swift - MKGeodesicPolyline 可以沿线划分为任意数量的点吗?
- alfresco - 为什么 Alfresco 节点浏览器和编程相同的查询执行之间存在差异?
- azure - 在没有数据丢失或中断的情况下批量整合和编辑 Azure 标记?
- salesforce - 合并两个 Salesforce SOQL 查询
- c# - 我的 IEnumerator 正在工作但没有等待
- python - 使用 Pip 安装 OpenCv 时的问题
- excel - 如何在 VBA 中为 LOOKUP 引用特定的单元格编号?
- javascript - 赛普拉斯连接以查找第二个元素
- flutter - flutter - 同时滚动浏览两个列表视图
- python - 如何检查来自电报频道的消息是否是图像 Python