PySpark3.4.1 相关性统计分析

181 阅读2分钟

基本的统计分析工具

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()

image.png