如何在 Python 中计算相关比或 Eta?

ebr*_*imi 1 statistics correlation python-3.x pandas categorical-data

根据这篇文章的回答,

名义变量和区间(“数字”)变量之间最经典的“相关”度量是 Eta,也称为相关比,等于单向方差分析的 R 方根(p 值 =方差分析)。Eta 可以被视为一种对称关联测度,就像相关性一样,因为方差分析的 Eta(名义为独立,数值为因变量)等于多元回归的 Pillai 迹(数值为独立,一组虚拟变量对应于名义上为受抚养人)。

如果您能让我知道如何用 python 计算 Eta,我将不胜感激。

事实上,我有一个包含一些数字和一些名义变量的数据框。

此外,如何为其绘制类似热图的图?

Kir*_*ryl 5

上面的答案缺少根提取,因此,您将收到一个 eta 平方。不过,在主文章(User777 使用的)中,该问题已得到解决。
因此,维基百科上有一篇关于相关比以及如何计算它的文章。我创建了一个更简单的计算版本,并将使用wiki 中的示例:

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 correlation_ratio(categories, values):
    categories = np.array(categories)
    values = np.array(values)
    
    ssw = 0
    ssb = 0
    for category in set(categories):
        subgroup = values[np.where(categories == category)[0]]
        ssw += sum((subgroup-np.mean(subgroup))**2)
        ssb += len(subgroup)*(np.mean(subgroup)-np.mean(values))**2

    return (ssb / (ssb + ssw))**.5

coef = correlation_ratio(df['subjects'], df['scores'])

print('Eta_squared: {:.4f}\nEta: {:.4f}'.format(coef**2, coef))

>>> Eta_squared: 0.7033
    Eta: 0.8386

Run Code Online (Sandbox Code Playgroud)