欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

描述性统计

程序员文章站 2024-03-25 21:09:46
...

描述性统计

描述性统计会显示数据集的基本信息:数据集种有多少个非缺失的观测数据、列的平均值和标准偏差、还有最大值和最小值

import pyspark.sql.types as typ
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
fraud = spark.sparkContext.textFile('file:///Program Files/Pyproject/pyspark/data/ccFraud.csv')
header = fraud.first()
fraud = fraud.filter(lambda row: row != header).map(lambda row: [int(elem) for elem in row.split(',')]) 
fileds = [
    *[
        typ.StructField(h[1:-1], typ.IntegerType(), True)
        for h in header.split(',')
    ]
]
schema = typ.StructType(fileds)
fraud_df = spark.createDataFrame(fraud, schema)
fraud_df.printSchema()
root
 |-- custID: integer (nullable = true)
 |-- gender: integer (nullable = true)
 |-- state: integer (nullable = true)
 |-- cardholder: integer (nullable = true)
 |-- balance: integer (nullable = true)
 |-- numTrans: integer (nullable = true)
 |-- numIntlTrans: integer (nullable = true)
 |-- creditLine: integer (nullable = true)
 |-- fraudRisk: integer (nullable = true)
fraud_df.groupby('gender').count().show()
+------+-------+
|gender|  count|
+------+-------+
|     1|6178231|
|     2|3821769|
+------+-------+

对于真正的数值特征,使用.describe()方法:
.show()方法生成结果:

numerical = ['balance', 'numTrans', 'numIntlTrans']
desc = fraud_df.describe(numerical)
desc.show()
+-------+-----------------+------------------+-----------------+
|summary|          balance|          numTrans|     numIntlTrans|
+-------+-----------------+------------------+-----------------+
|  count|         10000000|          10000000|         10000000|
|   mean|     4109.9199193|        28.9351871|        4.0471899|
| stddev|3996.847309737258|26.553781024523122|8.602970115863904|
|    min|                0|                 0|                0|
|    max|            41485|               100|               60|
+-------+-----------------+------------------+-----------------+

即使是从这些相对较少的数字中,可以看出:

  • 所有的特征都呈正偏态;最大值是平均值的多倍
  • 变异系数(均值与标准差之比)非常高(接近或者大于1),意味着这是一个广泛的观测数据

如何检查偏度:

fraud_df.agg({'balance' : 'skewness'}).show()
+------------------+
| skewness(balance)|
+------------------+
|1.1818315552993839|
+------------------+

列表中的聚合函数包括:avg(),count(),countDistinct(),first(),kurtosis(),max(),mean(),min(),skewness(),stddev(),stddev_pop(),stddev_samp(),sum(),sumDistinct(),var_pop(),var_samp()和variance()

相关性

特征之间相互关系的另一个非常有用的度量是相关性。
检查特征之间的相关性同样重要,包括它们之间高度相关的特征(即共性(collinear)),可能会导致模型的不可预知行为或者可能进行不必要的复杂化。

DataFrame形式,运用Pyspark计算相关性非常容易。唯一困难的是.corr()方法支持Pearson相关性系数,并且只能计算两两相关性:

fraud_df.corr('balance', 'numTrans')
# 创建相关矩阵
n_numerical = len(numerical)
corr = []
for i in range(0, n_numerical):
    temp = [None] * i
    for j in range(i, n_numerical):
        temp.append(fraud_df.corr(numerical[i], numerical[j]))
    corr.append(temp)
corr
[[1.0, 0.0004452314017265386, 0.0002713991339817875],
 [None, 1.0, -0.0002805712819816554],
 [None, None, 1.0]]

可视化

使用matplotlib和Bokeh

%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('ggplot')
from bokeh.io import output_notebook
output_notebook()
<div class="bk-root">
    <a href="https://bokeh.pydata.org" target="_blank" class="bk-logo bk-logo-small bk-logo-notebook"></a>
    <span id="6474283b-1c18-4487-96a2-9cd839f97830">Loading BokehJS ...</span>
</div>

%matplotlib inline、output_notebook()命令分别会使matplotlib或者Boken生成每个图表

直方图

直方图是迄今位置最容易直观地计算显示特征分布的方法。pyspark有三种方法可以生成直方图:

  • 聚集工作节点中的数据并返回一个汇总bins列表和直方图每个bin中的计数给驱动程序
  • 返回所有的数据给驱动程序,并且允许用绘图库的方法完成这项工作
  • 对数据进行采样,然后给他们返回给驱动程序进行绘图
hists = fraud_df.select('balance').rdd.flatMap(
lambda row: row).histogram(20)
# 绘制直方图,可以使用matplotlib
data = {
    'bins' : hists[0][:-1],
    'freq' : hists[1]
}
plt.bar(data['bins'], data['freq'], width=2000,color='blue')
plt.title('Histogram of \'balance\'')
Text(0.5,1,"Histogram of 'balance'")

描述性统计

data_driver = {
    'obs' : fraud_df.select('balance').rdd.flatMap(
    lambda row: row
    ).collect()
}
plt.hist(data_driver['obs'],bins=20)
plt.title('Histogram of \'balance\'using .hist()')
Text(0.5,1,"Histogram of 'balance'using .hist()")

描述性统计

特征之间的交互

散点图能够一次可视化多达三个变量间的交互