十二、数据预处理之数据清洗
任务描述
本关任务:完成泰坦尼克号遇难数据的清洗。
相关知识
案例背景
泰坦尼克号遭遇的灾难震惊世界,如何避免灾难甚至预测灾难呢? 要实现首先要做好泰坦尼克号的损失数据统计,才能为数据分析打下基础。
观察数据特点

如图所示的数据集中有一些的缺失值和不合理的数字即离群点。
目标:预测泰坦尼克号上的乘客是幸存还是遇难,每个乘客对应一个乘客Id,用0表示遇难,用1表示幸存。
Spark 生态系统
在实际应用中,大数据处理主要包括以下三个类型:
(1)复杂的批量数据处理:通常时间跨度在数十分钟到数小时之间
(2)基于历史数据的交互式查询:通常时间跨度在数十秒到数分钟之间
(3)基于实时数据流的数据处理:通常时间跨度在数百毫秒到数秒之间
当同时存在以上三种场景时,就需要同时部署三种不同的软件,比如: MapReduce / Impala / Storm 。这样做难免会带来一些问题,不同场景之间输入输出数据无法做到无缝共享,通常需要进行数据格式的转换;不同的软件需要不同的开发和维护团队,带来了较高的使用成本;比较难以对同一个集群中的各个系统进行统一的资源协调和分配。
Spark 的设计遵循"一个软件栈满足不同应用场景"的理念,逐渐形成了一套完整的生态系统,既能够提供内存计算框架,也可以支持 SQL 即席查询、实时流式计算、机器学习和图计算等。Spark 可以部署在资源管理器 YARN 之上,提供一站式的大数据解决方案,因此,Spark 所提供的生态系统足以应对上述三种场景,即同时支持批处理、交互式查询和流数据处理。
Spark 的生态系统主要包含了 Spark Core、Spark SQL、Spark Streaming、Structured Streaming、MLlib 和 GraphX 等组件。
Spark 生态系统
Spark 生态系统组件的应用场景:
应用场景 时间跨度 其他框架 Spark 生态系统中的组件
复杂的批量数据处理 小时级 MapReduce、Hive Spark
基于历史数据的交互式查询 分钟级、秒级 Impala、Dremel、Drill Spark SQL
基于实时数据流的数据处理 毫秒、秒级 Storm、S4 Spark Streaming、Structured Streaming
基于历史数据的数据挖掘 - Mahout MLlib
图结构数据的处理 - Pregel、Hama GraphX
Spark 体系架构
Spark 运行架构包括集群资源管理器(Cluster Manager)、运行作业任务的工作节点(Worker Node)、每个应用的任务控制节点(Driver)和每个工作节点上负责具体任务的执行进程(Executor),资源管理器可以自带或 Mesos 或 YARN。
Spark 运行架构
Spark 的数据抽象 RDD
Spark Core 是建立在统一的抽象 RDD 之上,使得 Spark 的各个组件可以无缝进行集成,在同一个应用程序中完成大数据计算任务。一个 RDD 就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个 RDD 可以分成多个分区,每个分区就是一个数据集片段,并且一个 RDD 的不同分区可以被保存到集群中不同的节点上,从而可以在集群中的不同节点上进行并行计算。
RDD 提供了一组丰富的操作以支持常见的数据运算,分为"动作"(Action)和"转换"(Transformation)两种类型,RDD 提供的转换接口都非常简单,都是类似 map、filter、groupBy、join 等粗粒度的数据转换操作,而不是针对某个数
据项的细粒度修改(不适合网页爬虫)。
表面上 RDD 的功能很受限、不够强大,实际上 RDD 已经被实践证明可以高效地表达许多框架的编程模型(比如 MapReduce、SQL、Pregel),Spark 提供了 RDD 的 API,程序员可以通过调用 API 实现对 RDD 的各种操作。
RDD 典型的执行过程如下:
(1)RDD 读入外部数据源进行创建;
(2)RDD 经过一系列的转换(Transformation)操作,每一次都会产生不同的RDD,供给下一个转换操作使用;
(3)最后一个 RDD 经过"动作"操作进行转换,并输出到外部数据源。
理论基础
数据清洗
有上图案例的数据可知,在现实生活中的数据是"脏"的:
不完整的:缺少属性值。 例如,年龄=" "(地市的值)
含嘈杂的噪音,错误或离群。 例如,票价="-10"(错误)
如何处理丢失的数据
1.忽略元组:当每个属性缺少值比例比较大时,它的效果非常差
2.手动填写遗漏值:工作量大
3.自动填写
使用属性的平均值填充空缺值
最有可能的值:基于诸如贝叶斯公式或决策树推理
缺失值处理方法
import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
import matplotlib.pyplot as plt
data_url = "train.csv"
df = pd.read_csv(data_url)
#使用属性的平均值填充空缺值
imp = SimpleImputer(missing_values = np.nan, strategy = 'mean')
imp.fit(df.iloc:,5:6)
plt.hist(imp.transform(df.iloc:,5:6))
plt.show()

如何处理噪音数据
正态分布检测离群数据:删除离群点
基于正态分布的一元离群点检测 假定数据集由一个正态分布产生,然后,可以由输入数据学习正态分布的参数,并把低概率的点识别为离群点。 在正态分布的假定下,区域包含99.7%的数据,包含95.4%的数据,包含68.3%的数据。视具体情况而定,将其区域外的数据视为离群点。
数值分布在(μ-σ,μ+σ)中的概率为0.6827
数值分布在(μ-2σ,μ+2σ)中的概率为0.9545
数值分布在(μ-3σ,μ+3σ)中的概率为0.9973
箱线图检测离群数据:删除离群点

四分位数
四分位数:Q1(第25百分位),Q3(第75百分位)
四分位数极差:IQR= Q3 - Q1
IQR=Q3−Q1
max=Q3+1.5∗IQR
min=Q1−1.5∗IQR
离群点:通常情况下,一个值高于/低于1.5×IQR
处理噪声数据代码实现
import pandas as pd
import numpy as np
import matplotlib.pyplot as pl
from sklearn.impute import SimpleImputer
data_url = "train.csv"
df = pd.read_csv(data_url)
imp = SimpleImputer(missing_values = np.nan, strategy = 'mean')
imp.fit(df.iloc:,5:6)
pl.boxplot(imp.transform(df.iloc:,5:6))
pl.xlabel('data')
pl.show()

编程要求
根据提示,你需要完成:
缺失值填充
离群点检测
测试说明
平台会对你编写的代码进行测试:
开始你的任务吧,祝你成功!

import numpy as np
import pandas as pd
#读取数据
df=pd.read_csv('/data/workspace/myshixun/step1/train.csv')
begin
#查看列中是否存在空值(any,布尔)
print(df.isnull().any())
#使用SimpleImputer取出缺失值所在列的数值,sklearn当中特征矩阵必须是二维才能传入 使用reshape(-1,1)升维
age=df'Age'.values.reshape(-1,1)
#导入模块
from sklearn.impute import SimpleImputer
#实例化,均值填充
imp_mean=SimpleImputer(missing_values=np.nan,strategy='mean')
imp_mean=imp_mean.fit_transform(age)
#填充好的数据传回到 data'Age'列
df_fillna=df
df_fillna'Age'=imp_mean
#检验是否还有空值,打印数量
print(df_fillna'Age'.isnull().sum())
end
#正太分布离群点检测
begin
#计算均值
mu = df_fillna'Age'.mean()
#计算标准差
sigma = df_fillna'Age'.std()
#识别异常值
error = df_fillna(df_fillna\['Age' < mu - 3*sigma) | (df_fillna'Age' > mu + 3*sigma)]
end
print(error)
有任何问题都可以随时关注私信!