数据预处理

数据预处理是对数据中的特殊数据进行处理,包括重复数据、缺失值和异常值的处理。在进行统计分析时,经常要求数据满足一定的要求,如果不满足则对数据进行转换处理,这也是数据预处理的内容。[大谦Excel,dqexcel点com]

重复数据的处理

对数据进行统计分析之前,如果发现出现重复数据,而且这些重复数据是不应该出现的,应该首先进行处理。一般的处理方法是直接删除。判断行数据是否重复,有两种情况。第一种是整行数据全部与另一行的重复才认为行数据重复,第二种是该行中指定列的数据与其他行的重复则认为该行数据重复。

图3-54所示工作表中A-C列是一些员工的身份证号,现在要求删除完全重复的行。D1单元格在Python模式下在公式栏中输入代码:

code.python
df=xl("A1:C13",headers=True)
df2=df.drop_duplicates()

单击键盘上的Ctrl+Enter键,D1单元格返回一个DataFrame对象。显示对象的内容,结果如图3-54工作表中E-G列所示,有两个完全重复的数据行被删除了。代码用DataFrame对象的drop_duplicates方法删除重复行。

然后用“工号”列数据进行判断,工号重复的认为该行数据重复。I1单元格在Python模式下在公式栏中输入代码:

code.python
df3=df.drop_duplicates(subset=['工号'],keep='first')

单击键盘上的Ctrl+Enter键,I1单元格返回一个DataFrame对象。显示对象的内容,结果如图3-54工作表中J-L列所示,现在只剩下唯一工号对应的行。代码指定drop_duplicates方法的subset参数的值为['工号'],表示以工号数据为评判标准;keep参数的值为'first',表示重复项保留第1个。

Document Image

图3-54 处理重复数据

缺失值的处理

在数据采集过程中,由于条件受限无法采集到数据,或者采集到的数据遗失了,出现了数据缺失,这就是缺失值。缺失值不是0,而是这个位置没有数据,是空的。数据中存在缺失值,会导致数据处理无法进行,所以必须先对缺失值进行处理,要么删除,要么用指定的值进行填充。

图3-55所示工作表中A-B列是一些学生的语文考试成绩,其中有部分学生因为缺考没有成绩,现在要求找到缺考的学生的学号。C1单元格在Python模式下在公式栏中输入代码:

code.python
df=xl("A1:B21",headers=True)
#找到有缺失值的行的编号
is_missing=df.isna().any(axis=1)
#用找到的编号对df索引找到有缺失值的行,再找到学号
missing=df[is_missing]['学号']

单击键盘上的Ctrl+Enter键,C1单元格返回一个Series对象。显示对象的内容,结果如图3-55工作表中D列所示,有4个学生缺考了。代码用DataFrame对象的isna方法得到有空值的行,然后通过对它们索引返回缺考学生的学号。

删除缺考学生的行数据。F1单元格在Python模式下在公式栏中输入代码:

code.python
df2=df.dropna()

单击键盘上的Ctrl+Enter键,F1单元格返回一个DataFrame对象。以Excel值的形式显示,结果如图3-55工作表中F-G列所示,有缺失值的行被删除了。代码用DataFrame对象的dropna方法删除有缺失值的行。

如果简单地删除缺考学生的行数据,会丢失一些数据提供的有用信息。所以考虑对缺失值进行填充,即用缺失值附近的值、列均值、中值、固定值等代替缺失值。I1单元格在Python模式下在公式栏中输入代码:

code.python
df3=df.fillna(method='ffill')

单击键盘上的Ctrl+Enter键,I1单元格返回一个DataFrame对象。以Excel值的形式显示,结果如图3-55工作表中I-J列所示,用缺失值前面的值对缺失值进行了填充。代码用DataFrame对象的fillna方法实现填充,指定fillna方法中method参数的值为'ffill',表示用缺失值前面的值进行填充。

Document Image

图3-55 处理缺失值

异常值的处理

异常值是由于某种原因造成的数据中出现的统计上过大或过小的值,将它们纳入数据分析会影响分析结果。

判断一个值是否异常有各种不同的方法。下面介绍比较常用的3种方法。第1种方法是使用分位数进行判断。0.75分位数减去0.25分位数得到数据的内四分极值,如果数据落在[0.25分位数-1.5×内四分极值, 0.75分位数+1.5×内四分极值]范围外,则认为数据是异常值,否则不是。第2种方法是使用数据的均值和标准差进行判断,如果数据落在[均值-3×标准差, 均值+3×标准差]范围外,则认为数据是异常值,否则不是。第3种方法用箱形图判断异常值。

首先用分位数法查找异常值。图3-56所示工作表中A列是一系列测量值,要求查找数据中的异常值。C1单元格在Python模式下在公式栏中输入代码:

code.python
df=xl("A1:A25",headers=True)
Q1=df['x'].quantile(0.25)    #25%分位数
Q3=df['x'].quantile(0.75)    #75%分位数
IQR=Q3-Q1    #内四分极差
lower=Q1-1.5*IQR    #25%分位数减去1.5倍内四分极差
upper=Q3+1.5*IQR    #75%分位数加上1.5倍内四分极差
outliers=df[(df['x']<lower) | (df[&#x27;x']>upper)]    #布尔索引找到异常值

单击键盘上的Ctrl+Enter键,C1单元格返回一个DataFrame对象。显示对象的内容,结果如图3-56工作表中单元格区域D2:D3所示,找到两个异常值,即3和326。代码按照分位数法的算法算得判断异常值的阈值lower和upper,小于lower和大于upper的值都是异常值,最后用布尔索引找到数据中的异常值。

用均值和标准差查找异常值。F1单元格在Python模式下在公式栏中输入代码:

code.python
df=xl("A1:A25",headers=True)
mean=df['x'].mean()    #计算均值
std_dev=df['x'].std()    #计算标准差
th=3*std_dev    #3倍标准差
outliers=df[(df['x']-mean).abs()>th]    #根据算法找到异常值

单击键盘上的Ctrl+Enter键,F1单元格返回一个DataFrame对象。显示对象的内容,结果如图3-56工作表中单元格G2所示,利用本方法只找到一个异常值,即326。

第3种方法是图示法,使用箱形图判断异常值。箱形图实际上是分位数法的图形化表示。箱形图如图3-56中所示,由矩形、矩形中间的横线、矩形上下的触须、触须上下的散点等几部分组成。矩形中间的横线对应的是数据的中值,矩形上下边对应75%分位数和25%分位数,矩形上下的触须对应75%分位数加上内四分极值的1.5倍和25%分位数减去内四分极值的1.5倍,触须以外的散点视为异常值。

C5单元格在Python模式下在公式栏中输入代码:

code.python
plt.boxplot(df['x'],vert=True)    #绘箱形图
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)

单击键盘上的Ctrl+Enter键,C5单元格返回一个Image对象。显示该对象,合并单元格区域D5:H16,结果如图3-56所示,利用箱形图找到两个异常值。

Document Image

图3-56 查找异常值

数据转换

对数据进行统计分析时,为了消除量纲和量级的影响,或者为了满足统计方法对数据的要求,经常需要在统计分析之前对数据进行转换。常见的数据转换方法有对数转换、平方根转换、反正弦转换、中心化、标准化和归一化等。对数转换和平方根转换等可以使用第3章列操作部分通过转换已有列得到新列的方法进行计算。本节主要介绍数据标准化和数据归一化。

标准化的算法是将每个数据减去它们的均值后除以标准差,数据的均值为0,标准差为1。归一化是将所有数据转换到0~1。归一化的算法是将每个数减去数据最小值得到的差除以数据的极差。极差是用数据的最大值减去最小值得到的。

本示例要求对图3-57所示工作表中A列的数据进行标准化和归一化。C1单元格在Python模式下在公式栏中输入代码:

code.python
df=xl("A1:A85",headers=True)
ser1=df['x']
ser2=(ser1-ser1.mean())/ser1.std()

单击键盘上的Ctrl+Enter键,C1单元格返回一个Series对象。以Excel值的形式显示,结果如图3-57工作表中C列所示,得到对A列数据进行标准化的结果。标准化后的数据,均值为0,标准差为1。

进行归一化,F1单元格在Python模式下在公式栏中输入代码:

code.python
ser3=(ser1-ser1.min())/(ser1.max()-ser1.min())

单击键盘上的Ctrl+Enter键,F1单元格返回一个Series对象。以Excel值的形式显示,结果如图3-57工作表中F列所示,得到对A列数据进行归一化的结果。归一化后的数据大小界于0和1之间。

Document Image

图3-57 转换数据