33.数据分布情况分析

本章概要

  • 学习材料:带样本口径的连续变量序列。
  • 本章任务:运行 lst-skewness-kurtosisfig-hist-box,计算中心、离散、偏度和Fisher超额峰度。
  • 完成后你将得到:统计表、直方图/箱线图和峰度约定说明。
  • 自我检查:用分位数复算IQR并核对正态基准0;常量或有效样本不足时先检查原因。
  • 拓展练习:把分布检查拓展应用到另一中国业务指标。

为什么要分析数据分布?

理解数据的分布特征,是所有数据分析工作的第一步

分布特征帮助我们回答三个核心问题:

  • 集中趋势:数据聚集在哪里?(均值、中位数)
  • 离散程度:数据分散到什么程度?(方差、标准差)
  • 形状特征:数据是对称的还是偏斜的?(偏度、峰度)

描述性统计:数据的”全貌速写”

描述性统计能快速呈现数据集的基本面貌,包括样本量、均值、标准差、最小值、四分位数和最大值。

下面我们生成 10000 个随机整数,并计算其描述性统计量。

运行前预测|平台任务:描述性统计与偏度峰度计算

  • 输入预测:运行前先写出 datadata_describedata_skewdata_kurtosis 的业务含义、数据类型或取值范围,并判断哪一个输入最可能改变结果。
  • 结果预测:不展开答案,先预测将得到“数据集的描述性统计信息:”相关结果;同时写出方向、数量级或表格/图形结构。
  • 完成要求:能独立说明本任务从输入到“平台任务:描述性统计与偏度峰度计算”结果的关键步骤,原样录入平台代码并得到可核对的运行结果。

Fisher 口径提示

kurtosis() 默认采用 Fisher 超额峰度:正态总体的基准为 0;有限样本估计的正负只是第四矩形状线索,不能单独证明厚尾、薄尾或极端风险高低。

⭐ 平台任务:描述性统计与偏度峰度计算

展开完整代码(投影默认折叠)
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
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)  # 输出数据集的峰度为

任务复盘|平台任务:描述性统计与偏度峰度计算

运行后核对:核对 datadata_describedata_skewdata_kurtosis 是否按预测参与运算,实际输出是否与预测一致;若不一致,先检查类型、单位、索引/字段和运算顺序。

拓展练习:把输入表替换为本地中国上市公司数据的同结构子集;指出必须保持的字段、数据类型和质量检查。

什么是偏度(Skewness)?

偏度衡量数据分布的对称性,公式为:

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

  • Skew = 0:第三中心矩为零;这是形状线索,不足以推出对称,更不能推出正态
  • Skew > 0:右偏(正偏),右侧有长尾
  • Skew < 0:左偏(负偏),左侧有长尾

偏度的直观理解

偏度直观对比 展示左偏、对称和右偏三种分布形态 左偏 (Skew < 0) 长尾在左侧 对称 (Skew = 0) 一个对称示例:正态 右偏 (Skew > 0) 长尾在右侧

什么是峰度(Kurtosis)?

Fisher 超额峰度是相对正态基准的第四矩形状摘要,公式为:

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

  • Kurt ≈ 0:样本第四矩接近正态基准;不推出总体正态或尾部概率相同
  • Kurt > 0 / < 0:可能同时受尾部与中心质量分配影响,不能单独等同于尾部风险高/低

边界:必须联看分布图、分位数与尾部专门指标;零偏度不推出对称,零超额峰度也不推出正态。

计算偏度和峰度并解读

本页与平台任务统一使用 SciPy 的 Fisher 超额峰度:正态总体基准为 0。样本值受样本量和极端点显著影响,只能与分位数、经验尾部概率和敏感性分析联读。

偏度峰度的课堂阈值边界

代码中的 ±0.5 仅是帮助课堂初步分类的示意性启发阈值;样本量、抽样不确定性与估计量选择都会改变判断,不能把该阈值当作通用统计检验标准。

Listing 1: 计算偏度和峰度
展开确定性输入、偏度峰度计算与判读代码
# 本地讲解链自带确定性输入;上方平台任务按要求不在课件渲染时执行
import numpy as np
from scipy.stats import skew, kurtosis

np.random.seed(0)
data = np.random.randint(10, 20, 10000)

# ==================== 计算偏度 ====================
# 偏度衡量分布的不对称性,正值表示右偏,负值表示左偏
data_skew = skew(data)  # 计算数据的偏度系数

# ==================== 计算峰度 ====================
# fisher=True表示使用Fisher超额峰度(正态分布峰度为0)
data_kurtosis = kurtosis(data, fisher=True)  # 与平台任务统一计算Fisher超额峰度

# ==================== 输出偏度和峰度 ====================
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) < 0.5:  # 采用受样本与估计量影响的课堂示意阈值
    print('  样本超额峰度接近正态基准,不足以判定正态或尾部风险')  # 限定为有限样本形状线索
elif data_kurtosis > 0:  # 样本超额峰度为正
    print('  样本第四矩高于正态基准,须用经验尾部与敏感性核对')  # 不从单一统计量推出厚尾风险
else:  # 样本超额峰度为负
    print('  样本第四矩低于正态基准,须用经验尾部与敏感性核对')  # 不从单一统计量推出薄尾安全
偏度: -0.0096
峰度: -1.2371

偏度解读:
  偏度接近0,分布较为对称

峰度解读:
  样本第四矩低于正态基准,须用经验尾部与敏感性核对

可视化分析:直方图与箱线图

直方图展示频率分布,箱线图展示五数概括(最小值、Q1、中位数、Q3、最大值)。

两者结合使用能全面展现数据的分布形态和异常值。

绘制直方图与箱线图

展开分布输入与直方图、箱线图代码
# ==================== 导入绘图库 ====================
import matplotlib.pyplot as plt  # 基础绘图库
import seaborn as sns  # 统计绘图库

# ==================== 创建画布 ====================
fig, axes = plt.subplots(1, 2, figsize=(8, 4.2))  # 压缩双图高度以适配 1280×720 投影视口

# ==================== 绘制直方图 ====================
axes[0].hist(data, bins=20, color='steelblue', alpha=0.7, edgecolor='black')
axes[0].set_title('直方图', fontsize=14)
axes[0].set_xlabel('值', fontsize=12)
axes[0].set_ylabel('频数', fontsize=12)
axes[0].grid(axis='y', alpha=0.3)

# ==================== 绘制箱线图 ====================
axes[1].boxplot(data, vert=True)
axes[1].set_title('箱线图', fontsize=14)
axes[1].set_ylabel('值', fontsize=12)
axes[1].grid(axis='y', alpha=0.3)

plt.tight_layout()
plt.show()
图中展示直方图与箱线图;读者应依据坐标、图例与注释比较主要模式。
Figure 1: 直方图与箱线图

箱线图解读要点

箱线图结构解析 标注箱线图各部分含义:最小值、Q1、中位数、Q3、最大值、异常值 最大值(1.5×IQR内) Q3(第75百分位数) 中位数 Q2(第50百分位数) Q1(第25百分位数) 最小值(1.5×IQR内) ● 异常值(超出1.5×IQR) IQR

Q-Q 图:诊断与正态分布的一致程度

Q-Q 图(Quantile-Quantile Plot)将数据的分位数与理论正态分布的分位数对比:

  • 样本点在中部近似贴线 → 与该部分正态分位数近似一致,但不是正态性的证明
  • 系统弯曲或尾端偏离 → 提示位置、尺度、偏度或尾部差异;需结合样本量、检验与尾部统计量

绘制 Q-Q 图

展开 Q-Q 图检验与绘制代码
from scipy import stats  # 导入统计模块

plt.figure(figsize=(8, 4.2))  # 压缩 Q-Q 图高度并保留标题与结果区域
stats.probplot(data, dist='norm', plot=plt)
plt.title('Q-Q图(正态分布检验)', fontsize=14)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
图中展示Q-Q图(正态分布检验);读者应依据坐标、图例与注释比较主要模式。
Figure 2: Q-Q图(正态分布检验)

金融应用:分布分析的实际意义

在金融领域,分布分析是风险管理的基础:

  • 正态性检验:股票收益率是否服从正态分布?
  • 尾部风险:极端亏损发生的概率有多大?
  • VaR 计算:基于收益率分布估计在一定置信水平下的最大潜在损失

本章小结

概念 含义 关键判断
偏度 第三矩形状线索 =0 不足以证明对称;正/负值提示偏斜方向
超额峰度 相对正态第四矩基准 ≈0 不推出正态;正/负值须联看经验尾部
直方图 频率分布形状 直观展示分布形态
箱线图 五数概括+异常值 识别中位数与离群点
Q-Q 图 正态一致性诊断 近线只是有限样本近似;系统偏离提示进一步检查

随堂练习

  • 问题 1|需要准备哪些数据?:带样本口径的连续变量序列。
  • 问题 2|需要完成哪些操作?:运行 lst-skewness-kurtosisfig-hist-box,计算中心、离散、偏度和Fisher超额峰度。
  • 问题 3|应得到哪些结果?:统计表、直方图/箱线图和峰度约定说明。
  • 问题 4|怎样确认结果可靠?:用分位数复算IQR并核对正态基准0;常量或有效样本不足时先检查原因。
  • 问题 5|换一个情境,怎样继续应用?:把分布检查拓展应用到另一中国业务指标。
  • 作答提示:请依次写清所用数据、分析过程、所得结果、核对方法和拓展思考。课程所需数据见前言中的下载入口;教学平台固定题按页面说明完成。

教师参考解答|答案与说明 1

  • 所用数据与字段:规定资产 stock_price_post_adjusted.parquet;上海汽车 600104.XSHG;字段 order_book_id/date/close
  • 解答示例|直方图、箱线图与 Fisher 峰度(平台保护块之外):

教师参考解答|代码 1

展开代码(代码区可独立滚动)
from pathlib import Path  # 导入路径工具
import matplotlib.pyplot as plt  # 导入绘图库
import pandas as pd  # 导入表格库
import numpy as np  # 导入有限值数据质量检查工具
from scipy import stats  # 导入Q-Q图与稳健分布工具
path=Path('/home/ubuntu/r2_data_mount/data/stock/stock_price_post_adjusted.parquet')  # 指定复权价格
if not path.exists(): raise FileNotFoundError('未找到课程数据文件,请从课程数据下载入口获取并核对文件位置')  # 缺失即停止
price_rows=pd.read_parquet(path,columns=['order_book_id','date','close'],filters=[('order_book_id','==','600104.XSHG')])  # 按实际字段结构与目标证券读取必需字段
price_rows=price_rows.rename(columns={'order_book_id':'ts_code','date':'trade_date'}).copy()  # 标准化证券与交易日字段供后续核对
if price_rows.empty: raise ValueError('输入文件、字段、样本量或数值不符合当前分析要求,请按本页说明检查')  # 目标证券缺失时停止
price_rows['trade_date']=pd.to_datetime(price_rows['trade_date'],errors='coerce')  # 解析交易日期键
price_rows['close']=pd.to_numeric(price_rows['close'],errors='coerce')  # 解析复权收盘价
if price_rows['trade_date'].isna().any() or not np.isfinite(price_rows['close']).all() or price_rows['close'].le(0).any(): raise ValueError('输入文件、字段、样本量或数值不符合当前分析要求,请按本页说明检查')  # 日期或价格不可用时停止
if price_rows.duplicated('trade_date').any(): raise ValueError('输入文件、字段、样本量或数值不符合当前分析要求,请按本页说明检查')  # 目标日期键不唯一时停止
price_rows=price_rows.sort_values('trade_date')  # 按唯一日期键固定时间顺序
returns=price_rows['close'].pct_change(fill_method=None).dropna()  # 计算单只股票日收益率
if not np.isfinite(returns).all(): raise ValueError('输入文件、字段、样本量或数值不符合当前分析要求,请按本页说明检查')  # 派生收益非有限时停止
if len(returns)<30: raise ValueError('输入文件、字段、样本量或数值不符合当前分析要求,请按本页说明检查')  # 最小收益样本不足时禁止发布分布依据
distribution_summary=returns.agg(['count','mean','median','std','skew'])  # 汇总中心、离散与偏度
fisher_kurtosis=returns.kurt()  # 按Pandas Fisher约定计算超额峰度且正态基准为0

教师参考解答|代码 2

展开代码(代码区可独立滚动)
figure,axes=plt.subplots(1,2)  # 创建直方图与箱线图画布
axes[0].hist(returns,bins=30)  # 绘制收益率直方图
axes[1].boxplot(returns,vert=True)  # 绘制收益率箱线图
qq_theoretical,qq_ordered=stats.probplot(returns,dist='norm',fit=False)  # 计算Q-Q图理论与样本分位点
lower_bound,upper_bound=returns.quantile([0.01,0.99])  # 定义1%缩尾边界
winsorized_returns=returns.clip(lower_bound,upper_bound)  # 生成稳健性比较序列
sensitivity=pd.DataFrame({'raw':[returns.skew(),fisher_kurtosis],'winsorized':[winsorized_returns.skew(),winsorized_returns.kurt()]},index=['skew','fisher_kurtosis'])  # 比较原始与缩尾统计
print(distribution_summary,{'fisher_kurtosis':fisher_kurtosis,'qq_points':len(qq_ordered)},sensitivity)  # 输出分布统计、Q-Q点数与敏感性结果

教师参考解答|答案与说明 2

  • 口径答案:本章采用 Fisher 超额峰度,正态总体基准为0;样本正负只表示第四矩估计相对该基准的方向,不能单独证明厚尾/薄尾、正态性或极端风险高低,必须联看经验分位数、尾部概率与敏感性。
  • 解释与拓展应用答案:分布分析用于识别中心、波动和尾部风险,不直接识别价格变化原因;替换为另一家长三角公司后保持同频率/期间,用原始与1%缩尾结果以及Q-Q偏离共同核对。
  • 参考结果:样本量、均值、中位数、标准差、偏度、Fisher 峰度、直方图、箱线图、Q-Q 图和缩尾前后比较。所需股票行情可从课程数据下载入口取得。
  • 边界 / 局限:尾部统计依赖频率、期间和复权口径
  • 常见错误:用价格水平;忽略极端值日期