1.数据预处理概述
数据预处理的主要作用是为将未经处理的原始数据转换为在数量、结构和格式方面完全适合于对应的数据挖掘任务的干净数据,数据预处理是一种已被证明上述问题的有效方法。
数据预处理主要包括数据清理、数据集成、数据变换、数据归约4种基本过程。
图形显示有助于可视化地审视数据,利于识别噪声和离群点,对数据预处理是相当有用的。
2.数据可视化实例
使用Kaggle的房价预测竞赛的数据集
2.1
首先,将用到的库都包含进来,numpy和pandas用于数据处理,matplotlib和seaborn用于可视化操作。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns #统计建模
from sklearn.preprocessing import StandardScaler
from scipy.stats import norm
from scipy import stats #统计
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline
之后载入数据集
df_train = pd.read_csv('kaggle_house_pred_train.csv')
载入后即可以查看数据列名,也就是数据的不同属性
df_train.columns
Index(['Id', 'MSSubClass', 'MSZoning', 'LotFrontage', 'LotArea', 'Street',
'Alley', 'LotShape', 'LandContour', 'Utilities', 'LotConfig',
'LandSlope', 'Neighborhood', 'Condition1', 'Condition2', 'BldgType',
'HouseStyle', 'OverallQual', 'OverallCond', 'YearBuilt', 'YearRemodAdd',
'RoofStyle', 'RoofMatl', 'Exterior1st', 'Exterior2nd', 'MasVnrType',
'MasVnrArea', 'ExterQual', 'ExterCond', 'Foundation', 'BsmtQual',
'BsmtCond', 'BsmtExposure', 'BsmtFinType1', 'BsmtFinSF1',
'BsmtFinType2', 'BsmtFinSF2', 'BsmtUnfSF', 'TotalBsmtSF', 'Heating',
'HeatingQC', 'CentralAir', 'Electrical', '1stFlrSF', '2ndFlrSF',
'LowQualFinSF', 'GrLivArea', 'BsmtFullBath', 'BsmtHalfBath', 'FullBath',
'HalfBath', 'BedroomAbvGr', 'KitchenAbvGr', 'KitchenQual',
'TotRmsAbvGrd', 'Functional', 'Fireplaces', 'FireplaceQu', 'GarageType',
'GarageYrBlt', 'GarageFinish', 'GarageCars', 'GarageArea', 'GarageQual',
'GarageCond', 'PavedDrive', 'WoodDeckSF', 'OpenPorchSF',
'EnclosedPorch', '3SsnPorch', 'ScreenPorch', 'PoolArea', 'PoolQC',
'Fence', 'MiscFeature', 'MiscVal', 'MoSold', 'YrSold', 'SaleType',
'SaleCondition', 'SalePrice'],
dtype='object')
可以看到一共81个属性,从属性的字面含义与数据存储形式,分析数据类型,可以大致将数据分为numerical(数值型)和categorical(类别型)。例如,SalePrice(商品售价)为典型的数值类型,SaleType(销售类型)为典型的标称属性等。
2.2
接下来,用describe()函数进行数据的快速统计汇总,可以查看数据的总体统计情况(也是箱线图所需数据)
df_train['SalePrice'].describe()
count 1460.000000
mean 180921.195890
std 79442.502883
min 34900.000000
25% 129975.000000
50% 163000.000000
75% 214000.000000
max 755000.000000
Name: SalePrice, dtype: float64
还可以绘制直方图来初步SalePrice(房屋售价)属性的数据分布。横轴为销售价格,纵轴为数据的频道,可以从图中看出房屋售价的大致情况。
sns.distplot(df_train['SalePrice'])
2.3
绘制OverallQual(总体质量)/SalePrice(房屋售价)的箱线图,该图可以显示一组数据的最大值、最小值、中位数及上下四分位数,还有异常值,它比四分位更加全面。
var = 'OverallQual'
data = pd.concat([df_train['SalePrice'],df_train['OverallQual']],axis = 1)
f,ax = plt.subplots(figsize = (8,6)) #subplots 创建一个画像(figure)和一组子图(subplots)
fig = sns.boxplot(x = var,y = 'SalePrice',data = data)
fig.axis (ymin = 0,ymax = 800000)
(-0.5, 9.5, 0.0, 800000.0)
之后,绘制Grlivearea(平方英尺) / SalePrice(售价)的散点图,直观上看,这两个变量可能存在线性正相关的关系。
var = 'GrLivArea'
data = pd.concat([df_train['SalePrice'],df_train[var]],axis = 1)
data.plot.scatter(x = var,y = 'SalePrice',ylim = (0,800000));
3.数据清洗
数据清洗一般包括以下几个任务:填充缺失值、平滑噪声数据、识别或删除异常值并解决不一致性、最后转换成标准化数据格式、清除异常数据、纠正错误、清除重复数据等。
3.1缺失值处理
数据的缺失主要包括属性的缺失和属性中,某些值的缺失,两者都会造成分析结果的不准确。
1.忽略元组
2.人工填充缺失值
3.自动填充缺失值
- 全局常数
- 属性的中心度量(均值或中位数)
对于正常的(对称的)数据分布而言,可以使用均值来填充。 - 最可能的值
在填充缺失值时,还可以用回归、贝叶斯形式化方法的基本推理的工具或决策树归纳来确定缺失值最可能的取值。
例:使用随机生成的数据集作为样例
1.导入所需库
import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
可以看到数据结构DataFrame中缺失值的存在是用NaN来表示的
df = pd.DataFrame(np.random.randn(6,4),columns = list('abcd')) #随机生成数据
df.iloc[4,3] = np.nan #iloc选择行和列
df.loc[3] = np.nan #loc选择行
df
3.
在处理缺失值的过程中,经常需要统计各个属性的缺失值百分比,然后再选择缺失值处理的方案
total = df.isnull().sum().sort_values(ascending = False)
percent = (df.isnull().sum() / df.isnull().count()).sort_values(ascending = False)
missing_data = pd.concat([total,percent],axis = 1,keys = ['Total','Percent'])
missing_data
可以看到在该数据集中,a,b,c,d4个属性的缺失百分比分别为33%、16.6%、16.6%、16.6%。
4.
对于元组缺失多个值或全部缺失时,可以简单将该元组忽略,比如第三行,在此使用DataFrame中的dropna()函数来删除第3行的全部缺失数据。
df_cleaned = df.dropna(how='all')
df_cleaned
5.
接下来进行填充,使用Imputer类进行缺失值填充,这里采用列均值来填充缺失值。
imp = SimpleImputer(missing_values = np.nan,strategy = 'mean')
imp.fit(df)
df_cleaned_1 = imp.transform(df_cleaned)
df_cleaned_1
(axis:默认为axis=0
axis = 0:按列处理
axis = 1:按行处理)
3.2噪声平滑
噪声平滑是被测量的变量的随机误差或方差,包括错误的值或偏离期望的离群点,可以使用基本的数据统计描述技术和数据可视化方法来识别可能代表噪声的离群点。
1.分箱法:分箱法通过考察数据的“近邻”(即周围的值)来平滑有序数据值,是一种局部平滑的方法。所谓“分箱”指的就是将数据划分为几个含有相同个数数据的数据段,之后将箱中每一个值用某个值来替换,从而达到平滑数据、消除噪声的目的。
“箱的宽度”来表示每个箱值的取值区间
1.用箱均值平滑:箱中每一个值被箱中的平均值替换
2.用箱中位数平滑:箱中每一个值被箱中的中位值替换
3.用箱边界平滑:箱中的最小值和最大值同样被视为边界,箱中的每一个值被最近的边界值替换。
宽度越大,平滑效果越明显。
2.回归法:用一个函数拟合数据来平滑数据。使用回归,找到适合数据的数学方程式,能够剔除一些数据中的异常点,所以能够帮助消除噪声。
3.离群点分析:通过如聚类来检测离群点。
许多噪声平滑的方法也适用于数据离散化(一种数据变化形式)和数据归约。
3.3异常值的检测与处理
由于系统误差、人为误差或者固有数据的变异,使得某些数据与总体的行为特征、结构或相关性等不一样,这部分数据称为异常值。
对于异常值的常见处理方法:
1.删除含有异常值的记录:是否要删除异常值可根据实际情况考虑。
2.将异常值视为缺失值,交给缺失值处理方法来处理
3.用平均值来修正
4.不处理
使用随机生成的取值范围在0~10000的100个数据来进行异常值分析。
1.
首先生成数据集,之后进行正态性检验。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
data = pd.Series(np.random.randn(10000)*100) #随机生成数据
u = data.mean() #计算均值
std = data.std()
stats.kstest(data,'norm',(u,std))
print('均值为:%.3f,标准差为:%.3f'%(u,std))
2.绘制数据密度曲线
3.根据3原则,异常值共有36个,剔除异常值之后的数据为data_c
ax2 = fig.add_subplot(2,1,2)
error = data[np.abs(data -u) >3*std]
data_c = data[np.abs(data -u) <=3*std]
len(error)
4.使用箱型图查看数据分布
6.计算分位差
q1 = s['25%']
q3 = s['75%']
iqr = q3 - q1
mi = q1 - 1.5 * iqr
ma = q3 + 1.5 * iqr
print('分位差为:%.3f,下限为:%.3f,上限为:%.3f'%(iqr,mi,ma))
7.根据分位差的上下限筛选出异常值error,剔除异常值之后的数据为data_c
ax2 = fig.add_subplot(2,1,2)
error = data[(data <mi) | (data <= ma)]
print('异常值共%i条'%len(error))