对于单纯的数字来说,光从读数据的角度,并不能直观反映数字的偏差和集中程度,因此需要采用另外一种方法来更好地分析数据。对于数据来说,没有什么能够比用图形来解释更加形象和直观的了。
继续回到表2.2的数据中,第2列是各个房屋的价格,其价格并不相同,因此直观地查看价格的差异和偏移程度是比较困难的一件事。
研究数值差异和异常的方法是绘制数据的分布程度——相对于合适的直线或曲线,其差异程度如何——以便帮助我们确定数据的分布。一个对价格的偏离程度的代码实现如程序2-4所示。
import numpy as np import pylab import scipy.stats as stats data = np.mat([[1,200,105,3,False],[2,165,80,2,False], [3,184.5,120,2,False],[4,116,70.8,1,False],[5,270,150,4,True]]) col1 = [] for row in data: col1.append(row[0,1]) stats.probplot(col1,plot=pylab) pylab.show()
col1集合是价格的合集,scipy是专门进行数据处理的包,probplot计算了col1数据集中数据在正态分布下的偏离程度。
结果如图2.2所示。
从图中可以看到,价格围绕一条直线上下波动,有一定的偏离,但是偏离情况不太明显。
其中 R 2 为0.9579指的是数据拟合的相关性,一般0.95以上就可以认为数据拟合程度比较好。
图2.2
通过上一小节的可视化处理可以看到,可视化能够让数据更加直观地展现出来,同时可以对数据的误差表现得更加明晰。
图2.3是一个横向坐标图,用以展示不同类别所占的比重。系列1、2、3可以分别代表不同的属性,而类别1~6可以看作是6个不同的特例。通过坐标图的描述可以非常直观地看到,不同的类别中,不同的属性所占的比重如何。
图2.3
一个坐标图能够对数据进行展示,其最基本的要求是可以通过不同的行或者列表现出数据的某些具体值。不同的标签使用不同的颜色和样式,以展示不同的系统关系。程序2-5对不同目标的数据提取不同的行进行显示。
import pandas as pd import matplotlib.pyplot as plot rocksVMines = pd.DataFrame([[1,200,105,3,False],[2,165,80,2,False], [3,184.5,120,2,False],[4,116,70.8,1,False],[5,270,150,4,True]]) dataRow1 = rocksVMines.iloc[1,0:3] dataRow2 = rocksVMines.iloc[2,0:3] plot.scatter(dataRow1, dataRow2) plot.xlabel("Attribute1") plot.ylabel(("Attribute2")) plot.show() dataRow3 = rocksVMines.iloc[3,0:3] plot.scatter(dataRow2, dataRow3) plot.xlabel("Attribute2") plot.ylabel("Attribute3") plot.show()
结果如图2.4所示。从图中可以看到,通过选定不同目标行中不同的属性,可以较好地比较两个行之间的属性关系,以及属性之间的相关性。不同的目标,即使属性千差万别,也可以构建相互关系图。
图2.4
顺便说一句,本例中采用的数据较少,而随着数据的增加,属性之间一般也呈现出正态分布的特点,这一点可以请读者自行验证。
提示: 程序2-5可以出现两个图,第二幅图请读者自行查看,建议与第一幅进行比较。
对于大规模数据来说,由于涉及的目标比较多,而属性特征值又比较多,对其查看更是一项非常复杂的内容。因此为了更好地理解和掌握大数据的处理,将其转化为可视性较强的图形是更好的做法。
前两小节对小数据集进行了图形化查阅,现在对现实中的大数据进行处理。
数据来源于真实的信用贷款数据,从50000个数据记录中随机选取了200个数据进行计算,而每个数据又有较多的属性值。大多数情况下,数据是以CSV格式进行存储,Pandas包同样提供了相关的读取程序,具体代码见程序2-6。
import pandas as pd import matplotlib.pyplot as plot filePath = ("c://dataTest.csv") dataFile = pd.read_csv(filePath,header=None, prefix="V") dataRow1 = dataFile.iloc[100,1:300] dataRow2 = dataFile.iloc[101,1:300] plot.scatter(dataRow1, dataRow2) plot.xlabel("Attribute1") plot.ylabel("Attribute2") plot.show()
首先使用filePath创建了一个文件路径,用以建立数据地址。然后使用Pandas自带的read_csv读取CSV格式的文件。dataFile是读取的数据集。之后使用iloc方法获取其中行的属性数据,scatter是做出分散图的方法。对属性进行画图,最终结果如图2.5所示。
图2.5
从图2.5中可以看到,数据在(0,0)的位置有较大的集合,这表明属性在此处的偏离程度较少,而几个特定点是偏离程度较大的点。这可以帮助我们对离群值进行分析。
提示: 程序2-6出现了两个图,第一幅图请读者自行分析。
下面继续对数据集进行分析。程序2-5和程序2-6让我们看到了对数据的同一行中不同的属性进行处理和实现的方法,如果是要对不同目标行的同一种属性进行分析,那么该如何做呢?具体代码见程序2-7。
import pandas as pd import matplotlib.pyplot as plot filePath = ("c://dataTest.csv") dataFile = pd.read_csv(filePath,header=None, prefix="V") target = [] for i in range(200): if dataFile.iat[i,10] >= 7: target.append(1.0) else: target.append(0.0) dataRow = dataFile.iloc[0:200,10] plot.scatter(dataRow, target) plot.xlabel("Attribute") plot.ylabel("Target") plot.show()
程序2-7中对数据进行处理,提取了200行数据中的第10个属性,并对其进行判定,单纯的判定规则是根据均值对其进行区分,之后计算判定结果。
最终结果如图2.6所示。
图2.6
通过图2.6可以看到,属性被分成两个分布,数据集合的程度也显示了偏离程度。而如果下一步需要对属性的离散情况进行反映,则应该使用程序2-8。
import pandas as pd import matplotlib.pyplot as plot filePath = ("c://dataTest.csv") dataFile = pd.read_csv(filePath,header=None, prefix="V") target = [] for i in range(200): if dataFile.iat[i,10] >= 7: target.append(1.0 + uniform(-0.3, 0.3)) else: target.append(0.0 + uniform(-0.3, 0.3)) dataRow = dataFile.iloc[0:200,10] plot.scatter(dataRow, target, alpha=0.5, s=100) plot.xlabel("Attribute") plot.ylabel("Target") plot.show()
在此段程序中,离散的数据中加入了离散变量,具体显示结果请读者自行完成。
提示: 读者可以对程序的属性做出诸多的抽取,并尝试使用更多的方法和变量进行处理。