假设检验
假设检验是统计学中一个强大的工具,用来确定结果是否具有统计意义,以及该结果是否偶然发生。
卡方检验是用途非常广的一种假设检验方法,包括适合度检验和独立性检验。 适合度检验用于验证一组观察值的次数分配是否异于理论上的分配。独立性检验用于验证从两个变量中抽出的配对观察值组是否相互独立。spark.ml包目前支持皮尔逊卡方检验的独立性检验。
独立性检验一般采用列联表的形式记录观察数据,列联表是由两个以上的变量进行交叉分类得到的频数分布表。如果列联表共有r行c列, 独立性检验的步骤为:首先建立假设,即 代表两变量相互独立,
代表两变量相互不独立,接着计算自由度和卡方检验统计值
自由度的计算公式为:
卡方检验统计值的计算公式为:
代表列联表第i行第j列的观测频数,
代表列联表第i行第j列的期望频数。根据设定的置信水平,查出自由度为df的卡方分布临界值,将它与卡方检验统计值比较,推测是否能拒绝
假设。
# -*- coding: utf-8 -*-
# @Time : 2024/10/1 18:56
# @Author : pblh123@126.com
# @File : pyspark_hypothesisTesting.py
# @Describe : 假设检验
import os
import warnings
from pyspark import Row
from pyspark.ml.linalg import Vectors
from pyspark.ml.stat import ChiSquareTest
from pyspark.sql import SparkSession
from utils.window_Utils import windows_enviroment_set
# 过滤警告信息
warnings.simplefilter("ignore")
windows_enviroment_set()
def main():
# 创建数据集
data = [
(0.0, Vectors.dense([3.5, 40.0])),
(0.0, Vectors.dense([3.5, 30.0])),
(1.0, Vectors.dense([1.5, 30.0])),
(0.0, Vectors.dense([1.5, 20.0])),
(0.0, Vectors.dense([0.5, 10.0]))
]
# 将数据集转换为DataFrame
df = spark.createDataFrame([Row(label=label, features=vec) for label, vec in data])
# 执行卡方独立性检验
chi_square_result = ChiSquareTest.test(df, "features", "label")
print("ChiSquareTest, 卡方独立性检验:")
chi_square_result.show()
# 打印degreesOfFreedom
print("Degrees of Freedom,自由度:")
chi_square_result.select("degreesOfFreedom").show(truncate=False)
# 打印statistics
print("Statistics, 卡方检验统计值:")
chi_square_result.select("statistics").show(truncate=False)
if __name__ == '__main__':
# 1. 创建SparkSession
spark = SparkSession.builder \
.appName("Pysparkmllibcorrelation_spark341") \
.master("local[2]") \
.getOrCreate()
# sparkcontext
sc = spark.sparkContext
spark.sparkContext.setLogLevel("WARN")
# 2. spark业务代码 business code main()
# 3. 关闭sparkSession, sparkcontext
sc.stop()
spark.stop()