1.什么是回归?
回归(Regression)是统计学中一种用于探索变量之间关系的分析方法。它主要用于预测一个或多个自变量(输入变量)与因变量(输出变量)之间的关系。在回归分析中,我们尝试根据已知的自变量值来预测因变量的值。
回归分析通常用于以下情况:
(1) 预测:通过已知的自变量值来预测因变量的值。例如,根据房屋的面积、地理位置等因素来预测房屋的售价。
(2)关联性分析:确定自变量与因变量之间的关系强度和方向。例如,研究气温与冰淇淋销量之间的关系。
(3)控制变量:在研究中控制其他变量的影响,以便更准确地分析自变量与因变量之间的关系。
回归分析的基本思想是通过一个数学模型来描述自变量和因变量之间的关系。这个模型通常是一个线性函数,但也可以是其他形式,如多项式函数、指数函数等。常见的回归分析包括线性回归、多元线性回归、逻辑回归等。
在实际应用中,回归分析是数据科学和机器学习中的重要工具之一,广泛应用于预测、分类、控制和优化等领域。
弗朗西斯·高尔顿(Francis Galton)是19世纪的一位英国科学家,涉猎广泛,特别是在统计学、心理学和生物学方面做出了许多重要贡献。其中一个著名的贡献就是提出并发展了“回归”这一统计概念。
高尔顿在研究遗传学时,发现了一个有趣的现象,即子女的某些特征往往会回归到群体平均水平。例如,他观察到高个子父母的子女虽然也倾向于较高,但往往没有父母那么高;同样,矮个子父母的子女虽然也倾向于较矮,但往往没有父母那么矮。这一现象后来被称为“回归”或“回归均值”。
为了更好地理解这一现象,高尔顿进行了大量的数据分析和实验,并最终提出了“回归线”的概念。他的工作奠定了现代回归分析的基础,这是一种用于探讨和量化变量之间关系的重要统计方法。
具体来说,高尔顿的研究包括:
(1) 回归分析:高尔顿最初在研究身高遗传时注意到,子女的身高总是回归到平均水平。他利用散点图和回归线来描述这种趋势。这为后来的线性回归模型奠定了基础。
(2)相关系数:高尔顿还发展了相关分析的方法,用来量化两个变量之间的线性关系。卡尔·皮尔逊(Karl Pearson)进一步推广了这一概念,提出了皮尔逊相关系数。
高尔顿的贡献不仅在于他发现了这些现象,更在于他开发了统计工具和方法,使得其他科学家可以系统地研究和分析数据。这些工具和方法今天仍然广泛应用于各个科学领域。
2.回归和相关有什么区别?
回归分析和相关分析都是用于探索变量之间的关系,但它们有一些重要的区别:
(1)目标:

(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}')
得到的结果:



