在2.3节中,我们对数据,特别是大数据的处理有了一个基本的认识,可以看到通过数据的可视化处理,对数据的基本属性和分布都有了较直观的理解。但是对于数据处理来说,数据还需要更多的分析处理,需要用到更精准和科学的统计学分析算法。
本节将使用统计学分析对数据进行处理。
四分位数(Quartile)是统计学中分位数的一种,即把所有数据由小到大排列并分成四等份,处于三个分割点位置的数据就是四分位数。
● 第一四分位数(Q1),又称“下四分位数”,等于该样本中所有数据由小到大排列后第25%的数据。
● 第二四分位数(Q2),又称“中位数”,等于该样本中所有数据由小到大排列后第50%的数据。
● 第三四分位数(Q3),又称“上四分位数”,等于该样本中所有数据由小到大排列后第75%的数据。
● 第三四分位数与第一四分位数的差距又称四分位距(InterQuartile Range, IQR)。
首先确定四分位数的位置, n 表示项数的话,三个四分位数的位置分别为:
Q1的位置= ( n +1) × 0.25
Q2的位置= ( n +1) × 0.5
Q3的位置= ( n +1) × 0.75
那么通过图形表示,如图2.9所示。
图2.9
从图2.9可以看到,四分位数在图形中根据Q1和Q3的位置绘制了一个箱体结构,即根据一组数据的5个特征绘制的一个箱子和两条线段的图形。这种直观的箱线图反映出一组数据的特征分布,还显示了数据的最小值、中位数和最大值。
首先介绍一下本示例中的数据集。本示例数据集的来源是现实世界中某借贷机构对申请贷款人的背景调查,目的是根据不同借款人的条件,分析判断借款人能否按时归还贷款。一般来说,借款人能否按时归还贷款,是所有借贷中最重要的问题,其中的影响因素很多,判别相对麻烦,判断错误的后果也较严重。而通过数据处理,可以比较轻松地将其转化成一个回归分类问题进行解决。
数据集中的数据如图2.10所示。
图2.10
这个数据集的形式是每一行为一个单独的目标行,使用逗号分隔不同的属性;每一列是不同的属性特征,不同列的含义在现实中至关重要,这里不做解释。具体代码如程序2-9所示。
from pylab import * import pandas as pd import matplotlib.pyplot as plot filePath = ("c://dataTest.csv") dataFile = pd.read_csv(filePath,header=None, prefix="V") print(dataFile.head()) print((dataFile.tail()) summary = dataFile.describe() print(summary) array = dataFile.iloc[:,10:16].values boxplot(array) plot.xlabel("Attribute") plot.ylabel(("Score")) show()
首先来看数据的结果:
V0 V1 V2 V3 V4 V5 V6 V7 V8 V9 ... V1129 \ 0 20001 6.15 7.06 5.24 2.61 0.00 4.36 0.00 5.76 3.83 ... 7 1 20002 6.53 6.15 9.85 4.03 0.10 1.32 0.69 6.24 7.06 ... 6 2 20003 8.22 3.23 1.69 0.41 0.02 2.89 0.13 10.05 8.76 ... 1 3 20004 6.79 4.99 1.50 2.85 5.53 1.89 5.41 6.79 6.11 ... 3 4 20005 -1.00 -1.00 -1.00 -1.00 -1.00 -1.00 -1.00 -1.00 -1.00 ... 7 V1130 V1131 V1132 V1133 V1134 V1135 V1136 V1137 V1138 0 6 1 2 5 7 3 6 8 12 1 7 15 2 6 7 1 8 1 24 2 8 3 1 1 8 8 1 7 6 3 6 20 1 6 8 1 6 5 12 4 8 1 1 8 8 1 8 8 1 [5 rows x 1139 columns] V0 V1 V2 V3 V4 V5 V6 V7 V8 V9 ... \ 196 20197 3.59 5.63 6.21 5.24 1.88 1.65 4.74 3.73 7.19 ... 197 20198 7.27 5.31 9.35 2.77 0.00 1.37 0.74 5.77 4.64 ... 198 20199 6.18 5.05 6.43 6.05 1.93 2.58 3.75 7.32 4.19 ... 199 20200 6.12 7.45 1.05 1.03 0.16 1.44 0.32 6.49 10.79 ... 200 20201 5.60 6.29 6.11 2.64 0.11 4.08 2.44 7.04 5.60 ... V1129 V1130 V1131 V1132 V1133 V1134 V1135 V1136 V1137 V1138 196 6 6 1 1 6 8 9 8 4 28 197 7 1 1 1 1 8 24 7 8 14 198 3 7 1 2 7 7 3 3 7 4 199 7 8 1 2 4 7 6 8 7 12 200 7 7 3 1 7 8 1 2 7 23 [5 rows x 1139 columns] V0 V1 V2 V3 V4 \ count 201.000000 201.000000 201.000000 201.000000 201.000000 mean 20101.000000 5.266219 6.447015 6.156020 3.319303 std 58.167861 2.273933 2.443789 2.967566 3.134570 min 20001.000000 -1.000000 -1.000000 -1.000000 -1.000000 25% 20051.000000 4.130000 5.190000 4.660000 1.200000 50% 20101.000000 5.240000 6.410000 6.000000 2.830000 75% 20151.000000 6.590000 7.790000 7.640000 4.570000 max 20201.000000 13.150000 13.960000 16.620000 28.440000 V5 V6 V7 V8 V9 ... \ count 201.000000 201.000000 201.000000 201.000000 201.000000 ... mean 0.907662 2.680149 2.649254 5.149055 5.532736 ... std 1.360489 2.292231 2.912611 2.965096 2.763270 ... min -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 ... 25% 0.020000 1.270000 0.320000 3.260000 3.720000 ... 50% 0.300000 2.030000 1.870000 4.870000 5.540000 ... 75% 1.390000 3.710000 4.140000 6.760000 7.400000 ... max 8.480000 12.970000 18.850000 15.520000 13.490000 ... V1129 V1130 V1131 V1132 V1133 V1134 \ count 201.000000 201.000000 201.000000 201.000000 201.000000 201.000000 mean 6.054726 6.039801 7.756219 1.353234 4.830846 7.731343 std 1.934422 2.314824 9.145232 0.836422 2.161306 0.444368 min 1.000000 1.000000 1.000000 1.000000 1.000000 7.000000 25% 6.000000 5.000000 1.000000 1.000000 3.000000 7.000000 50% 7.000000 7.000000 1.000000 1.000000 6.000000 8.000000 75% 7.000000 8.000000 15.000000 2.000000 7.000000 8.000000 max 8.000000 8.000000 35.000000 7.000000 8.000000 8.000000 V1135 V1136 V1137 V1138 count 201.000000 201.000000 201.000000 201.000000 mean 10.960199 5.631841 5.572139 16.776119 std 9.851315 2.510733 2.517145 8.507916 min 1.000000 1.000000 1.000000 1.000000 25% 3.000000 3.000000 4.000000 11.000000 50% 8.000000 7.000000 7.000000 17.000000 75% 18.000000 8.000000 7.000000 23.000000 max 36.000000 8.000000 8.000000 33.000000
这一部分是打印出来的计算后的数据头部和尾部,这里为了节省空间,只选择了前5个和尾部5个数据。第一列是数据的编号,对数据目标行进行区分,其后是每个不同的目标行的属性。
dataFile.describe()方法是对数据进行统计学估计,count、mean、std、min、max分别求得每列数据的计数、均值、方差、最小值以及最大值,几个百分比是求得的四分位数的数据,具体图形如图2.11所示。
代码选择了第11~16列的数据作为分析数据集,可以看到,不同的数据列做出的箱体四分位图也是不同的,而部分不在箱体内的数据被称为离群值,一般被视作特异点加以处理。
提示: 读者可以多选择不同的目标行和属性点进行分析。
图2.11
从图2.11中可以看出,四分位图是一个以更好、更直观的方式来识别数据中异常值的方法,比起数据处理的其他方式,能够更有效地让分析人员判断离群值。
继续对数据进行分析。相信读者在进行数据选择的时候,可能会遇到某一列的数值过大或者过小的问题,即数据的显示超出其他数据部分较大时,会产生数据图形失真的问题,如图2.12所示。
图2.12
因此,需要一个能够将数据进行处理使其具有共同计算均值的方法,这样的方法称为数据的标准化处理。
顾名思义,数据的标准化是将数据根据自身的一定比例进行处理,使之落入一个小的特定区间,一般为(-1,1)区间。这样做的目的是去除数据的单位限制,将其转化为无量纲的纯数值,使得不同单位或量级的指标能够进行比较和加权,其中最常用的就是0-1标准化和Z标准化。
0-1标准化也叫离差标准化,是对原始数据的线性变换,使结果落到[0,1]区间,转换函数如下:
其中max为样本数据的最大值,min为样本数据的最小值。这种方法有一个缺陷就是当有新数据加入时,可能导致max和min发生变化,需要重新定义。
Z-score标准化也叫标准差标准化,经过处理的数据符合标准正态分布,即均值为0、标准差为1,其转化函数为:
其中为所有样本数据的均值,为所有样本数据的标准差。
一般情况下,通过数据的标准化处理后,数据最终落在(-1,1)区间的概率为99.7%,而在(-1,1)之外的数据被设置成-1和1,以便处理。标准差标准化的代码见程序2-10。
从代码可以看到,数据被处理为标准差标准化的方法,dataFileNormalized被重新计算并定义,大数值被限定在(-1,1)区间,请读者自行运行验证。
提示: 代码2-10中所使用的数据被修改,请读者自行修改验证,这里笔者不再进行演示。此外读者可以对数据进行处理,验证更多的标准化方法。
从2.5.2节可以看到,对于每种单独的数据属性来说,可以通过数据的四分位法进行处理、查找和寻找离群值,从而对其进行分析处理。
但是对于属性之间的横向比较,即每个目标行属性之间的比较,使用四分位法则较难判断,因此为了描述和表现每一个目标行之间数据的差异,需要另外一种处理和展示方法。
平行坐标(Parallel Coordinates)是一种常用的可视化方法,用于对高维几何和多元数据的可视化。
平行坐标表示在高维空间的一个点集,在 N 条平行的线的背景下(一般这 N 条线都竖直且等距),一个在高维空间的点被表示为一条拐点在 N 条平行坐标轴的折线,在第 K 个坐标轴上的位置就表示这个点在第 K 个维的值。
平行坐标是信息可视化的一种重要技术。为了克服传统的笛卡尔直角坐标系容易耗尽空间、难以表达三维以上数据的问题,平行坐标将高维数据的各个变量用一系列相互平行的坐标轴表示,变量值对应轴上位置。为了反映变化趋势和各个变量间的相互关系,往往将描述不同变量的各点连接成折线。所以平行坐标图的实质是将欧式空间的一个点 X i ( x i 1 , x i 2 ,..., x im )映射到二维平面上的一条曲线。
平行坐标图可以表示超高维数据。平行坐标的一个显著优点是具有良好的数学基础,其射影几何解释和对偶特性使它很适合用于可视化数据分析。平行坐标的代码见程序2-11。
from pylab import * import pandas as pd import matplotlib.pyplot as plot filePath = ("c://dataTest.csv") dataFile = pd.read_csv(filePath,header=None, prefix="V") summary = dataFile.describe() minRings = -1 maxRings = 99 nrows = 10 for i in range(nrows): dataRow = dataFile.iloc[i,1:10] labelColor = (dataFile.iloc[i,10] - minRings) / (maxRings - minRings) dataRow.plot(color=plot.cm.RdYlBu(labelColor), alpha=0.5) plot.xlabel("Attribute") plot.ylabel("Score") show()
首先是计算总体的统计量,之后设置计算的最大值和最小值。本例中设置-1为最小值,99为最大值。为了计算简便,选择了前10行作为目标行进行计算。使用for循环对数据进行训练。
最终图形结果如图2.13所示。
图2.13
从图中可以看到,不同的属性画出了10条不同的曲线,这些曲线根据不同的属性画出不同的运行轨迹。
提示: 可以选择不同的目标行和不同的属性进行验证,观察在更多的数据中所展示的结果有何不同。
在前面小节中,笔者对数据集中数据的属性分别进行了横向和纵向的比较,现在请读者换一种思路,如果要对数据属性之间的相关性进行检测的话,那该怎么办?
热力图是一种判断属性相关性的常用方法,根据不同目标行数据对应的数据属性相关性进行检测。程序2-12展示了对数据属性相关性进行检测的方法,根据不同数据属性之间的相关性画出图形。
from pylab import * import pandas as pd import matplotlib.pyplot as plot filePath = ("c://dataTest.csv") dataFile = pd.read_csv(filePath,header=None, prefix="V") summary = dataFile.describe() corMat = DataFrame(dataFile.iloc[1:20,1:20].corr()) plot.pcolor(corMat) plot.show()
最终结果如图2.14所示。
图2.14
不同颜色之间显示了不同的属性相关性,颜色的深浅显示了相关性的强弱程度。对此读者可以通过打印相关系数来直观地显示数据,相关系数打印方法如下:
print(corMat)
提示: 笔者在此选择了前20行中的前20列的数据属性进行计算,读者可以对其进行更多的验证和显示处理。