数据的模型分析及可视化
数据的模型分析及可视化
文章目录
- 数据的模型分析及可视化
- 7.1 线性相关分析
- 7.1.1 线性相关基础
- 7.1.2 相关关系模拟与可视化
- 7.1.3 相关系数计算方法
- 公式与含义
- Python 实现
- 7.1.4 相关系数显著性检验
- 7.2 简单线性回归模型
- 7.2.1 模型构建与原理
- 7.2.2 模型拟合与可视化
- 7.2.3 模型检验与解释
- 系数显著性检验
- 模型整体拟合度
- 7.2.4 回归预测应用
- 7.3 分组对比分析与可视化
- 7.3.1 分组数据准备
- 7.3.2 分组相关分析
- 7.3.3 分组回归模型对比
- 总结
- 核心内容回顾
7.1 线性相关分析
7.1.1 线性相关基础
核心概念:
线性相关描述两个定量变量间线性关系的方向和强度,通过 Pearson 相关系数 ( r ) 度量(( r \in [-1, 1] )):
- 完全正相关(( r=1 )):变量严格同向变化(如 ( y = x ))
- 完全负相关(( r=-1 )):变量严格反向变化(如 ( y = -x ))
- 无线性相关(( r=0 )):变量间无直线关系
适用条件:
- 变量为定量数据(如身高、体重)
- 双变量正态分布假设
- 散点图显示线性趋势
7.1.2 相关关系模拟与可视化
数据生成逻辑:
通过控制自变量 ( x ) 和随机误差 ( e \sim N(0, 1) ) 生成不同相关关系的因变量 ( y ):
- 含噪声正相关:( y = x + e )
- 含噪声负相关:( y = -x + e )
代码实现(模拟数据散点图):
import numpy as np
import matplotlib.pyplot as pltx = np.linspace(-4, 4, 20)
np.random.seed(1)
e = np.random.randn(20)
y_positive = x + e # 正相关数据
y_negative = -x + e # 负相关数据plt.figure(figsize=(12, 4))
plt.subplot(121)
plt.scatter(x, y_positive, label=f'正相关 (r={np.corrcoef(x, y_positive)[0,1]:.2f})')
plt.subplot(122)
plt.scatter(x, y_negative, label=f'负相关 (r={np.corrcoef(x, y_negative)[0,1]:.2f})')
plt.legend()
plt.show()
7.1.3 相关系数计算方法
公式与含义
Pearson 相关系数计算公式:
- 分子:协方差(Covariance),反映变量协同变化程度
- 分母:标准差乘积,用于标准化
Python 实现
-
单变量相关系数:
import pandas as pd BS = pd.read_excel('DaPy_data.xlsx', 'BSdata') r = BS['身高'].corr(BS['体重']) # 计算身高与体重的相关系数 print(f"身高与体重相关系数:{r:.4f}") # 输出约 0.7521
-
相关系数矩阵:
correlation_matrix = BS[['身高', '体重', '支出']].corr() # 生成多变量相关矩阵 print(correlation_matrix)
-
矩阵散点图:
import seaborn as sns sns.pairplot(BS[['身高', '体重', '支出']], diag_kind='hist', plot_kws={'alpha': 0.6})
7.1.4 相关系数显著性检验
检验步骤:
-
假设:
- 原假设 ( H_0 ):总体相关系数 ( \rho = 0 )
- 备择假设 ( H_1 ):( \rho \neq 0 )
-
统计量:
通过 t 检验判断 ( r ) 是否显著非零(p < 0.05 时拒绝 ( H_0 ))
代码示例:
import scipy.stats as st# 检验身高与支出的相关性
r, p_value = st.pearsonr(BS['身高'], BS['支出'])
print(f"相关系数:{r:.4f}, p值:{p_value:.4f}")
# 若 p_value < 0.05,说明相关性显著
7.2 简单线性回归模型
7.2.1 模型构建与原理
数学模型:
- ( \beta_0 ):截距项(X=0时Y的理论值)
- ( \beta_1 ):回归系数(X每增加1单位,Y平均变化量)
- ( \epsilon ):随机误差(服从正态分布)
拟合方法:
最小二乘法(OLS):通过最小化残差平方和 ( \sum (y_i - \hat{y}_i)^2 ) 估计 ( \beta_0 ) 和 ( \beta_1 )
7.2.2 模型拟合与可视化
步骤解析:
-
散点图观察:
plt.scatter(BS['身高'], BS['体重'], alpha=0.6, label='观测值') plt.xlabel('身高 (cm)'); plt.ylabel('体重 (kg)')
-
模型拟合:
import statsmodels.api as sm X = sm.add_constant(BS['身高']) # 添加截距项(常数项) y = BS['体重'] model = sm.OLS(y, X).fit() # 最小二乘估计 print(f"截距 β₀:{model.params[0]:.2f},斜率 β₁:{model.params[1]:.2f}")
-
回归线绘制:
y_pred = model.fittedvalues # 获取预测值 plt.plot(BS['身高'], y_pred, 'r-', linewidth=2, label=f'回归直线:y = {model.params[0]:.2f} + {model.params[1]:.2f}x') plt.legend()
7.2.3 模型检验与解释
系数显著性检验
指标 | 含义 | 解读 |
---|---|---|
t 值 | 系数与0的差异显著性(t=系数/标准误) | |
p 值 | 拒绝原假设的概率 | p < 0.05 时系数显著非零 |
置信区间 | 系数的95%可信范围 | 不包含0则支持变量相关性 |
代码输出:
print(model.summary().tables[1]) # 查看回归系数检验表
模型整体拟合度
-
R²(决定系数):
取值范围 [0, 1],表示模型解释因变量变异的比例。print(f"R²:{model.rsquared:.4f}") # 如 0.5663,说明身高解释了体重56.63%的变异
-
F 检验:
检验模型整体显著性,F值越大、p值越小,说明模型中至少有一个自变量显著。
7.2.4 回归预测应用
点预测示例:
# 预测身高175cm的体重(需包含截距项的常数1)
new_data = pd.DataFrame({'const': 1, '身高': [175]})
predicted_weight = model.predict(new_data)
print(f"预测体重:{predicted_weight[0]:.1f} kg")
7.3 分组对比分析与可视化
7.3.1 分组数据准备
按性别分组:
BS_male = BS[BS['性别'] == '男'][['身高', '体重']] # 筛选男生数据
BS_female = BS[BS['性别'] == '女'][['身高', '体重']] # 筛选女生数据
7.3.2 分组相关分析
男生组:
# 相关系数与显著性检验
r_male, p_male = st.pearsonr(BS_male['身高'], BS_male['体重'])
print(f"男生相关系数:{r_male:.4f},p值:{p_male:.4f}")# 联合图(散点图+直方图)
import seaborn as sns
sns.jointplot(x='身高', y='体重', data=BS_male, kind='scatter', color='blue')
女生组:
r_female, p_female = st.pearsonr(BS_female['身高'], BS_female['体重'])
sns.jointplot(x='身高', y='体重', data=BS_female, kind='kde', color='pink') # 密度估计图
7.3.3 分组回归模型对比
回归系数对比:
# 男生回归模型(公式接口更简洁)
import statsmodels.formula.api as smf
model_male = smf.ols('体重 ~ 身高', data=BS_male).fit()
print("男生斜率(身高每增1cm,体重平均变化):", model_male.params['身高']) # 如 0.88 kg# 女生回归模型
model_female = smf.ols('体重 ~ 身高', data=BS_female).fit()
print("女生斜率:", model_female.params['身高']) # 如 0.72 kg
可视化对比(分性别回归线):
# 使用 plotnine 绘制分面回归图(支持中文)
from plotnine import *
theme_set(theme_bw(base_family='SimSun')) # 设置中文字体(ggplot(BS, aes('身高', '体重'))+ geom_point(alpha=0.6) # 绘制原始数据点+ facet_wrap('性别') # 按性别分组显示+ stat_smooth(method='lm', se=True, color='red') # 添加回归线及置信带
)
总结
核心内容回顾
-
线性相关分析:
- 用 Pearson 相关系数 ( r ) 量化线性关系,范围 ([-1, 1]),结合散点图和 t 检验验证显著性。
- 注意数据需为定量变量,且满足线性趋势和正态分布假设。
-
简单线性回归:
- 建立 ( Y = \beta_0 + \beta_1 X + \epsilon ) 模型,通过最小二乘法拟合,用 R² 评估解释力,t 检验判断系数显著性。
- 预测时需注意自变量范围,避免过度外推。
-
分组对比分析:
- 按类别(如性别)分组后,分别计算相关系数和回归模型,揭示不同群体的差异。
- 利用联合图、分面图等可视化工具清晰展示分组结果。