我在其中包含在维基百科上的文章计算指标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)
然后,我可以测试我的假设,即指标将成为其语言是维基百科的语言的文章越高。谢谢
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])
克拉默上的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)
此代码对我的数据集进行了测试,但我希望它是确定使用它,而你的情况变化。
有点从齐格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)