33 数据分布情况分析
33.1 引言数据分布的重要性
分布特征: - 集中趋势: 均值、中位数 - 离散程度: 方差、标准差 - 形状特征: 偏度、峰度
33.2 描述性统计
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
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: 平峰分布(更分散)
# ==================== 计算偏度 ====================
# 偏度衡量分布的不对称性,正值表示右偏,负值表示左偏
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 可视化分析
# ==================== 导入绘图库 ====================
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计算: 基于分布的风险价值