Python构建Pearson相关矩阵时报float与str不支持运算错误如何解决
错误原因
pearsonr 函数要求输入的两个序列均为数值类型,你定义的属性列表中包含model、transmission、fuelType三个字符串类型的分类变量,字段值无法直接参与数值运算,因此触发类型错误。
修复方案
方案1:仅计算数值变量的相关系数(推荐)
Pearson相关系数本身仅适用于衡量连续数值变量的线性相关程度,建议直接过滤掉非数值字段即可正常运行,同时你可以用pandas内置方法简化代码,无需手动写循环:
# 方法A:修改属性列表,仅保留数值字段后运行原逻辑 from scipy.stats import pearsonr import numpy as np # 过滤掉字符串类型的分类属性 attribute_list = ["year", "price", "mileage", "tax", "mpg", "engineSize"] n = len(attribute_list) correlation_coefficient_matrix = np.zeros((n, n)) pvalue_matrix = np.zeros((n, n)) for i in range(n): for j in range(n): if i >= j: x = my_data_frame[attribute_list[i]].values y = my_data_frame[attribute_list[j]].values r1, pvalue = pearsonr(x, y) correlation_coefficient_matrix[i,j] = r1 pvalue_matrix[i,j] = pvalue if i != j: correlation_coefficient_matrix[j,i] = r1 pvalue_matrix[j,i] = pvalue print("变量列表:", attribute_list) print("\n相关系数矩阵:\n", correlation_coefficient_matrix) print("\nP值矩阵:\n", pvalue_matrix)
# 方法B:直接调用pandas内置方法,代码更简洁且自动跳过非数值列 # 生成相关系数矩阵 corr_matrix = my_data_frame.corr(method='pearson') print(corr_matrix)
方案2:分类变量编码后计算
如果你确实需要把分类变量纳入计算,需要先将字符串字段编码为数值类型后再运行原逻辑:
from sklearn.preprocessing import LabelEncoder le = LabelEncoder() # 对字符串分类字段做标签编码 my_data_frame['model'] = le.fit_transform(my_data_frame['model']) my_data_frame['transmission'] = le.fit_transform(my_data_frame['transmission']) my_data_frame['fuelType'] = le.fit_transform(my_data_frame['fuelType'])
注意:无序分类变量编码后计算Pearson相关系数不具备统计意义,这类变量建议改用卡方检验或斯皮尔曼等级相关系数衡量相关性。
内容的提问来源于stack exchange,提问作者JacobMarlo
相关产品推荐
相关产品推荐

