You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kolmogorov-Smirnov检验与帕累托分布拟合矛盾问题求助

帕累托分布拟合与KS检验矛盾的问题排查与解决

问题背景

基于“80%财富掌握在20%人手中”的经验法则,推导对应的帕累托分布形状参数为α=log₄5≈1.161。使用亿万富翁数据集的finalWorth列验证时,ECDF与帕累托CDF视觉拟合效果极佳,但KS检验返回极小p值(3.268×10⁻⁵³),严格拒绝数据服从该分布的原假设。针对你提出的三个可能原因,逐一分析如下:


1. 代码与数据处理错误排查

核心问题:数据中的0值与缺失值

帕累托分布的定义域为x ≥ scale > 0,但原始数据可能存在0值或缺失值,这会直接导致KS检验偏差:

  • 若数据包含0值,帕累托CDF在x < scale时为0,而ECDF在x=0处已累积了部分概率,两者的偏差会被KS检验捕捉到;
  • 缺失值会影响样本量与ECDF计算,需先清洗。

代码修正点

  • 添加数据清洗步骤,过滤缺失值与0值:
    final_worth = billionaires_data['finalWorth'].dropna()
    final_worth = final_worth[final_worth > 0]
    
  • 确认scipy.stats.pareto参数顺序:KS检验中args=(alpha, 0, scale)是正确的,对应帕累托分布的形状参数α、位置参数0、尺度参数scale。

2. KS检验的局限性:无限方差导致p值失真

帕累托分布当α≤2时方差无限(本次α≈1.161<2),而KS检验的渐近有效性依赖于分布的矩(均值、方差等)存在。对于重尾、无限方差的分布:

  • 大样本下,KS检验会极度放大数据与分布的微小偏差,即使视觉拟合良好,也会返回极小p值;
  • 检验的p值计算基于正态近似,不适用于无限方差分布,结果不可靠。

3. 财富分布的实际特性

“80/20法则”是经验近似,实际财富分布可能并非严格服从单一帕累托分布:

  • 可能是分段帕累托分布(不同财富区间的α不同);
  • 存在混合分布特性(如不同行业、地区的亿万富翁财富分布差异);
  • 大样本下,统计检验会拒绝任何“严格服从”的假设,即使分布是极佳的实用近似。

解决方案与替代方法

1. 修正数据后重新检验

按上述步骤清洗数据,过滤0值与缺失值,再执行KS检验,可排除数据异常导致的偏差。

2. 用可视化替代单一统计检验

  • Q-Q图:直观对比样本分位数与帕累托理论分位数,若大部分点落在直线上,说明拟合效果良好:
    n = len(final_worth)
    quantiles = np.linspace(1/(n+1), n/(n+1), n)
    theoretical_quantiles = pareto.ppf(quantiles, alpha, scale=scale)
    
    plt.figure(figsize=(10,6))
    plt.scatter(theoretical_quantiles, np.sort(final_worth), alpha=0.5)
    plt.plot(theoretical_quantiles, theoretical_quantiles, 'r--')
    plt.xlabel('理论帕累托分位数')
    plt.ylabel('样本分位数')
    plt.title('帕累托分布拟合Q-Q图')
    plt.show()
    
  • 放大尾部区域观察:重尾分布的拟合质量主要看尾部是否对齐,ECDF图可切换为对数坐标轴,更清晰观察尾部差异。

3. 理解大样本假设检验的意义

大样本下,几乎任何微小的分布偏差都会导致检验拒绝原假设。视觉拟合良好已说明该帕累托分布是财富分布的有效近似,可满足实际分析需求,无需纠结统计检验的严格结果。


修正后完整代码示例

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

# 加载并清洗数据
billionaires_data = pd.read_csv("D:/Self Study/Math/Statistic/Billionaires Statistics Dataset.csv")
final_worth = billionaires_data['finalWorth'].dropna()
final_worth = final_worth[final_worth > 0]
print(f"有效样本量: {len(final_worth)}")

# 计算ECDF
def ecdf(data):
    n = len(data)
    x = np.sort(data)
    y = np.arange(1, n+1) / n
    return x, y

x_ecdf, y_ecdf = ecdf(final_worth)

# 帕累托分布参数
alpha = np.log(5) / np.log(4)
scale = final_worth.min()

# 绘制ECDF与帕累托CDF
wealth_values = np.linspace(scale, final_worth.max(), 1000)
pareto_cdf = pareto.cdf(wealth_values, alpha, scale=scale)

plt.figure(figsize=(10, 6))
plt.plot(x_ecdf, y_ecdf, label='ECDF', color='blue')
plt.plot(wealth_values, pareto_cdf, label='Pareto CDF', color='red')
plt.title('ECDF of Final Worth vs. Pareto CDF')
plt.xlabel('Wealth (Final Worth)')
plt.ylabel('Cumulative Probability')
plt.legend()
plt.show()

# KS检验
ks_statistic, p_value = kstest(final_worth, 'pareto', args=(alpha, 0, scale))
print(f"KS Statistic: {ks_statistic}, p-value: {p_value}")

# 绘制Q-Q图
n = len(final_worth)
quantiles = np.linspace(1/(n+1), n/(n+1), n)
theoretical_quantiles = pareto.ppf(quantiles, alpha, scale=scale)

plt.figure(figsize=(10,6))
plt.scatter(theoretical_quantiles, np.sort(final_worth), alpha=0.5)
plt.plot(theoretical_quantiles, theoretical_quantiles, color='red', linestyle='--')
plt.xlabel('理论帕累托分位数')
plt.ylabel('样本分位数')
plt.title('帕累托分布拟合Q-Q图')
plt.show()

内容的提问来源于stack exchange,提问作者Danny Wen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:14:53