未记录事实核验 · 状态:现行内容

记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。

warning 适用边界与维护说明

本文适用于总体与样本方差、NumPy/Pandas计算及模拟数据离散程度比较的基础学习;样本方差计算要求样本量至少为2,其无偏估计解释以独立同分布且总体方差有限等通常抽样条件为前提。投资示例未定义观测周期,不作年化或真实投资评估,均值/标准差仅在无风险收益率取零且周期一致时作简化解释;质量示例使用规格限而非统计控制限,Cp分档不能替代过程稳定性和均值偏移评价。变异系数仅对适宜的比率尺度数据解释,当前代码已将零均值情况返回为未定义值;独立变量方差可加的有限样本演示不构成独立性检验。各代码段应按正文顺序使用前段导入的依赖。本次仅作结构审阅,未执行代码或开展外部事实核验。

🟣 方差(Variance)

abstract 📋 本节概览

  • 🎯 前置知识:理解什么是方差,为什么要用方差,以及如何用Python计算方差
  • 📚 前置知识:均值|均值 | 描述性统计|描述性统计
  • ⏱️ 预计用时:8分钟

🎯 核心概念

note 📖 **什么是方差?**

方差是衡量数据分散程度的统计量,表示各数据点与平均值的偏离程度。

直观理解:

  • 方差大 = 数据分布分散,个体差异大
  • 方差小 = 数据分布集中,个体差异小
  • 方差为0 = 所有数据都相等

📐 数学定义与计算

1. 总体方差 (Population Variance)

σ² = Σ(xi - μ)² / N

其中:μ为总体均值,N为总体大小

2. 样本方差 (Sample Variance)

s² = Σ(xi - x̄)² / (n-1)

其中:x̄为样本均值,n为样本大小,(n-1)称为自由度

note 🔍 **为什么样本方差除以(n-1)?**

使用(n-1)而不是n是为了得到总体方差的无偏估计,这被称为贝塞尔校正。

💻 Python实现详解

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats

# 基础方差计算
def variance_calculation_demo():
    """演示方差的不同计算方法"""
    
 # 示例数据:学生成绩
    scores = [85, 92, 78, 88, 95, 82, 90, 87, 91, 83]
    
    print("=== 方差计算演示 ===")
    print(f"数据: {scores}")
    
 # 1. 手动计算样本方差
    n = len(scores)
    mean = sum(scores) / n
    manual_var = sum((x - mean) ** 2 for x in scores) / (n - 1)
    
    print(f"\n手动计算:")
    print(f"样本均值: {mean:.2f}")
    print(f"样本方差: {manual_var:.2f}")
    
 # 2. NumPy计算
    numpy_var_sample = np.var(scores, ddof=1)  # 样本方差
    numpy_var_pop = np.var(scores, ddof=0)     # 总体方差
    
    print(f"\nNumPy计算:")
    print(f"样本方差 (ddof=1): {numpy_var_sample:.2f}")
    print(f"总体方差 (ddof=0): {numpy_var_pop:.2f}")
    
 # 3. Pandas计算
    df = pd.Series(scores)
    pandas_var = df.var()  # 默认是样本方差
    
    print(f"\nPandas计算:")
    print(f"样本方差: {pandas_var:.2f}")
    
 # 4. 计算过程可视化
    deviations = [(x - mean) for x in scores]
    squared_deviations = [(x - mean) ** 2 for x in scores]
    
 # 创建数据框显示计算过程
    calc_df = pd.DataFrame({
        '数据点': scores,
        '偏差': deviations,
        '偏差平方': squared_deviations
    })
    
    print(f"\n计算过程详解:")
    print(calc_df)
    print(f"偏差平方和: {sum(squared_deviations):.2f}")
    print(f"自由度: {n-1}")
    print(f"方差: {sum(squared_deviations)/(n-1):.2f}")

variance_calculation_demo()

📊 方差的几何意义

def variance_geometric_meaning():
    """展示方差的几何意义"""
    
 # 创建三组不同方差的数据
    np.random.seed(42)
    
 # 低方差数据
    low_var = np.random.normal(50, 3, 100)
    
 # 中方差数据
    med_var = np.random.normal(50, 8, 100)
    
 # 高方差数据
    high_var = np.random.normal(50, 15, 100)
    
 # 计算方差
    vars = [np.var(low_var, ddof=1), np.var(med_var, ddof=1), np.var(high_var, ddof=1)]
    labels = ['低方差', '中方差', '高方差']
    data_sets = [low_var, med_var, high_var]
    
    print("=== 方差的几何意义 ===")
    for i, (data, var, label) in enumerate(zip(data_sets, vars, labels)):
        print(f"{label}: 均值={np.mean(data):.1f}, 方差={var:.1f}")
    
 # 可视化
    fig, axes = plt.subplots(2, 2, figsize=(15, 10))
    
 # 直方图对比
    for i, (data, label, color) in enumerate(zip(data_sets, labels, ['blue', 'green', 'red'])):
        axes[0, 0].hist(data, alpha=0.6, label=f'{label} (σ²={np.var(data, ddof=1):.1f})', 
                       bins=20, color=color, density=True)
    axes[0, 0].set_title('不同方差的数据分布')
    axes[0, 0].legend()
    axes[0, 0].set_xlabel('数值')
    axes[0, 0].set_ylabel('密度')
    
 # 箱线图对比
    axes[0, 1].boxplot(data_sets, labels=labels)
    axes[0, 1].set_title('箱线图对比')
    axes[0, 1].set_ylabel('数值')
    
 # 散点图展示离散程度
    for i, (data, label, color) in enumerate(zip(data_sets, labels, ['blue', 'green', 'red'])):
        y_vals = [i] * len(data)
        axes[1, 0].scatter(data, y_vals, alpha=0.6, label=label, color=color)
    axes[1, 0].set_title('数据点分布')
    axes[1, 0].set_xlabel('数值')
    axes[1, 0].set_yticks([0, 1, 2])
    axes[1, 0].set_yticklabels(labels)
    axes[1, 0].legend()
    
 # 方差对比柱状图
    axes[1, 1].bar(labels, vars, color=['blue', 'green', 'red'], alpha=0.7)
    axes[1, 1].set_title('方差对比')
    axes[1, 1].set_ylabel('方差')
    
    plt.tight_layout()
    plt.show()

variance_geometric_meaning()

🏢 方差的实际应用

1. 🎯 投资风险评估

def investment_risk_analysis():
    """投资组合风险分析中的方差应用"""
    
 # 模拟三种投资产品的收益率
    np.random.seed(42)
    
 # 稳健型:低收益,低风险
    conservative = np.random.normal(0.05, 0.02, 252)  # 假设每次观测的收益率均值为5%、标准差为2%;未定义观测周期,不作年化解释
    
 # 平衡型:中等收益,中等风险
    balanced = np.random.normal(0.08, 0.05, 252)      # 假设每次观测的收益率均值为8%、标准差为5%;未定义观测周期,不作年化解释
    
 # 激进型:高收益,高风险
    aggressive = np.random.normal(0.12, 0.10, 252)    # 假设每次观测的收益率均值为12%、标准差为10%;未定义观测周期,不作年化解释
    
    investments = {
        '稳健型': conservative,
        '平衡型': balanced, 
        '激进型': aggressive
    }
    
    print("=== 投资风险分析 ===")
    print("投资产品风险评估(基于方差):")
    
    for name, returns in investments.items():
        mean_return = np.mean(returns)
        variance = np.var(returns, ddof=1)
        std_dev = np.std(returns, ddof=1)
        
 # 均值/标准差:仅在无风险收益率取0且收益周期一致时,可解释为同周期夏普比率的简化形式;未作年化
        risk_adjusted = mean_return / std_dev if std_dev > 0 else 0
        
        print(f"\n{name}:")
        print(f"  平均收益率: {mean_return:.2%}")
        print(f"  收益方差: {variance:.6f}")
        print(f"  收益标准差: {std_dev:.2%}")
        print(f"  风险调整收益: {risk_adjusted:.3f}")
    
 # 可视化收益分布
    plt.figure(figsize=(15, 5))
    
    for i, (name, returns) in enumerate(investments.items(), 1):
        plt.subplot(1, 3, i)
        plt.hist(returns, bins=30, alpha=0.7, density=True)
        plt.axvline(np.mean(returns), color='red', linestyle='--', 
                   label=f'均值: {np.mean(returns):.2%}')
        plt.title(f'{name}\n方差: {np.var(returns, ddof=1):.6f}')
        plt.xlabel('收益率')
        plt.ylabel('概率密度')
        plt.legend()
    
    plt.tight_layout()
    plt.show()

investment_risk_analysis()

2. 🏭 质量控制

def quality_control_analysis():
    """制造业质量控制中的方差应用"""
    
 # 模拟生产线产品尺寸数据
    np.random.seed(42)
    
 # 标准:目标尺寸100mm,允许误差±2mm
    target_size = 100
    tolerance = 2
    
 # 三条生产线的数据
    line1 = np.random.normal(100, 0.5, 50)   # 高精度生产线
    line2 = np.random.normal(100, 1.2, 50)   # 中等精度生产线  
    line3 = np.random.normal(99.5, 2.0, 50)  # 低精度生产线(均值偏移)
    
    production_lines = {
        '生产线A(高精度)': line1,
        '生产线B(中精度)': line2,
        '生产线C(低精度)': line3
    }
    
    print("=== 质量控制分析 ===")
    print(f"目标尺寸: {target_size}mm")
    print(f"允许公差: ±{tolerance}mm")
    
    for name, data in production_lines.items():
        mean_size = np.mean(data)
        variance = np.var(data, ddof=1)
        std_dev = np.std(data, ddof=1)
        
 # 计算合格率
        within_tolerance = np.sum((data >= target_size - tolerance) & 
                                (data <= target_size + tolerance))
        pass_rate = within_tolerance / len(data)
        
 # 过程能力指数Cp(简化版)
        cp = tolerance / (3 * std_dev) if std_dev > 0 else float('inf')
        
        print(f"\n{name}:")
        print(f"  平均尺寸: {mean_size:.2f}mm")
        print(f"  尺寸方差: {variance:.3f}")
        print(f"  尺寸标准差: {std_dev:.3f}mm")
        print(f"  合格率: {pass_rate:.1%}")
        print(f"  过程能力指数Cp: {cp:.2f}")
        print(f"  示例Cp分档(非综合质量评级,不反映均值偏移): {'Cp≥1.33' if cp >= 1.33 else '1.0≤Cp<1.33' if cp >= 1.0 else 'Cp<1.0'}")
    
 # 可视化
    fig, axes = plt.subplots(2, 2, figsize=(15, 10))
    
 # 分布对比
    for name, data in production_lines.items():
        axes[0, 0].hist(data, alpha=0.6, label=name, bins=20, density=True)
    
 # 添加公差线
    axes[0, 0].axvline(target_size - tolerance, color='red', linestyle='--', alpha=0.7, label='下限')
    axes[0, 0].axvline(target_size + tolerance, color='red', linestyle='--', alpha=0.7, label='上限')
    axes[0, 0].axvline(target_size, color='black', linestyle='-', alpha=0.7, label='目标')
    axes[0, 0].set_title('产品尺寸分布')
    axes[0, 0].legend()
    axes[0, 0].set_xlabel('尺寸 (mm)')
    
 # 方差对比
    variances = [np.var(data, ddof=1) for data in production_lines.values()]
    axes[0, 1].bar(production_lines.keys(), variances, color=['green', 'orange', 'red'], alpha=0.7)
    axes[0, 1].set_title('各生产线方差对比')
    axes[0, 1].set_ylabel('方差')
    axes[0, 1].tick_params(axis='x', rotation=15)
    
 # 合格率对比
    pass_rates = []
    for data in production_lines.values():
        within_tolerance = np.sum((data >= target_size - tolerance) & 
                                (data <= target_size + tolerance))
        pass_rates.append(within_tolerance / len(data))
    
    axes[1, 0].bar(production_lines.keys(), pass_rates, color=['green', 'orange', 'red'], alpha=0.7)
    axes[1, 0].set_title('各生产线合格率')
    axes[1, 0].set_ylabel('合格率')
    axes[1, 0].tick_params(axis='x', rotation=15)
    
 # 样本序列与规格限对照图:公差界限不是统计控制限
    for i, (name, data) in enumerate(production_lines.items()):
        axes[1, 1].plot(data[:30], label=name, marker='o', markersize=3)
    
    axes[1, 1].axhline(target_size, color='black', linestyle='-', alpha=0.7, label='目标值')
    axes[1, 1].axhline(target_size + tolerance, color='red', linestyle='--', alpha=0.7)
    axes[1, 1].axhline(target_size - tolerance, color='red', linestyle='--', alpha=0.7)
    axes[1, 1].set_title('尺寸序列与规格限(前30个样本)')
    axes[1, 1].set_xlabel('样本序号')
    axes[1, 1].set_ylabel('尺寸 (mm)')
    axes[1, 1].legend()
    
    plt.tight_layout()
    plt.show()

quality_control_analysis()

🧮 方差的数学性质

📐 重要性质

def variance_properties_demo():
    """演示方差的数学性质"""
    
    np.random.seed(42)
    X = np.random.normal(10, 3, 1000)  # 均值10,标准差3
    
    print("=== 方差的数学性质 ===")
    print(f"原始数据X: 均值={np.mean(X):.2f}, 方差={np.var(X, ddof=1):.2f}")
    
 # 性质1: Var(X + c) = Var(X)
    c = 5
    X_plus_c = X + c
    print(f"\n性质1: Var(X + {c}) = Var(X)")
    print(f"X + {c}的方差: {np.var(X_plus_c, ddof=1):.2f}")
    print(f"是否相等: {abs(np.var(X, ddof=1) - np.var(X_plus_c, ddof=1)) < 0.01}")
    
 # 性质2: Var(cX) = c²Var(X)
    c = 2
    cX = c * X
    expected_var = (c**2) * np.var(X, ddof=1)
    actual_var = np.var(cX, ddof=1)
    print(f"\n性质2: Var({c}X) = {c}²Var(X)")
    print(f"理论值: {expected_var:.2f}")
    print(f"实际值: {actual_var:.2f}")
    print(f"是否相等: {abs(expected_var - actual_var) < 0.1}")
    
 # 性质3: 对于独立且方差有限的随机变量X和Y,总体方差满足Var(X + Y) = Var(X) + Var(Y);有限样本方差还包含两倍样本协方差项
    Y = np.random.normal(5, 2, 1000)  # 独立的Y
    X_plus_Y = X + Y
    expected_var_sum = np.var(X, ddof=1) + np.var(Y, ddof=1)
    actual_var_sum = np.var(X_plus_Y, ddof=1)
    
    print(f"\n性质3: 对于独立X和Y,Var(X + Y) = Var(X) + Var(Y)")
    print(f"Var(X): {np.var(X, ddof=1):.2f}")
    print(f"Var(Y): {np.var(Y, ddof=1):.2f}")
    print(f"理论值: {expected_var_sum:.2f}")
    print(f"实际值: {actual_var_sum:.2f}")
    print(f"样本方差差值是否小于演示阈值0.5(不用于检验独立性或验证总体恒等式): {abs(expected_var_sum - actual_var_sum) < 0.5}")

variance_properties_demo()

🎯 方差与其他统计量的关系

📊 标准差、变异系数

def variance_relationships():
    """方差与相关统计量的关系"""
    
 # 创建不同特征的数据集
    datasets = {
        '收入数据': [20000, 25000, 30000, 50000, 80000, 120000],  # 高变异
        '身高数据': [165, 170, 172, 175, 178, 180],              # 低变异  
        '温度数据': [20, 22, 23, 25, 27, 28]                     # 示例假设单位为K;摄氏或华氏温度不适合这样解释变异系数
    }
    
    print("=== 方差与相关统计量的关系 ===")
    
    for name, data in datasets.items():
        mean_val = np.mean(data)
        variance = np.var(data, ddof=1)
        std_dev = np.std(data, ddof=1)
        cv = std_dev / mean_val if mean_val != 0 else np.nan  # 均值为0时未定义;仅对适宜的比率尺度数据解释变异系数
        
        print(f"\n{name}:")
        print(f"  数据: {data}")
        print(f"  均值: {mean_val:.2f}")
        print(f"  方差: {variance:.2f}")
        print(f"  标准差: {std_dev:.2f}")
        print(f"  变异系数: {cv:.3f} ({cv:.1%})")
        print(f"  标准差 = √方差: {np.sqrt(variance):.2f}")
        
 # 验证关系
        print(f"  验证 方差 = 标准差²: {abs(variance - std_dev**2) < 0.01}")

variance_relationships()

⚠️ 使用注意事项

🚫 常见误区

  1. 单位问题:方差的单位是原数据单位的平方
  2. 样本vs总体:注意使用正确的自由度
  3. 异常值敏感:方差容易受极端值影响
  4. 解释困难:相比标准差,方差的直观性较差

💡 最佳实践

  • 报告结果时同时提供标准差
  • 识别并处理异常值
  • 根据数据性质选择合适的离散度量
  • 结合其他统计量综合分析

🔗 相关知识