使用 Cross tab (spark dataframe) 的结果在 SparkMlib 中进行卡方检验

Use the result from Cross tab (spark dataframe) for chi-square test in SparkMlib

我已经在 Spark DataFrame 中从 crosstab 生成了一个数据帧 data 并且想要执行卡方检验。

好像Statistics.chiSqTest只能应用于矩阵。我的 DataFrame 如下所示,我想看看三个组的水平分布是否相同:

from pyspark.mllib.stat import Statistics


+-----------------------------+-------+--------+----------+
|levels                       |   true|   false|Undefined |
+-----------------------------+-------+--------+----------+
|                         1   |32783  |634460  |2732340   |
|                         2   | 2139  | 41248  |54855     |
|                         3   |28837  |573746  |5632147   |
|                         4   |16473  |320529  |8852552   |
+-----------------------------+-------+--------+----------+

有什么简单的方法可以转换它以用于卡方检验吗?

一种不使用 mllib.Statistics 的处理方式:

import scipy.stats

crosstab = ...  
scipy.stats.chi2_contingency(
  crosstab.drop(crosstab.columns[0]).toPandas().as_matrix()
)

如果你真的想要 Spark 统计信息:

from itertools import chain

Statistics.chiSqTest(DenseMatrix(
    numRows=crosstab.count(), numCols=len(crosstab.columns) - 1, 
    values=list(chain(*zip(*crosstab.drop(crosstab.columns[0]).collect())))
))