用python处理excel数据、求线性回归方程的r值_使用 python 做线性回归,scipy,statsmodels,sklearn...

使用 python 做线性回归分析有好几种方式,常要的分别是 scipy 包,statsmodels 包,以及 sklearn 包。但是,这些包目前都不能处理共线性,即自动剔除部分共线性的变量,需要自己去编函数,这一点不如 spss 或 r 语言。

假设有下面的数据存储在 excel 文件里面:

不良贷款各项贷款余额本年累计应收贷款贷款项目个数本年固定资产投资额

0.9

67.3

6.8

5

51.9

1.1

111.3

19.8

16

90.9

4.8

173.0

7.7

17

73.7

3.2

80.8

7.2

10

14.5

7.8

199.7

16.5

19

63.2

2.7

16.2

2.2

1

2.2

1.6

107.4

10.7

17

20.2

12.5

185.4

27.1

18

43.8

1.0

96.1

1.7

10

55.9

2.6

72.8

9.1

14

64.3

0.3

64.2

2.1

11

42.7

4.0

132.2

11.2

23

76.7

0.8

58.6

6.0

14

22.8

3.5

174.6

12.7

26

117.1

10.2

263.5

15.6

34

146.7

3.0

79.3

8.9

15

29.9

0.2

14.8

0.6

2

42.1

0.4

73.5

5.9

11

25.3

1.0

24.7

5.0

4

13.4

6.8

139.4

7.2

28

64.3

11.6

368.2

16.8

32

163.9

1.6

95.7

3.8

10

44.5

1.2

109.6

10.3

14

67.9

7.2

196.2

15.8

16

39.7

3.2

102.2

12.0

10

97.1

首先使用 pandas 读取 excel 数据:

import pandas as pd

# 读取 excel 数据,引号里面是 excel 文件在电脑的存储位置

datas = pd.read_excel(r'D:\Users\chen_\git\Statistics-book\datas\linear_regression.xlsx')

1

2

3

4

1. 用 scipy 包

scipy.stats 中的 linregress 函数可以做一元线性回归。假如因变量为 “不良贷款”,自变量为 “各项贷款余额”,全部 python 代码如下:

import scipy.stats as st

import pandas as pd

datas = pd.read_excel(r'D:\Users\chen_\git\Statistics-book\datas\linear_regression.xlsx') # 读取 excel 数据,引号里面是 excel 文件的位置

y = datas.iloc[:, 1] # 因变量为第 2 列数据

x = datas.iloc[:, 2] # 自变量为第 3 列数据

# 线性拟合,可以返回斜率,截距,r 值,p 值,标准误差

slope, intercept, r_value, p_value, std_err = st.linregress(x, y)

print(slope)# 输出斜率

print(intercept) # 输出截距

print(r_value**2) # 输出 r^2

1

2

3

4

5

6

7

8

9

10

11

12

13

scipy 中的回归分析比较简单,目前只能做一元线性回归,也不能用来做预测。

2. 用 statsmodels 包

import pandas as pd

import statsmodels.api as sm

import matplotlib.pyplot as plt

datas = pd.read_excel(r'D:\Users\chen_\git\Statistics-book\datas\linear_regression.xlsx') # 读取 excel 数据,引号里面是 excel 文件的位置

y = datas.iloc[:, 1] # 因变量为第 2 列数据

x = datas.iloc[:, 2] # 自变量为第 3 列数据

x = sm.add_constant(x) # 若模型中有截距,必须有这一步

model = sm.OLS(y, x).fit() # 构建最小二乘模型并拟合

print(model.summary()) # 输出回归结果

# 画图

# 这两行代码在画图时添加中文必须用

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.rcParams['axes.unicode_minus'] = False

predicts = model.predict() # 模型的预测值

x = datas.iloc[:, 2] # 自变量为第 3 列数据

plt.scatter(x, y, label='实际值') # 散点图

plt.plot(x, predicts, color = 'red', label='预测值')

plt.legend() # 显示图例,即每条线对应 label 中的内容

plt.show() # 显示图形

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

统计结果如下:

画出的实际值与预测值如下图:

注意:若导入包时使用命令 import statsmodels.formula.api as sm, 则在回归分析时不用添加截距 add_constant,但是必须使用统计语言给出模型信息,代码如下:

import pandas as pd

import statsmodels.formula.api as sm

import matplotlib.pyplot as plt

datas = pd.read_excel(r'D:\Users\chen_\git\Statistics-book\datas\linear_regression.xlsx') # 读取 excel 数据,引号里面是 excel 文件的位置

model = sm.ols('不良贷款~各项贷款余额', datas).fit() # 构建最小二乘模型并拟合,

#此时不用单独输入 x,y了,而是将自变量与因变量用统计语言公式表示,将全部数据导入

print(model.summary()) # 输出回归结果

# 画图

# 这两行代码在画图时添加中文必须用

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.rcParams['axes.unicode_minus'] = False

predicts = model.predict() # 模型的预测值

y = datas.iloc[:, 1] # 因变量为第 2 列数据

x = datas.iloc[:, 2] # 自变量为第 3 列数据

plt.scatter(x, y, label='实际值')

plt.plot(x, predicts, color = 'red', label='预测值')

plt.legend() # 显示图例,即每条线对应 label 中的内容

plt.show() # 显示图形

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

在多元回归中,只需把自变量改为多列数据即可,假如不良贷款为因变量,从第3列到第6列都是因变量,则使用 statsmodels 包的全部 python 代码如下:

import pandas as pd

import statsmodels.api as sm

import matplotlib.pyplot as plt

datas = pd.read_excel(r'D:\Users\chen_\git\Statistics-book\datas\linear_regression.xlsx') # 读取 excel 数据,引号里面是 excel 文件的位置

y = datas.iloc[:, 1] # 因变量为第 2 列数据

x = datas.iloc[:, 2:6] # 自变量为第 3 列到第 6 列数据

x = sm.add_constant(x) # 若模型中有截距,必须有这一步

model = sm.OLS(y, x).fit() # 构建最小二乘模型并拟合

print(model.summary()) # 输出回归结果

1

2

3

4

5

6

7

8

9

10

回归结果:

3. 用 sklearn 包

sklearn 包机器学习中常见的 python 包,可以用来做统计分析时,但它并不能像 statsmodels 那样生成非常详细的统计分析结果。一元回归时,自变量与因变量都需要处理下,对于上面同样的例子:

import pandas as pd

import matplotlib.pyplot as plt

import numpy as np

from sklearn.linear_model import LinearRegression

datas = pd.read_excel(r'D:\Users\chen_\git\Statistics-book\datas\linear_regression.xlsx') # 读取 excel 数据,引号里面是 excel 文件的位置

y = datas.iloc[:, 1] # 因变量为第 2 列数据

x = datas.iloc[:, 2] # 自变量为第 3 列数据

# 将 x,y 分别增加一个轴,以满足 sklearn 中回归模型认可的数据

x = x[:, np.newaxis]

y = y[:, np.newaxis]

model = LinearRegression() # 构建线性模型

model.fit(x, y) # 自变量在前,因变量在后

predicts = model.predict(x) # 预测值

R2 = model.score(x, y) # 拟合程度 R2

print('R2 = %.2f' % R2) # 输出 R2

coef = model.coef_ # 斜率

intercept = model.intercept_ # 截距

print(model.coef_, model.intercept_) # 输出斜率和截距

# 画图

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.rcParams['axes.unicode_minus'] = False

y = datas.iloc[:, 1] # 因变量为第 2 列数据

x = datas.iloc[:, 2] # 自变量为第 3 列数据

plt.scatter(x, y, label='实际值') # 散点图

plt.plot(x, predicts, color = 'red', label='预测值')

plt.legend() # 显示图例,即每条线对应 label 中的内容

plt.show() # 显示图形

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

用 sklearn 做多元回归时,自变量不需要单独处理了,全部代码如下:

import pandas as pd

import matplotlib.pyplot as plt

import numpy as np

from sklearn.linear_model import LinearRegression

datas = pd.read_excel(r'D:\Users\chen_\git\Statistics-book\datas\linear_regression.xlsx') # 读取 excel 数据,引号里面是 excel 文件的位置

y = datas.iloc[:, 1] # 因变量为第 2 列数据

x = datas.iloc[:, 2:6] # 自变量为第 3 列到第 6 列数据

# 将 y 分别增加一个轴,以满足 sklearn 中回归模型认可的数据

# 此时由于 x 是多元变量,则不用添加新的轴了

y = y[:, np.newaxis]

model = LinearRegression() # 构建线性模型

model.fit(x, y) # 自变量在前,因变量在后

predicts = model.predict(x) # 预测值

R2 = model.score(x, y) # 拟合程度 R2

print('R2 = %.3f' % R2) # 输出 R2

coef = model.coef_ # 斜率

intercept = model.intercept_ # 截距

print(model.coef_, model.intercept_) # 输出斜率和截距

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是 Python 实现最小二乘法拟合多元线性回归的代码: ```python import numpy as np # 输入数据 X = np.array([[1, 2, 3], [1, 3, 4], [1, 4, 5], [1, 5, 6]]) y = np.array([5, 7, 9, 11]) # 解系数 XTX = np.dot(X.T, X) XTX_inv = np.linalg.inv(XTX) XTy = np.dot(X.T, y) w = np.dot(XTX_inv, XTy) # 打印结果 print("系数为:", w) ``` 代码解释: 1. 首先导入 NumPy 库,该库提供了很多数学运算的函数,方便我们进行矩阵计算。 2. 定义输入数据 X 和输出数据 y,其中 X 的每一行表示一个样本,第一列全为 1,表示常数项,后面几列是自变量的取。 3. 计算系数 w,首先解 X 的转置矩阵与 X 的乘积 XTX,然后 XTX 的逆矩阵 XTX_inv,接着 X 的转置矩阵与 y 的乘积 XTy,最后解系数 w = XTX_inv * XTy。 4. 打印系数 w。 ### 回答2: Python中的最小二乘法拟合多元线性回归可以使用numpy和scipy库来实现。 首先,我们需要导入所需的库: ```python import numpy as np from scipy import stats ``` 然后,我们定义输入变量X和输出变量Y: ```python X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 输入变量X,每行代表一个样本 Y = np.array([10, 20, 30]) # 输出变量Y,每个元素对应一个样本的输出 ``` 接下来,我们使用numpy的linalg.lstsq函数进行最小二乘法拟合: ```python # 增加常数项 X = np.column_stack((X, np.ones(len(X)))) # 最小二乘法拟合 coefficients, residuals, _, _ = np.linalg.lstsq(X, Y, rcond=None) ``` 最后,我们可以打印出回归系数和残差: ```python print("回归系数:", coefficients[:-1]) print("常数项:", coefficients[-1]) print("残差:", residuals[0]) ``` 以上代码将计算出多元线性回归的回归系数、常数项和残差。 要注意的是,在使用最小二乘法拟合多元线性回归时,输入变量X的每个样本应该以行的形式表示。常数项可以通过在输入变量X后添加一列全为1的特征变量来表示。 ### 回答3: python使用最小二乘法进行多元线性回归的代码如下: ```python import numpy as np from scipy import stats # 生成样本数据 x1 = np.array([0, 1, 2, 3, 4, 5]) x2 = np.array([0, 1, 1, 2, 3, 5]) y = np.array([1, 2, 3, 4, 5, 6]) # 增加截距项 X = np.column_stack((np.ones(len(x1)), x1, x2)) # 使用最小二乘法进行拟合 beta, _, _, _ = np.linalg.lstsq(X, y, rcond=None) beta = np.round(beta, 2) # 四舍五入保留两位小数 # 输出回归系数 print("回归系数:", beta) # 再次使用stats模块得到回归方程 slope, intercept, r_value, p_value, std_err = stats.linregress(X[:,1:], y) # 输出回归方程 print("回归方程:y = {:.2f} + {:.2f} * x1 + {:.2f} * x2".format(intercept, slope[0], slope[1])) # 进行预测 x1_new = np.array([6, 7]) x2_new = np.array([4, 5]) X_new = np.column_stack((np.ones(len(x1_new)), x1_new, x2_new)) predicted_y = np.dot(X_new, beta) print("预测:", predicted_y) ``` 以上代码中,首先生成了样本数据,其中x1和x2表示自变量,y表示因变量。然后使用最小二乘法拟合多元线性回归模型,并得到回归系数。通过stats模块的linregress函数也可以得到回归方程的相关信息。最后,使用获得的回归系数进行预测,得到预测
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值