數據預處理---空值(補全或刪除)與異常值(剔除)(基於MATLAB)

% clc
% clear all
% 
% 導入數據(原始數據)
Data = xlsread('F:\實驗數據\數據彙總表111','D:M');  

figure(1)
x3str={'z1','z2','z3','z4','z5','z6','z7','z8','z9','z10','z11','z12','z13','z14','z15'}
bar(Data(1:15))
xtextp=1:15;%每個標籤放置位置的橫座標,這個自然應該和原來的一樣了。                    
ytextp=-0.1*0.18*ones(1,length(xtextp));
text(xtextp-0.3,ytextp,x3str)
set(gca,'XTickLabel',[]); %將原座標(1,2,3,..)去掉
title('變量z1-z15空值百分比圖','fontsize',12)
ylim([0,0.85])

figure(2)
x3str={'z16','z17','z18','z19','z20','z21','z22','z23','z24','z25','z26','z27','y1','y2'};
bar(Data(16:29))
xtextp=1:14;%每個標籤放置位置的橫座標,這個自然應該和原來的一樣了。                    
ytextp=-0.1*0.04*ones(1,length(xtextp));
text(xtextp-0.3,ytextp,x3str)
set(gca,'XTickLabel',[]); %將原座標(1,2,3,..)去掉
title('變量z11-z27、y1、y2空值百分比圖','fontsize',12)


% 
% [M N] = size(Data);   %矩陣B的行數與列數
% % 缺失值補全,
% % 補全依據是確失的值認爲與它上一行的數據一樣,即每個時間段測一次
% % 未測的時間段認定與它最近的上次測試結果一致.
% for i = 2:M
%     for j = 1:N
%         
%         AA = isnan(Data);
%         
%         if AA(i,j) == 1
%             
%             Data(i,j) = Data(i-1,j);
%             
%         else
%             
%             Data(i,j) = Data(i,j);
%             
%         end
%     end
% end
% 
% 

% % 刪除數據中的空值
% [U V] = size(Data);
% BB = isnan(Data);
% [u,v] = find(BB()==1);
% Data(u,:) = [];

figure(1);boxplot(Data(:,1:10))
title('變量z1-z10箱體圖','fontsize',12)
set(gca,'Xticklabel',{'z1','z2','z3','z4','z5','z6','z7','z8','z9','z10'});
figure(2);boxplot(Data(:,11:27))
title('變量z11-z27箱體圖','fontsize',12)
set(gca,'Xticklabel',{'z11','z12','z13','z14','z15','z16','z17','z18','z19','z20','z21','z22','z23','z24','z25','z26','z27'});
figure(3);boxplot(Data(:,28:29))
title('變量y1,y2箱體圖','fontsize',12)
set(gca,'Xticklabel',{'y1','y2'});

%% 使用肖維勒方法(等置信概率)剔除異常值
[m n] = size(Data);
Y = [];            
w = 1 + 0.4*log(m);    % 肖維勒係數(近似計算公式)

for i = 1:n
   x = Data(:,i);    
   YiChang = abs(x-mean(x)) > w*std(x);
   %YiChang = x > mean(x)+3*std(x) | x < mean(x)-3*std(x);
   %Std(:,i) = std(x);
   %Mean(:,i) = mean(x);
   Y(:,i) = YiChang;
end

[u v] = find(Y() == 1);   % 找出異常值所在的行與列
uu = unique(u);    % 剔除重複的行數
Data(uu,:) = [ ];   %令異常值所在行爲空,即剔除異常值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章