对频率列表进行 t 检验的 Python 程序

标签 python statistics

嘿,所以我在数据分析中遇到了以下障碍。

我有两个频率列表,包含在两个单独的文本文件中,如下所示:

list2.txt

325 de
309 het
308 is
289 een
258 ik
208 rt
207 op
192 :
189 van
186 met
178 echt
167 en
160 in
150 dat

list2.txt

528 het
471 ik
466 een
445 de
426 is
350 dat
308 niet
273 van
239 en
227 wat
215 die
199 je
193 met
188 op
180 in
166 te
155 voor

选项 1: 我正在寻找一种方法,最好是Python,对以下数据执行以下方程。 这是我试图实现的公式:

Pm(w) = relative frequency of word/token 'w' in list1
Pv(w) = relative frequency of word/token 'w' in list2
variance = sqrt (Pm(w) / Nm + Pv(w) / Nv)
t = ( Pm(w) - Pv(w)) / variance

有人可以帮我编写一个程序/函数来为我执行此操作吗?即,它将两个文本文件作为输入,并为每个单词/标记生成一个 t 值。我很迷失,这似乎要永远带走我。

输出:包含 t 检验值和单词的新文档。

选项2: 我也在寻找一种为我产生比率的方法。

输入:(list1.txt 和 list2.txt)

输出:(list1-ratio.txt)

325  de  445 de  0.7:1
289 een  466 een  0.6:1

输出:(list2-ratio.txt)

445 de  325 de  1.3:1
466 een  289 een 1.6:1

有没有人可以帮助我解决这个问题,最好的情况是使用这两个选项,这样我就可以比较数据。这不是家庭作业,我正在研究情感分析。

谢谢

最佳答案

这里是使用 scipy.stats 中的 ttest_rel 的示例。这对两个样本的相关数据执行 t 检验。为了进行这样的测试,假设不在列表中的所有单词的计数为 0(例如,“die”在 list2 中,但不在 list1 中,因此 list1 中的 die 计数为 0)。

from scipy.stats import ttest_rel
def input_file_to_dict(f):
    return dict((key, int(value)) for value, key in map(lambda line:line.split(), f))

with open("16892486/list1.txt") as f:
    word_counts1 = input_file_to_dict(f)

with open("16892486/list2.txt") as f:
    word_counts2 = input_file_to_dict(f)

#find all words that are in list1 and in list2
common_words = set.intersection(set(word_counts1.keys()), set(word_counts2.keys()))

t,p = ttest_rel([word_counts1[k] for k in common_words],
                [word_counts2[k] for k in common_words])

对于要求二,我们可以简单地计算我们需要的结果并将其写入文件:

with open("16892486/list1-ratio.txt","w") as f_out:
    for word, count1, count2 in zip(all_words, counts1, counts2):
        ratio = float(count1) / count2 if count2>0 else np.inf
        print >>f_out, count1, word, count2, word, "%.2f:1" % ratio

文件中的输出是:

192 : 0 : inf:1
150 dat 350 dat 0.43:1
325 de 445 de 0.73:1
0 die 215 die 0.00:1
178 echt 0 echt inf:1
289 een 466 een 0.62:1
167 en 239 en 0.70:1
309 het 528 het 0.59:1
258 ik 471 ik 0.55:1
160 in 180 in 0.89:1
308 is 426 is 0.72:1
0 je 199 je 0.00:1
186 met 193 met 0.96:1
0 niet 308 niet 0.00:1
207 op 188 op 1.10:1
208 rt 0 rt inf:1
0 te 166 te 0.00:1
189 van 273 van 0.69:1
0 voor 155 voor 0.00:1
0 wat 227 wat 0.00:1

注释:

  • 您确定要采用 1.70:1 的比例格式吗?
  • 如果 count2 为零,我将“inf”分配给比率
  • 我使用字符串格式仅输出点后的 2 位数字。

关于对频率列表进行 t 检验的 Python 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16892486/

相关文章:

Python 多处理问题?

python - 字典中的 "TypeError: ' unicode ' object does not support item assignment"

Android 安装基数在 2 天内大幅下降。如何查明发生了什么?

Python-Matplotlib : normalize axis when plotting a Probability Density Function

r - 将数据框中的列添加到 SpatialPolygon 数据框中

machine-learning - 使用大量数据偏向某一类别来预测类别

statistics - 'tractable' 分布是什么意思?

python - 如何让 Python 拒绝负索引值?

c++ - GDB 支持 STL 可视化( pretty-print )

python - Pandas 数据框中的 FutureWarning