33  数据分布情况分析

33.1 引言数据分布的重要性

分布特征: - 集中趋势: 均值、中位数 - 离散程度: 方差、标准差 - 形状特征: 偏度、峰度

33.2 描述性统计

列表 33.1
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
import numpy as np  # 导入NumPy数值计算库
import pandas as pd  # 导入Pandas数据分析库
from scipy.stats import skew, kurtosis  # 导入SciPy科学计算库

# 生成1000个10到20之间的随机整数
np.random.seed(0)
data = np.random.randint(10,20,10000)  # 生成随机数

# 描述性统计
data_describe = pd.DataFrame(data).describe()
print("数据集的描述性统计信息:\n", data_describe)  # 输出数据集的描述性统计信息:\n

# 计算偏度和峰度
data_skew = skew(data)
data_kurtosis = kurtosis(data)  # 计算数据的峰度(衡量分布尖锐程度)
print("数据集的偏度为:", data_skew)  # 输出数据集的偏度为
print("数据集的峰度为:", data_kurtosis)  # 输出数据集的峰度为

33.3 偏度与峰度

偏度(Skewness): 衡量分布的对称性

\[ \text{Skew} = E\left[\left(\frac{X-\mu}{\sigma}\right)^3\right] \]

  • Skew = 0: 对称分布(如正态分布)
  • Skew > 0: 右偏(正偏),长尾在右侧
  • Skew < 0: 左偏(负偏),长尾在左侧

峰度(Kurtosis): 衡量分布的尖锐程度

\[ \text{Kurt} = E\left[\left(\frac{X-\mu}{\sigma}\right)^4\right] - 3 \]

  • Kurt = 0: 正态峰度(以正态分布为基准)
  • Kurt > 0: 尖峰分布(更集中)
  • Kurt < 0: 平峰分布(更分散)
列表 33.2
# ==================== 计算偏度 ====================
# 偏度衡量分布的不对称性,正值表示右偏,负值表示左偏
data_skew = skew(data)  # 计算数据的偏度系数

# ==================== 计算峰度 ====================
# fisher=False表示使用Pearson峰度(正态分布峰度为3)
# fisher=True表示使用Fisher峰度(正态分布峰度为0)
data_kurtosis = kurtosis(data, fisher=False)  # 计算Pearson峰度

# ==================== 输出偏度和峰度 ====================
print(f'偏度: {data_skew:.4f}')  # 打印偏度值,保留4位小数
print(f'峰度: {data_kurtosis:.4f}')  # 打印峰度值

# ==================== 偏度解读 ====================
print('\n偏度解读:')
if abs(data_skew) < 0.5:  # 偏度绝对值小于0.5
    print('  偏度接近0,分布较为对称')  # 近似对称分布
elif data_skew > 0:  # 偏度大于0
    print('  正偏,右侧长尾')  # 右侧有极端值拉动均值
else:  # 偏度小于0
    print('  负偏,左侧长尾')  # 左侧有极端值拉动均值

# ==================== 峰度解读 ====================
print('\n峰度解读:')
if abs(data_kurtosis - 3) < 0.5:  # Pearson峰度接近3
    print('  峰度接近3,接近正态分布')  # 正态峰度
elif data_kurtosis > 3:  # Pearson峰度大于3
    print('  尖峰,数据更集中')  # 中心集中,尾部较薄
else:  # Pearson峰度小于3
    print('  平峰,数据更分散')  # 中心平坦,尾部较厚

33.4 可视化分析

列表 33.3
# ==================== 导入绘图库 ====================
import matplotlib.pyplot as plt  # 基础绘图库
import seaborn as sns  # 统计绘图库

# ==================== 创建画布 ====================
fig, axes = plt.subplots(1, 2, figsize=(14, 6))  # 1行2列的子图,总大小14x6英寸

# ==================== 绘制直方图 ====================
# 直方图展示数据的频率分布,直观显示分布形状
axes[0].hist(data, bins=20, color='steelblue', alpha=0.7, edgecolor='black')
# bins=20: 分成20个区间
# color='steelblue': 钢蓝色填充
# alpha=0.7: 透明度70%
# edgecolor='black': 黑色边框
axes[0].set_title('直方图', fontsize=14)  # 设置标题
axes[0].set_xlabel('值', fontsize=12)  # x轴标签
axes[0].set_ylabel('频数', fontsize=12)  # y轴标签
axes[0].grid(axis='y', alpha=0.3)  # 添加y轴网格线

# ==================== 绘制箱线图 ====================
# 箱线图展示数据的五数概括和异常值
axes[1].boxplot(data, vert=True)  # vert=True表示垂直方向
axes[1].set_title('箱线图', fontsize=14)  # 设置标题
axes[1].set_ylabel('值', fontsize=12)  # y轴标签
axes[1].grid(axis='y', alpha=0.3)  # 添加y轴网格线

# 箱线图解读:
# 箱子:从Q1(25%)到Q3(75%),包含中间50%的数据
# 中线:中位数(Q2,50%)
# 须:1.5倍IQR(四分位距)范围
# 点:超出须范围的异常值

plt.tight_layout()  # 自动调整布局
plt.show()  # 显示图形

# ==================== Q-Q图检验正态性 ====================
from scipy import stats  # 导入统计模块

plt.figure(figsize=(8, 6))  # 创建8x6英寸的画布
stats.probplot(data, dist='norm', plot=plt)  # 绘制Q-Q图
# dist='norm': 与正态分布比较
# plot=plt: 在当前图形上绘制
plt.title('Q-Q图(正态分布检验)', fontsize=14)  # 设置标题
plt.grid(True, alpha=0.3)  # 添加网格线
plt.tight_layout()  # 自动调整布局
plt.show()  # 显示图形

# Q-Q图解读:
# 如果数据点大致落在红色参考线上,说明数据符合正态分布
# 如果偏离参考线,说明数据不符合正态分布

33.5 金融应用

收益分布分析: - 正态性检验: 股票收益是否正态分布 - 尾部风险: 极端收益概率 - VaR计算: 基于分布的风险价值