1.什么是回归?
回归(Regression)是统计学中一种用于探索变量之间关系的分析方法。它主要用于预测一个或多个自变量(输入变量)与因变量(输出变量)之间的关系。在回归分析中,我们尝试根据已知的自变量值来预测因变量的值。
回归分析通常用于以下情况:
(1) 预测:通过已知的自变量值来预测因变量的值。例如,根据房屋的面积、地理位置等因素来预测房屋的售价。
(2)关联性分析:确定自变量与因变量之间的关系强度和方向。例如,研究气温与冰淇淋销量之间的关系。
(3)控制变量:在研究中控制其他变量的影响,以便更准确地分析自变量与因变量之间的关系。
回归分析的基本思想是通过一个数学模型来描述自变量和因变量之间的关系。这个模型通常是一个线性函数,但也可以是其他形式,如多项式函数、指数函数等。常见的回归分析包括线性回归、多元线性回归、逻辑回归等。
在实际应用中,回归分析是数据科学和机器学习中的重要工具之一,广泛应用于预测、分类、控制和优化等领域。
弗朗西斯·高尔顿(Francis Galton)是19世纪的一位英国科学家,涉猎广泛,特别是在统计学、心理学和生物学方面做出了许多重要贡献。其中一个著名的贡献就是提出并发展了“回归”这一统计概念。
高尔顿在研究遗传学时,发现了一个有趣的现象,即子女的某些特征往往会回归到群体平均水平。例如,他观察到高个子父母的子女虽然也倾向于较高,但往往没有父母那么高;同样,矮个子父母的子女虽然也倾向于较矮,但往往没有父母那么矮。这一现象后来被称为“回归”或“回归均值”。
为了更好地理解这一现象,高尔顿进行了大量的数据分析和实验,并最终提出了“回归线”的概念。他的工作奠定了现代回归分析的基础,这是一种用于探讨和量化变量之间关系的重要统计方法。
具体来说,高尔顿的研究包括:
(1) 回归分析:高尔顿最初在研究身高遗传时注意到,子女的身高总是回归到平均水平。他利用散点图和回归线来描述这种趋势。这为后来的线性回归模型奠定了基础。
(2)相关系数:高尔顿还发展了相关分析的方法,用来量化两个变量之间的线性关系。卡尔·皮尔逊(Karl Pearson)进一步推广了这一概念,提出了皮尔逊相关系数。
高尔顿的贡献不仅在于他发现了这些现象,更在于他开发了统计工具和方法,使得其他科学家可以系统地研究和分析数据。这些工具和方法今天仍然广泛应用于各个科学领域。
2.回归和相关有什么区别?
回归分析和相关分析都是用于探索变量之间的关系,但它们有一些重要的区别:
(1)目标:
- 回归分析:旨在建立一个数学模型来描述自变量与因变量之间的关系,并用这个模型进行预测。回归分析关注的是预测性能,即模型在新数据上的表现。
- 相关分析:旨在衡量两个变量之间的相关程度,即它们的变化是否同步发生。相关分析关注的是变量之间的关联性,而不是因果关系或预测能力。
(2)用途: - 回归分析:通常用于预测一个或多个因变量的值,根据已知的自变量值。它可以用于预测连续型变量,也可以用于分类问题(例如逻辑回归)。
- 相关分析:用于描述和衡量两个变量之间的关系强度和方向。它可以帮助我们了解变量之间的相关性,但不能用于预测。
(3)统计方法: - 回归分析: 通常基于最小二乘法等统计方法来拟合一个数学模型,例如线性回归、多元线性回归、逻辑回归等。
- 相关分析: 通常使用皮尔逊相关系数或斯皮尔曼等级相关系数等统计量来衡量变量之间的相关性。
(4)变量类型: - 回归分析:可以用于分析和预测连续型变量之间的关系,也可以用于分析离散型因变量的关系(例如逻辑回归)。
- 相关分析:通常用于衡量两个连续型变量之间的关系。
虽然回归分析和相关分析有一些区别,但它们都是探索变量之间关系的重要工具,在统计学和数据分析中都具有广泛的应用。
3.回归的分类
回归分析根据自变量(解释变量)和因变量(响应变量)的数量以及模型的形式可以分为多种类型。以下是常见的回归分析分类:
(1)线性回归: - 简单线性回归:只有一个自变量和一个因变量的回归分析。
- 多元线性回归:有多个自变量和一个因变量的回归分析。
(2)非线性回归: - 多项式回归:自变量和因变量之间的关系可用多项式函数来描述。
- 指数回归:因变量的对数与自变量之间存在线性关系。
- 对数回归:自变量的对数与因变量之间存在线性关系。
- 幂函数回归:自变量和因变量之间存在幂函数关系。
(3)广义线性模型(Generalized Linear Models, GLM): - 逻辑回归:用于二分类问题,因变量是二元变量。
- 泊松回归:用于计数数据,因变量是计数型变量。
- 负二项分布回归:用于计数数据,对应因变量的方差大于均值的情况。
- Gamma 回归:用于因变量为连续的正数,但不是正态分布的情况。
(4) 岭回归和 Lasso 回归: - 岭回归(Ridge Regression):通过添加 L2 正则化项来解决多重共线性问题。
- Lasso 回归(Least Absolute Shrinkage and Selection Operator):通过添加 L1 正则化项来实现特征选择和稀疏性。
(5)弹性网络回归(Elastic Net Regression): - 综合了岭回归和 Lasso 回归的特点,同时使用 L1 和 L2 正则化项。
(6)加权回归(Weighted Regression): - 对不同观测值赋予不同的权重,以适应不同观测值的异方差性。
(7)非参数回归(Nonparametric Regression): - 不假设数据遵循特定的分布或模型形式,根据数据来拟合灵活的曲线。
(8)稳健回归(Robust Regression): - 对异常值具有鲁棒性,减少异常值对回归结果的影响。
以上是一些常见的回归分析类型,每种类型适用于不同的问题和数据特征。选择适当的回归模型是根据数据类型、假设和分析目的来决定的。
4.回归分析的步骤
(1)数据收集
收集要分析的变量数据。例如,在上一篇中,我们收集了温度和游客数量。
温度(x):20,23,26,29,30,33,35,38
游客数量(y):80,120,270,430,540,580,680,750
(2)数据可视化
绘制散点图来初步观察变量之间的关系。这有助于判断是否存在线性关系或其他类型的关系。
(3)假设模型
选择适当的回归模型。这里我们以简单线性回归为例:
可以有很多条线来拟合这些点,那么如何判断哪条线最好呢?
对于简单线性回归,这些参数的计算公式如下:
(4)估计模型参数
(计算结果来自chatgpt,不一定准确,只看步骤就行)
(5) 模型评估
计算决定系数 (𝑅2) 和进行残差分析
(残差分析这里只提一下,后面碰到再详细说)
(6) 假设检验
进行 t 检验以确定 𝑎和 𝑏 是否显著。
解释一下这里面几个要计算的量
截距和斜率标准误差的计算公式:
然后计算t统计量,查找临界值就行了。
(7)预测和解释
(8) 报告结果
(计算结果来自chatgpt,不一定准确,只看过程就行了)
用代码简单一些:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
# 数据输入
temperature = np.array([20, 23, 26, 29, 30, 33, 35, 38])
visitors = np.array([80, 120, 270, 430, 540, 580, 680, 750])
# 绘制散点图
plt.figure(figsize=(10, 6))
plt.scatter(temperature, visitors, color='blue', label='Data Points')
plt.xlabel('Temperature (°C)')
plt.ylabel('Number of Visitors')
plt.title('Scatter Plot of Temperature vs. Number of Visitors')
plt.legend()
plt.grid(True)
plt.show()
# 回归模型拟合
slope, intercept, r_value, p_value, std_err = stats.linregress(temperature, visitors)
print(f'回归方程: y = {intercept:.2f} + {slope:.2f}x')
# 绘制回归函数图
plt.figure(figsize=(10, 6))
plt.scatter(temperature, visitors, color='blue', label='Data Points')
plt.plot(temperature, intercept + slope * temperature, color='red', label='Regression Line')
plt.xlabel('Temperature (°C)')
plt.ylabel('Number of Visitors')
plt.title('Regression Line of Temperature vs. Number of Visitors')
plt.legend()
plt.grid(True)
plt.show()
# 决定系数
r_squared = r_value**2
print(f'决定系数 (R^2): {r_squared:.4f}')
# 残差分析
predicted_visitors = intercept + slope * temperature
residuals = visitors - predicted_visitors
plt.figure(figsize=(10, 6))
plt.scatter(temperature, residuals, color='purple')
plt.axhline(y=0, color='red', linestyle='--')
plt.xlabel('Temperature (°C)')
plt.ylabel('Residuals')
plt.title('Residual Plot')
plt.grid(True)
plt.show()
# 残差的统计量
residuals_mean = np.mean(residuals)
residuals_std = np.std(residuals)
print(f'残差的平均值: {residuals_mean:.4f}')
print(f'残差的标准差: {residuals_std:.4f}')
# 斜率和截距的t统计量
t_stat_slope = slope / std_err
t_stat_intercept = intercept / (std_err * np.sqrt(np.sum((temperature - np.mean(temperature))**2)))
print(f'斜率的 t 统计量: {t_stat_slope:.4f}')
print(f'截距的 t 统计量: {t_stat_intercept:.4f}')
# 计算斜率和截距的p值
p_value_slope = 2 * (1 - stats.t.cdf(np.abs(t_stat_slope), df=len(temperature)-2))
p_value_intercept = 2 * (1 - stats.t.cdf(np.abs(t_stat_intercept), df=len(temperature)-2))
print(f'斜率的 p 值: {p_value_slope:.4f}')
print(f'截距的 p 值: {p_value_intercept:.4f}')
得到的结果: