【发布时间】:2022-09-28 18:07:37
【问题描述】:
我是数据科学的新手,并试图掌握探索性数据分析。我的目标是获得所有变量之间的相关矩阵。对于数值变量,我使用 Pearson\'s R,对于分类变量,我使用修正后的 Cramer\'s V。现在的问题是在分类变量和数值变量之间获得有意义的相关性。为此,我使用相关比率,如here 所述。问题在于,具有高基数的分类变量无论如何都显示出高相关性:
correlation matrix cat vs. num
这似乎很荒谬,因为这实际上会显示分类变量的基数,而不是与数值变量的相关性。问题是:如何处理问题以获得有意义的相关性。
下面的 Python 代码显示了我是如何实现相关比率的:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
train = pd.DataFrame({
\'id\': [0,1,2,3,4,5,6,7,8,9,10,11], \'num3\': [6,3,3,9,6,9,9,3,6,3,6,9],
\'cat2\': [0,1,0,1,0,1,0,1,0,1,0,1], \'cat3\': [0,1,2,0,1,2,0,1,2,0,1,2],
\'cat6\': [0,4,8,2,6,10,0,4,8,2,6,10], \'cat12\': [0,7,2,9,4,11,6,1,8,3,10,5],
})
cat_cols, num_cols = [\'cat2\',\'cat3\',\'cat6\',\'cat12\'], [\'id\',\'num3\']
def corr_ratio(cats, nums):
avgtotal = nums.mean()
elements_avg, elements_count = np.zeros(len(cats.index)), np.zeros(len(cats.index))
cu = cats.unique()
for i in range(cu.size):
cn = cu[i]
filt = cats == cn
elements_count[i] = filt.sum()
elements_avg[i] = nums[filt].mean(axis=0)
numerator = np.sum(np.multiply(elements_count, np.power(np.subtract(elements_avg, avgtotal), 2)))
denominator = np.sum(np.power(np.subtract(nums, avgtotal), 2)) # total variance
return 0.0 if numerator == 0 else np.sqrt(numerator / denominator)
rows = []
for cat in cat_cols:
col = []
for num in num_cols:
col.append(round(corr_ratio(train[cat], train[num]), 2))
rows.append(col)
df = pd.DataFrame(np.array(rows), columns=num_cols, index=cat_cols)
sns.heatmap(df)
plt.tight_layout()
plt.show()
标签: python statistics data-science correlation exploratory-data-analysis