当前位置: 首页 > news >正文

数据的模型分析及可视化

数据的模型分析及可视化


文章目录

  • 数据的模型分析及可视化
    • 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 )):变量间无直线关系

适用条件

  1. 变量为定量数据(如身高、体重)
  2. 双变量正态分布假设
  3. 散点图显示线性趋势

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 相关系数计算公式:

[
r = \frac{\text{Cov}(X,Y)}{\sigma_X \sigma_Y} = \frac{\sum (x_i-\bar{x})(y_i-\bar{y})}{\sqrt{\sum (x_i-\bar{x})^2 \sum (y_i-\bar{y})^2}}
]

  • 分子:协方差(Covariance),反映变量协同变化程度
  • 分母:标准差乘积,用于标准化
Python 实现
  1. 单变量相关系数

    import pandas as pd
    BS = pd.read_excel('DaPy_data.xlsx', 'BSdata')
    r = BS['身高'].corr(BS['体重'])  # 计算身高与体重的相关系数
    print(f"身高与体重相关系数:{r:.4f}")  # 输出约 0.7521
    
  2. 相关系数矩阵

    correlation_matrix = BS[['身高', '体重', '支出']].corr()  # 生成多变量相关矩阵
    print(correlation_matrix)
    
  3. 矩阵散点图

    import seaborn as sns
    sns.pairplot(BS[['身高', '体重', '支出']], diag_kind='hist', plot_kws={'alpha': 0.6})
    

7.1.4 相关系数显著性检验

检验步骤

  1. 假设

    • 原假设 ( H_0 ):总体相关系数 ( \rho = 0 )
    • 备择假设 ( H_1 ):( \rho \neq 0 )
  2. 统计量
    在这里插入图片描述

    通过 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 模型构建与原理

数学模型
[
Y = \beta_0 + \beta_1 X + \epsilon, \quad \epsilon \sim N(0, \sigma^2)
]

  • ( \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 模型拟合与可视化

步骤解析

  1. 散点图观察

    plt.scatter(BS['身高'], BS['体重'], alpha=0.6, label='观测值')
    plt.xlabel('身高 (cm)'); plt.ylabel('体重 (kg)')
    
  2. 模型拟合

    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}")
    
  3. 回归线绘制

    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')  # 添加回归线及置信带
)

总结

核心内容回顾

  1. 线性相关分析

    • 用 Pearson 相关系数 ( r ) 量化线性关系,范围 ([-1, 1]),结合散点图和 t 检验验证显著性。
    • 注意数据需为定量变量,且满足线性趋势和正态分布假设。
  2. 简单线性回归

    • 建立 ( Y = \beta_0 + \beta_1 X + \epsilon ) 模型,通过最小二乘法拟合,用 R² 评估解释力,t 检验判断系数显著性。
    • 预测时需注意自变量范围,避免过度外推。
  3. 分组对比分析

    • 按类别(如性别)分组后,分别计算相关系数和回归模型,揭示不同群体的差异。
    • 利用联合图、分面图等可视化工具清晰展示分组结果。

相关文章:

  • 【python机器学习】Day 25 异常处理
  • 日本动漫风格人像街拍Lr调色预设,手机滤镜PS+Lightroom预设下载!
  • 《Python星球日记》 第71天:命名实体识别(NER)与关系抽取
  • Java—封装、继承与多态
  • 通过Ollama读取模型
  • CSS 锚点滑动效果的技术
  • 【C/C++】高阶用法_笔记
  • Tensorflow2保存和加载模型
  • 【Redis】缓存穿透、缓存雪崩、缓存击穿
  • Java 异常处理之 BufferUnderflowException(BufferUnderflowException 概述、常见发生场景、避免策略)
  • C 语言学习笔记(8)
  • 因果推断 | 用SHAP分值等价因果效应值进行反事实推理
  • 【Linux】掌握 setsid:让进程脱离终端独立运行
  • 东芝新四款产品“TB67Z830SFTG、TB67Z830HFTG、TB67Z850SFTG、TB67Z850HFTG系列三相栅极驱动器ic三相栅极驱动器IC
  • 软件测试--入门
  • 【Linux】Ext系列文件系统
  • 鸿蒙-5.1.0-release构建编译环境
  • Oracle中的select1条、几条、指定范围的语句
  • 每日算法-250514
  • 【golang】网络数据包捕获库 gopacket
  • 白玉兰奖征片综述丨动画的IP生命力
  • 国内首家破产的5A景区游客爆满,洛阳龙潭大峡谷:破产并非因景观不好
  • 人民日报仲音:大力纠治违规吃喝顽瘴痼疾
  • 中保协发布《保险机构适老服务规范》,全面规范保险机构面向老年人提供服务的统一标准
  • 哈马斯表示已释放一名美以双重国籍被扣押人员
  • 农行深圳市分行原副行长王国彪涉嫌严重违纪违法被查