卡方检验出现NaN值如何解决?用scipy获取有效p值
解决scipy.stats.chisquare返回NaN p值的问题
问题背景
已移除数据集中全部NaN值,尝试用卡方检验判断Scheduled Delivery Date和Product Group两个特征是否独立,但返回的p值全为NaN。
代码与结果
运行代码
t1=pd.crosstab(df['Scheduled Delivery Date'],df['Product Group']).values stats.chisquare(f_obs=t1,ddof=7084)
返回结果
Power_divergenceResult(statistic=array([ 3306.5 , 2394.36363636, 13689.2797075 , 4967.26974144, 1767. ]), pvalue=array([nan, nan, nan, nan, nan]))
原因分析与解决方案
核心问题
你用错了函数:scipy.stats.chisquare是拟合优度检验工具,默认和均匀分布对比,或需手动传入期望分布f_exp。但判断两个特征是否独立,应该用独立性卡方检验,即scipy.stats.chi2_contingency。
另外,手动设置ddof=7084完全不合理——卡方检验的自由度有固定计算规则,手动设置过大自由度会导致p值计算超出分布范围,直接返回NaN。
正确代码
from scipy.stats import chi2_contingency # 生成列联表 contingency_table = pd.crosstab(df['Scheduled Delivery Date'], df['Product Group']) # 执行独立性卡方检验 chi2, p_value, dof, expected = chi2_contingency(contingency_table) print(f"卡方统计量: {chi2}") print(f"p值: {p_value}") print(f"自由度: {dof}") print("期望频数表:") print(expected)
结果解释
chi2_contingency会自动计算正确的自由度、期望频数,输出的p_value是判断特征独立性的关键:若p值小于显著性水平(如0.05),则拒绝原假设,认为两个特征不独立;反之则认为特征独立。
内容的提问来源于stack exchange,提问作者shiva ashrith
相关产品推荐
相关产品推荐

