使用熊猫,计算克莱姆系数矩阵

问题描述 投票:15回答:3

我在其中包含在维基百科上的文章计算指标pandas一个数据帧。两个分类变量nation哪个国家的文章是关于和lang其中维基百科这是取自。单个指标的,我想看看如何密切的国家和语言变量相关,我相信这是用克拉默的统计完成。

index   qid     subj    nation  lang    metric          value
5   Q3488399    economy     cdi     fr  informativeness 0.787117
6   Q3488399    economy     cdi     fr  referencerate   0.000945
7   Q3488399    economy     cdi     fr  completeness    43.200000
8   Q3488399    economy     cdi     fr  numheadings     11.000000
9   Q3488399    economy     cdi     fr  articlelength   3176.000000
10  Q7195441    economy     cdi     en  informativeness 0.626570
11  Q7195441    economy     cdi     en  referencerate   0.008610
12  Q7195441    economy     cdi     en  completeness    6.400000
13  Q7195441    economy     cdi     en  numheadings     7.000000
14  Q7195441    economy     cdi     en  articlelength   2323.000000

我想生成显示克莱默的国家的所有组合之间的系数矩阵(法国,美国,科特迪瓦ivorie和乌干达)['fra','usa','uga']和三种语言['fr','en','sw']。所以将有一个产生4×3矩阵,如:

       en         fr          sw
usa    Cramer11   Cramer12    ... 
fra    Cramer21   Cramer22    ... 
cdi    ...
uga    ...

最终,然后我将做到这一点在所有不同的指标,我跟踪。

for subject in list_of_subjects:
    for metric in list_of_metrics:
        cramer_matrix(metric, df)

然后,我可以测试我的假设,即指标将成为其语言是维基百科的语言的文章越高。谢谢

python pandas statistics
3个回答
23
投票

cramers V似乎相当过于乐观在我做了一些测试。维基百科建议修正版本。

def cramers_corrected_stat(confusion_matrix):
    """ calculate Cramers V statistic for categorial-categorial association.
        uses correction from Bergsma and Wicher, 
        Journal of the Korean Statistical Society 42 (2013): 323-328
    """
    chi2 = ss.chi2_contingency(confusion_matrix)[0]
    n = confusion_matrix.sum()
    phi2 = chi2/n
    r,k = confusion_matrix.shape
    phi2corr = max(0, phi2 - ((k-1)*(r-1))/(n-1))    
    rcorr = r - ((r-1)**2)/(n-1)
    kcorr = k - ((k-1)**2)/(n-1)
    return np.sqrt(phi2corr / min( (kcorr-1), (rcorr-1)))

还要注意,混淆矩阵可以通过用于经由类别列内置大熊猫方法计算:

import pandas as pd
confusion_matrix = pd.crosstab(df[column1], df[column2])

6
投票

克拉默上的A统计允许了解一个数据集两个分类特征之间的相关性。因此,它是你的情况。

要计算克拉默上的A统计数字,你需要计算混淆矩阵。因此,解决方案的步骤是: 1.一种用于单个度量过滤器数据 2.计算混淆矩阵 3.计算克拉默上的A统计

当然,你可以在您的文章提供了循环嵌套这些步骤。但在你开始一段你只提指标作为外部参数,所以我不知道,你需要两个循环。现在,我将提供操作2-3码,因为过滤很简单,正如我所说,我不知道你certainely需要。

第2步:在下面data的代码是任何你想要的步骤1过滤的一个pandas.dataFrame

import numpy as np

confusions = []
for nation in list_of_nations:
    for language in list_of_languges:
        cond = data['nation'] == nation and data['lang'] == language
        confusions.append(cond.sum())
confusion_matrix = np.array(confusions).reshape(len(list_of_nations), len(list_of_languges))

步骤3.在下面confusion_matrix的代码是关于步骤2中获得的numpy.ndarray

import numpy as np
import scipy.stats as ss

def cramers_stat(confusion_matrix):
    chi2 = ss.chi2_contingency(confusion_matrix)[0]
    n = confusion_matrix.sum()
    return np.sqrt(chi2 / (n*(min(confusion_matrix.shape)-1)))

result = cramers_stat(confusion_matrix)

此代码对我的数据集进行了测试,但我希望它是确定使用它,而你的情况变化。


4
投票

有点从齐格Eunicien答案改性壳聚糖功能。 2次修改加入1)cheching一个变量是常数2)校正ss.chi2_contingency(conf_matrix,校正=正确) - FALSE如果混淆矩阵是2×2的

import scipy.stats as ss
import pandas as pd
import numpy as np
def cramers_corrected_stat(x,y):

    """ calculate Cramers V statistic for categorial-categorial association.
        uses correction from Bergsma and Wicher, 
        Journal of the Korean Statistical Society 42 (2013): 323-328
    """
    result=-1
    if len(x.value_counts())==1 :
        print("First variable is constant")
    elif len(y.value_counts())==1:
        print("Second variable is constant")
    else:   
        conf_matrix=pd.crosstab(x, y)

        if conf_matrix.shape[0]==2:
            correct=False
        else:
            correct=True

        chi2 = ss.chi2_contingency(conf_matrix, correction=correct)[0]

        n = sum(conf_matrix.sum())
        phi2 = chi2/n
        r,k = conf_matrix.shape
        phi2corr = max(0, phi2 - ((k-1)*(r-1))/(n-1))    
        rcorr = r - ((r-1)**2)/(n-1)
        kcorr = k - ((k-1)**2)/(n-1)
        result=np.sqrt(phi2corr / min( (kcorr-1), (rcorr-1)))
    return round(result,6)
© www.soinside.com 2019 - 2024. All rights reserved.