scipy调用contingency.association计算Tschuprow关联度报无属性错误
Tschuprow关联度计算scipy报错排查方案
报错根因排查顺序
- 第一优先级检查scipy版本:
scipy.stats.contingency.association是scipy 1.7.0版本才正式上线的函数,低于该版本的scipy环境下contingency模块不存在这个属性,是触发该报错的最常见原因。
执行以下代码检查当前scipy版本:
如果版本号低于1.7.0,直接执行升级命令即可:import scipy print(scipy.__version__)- pip环境:
pip install --upgrade scipy - conda环境:
conda update scipy
- pip环境:
- 第二优先级检查子模块导入逻辑:仅写
import scipy不会自动递归加载stats下的contingency子模块,哪怕版本符合要求,也可能出现属性识别失败的问题,需要显式导入对应子模块/函数。
现有代码逻辑错误修正
除了属性报错的问题,原有代码的传参逻辑也不符合函数要求,就算解决属性问题也无法正常运行:association函数的observed入参要求传入两个变量交叉统计得到的二维列联表(频数表),不能直接把两个原始变量的序列拼成列表传入。
正确可运行的代码流程如下:
- 显式导入依赖
import pandas as pd import numpy as np from scipy.stats.contingency import association, crosstab - 提取变量并生成符合要求的列联表
如果习惯用pandas生成列联表也可以,代码为:x = df["tablename1"] y = df["tablename2"] # 生成二维列联表,crosstab返回结果的count属性为频数统计矩阵 observed_table = crosstab(x, y).countobserved_table = pd.crosstab(x, y).values - 调用函数计算Tschuprow关联度
tschuprow_score = association(observed_table, method='tschuprow')
有效性验证
完成上述操作后,可以执行以下代码确认属性存在:
import scipy.stats.contingency print('association' in dir(scipy.stats.contingency))
输出为True即说明属性问题已解决,传入正确格式的列联表即可得到计算结果。
内容的提问来源于stack exchange,提问作者user4t48u
相关产品推荐
相关产品推荐

