Python 在SparkMlib中使用交叉表(spark数据框)的结果进行卡方检验

Python 在SparkMlib中使用交叉表(spark数据框)的结果进行卡方检验,python,apache-spark,pyspark,apache-spark-sql,apache-spark-mllib,Python,Apache Spark,Pyspark,Apache Spark Sql,Apache Spark Mllib,我已经从Sparkdataframe中的crosstab生成了一个dataframedata,并希望执行卡方检验 似乎Statistics.chiSqTest只能应用于矩阵。我的DataFrame如下所示,我想看看三个组的级别分布是否相同: true false 和未定义 从pyspark.mllib.stat导入统计信息 +-----------------------------+-------+--------+----------+ |级别|真|假|未定义| +-----------

我已经从Spark
dataframe
中的
crosstab
生成了一个dataframe
data
,并希望执行卡方检验

似乎
Statistics.chiSqTest
只能应用于矩阵。我的
DataFrame
如下所示,我想看看三个组的级别分布是否相同:

  • true
  • false
  • 未定义
从pyspark.mllib.stat导入统计信息
+-----------------------------+-------+--------+----------+
|级别|真|假|未定义|
+-----------------------------+-------+--------+----------+
|                         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())))
))