文章目录
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的差别