彩蛋:数据的完整性测试
使用assert语句,可以快速进行数据测试。如果测试结果是True,notebook不会显示任何信息并继续向下执行,否则终止运行,并显示错误提示。
In [16]:
assert 1 == 2
In [17]:
# We know that we should only have three classes
assert len(iris_data_clean['class'].unique()) == 3
In [18]:
# We know that sepal lengths for 'Iris-versicolor' should never be below 2.5 cm
assert iris_data_clean.loc[iris_data_clean['class'] == 'Iris-versicolor', 'sepal_length_cm'].min() >= 2.5
In [19]:
# We know that our data set should have no missing measurements
assert len(iris_data_clean.loc[(iris_data_clean['sepal_length_cm'].isnull()) |
(iris_data_clean['sepal_width_cm'].isnull()) |
(iris_data_clean['petal_length_cm'].isnull()) |
(iris_data_clean['petal_width_cm'].isnull())]) == 0
就像这样的测试,如果不能通过测试,会终止程序并返回例外信息,我们必须回头继续对数据进行整理。
Step 4:数据的探索性分析
探索性分析,是在剔除了异常值和错误之后,对数据集更深入的分析和研究。在这一步里,我们试图回答这样几个问题:
数据是如何分布的? 数据之间是否存在相关性? 有什么混杂的因素,可以解释这种相关性?在这个阶段,我们会采用各种方法绘数据图,当然不要太考虑美观,因为都是内部使用。 先从散点图矩阵开始吧。
In [20]:
sb.pairplot(iris_data_clean)
Out[20]:
看起来我们的数据大致是正常分布。对于数据建模来说,数据分布正常是一个很棒的消息。
不过,我们看到有些花瓣的尺寸数据有一点奇怪,是不是由于花的不同种类导致的呢?我们可以再一次通过有色的散点图来观察一次。
In [21]:
sb.pairplot(iris_data_clean, hue='class')
Out[21]:
果然,花瓣的数值分布,确实跟花的种类有关。这对我们分类的任务来说是个极好的消息,它意味着通过花瓣的尺寸,就可以容易地把iris-sentosa这个品种区分出来。
然而,区分iris-virginica和iris-versicolor这两个品种会困难一下,因为看起来它们的尺寸有些重叠。
花瓣的长度和宽度看起来有一些相关,花萼也有类似现象。我们通过咨生物学家,这是自然现象:较长的花瓣,宽度也会较大,花萼也类似。
我们还可以画出提琴图(violin plots),对比不同种类的数值分布。提琴图和箱型图所包含的信息是类似的,但它还能体现数据的密度。
In [23]:
plt.figure(figsize=(10, 10))
for column_index, column in enumerate(iris_data_clean.columns):
if column == 'class':
continue
plt.subplot(2, 2, column_index + 1)
sb.violinplot(x='class', y=column, data=iris_data_clean)
数据摆弄得差不多了,我们进入建模部分吧。