多元线性回归分析

1,概念

在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是与多个因素相联系的,由多个自变量的最优组合共同来预测或估计因变量,比只用一个自变量进行预测或估计更有效,更符合实际。因此多元线性回归比一元线性回归的实用意义更大。

2,用Excel进行多元线性回归

1,删掉表里的不需要的项,即非数据项

在这里插入图片描述

2,分析数据库

在数据出鼠标右击
在这里插入图片描述
然后点击自定义功能区,点击加载项,再点击转到
在这里插入图片描述再点击分析工具库,点击确定
在这里插入图片描述
再点击数据,点击右边的数据分析
在这里插入图片描述

选择回归
在这里插入图片描述
在这里输入x和y的输入区域
在这里插入图片描述
然后就会生成另一个文件,点开
在这里插入图片描述可以看到intercept为截距,下面几行就是对应自变量的系数

3,代码方式实现多元线性回归

1,导入包

import pandas as pd
import numpy as np
import seaborn as sns
from sklearn import datasets
from sklearn.linear_model import LinearRegression

2,读取文件

df = pd.read_csv('C:\\Users\\hp\\Desktop\\house_prices.csv')
df.info()#显示列名和数据类型类型
df.head(6)#显示前n行,n默认为5

注意,这里的df = pd.read_csv()中填的是csv文件路径,就是我们要读取的文件的路径,根据每个人的不同

3,取出变量

#取出自变量
data_x=df[['area','bedrooms','bathrooms']]
data_y=df['price']

4,进行多元线性回归并得出结果

# 进行多元线性回归
model=LinearRegression()
l_model=model.fit(data_x,data_y)
print('参数权重')
print(model.coef_)
print('模型截距')
print(model.intercept_)

5,结果

在这里插入图片描述

6,检测异常

# 异常值处理
# ================ 异常值检验函数:iqr & z分数 两种方法 =========================
def outlier_test(data, column, method=None, z=2):
    """ 以某列为依据,使用 上下截断点法 检测异常值(索引) """
    """ 
    full_data: 完整数据
    column: full_data 中的指定行,格式 'x' 带引号
    return 可选; outlier: 异常值数据框 
    upper: 上截断点;  lower: 下截断点
    method:检验异常值的方法(可选, 默认的 None 为上下截断点法),
            选 Z 方法时,Z 默认为 2
    """

    if method == None:
        print(f'以 {column} 列为依据,使用 上下截断点法(iqr) 检测异常值...')
        print('=' * 70)
        # 四分位点;这里调用函数会存在异常
        column_iqr = np.quantile(data[column], 0.75) - np.quantile(data[column], 0.25)
        # 1,3 分位数
        (q1, q3) = np.quantile(data[column], 0.25), np.quantile(data[column], 0.75)
        # 计算上下截断点
        upper, lower = (q3 + 1.5 * column_iqr), (q1 - 1.5 * column_iqr)
        # 检测异常值
        outlier = data[(data[column] <= lower) | (data[column] >= upper)]
        print(f'第一分位数: {q1}, 第三分位数:{q3}, 四分位极差:{column_iqr}')
        print(f"上截断点:{upper}, 下截断点:{lower}")
        return outlier, upper, lower
    # ===================== Z 分数检验异常值 ==========================
    if method == 'z':
        print(f'以 {column} 列为依据,使用 Z 分数法,z 分位数取 {z} 来检测异常值...')
        print('=' * 70)
        mean, std = np.mean(data[column]), np.std(data[column])
        upper, lower = (mean + z * std), (mean - z * std)
        print(f"取 {z} 个 Z分数:大于 {upper} 或小于 {lower} 的即可被视为异常值。")
        print('=' * 70)
        # 检测异常值
        outlier = data[(data[column] <= lower) | (data[column] >= upper)]
        return outlier, upper, lower

7,得到异常集并进行丢弃

outlier, upper, lower = outlier_test(data=df, column='price', method='z')#获得异常数据
outlier.info(); outlier.sample(5)
df.drop(index=outlier.index, inplace=True)#丢弃异常数据

8,取出自变量和因变量

#取出自变量
data_x=df[['area','bedrooms','bathrooms']]
data_y=df['price']

9,进行多元线性回归

# 进行多元线性回归
model=LinearRegression()
l_model=model.fit(data_x,data_y)
print('参数权重')
print(model.coef_)
print('模型截距')
print(model.intercept_)

10,结果

在这里插入图片描述

4,用线性回归模型的统计学库实现

1,导入函数

数据的预处理都是一样的,只是后面的导入的函数不一样了

# 对名义变量neighborhood进行处理
# 设置虚拟变量
nominal_data = df['neighborhood']
# 设置虚拟变量
dummies = pd.get_dummies(nominal_data)
dummies.sample() # pandas 会自动帮你命名
# 每个名义变量生成的虚拟变量中,需要各丢弃一个,这里以丢弃C为例
dummies.drop(columns=['C'], inplace=True)
dummies.sample()
# 对名义变量style进行处理
# 设置虚拟变量
nominal_style_data = df['style']
# 设置虚拟变量
style_dummies = pd.get_dummies(nominal_style_data)
style_dummies.sample() # pandas 会自动帮你命名
# 每个名义变量生成的虚拟变量中,需要各丢弃一个,这里以丢弃lodge
#原因:转化后的虚拟变量需要舍弃一个,才能得到满秩矩阵,可理解为当变量名可划分为n类时,只需要n-1个虚拟变量就能获取所有信息了
style_dummies.drop(columns=['lodge'], inplace=True)
style_dummies.sample()
#数据拼接
results = pd.concat(objs=[df, dummies], axis='columns') # 按照列来合并
results = pd.concat(objs=[results, style_dummies], axis='columns') # 按照列来合并
results.sample(3)

2,进行预测

from statsmodels.formula.api import ols
#使用虚拟变量
lm = ols('price ~ area + bedrooms + bathrooms + A + B', data=results).fit()
lm.summary()

在这里插入图片描述

3,检验一下

def vif(df, col_i):
    """
    df: 整份数据
    col_i:被检测的列名
    """
    cols = list(df.columns)
    cols.remove(col_i)
    cols_noti = cols
    formula = col_i + '~' + '+'.join(cols_noti)
    r2 = ols(formula, df).fit().rsquared
    return 1. / (1. - r2)
test_data = results[['area', 'bedrooms', 'bathrooms', 'A', 'B']]
for i in test_data.columns:
    print(i, '\t', vif(df=test_data, col_i=i))

在这里插入图片描述可以看到bedroom和bathroom相关程度较高

4,去掉bedroom,再次建模

# 去掉bedroom再次建模
lm = ols(formula='price ~ area + bathrooms + A + B', data=results).fit()
lm.summary()

在这里插入图片描述成功

5,分析

不进行数据处理时,用jupyter和使用excel进行数据分析的结果没有不同,但是数据清理之后差别还是挺大的,在就行了多元共线性检测后,结果更为合理

6,总结

初步了解了多元线性回归的步骤,也清楚了异常数据对于回归方程的影响,明白了Excel和jupyter的差别

7,参考

Excel-一元线性回归和多元线性回归(借助数据分析功能和直接计算)

线性回归分析

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论

打赏作者

可小阿木

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值