基本的统计分析工具
spark.mllib提供了一些基本的统计分析工具,包括相关性、分层抽样、假设检验、随机数生成等。Spark 3.0中迁移了相关性、假设检验及汇总统计等分析工具。
相关性
计算两组数据之间的相关性是统计学中的常见运算。spark.ml提供了在多组数据之间计算两两相关性的方法。支持的相关性方法有皮尔逊相关和斯皮尔曼相关,其相关系数可以反映两个变量之间变化趋势的方向及程度。
皮尔逊相关系数是一种线性相关系数
X,Y为两个输入的变量, 为期望值,
为标准差。皮尔逊相关系数的输出范围为
, 0表示无相关性,正值表示正相关,负值表示负相关。相关系数的绝对值越大,相关性越强;相关系数越接近0,相关性越弱。
皮尔逊相关系数主要服从正态分布的变量。对于不服从正态分布的变量,可以使用斯皮尔曼相关系数进行相关性分析。斯皮尔曼相关系数可以更好地用于测量变量的排序关系,其计算公式为:
表示
的秩次,
表示
的秩次,n为总的观测样本数。
# -*- coding: utf-8 -*-
# @Time : 2024/10/1 16:02
# @Author : pblh123@126.com
# @File : pyspark_correlationdemo.py
# @Describe : 相关系数案例
import os
import warnings
from pyspark.ml.linalg import Vectors
from pyspark.ml.stat import Correlation
from pyspark.sql import SparkSession
from pyspark.sql import Row
from utils.window_Utils import windows_enviroment_set
# 过滤警告信息
warnings.simplefilter("ignore")
# 解决Caused by: java.net.SocketTimeoutException: Accept timed out问题
windows_enviroment_set()
def correlation1():
# 示例数据,包含稀疏向量和稠密向量
data = [
Vectors.sparse(4, [(0, 2.0), (2, -1.0)]),
Vectors.dense([3.0, 0.0, 4.0, 5.0]),
Vectors.dense([6.0, 8.0, 0.0, 7.0])
]
# 将数据集转换为 DataFrame rows = [Row(features=vec) for vec in data]
df = spark.createDataFrame(rows)
# 打印 DataFrame df.show()
# 计算特征列的相关性矩阵
corr_matrix = Correlation.corr(df, "features")
# 提取相关性矩阵的值
coeff1 = corr_matrix.collect()[0]["pearson(features)"]
print("Pearson correlation matrix:")
print("皮尔逊相关系数矩阵:")
print(coeff1)
# 计算特征列的Spearman相关性矩阵
corr_matrix_spearman = Correlation.corr(df, "features", "spearman")
# 提取Spearman相关性矩阵的值
coeff2 = corr_matrix_spearman.collect()[0]["spearman(features)"]
print("Spearman correlation matrix:")
print("斯皮尔曼相关系数矩阵:")
print(coeff2)
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 correlation1()
# 3. 关闭sparkSession, sparkcontext
sc.stop()
spark.stop()