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

Scipy Gumbel拟合失效 数组/DataFrame格式与拟合校验问题

问题1:拟合曲线与直方图失配的原因

拟合效果差的核心问题不是sns.histplot的stat='probability'参数,而是拟合逻辑的根本性错误:

  • scipy 所有连续分布的fit()方法要求输入原始一维样本观测值,也就是你数据集里的data["score"]序列。你当前传入的是np.histogram()返回的hist数组——这是分箱后的密度统计值,长度仅等于分箱数,本质是聚合后的汇总结果,不是原始样本,用这个输入拟合得到的loc、scale参数完全偏离真实分布,自然曲线和直方图完全无法匹配。
  • stat='probability'确实会造成绘图尺度不匹配:该参数下直方图柱子高度是「分箱内样本数/总样本数」,代表分箱对应的样本概率,和你后续绘制的概率密度函数(PDF)物理意义、数值尺度都不一致,就算拟合参数正确,柱子和曲线的高度也无法对齐,但这不是拟合失效的核心原因。
问题2:代码修正方案

按以下三点调整即可得到匹配的拟合结果:

  • 拟合时直接传入原始样本序列,不要传入直方图统计结果,拟合前注意剔除空值避免报错
  • 统一直方图和PDF的绘图尺度:将直方图的stat参数改为density,和PDF的概率密度尺度对齐;如果要保留probability模式,就将PDF值乘以分箱宽度,转换为分箱概率再绘图
  • 绘图时x轴取值覆盖数据实际范围即可,无需硬编码固定区间

修正后的核心代码如下:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import scipy.stats as ss

data = pd.read_csv("data.csv")
# 直接用原始样本拟合分布参数
loc, scale = ss.gumbel_r.fit(data["score"].dropna())
dist = ss.gumbel_r(loc=loc, scale=scale)

# 密度直方图和PDF尺度对齐
sns.histplot(data["score"], stat='density', label='原始数据密度分布')
# 按数据实际范围生成绘图x轴序列
x = np.linspace(data["score"].min(), data["score"].max(), 1000)
plt.plot(x, dist.pdf(x), color='crimson', linewidth=2, label='拟合Gumbel_r分布PDF')
plt.legend()
plt.show()

如果修正后曲线形态依然和直方图差异较大,说明Gumbel_r本身的分布特性和你的数据不匹配(比如Gumbel_r是右偏分布,你的数据峰值在0.09属于明显左偏),需要更换其他候选分布重新拟合。

问题3:卡方检验做拟合优度筛选的可行性

你的实现思路大方向正确,但有几个关键细节如果忽略,会得到完全无效的检验结果:

  • 分箱必须满足约束:所有分箱对应的理论期望频数不能小于5,否则卡方分布的近似前提不成立,需要把尾部频数过低的相邻分箱合并后再计算;同时统计实际观测频数、计算理论期望频数时必须使用完全一致的分箱区间。
  • 自由度必须手动修正:卡方检验的自由度为「有效分箱数 - 1 - 估计的分布参数个数」,比如Gumbel_r拟合了loc、scale2个参数,调用scipy.stats.chisquare时需要设置ddof=2,该函数默认ddof=0,会高估检验统计量的p值,造成“拟合效果好”的假阳性结果。
  • 优化建议:卡方检验结果对分箱方式非常敏感,连续分布的拟合优度评估建议搭配K-S检验、AD检验做交叉验证,其中AD检验对分布尾部的差异敏感度更高,结果更稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:18:43