以下题目是来自微信公众数学建模清风老师的题目
以下是个人结合在微信公众号上所学到的知识去做的,若有不正确或不足的地方,欢迎指正!
1.0数据异常处理
Q14.异常值或离群值是指在一组数据中与其他数值相比差异较大的一个或几个数值。举个极端一点的例子,[4600,0,5000,5200,4700,4300,6000,5400,100000,6200]这一组数据中,我们可以认为0和100000这两个数就是异常值,因为剩下的数都集中在5000附近。异常值的识别和处理是数据清洗的重要环节,异常值的存在可能会导致后续的数据分析和建模工作出现偏差。本题会教给大家两种识别异常值的简单方法。
1.1正态分布的3 σ \sigma σ原则
1.2箱线图识别异常值
方法二:箱线图识别异常值箱线图又称为盒须图、盒式图或箱形图,是一种用作显示数据分散情况资料的统计图,因形状如箱子而得名。下方左侧给出了一个用来反映某班男女同学身高分布情况的箱线图,右侧是箱线图上各元素所代表的含义。可以看到,箱线图可以反映数据的许多统计信息,例如均值、中位数、上四分位数和下四分位数。另外,箱线图中规定了数据的异常值,因此我们可以借助箱线图来识别数据的异常值,下面我们来介绍箱线图中异常值的定义方法。(注意:箱线图的画法不唯一,下面给的是一种典型画法)
首先回顾下中位数的定义:我们将数据按从小到大的顺序排列,在排列后的数据中居于中间位置的数就是中位数,我们用Q2表示。下四分位数则是位于排列后的数据25%位置上的数值,我们用Q1表示;上四分位数则是处在排列后的数据75%位置上的数值,我们用Q3表示。(MATLAB中可以直接计算出Q1和Q3,大家不用操心计算问题,请接着看后面的内容)
然后我们要定义一个叫做四分位距(IQR: interquartile range)的指标,它是上四分位数(Q3,即位于75%)与下四分位数(Q1,即位于25%)的距离,因此IQR=Q3-Q1。四分位距反映了中间50%数据的离散程度,其数值越小,说明中间的数据越集中;其数值越大,说明中间的数据越分散。
2.0 数据异常处理实例
请完成下面的问题:
(1) 清风在武汉开了一家撸猫店,他统计了最近一个月以来每天进店撸猫的人数(本故事纯属虚构)。请大家用下面这三行代码来生成一个随机的向量x,向量x就表示清风记录的这一个月来每天进店的人数。从下一问开始,请你假装不知道这个数据是我们随机生成的,就把它当成真实的数据,能做到吗?
x =fix(50+5*randn(30,1));
x(randi(30,2,1))= randi([50,90],2,1);
x(randi(30,2,1))= randi([20,50],2,1);
(2) 计算这一个月来,撸猫人数最多的一天和最少的一天各有多少人?平均人数有多少人?标准差是多少?下四分位数、中位数和上四分位数各是多少?(提示:MATLAB中可以使用函数prctile来计算分位数,请大家自己百度它的用法)
(3) 无论是使用 3σ 原则还是箱线图识别异常值,均需要计算一个正常数值所在的区间,请分别算出这两种方法正常数值所在的区间,哪种方法的区间范围更大?
(4) 分别用两种方法识别出x中存在的异常值,并输出异常值在第几天出现。你可以多次运行第一问的代码生成新的x,观察哪种方法识别出来的异常值更多?
(5) 以箱线图识别异常值为准,分别完成下面两个任务:(a)删除x中的异常值,将剩下的正常值保存到向量y中;(b)计算正常数值的平均值,将x中的异常值替换成四舍五入后的平均值,将结果保存到向量z中。
解:大家看代码理解吧,都是根据上面的要求一步一步的写的
clear,clc
x =fix(50+5*randn(30,1));
x(randi(30,2,1))= randi([50,90],2,1);
x(randi(30,2,1))= randi([20,50],2,1);
ind1=find(x==min(x)) %人数最少的一天
ind2=find(x==max(x)) %人数最多的一天
u=mean(x) %均值
s=sqrt(var(x)) %标准差
Q1=prctile(x,25) %下四分位数
zhon=prctile(x,50) %中位数
Q3=prctile(x,75) %上四分位数
IQR=Q3-Q1; %四分矩
Z=[u-3*s u+3*s] %正态分布的3s原则
k=1.5;
XXT=[Q1-k*IQR Q3+k*IQR] %箱线图法
for i=1:length(x)
if x(i)>=u-3*s&x(i)<=u+3*s
A(i)=x(i);
end
if x(i)>=Q1-k*IQR&x(i)<=Q3+k*IQR
B(i)=x(i);
end
end
A; %正态分布正3p常值
B; %箱线图正常值
bz1=find(A==0) %正态分布3p异常值数
bz2=find(B==0) %箱线图异常值数
y=x;
y(bz2)=[] %删除异常值
u1=mean(y); %新的平均值
u2=round(u1); %四舍五入
x(bz2)=u2*eye(length(bz2),1) %替换掉异常值
z=x
3.0 总结分析
通过上面可以知道3 σ \sigma σ原则与箱线图的区别与联系,即都是可以识别异常值,处理异常值。不同点就是,3 σ \sigma σ原则要求数据服从正态分布或是近似正态分布,而箱线图则在总体分布未知的情况下,所以箱线图识别异常值比较客观。通过我多次运行的结果,发现,箱线图识别的异常值要比3 σ \sigma σ原则识别的异常值要多,即箱线图区间要更大一些。处理后的数据更加的完美。