python中的Cramer V相关性,但不是使用频率和权重?

2024-06-16 10:23:34 发布

您现在位置:Python中文网/ 问答频道 /正文

所以Cramer V correlation的数据集在列中有多个分类变量,但也有一列告诉我们这些值出现的频率。与下表类似:

Season     Age      Weather    Sales
Spring     New      Cold       100
Fall       Old      Warm       50 
Summer     New      Hot        200

我想弄清楚如何计算季节/年龄/天气和重量销售之间的Cramer V相关性?如果可行的话,人们会如何写一些东西来计算呢?或者有没有一种不同的方法可以用来计算相关性呢?谢谢


Tags: 数据newage分类old频率seasonweather
1条回答
网友
1楼 · 发布于 2024-06-16 10:23:34

您可能知道,Cramer的V度量两个标称变量之间的关联。因此,对于变量的每个成对组合,您可以将当前表转换为单独的列联表,然后计算成对统计数据

创建类似于您的表的代码:

from itertools import product
import numpy as np
import pandas as pd
import scipy.stats as stats

np.random.seed(42)

all_combs = product(
    ['Spring', 'Summer', 'Fall', 'Winter'],
    ['New', 'Old'],
    ['Cold', 'Warm', 'Hot']
)

df = pd.DataFrame(all_combs, columns=['Season', 'Age', 'Weather'])
df['Sales'] = np.random.randint(25, 200, len(df))
df.head()

#     Season    Age    Weather    Sales
# 0   Spring    New      Cold       127
# 1   Spring    New      Warm       117
# 2   Spring    New       Hot        39
# 3   Spring    Old      Cold       131
# 4   Spring    Old      Warm        96

将该表转换为列联表,用于测量SeasonAge之间的关联,并将其另存为二维数组:

cont = df.pivot_table('Sales', 'Season', 'Age', 'sum')
cont
#    Age    New Old
# Season        
# Fall      459 277
# Spring    283 272
# Summer    372 377
# Winter    356 384

cont_arr = cont.values

现在,你可以计算卡方统计量,并从中计算克莱默的V。克莱默的V的公式可以找到here

chi2 = stats.chi2_contingency(cont_arr, correction=False)[0]
sample_size = np.sum(cont_arr)
min_dim = min(cont_arr.shape) - 1

cramer_v = np.sqrt((chi2 / sample_size) / min_dim)

cramer_v
# 0.1157257...

相关问题 更多 >