对原始数据中的离群值进行识别
四分位法
四分位法对离群值的存在并不敏感,IQR作为数据离散程度的度量,比标准差更好,
IQR1:第一个四分位数为第25个百分数
IQR2:第一个四分位数为第50个百分数
IQR3:第一个四分位数为第75个百分数
IQR=IQR3-IQR1
若以下条件成立,则该数据为离群值
data < IQR1-1.5IQR || data> IQR3+1.5IQR
基于四分位法对数据进行了清洗
// An highlighted block
clc;
clear;
%% 本程序用于数据预处理,第一部分是四分位法
%% 本程序采用4分位法对数据进行了清洗。
B=xlsread('all_data7.xlsx','all_data','a1:a99648');
[a,b]=sort(B);
oldlt=0;
lengthdata=[];
for i=0:50 %% 将数据分成40块,
lt=length(find(a<2*i));%% 数据分组,这个需要根据自己数据的大小决定
eval(['n',num2str(i),'=a(oldlt+1:lt);'])
eval(['lengthdata=[lengthdata,length(n',num2str(i),')];'])
oldlt=lt;
end
%% 奇偶数
for i=1:49
if mod(lengthdata(i),2)==0 %% 总数是偶数时
eval(['n=n',num2str(i-1),';'])
ln=length(n);
Q2L=mean([n(ln/2),n(ln/2+1)]);
if mod(lengthdata(i),4)==0 %%总数时4的倍数
Q1L=mean([n(ln/4),n(ln/4+1)]);
Q3L=mean([n(ln*3/4),n(ln*3/4+1)]);
else %%%总数不是4的倍数
Q1L=n((ln/2+1)/2);
Q3L=n((ln/2+1)/2+ln/2);
end
IRL=Q3L-Q1L;
eval(['ia',num2str(i-1),'=find(n<Q1L-1.5*IRL);'])
eval(['ib',num2str(i-1),'=find(n>Q3L+1.5*IRL);'])
end
if mod(lengthdata(i),2)~=0 %%% 总数是奇数时
eval(['n=n',num2str(i-1),';'])
ln=length(n);
Q2L=n((ln+1)/2);
if mod(lengthdata(i),4)==1 %%除4取余为1时
Q1L=3/4*n(fix(ln/4)+1)+1/4*n(fix(ln/4)+2);
Q3L=1/4*n(fix(ln*3/4)+1)+3/4*n(fix(ln*3/4)+2);
else %% 除4取余为3时
Q1L=1/4*n(fix(ln/4)+1)+3/4*n(fix(ln/4)+2);
Q3L=3/4*n(fix(ln*3/4)+1)+1/4*n(fix(ln*3/4)+2);
end
IRL=Q3L-Q1L;
eval(['ia',num2str(i-1),'=find(n<Q1L-1.5*IRL);'])
eval(['ib',num2str(i-1),'=find(n>Q3L+1.5*IRL);'])
end
end