根据对此post的回答,
名义变量和区间变量(“数值”)之间最经典的“相关”度量是Eta,也称为相关比,等于单向方差分析的根R平方(其中p值= ANOVA)。 Eta可以看作是一种对称关联度量,就像相关性一样,因为ANOVA的Eta(标称值是独立的,数值是相关的)等于Pillai的多元回归轨迹(数值是独立的,对应于Pillai的一组虚拟变量)。名义上有依赖性)。
如果您能让我知道如何在python中计算Eta,我将不胜感激。
事实上,我有一个带有一些数字变量和一些名义变量的数据框。
此外,如何像绘制图一样绘制热图?
答案 0 :(得分:1)
提供了答案here:
def correlation_ratio(categories, measurements):
fcat, _ = pd.factorize(categories)
cat_num = np.max(fcat)+1
y_avg_array = np.zeros(cat_num)
n_array = np.zeros(cat_num)
for i in range(0,cat_num):
cat_measures = measurements[np.argwhere(fcat == i).flatten()]
n_array[i] = len(cat_measures)
y_avg_array[i] = np.average(cat_measures)
y_total_avg = np.sum(np.multiply(y_avg_array,n_array))/np.sum(n_array)
numerator = np.sum(np.multiply(n_array,np.power(np.subtract(y_avg_array,y_total_avg),2)))
denominator = np.sum(np.power(np.subtract(measurements,y_total_avg),2))
if numerator == 0:
eta = 0.0
else:
eta = numerator/denominator
return eta
答案 1 :(得分:0)
上面的答案是缺少根提取,因此,您将收到一个 eta 平方。但是,在主 article(由 User777 使用)中,该问题已修复。
所以,维基百科上有一篇关于 correlation ratio is 以及如何计算它的文章。我创建了一个更简单的计算版本,并将使用来自 wiki 的 example:
import pandas as pd
import numpy as np
data = {'subjects': ['algebra'] * 5 + ['geometry'] * 4 + ['statistics'] * 6,
'scores': [45, 70, 29, 15, 21, 40, 20, 30, 42, 65, 95, 80, 70, 85, 73]}
df = pd.DataFrame(data=data)
print(df.head(10))
>>> subjects scores
0 algebra 45
1 algebra 70
2 algebra 29
3 algebra 15
4 algebra 21
5 geometry 40
6 geometry 20
7 geometry 30
8 geometry 42
9 statistics 65
def corr_ratio(categories, values):
cat = pd.factorize(categories)[0]
values = np.array(values)
ssw = 0
ssb = 0
for i in np.unique(cat):
subgroup = values[np.argwhere(cat == i).flatten()]
ssw += np.sum((subgroup-np.mean(subgroup))**2)
ssb += len(subgroup)*(np.mean(subgroup)-np.mean(values))**2
return (ssb / (ssb + ssw))**.5
coef = corr_ratio(df['subjects'], df['scores'])
print('Eta_squared: {:.4f}\nEta: {:.4f}'.format(coef**2, coef)))
>>> Eta_squared: 0.7033
Eta: 0.8386