数据预处理

缺失值和异常值的处理

注意
数据既有缺失值又有异常值时,先处理哪个并没有严格的顺序,这里我先处理异常值,再处理缺失值。

异常值的识别方法

  异常值,指的是样本中的一些数值明显偏离其余数值的样本点,所以也称为离群点。常见的异常值判断方法可以分为以下两种情况:

数据有一个给定范围

  例如:调查问卷中,需要对某个事物进行打分,满分为0-10分。如果填问卷的人填了一个30分,那么这个数据就是异常值。
方法:我们可以使用MATLAB的逻辑运算快速的找到这些异常值

x = [8 9 10 7 6 3 30  4 13 9 2];
ind = find(x<0  |  x>10)
% 返回7和9,意味着第7个位置和第9个位置的元素不在0-10的范围内。

数据没有给定的范围

这种情况下有两种最常用的判定方法

$3\sigma$原则识别异常值

  概率论中正态分布的概率密度函数图像是关于均值点处对称的,假设总体服从均值为$\mu$,标准差为$\sigma$的正态分布,那么从该总体中随机抽取一个样本点,该点落在区间$[\mu -3\sigma,\mu +3\sigma]$上的概率约为$99.73%$,而超出这个范围的可能性仅占不到$0.3%$,是典型的小概率事件,所以这些超出该范围的数据可以认为是异常值。这就是$3\sigma$原则识别异常值的理论基础。
  总结$3\sigma$原则识别异常值的步骤:(1)计算这组数据的均值$\mu$和标准差$\sigma$(注意:我们得到的数据一般是样本数据,因此这里的标准差为样本标准差。如果总体的均值和标准差是已知的,那么就用总体的均值和标准差)。(2)判断这组数据中的每个值是否都位于$[\mu -3\sigma,\mu +3\sigma]$这个区间内,如果不在这个区间内就标记为异常值。注意事项:使用$3\sigma$原则确定异常值时,样本数据要来自正衣分布总体中者诉似于正态分布总体,这一点需要根据历史经验或统计检验来进行判断。

x = [48 51 57 57 49  86 48 53 59 50 48 47 53 56 60];
u =  mean(x,'omitnan');
sigma =  std(x,'omitnan');
lb = u -  3*sigma;    % 区间下界,low bound的缩写
ub = u +  3*sigma;   % 区间上界,upper bound的缩写
tmp = (x < lb) |  (x > ub);
ind = find(tmp)
% 返回6,意味着第6个位置是异常值

箱线图识别异常值

  箱线图又称为盒须图、盒式图或箱形图,是一种用作显示数据分散情况资料的统计图,因形状如箱子而得名。下方左侧给出了一个用来反映某班男女同学身高分布情况的箱线图,右侧是箱线图上各元素所代表的含义。可以看到,箱线图可以反映数据的许多统计信息,例如均值、中位数、上四分位数和下四分位数。另外,箱线图中规定了数据的异常值,因此我们可以借助箱线图来识别数据的异常值,下面我们来介绍箱线图中异常值的定义方法。(注意:箱线图的画法不唯一,下面给的是一种典型画法)
  首先回顾下中位数的定义:我们将数据按从小到大的顺序排列,在排列后的数据中居于中间位置的数就是中位数,我们用$Q2$表示。下四分位数则是位于排列后的数据$25%$位置上的数值,我们用$Q1$表示;上四分位数则是处在排列后的数据$75%$位置上的数值,我们用$Q3$表示。
  然后我们要定义一个叫做四分位距(IQR: interquartile range)的指标,它是上四分位数($Q3$,即位于$75%$)与下四分位数($Q1$,即位于$25%$)的距离,因此$IQR=Q3-Q1$。四分位距反映了中间$50%$数据的离散程度.其数值越小,说明中间的数据越集中;其数值越大,说明中间的数据越分散。
  接下来的工作和$3\sigma$原则识别异常值类似,我们需要给出一个合理的区间,位于该区间内的值是正常的数值,而在区间外的值就是我们定义异常值。在箱线图中,该区间一般为$[Q1-k\times IQR,Q3+k\times IQR]$. $k$是控制区间长度的一个正数,通常$k$取为$1.5$。因此,我们只需要判断这组数据中的每个值是否都位于$[Q1-1.5\times IQR,Q3+1.5\times IQR]$这个区间内,如果不在这个区间内就标记为异常值。
  另外,如果我们将$k$取为$3$.在这个区间外的异常值被称为极端异常值。和$3\sigma$原则相比,箱线图并没有对数据服从的分布作任何限制性要求($3\sigma$原则要求数据服从正态分布或近似服从正态分布),其判断异常值的标准主要以四分位数和四分位距为基础。在总体分布未知的情况下,使用箱线识别异常值的结界更加客观。(通常,箱线图识别出来的异常值要多余$3\sigma$原则)

x = [48 51 57 57 49  86 48 53 59 50 48 47 53 56 60]; % 计算分位数的函数需要MATLAB安装了统计机器学习工具箱
Q1 = prctile(x,25);  % 下四分位数
Q3 = prctile(x,75);  % 上四分位数
IQR = Q3-Q1; % 四分位距
lb = Q1 - 1.5*IQR; % 下界
ub = Q3 + 1.5*IQR; % 上界
tmp = (x < lb) |  (x > ub);
ind = find(tmp)
% 返回6,意味着第6个位置是异常值
注意
识别出异常值后,我们通常可以将异常值视为缺失值,然后交给缺失值处理方法来处理。

缺失值的处理

下面只介绍的一些比较简单的处理方法

缺失值的数量

  首先我们要计算异常值缺失的数量,举一个具体的例子,这是我随机生成的20个北京房价的数据,每一列是一个指标,每一行是一个样本。
  可以看到,“购买时价格”这个指标的缺失值有14个,占到总样本数的70%,缺失的有点太多了,所以这一个指标我们可以考虑删除。至于存在多大比例的缺失值我们可以接受,这个并没有一个标准,总之缺失值越少越好,缺的过多就要考虑删除。
  另外,我们可以看到,位于BCDG四列的指标都有一个缺失值,但是这个缺失值都位于第4行的样本中,因此我们可以考虑直接删除这个样本。当然,如果你觉得样本搜集的成本过高或者样本量太少,你也考虑使用后面介绍的缺失值填补的方法。

% 我们可以使用ismissing函数和sum函数,ismissing函数也可以对矩阵或者表格数据类型判断缺失值
A = [3 NaN 5 6 7  NaN NaN 9];
TF = ismissing(A)
% TF = 1x8 的逻辑数组(为1的位置表示是缺失值)%    0    1   0   0    0   1   1    0
total = sum(TF) % 对TF向量求和,结果为3,代表有3个缺失值
ind = find(TF) % 缺失值的位置2 6 7

ismissing函数参考文档[1]

进阶
MATLAB的table表格数据类型非常灵活好用,类似于python中的pandas包。

缺失值填补

分类
横截面数据和时间序列数据
横截面数据
指在某一时点收集的不同对象的数据,例如北京、上海、广州、深圳等30个城市今天的最高气温。
时间序列数据
指对同一对象在不同时间连续观察所取得的数据,例如北京今年来每天的最高气温。

横截面数据

解决方法
通常使用某个具体的数值来代替缺失值,例如非缺失数据的平均值、中位数或者众数
% fillmissing函数可以很方便的帮助我们实现这个功能
% F =fillmissing(A,'constant',v) 使用常数v 填充缺失的数组或表
A = [2 3 nan 3 nan nan  8 4];
v = mean(A,'omitnan');  % 平均值
% v =  median(A,'omitnan');  % 中位数
% v =  mode(A);  % 众数,常用于离散变量的缺失值
F = fillmissing(A,'constant',v)
%非缺失值数据的平均值是4,所以将缺失值nan代替为4

%    2      3     4     3      4     4     8      4

fillmissing函数参考文档[2]

时间序列数据

策略 函数
使用上一个非缺失值 F = fillmissing(A, 'previous')
使用下一个非缺失值 F = fillmissing(A, 'next')
距离最近的非缺失值 F = fillmissing(A, 'nearest')
使用相邻非缺失值的线性插值 F = fillmissing(A, 'linear')
使用分段三次样条插值 F = fillmissing(A, 'spline')

这里介绍的方法比较简单,如果你专门做数据挖掘,还可以使用一些其他的方法来填补缺失值,例如$KNN$填补、随机森林填补、多重插补等方法。

参考

文章

参考

  1. ^https://ww2.mathworks.cn/help/matlab/ref/table.html
  2. ^https://ww2.mathworks.cn/help/matlab/ref/fillmissing.html
文章作者: Mr.Zhang
文章标题: 数据预处理
文章链接: https://www.codewing.cn/index.php/272/data-processing/
版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0 许可协议。转载请注明来自Ying's Blog!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇