12/15/2006

吳子青:資料的前處理

吳子青:資料的前處理

前言:
這週開始應該會進入統計的課程,我想對統計大家都有一定的認識,從分佈、主成份分析和變方分析等,都是常用的方法。而且就算所研究的主題和統計一點關係都沒有,在論文和期刊上也是會要求利用討統計方法驗證結果的可靠度。

其實撇開統計上的理論方法,統計上最重要的是資料的品質,有好的資料品質分析出來的假設檢定才會具有意義。所以在進入統計前我們先要思考的問題是,我的資料夠好嗎?要如何改善?

我的問題是:
如果遇到資料有遺漏的處理方法




內容與方法
我寫了兩個小程式解決遇到資料有遺漏的處理方法,因為要分析的資料通常是千筆以上,不太可能手動自己算或用Excel慢慢拉,在分析數據上遇到資料有遺漏是常常有的狀況,但程式也只會回給你一個Error ,甚麼都不會和你說。

假設今天所要處理的資料有n 筆,每一筆資料共有p個變數,所以資料矩陣就是一個 n x p的矩陣。

處理方法一:
將有遺漏資料的那一筆刪除,因為不同資料長度或是不同的樣本作統計分析是無意義的,例如想知道一天之內日溫的變化,資料取禮拜一到禮拜日 (n=7),變數為每小時的日溫(p=12),假如溫度計禮拜三的中午忘記紀錄,這樣把禮拜三的11筆資料和禮拜四的12筆資料作比較是無意義的,所以處理方法一就是把禮拜三刪除。

處理方法二:
如果資料本身並不夠多,如果用處理方法一去處理就如同落井下石,所以在熟悉資料的特定或是合理的假設下(重要),可以對資料進行補遺的動作,在這裡使用的是最基本的內插法,前提是資料變動性不大或者變動是線性的。
以上面的例子解釋就是把禮拜三11點的日溫和13點的日溫作內插,估計12點的日溫。



程式流程:
在這裡要處理的資料設定為從Excel載入到Matlab的數據,所以當資料有遺漏處會顯示 “ NaN “ ,所以在這裡以指令 “isnan”來找出數據遺漏的地方,在進行處理。
Isnan(A) 的結果為和原矩陣同樣維度的矩陣,而A裡面NaN的元素對應到a是1,而其他的地方為0

處理方法一:
Step 1:資料矩陣為 A,a= isnan(A) 為判斷矩陣
Step2 : 從第一筆資料開始跑迴圈,然後慢慢的累加結果,而當遇到a矩陣裏出現1時直接跳過
Step3: 所以最後加總的結果就是刪除缺失資料的處理後數據

程式內容:


function [out]=de(A);
a=isnan(A(:,5));
[mm,nn]=size(A);
B=zeros(1,nn);
for i=1:mm
if a(i)==0
B=[B;A(i,:)];
end
end
out=B(2:end,:);



處理方法二
Step 1:資料矩陣為 A,a= isnan(A) 為判斷矩陣
Step2:搜尋每一筆資料中從0到1的位置,代表開始數具有缺失,之後利用while指令找出1總共延伸有幾個,代表中間有幾個數據要作內插。
Step3:將中間需補遺的地方用前一個和後一個資料進行內插的計算在矩陣B
Step4:跳過已搜尋的位置對全部的資料筆數進行補遺的動作
Step5:將原矩陣有資料的地方填補在矩陣B上面,完成處理
Step6:決定外插處理的方式

程式內容:

function [out]=inc(N12);

[mm,nn]=size(N12);
a=isnan(N12);
out=zeros(mm,nn);

for k=5:nn
switch sum(a(:,k))
case mm
otherwise
m=1;
s=1;
while a(s,k)==1
s=s+1;
end

for i=s:mm
if i>m
if a(i,k)==1
n=i;
w=n+1;
while a(w,k)==1
if w"<"mm
w=w+1;
else
m=w;
A(n:m-1,1)=0; %(data尾內插修正)
break;
end
end
m=w;
if m~=mm
for q=n:m-1
out(q,k)=N12(n-1,k)+(N12(m,k)-N12(n-1,k))/(m-n+1)*(q-n+1);
end
end
end
end
end
clear i w;
end
end
for i=1:mm
for j=1:nn
if a(i,j)==0
out(i,j)=out(i,j)+N12(i,j);
end
end
end


實際案例:

圖一 原始資料為Excel格式 中間有很多遺漏的資料
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBq50IiJDdqRdSucYkKME6gY8MpoJ1wNVsi0TFdZrwYi5ZHYwkBjRYU5f_gM99GRgPcL11kQyKeoI_m4xfOXbVVd6GiWM-944mjs4V5WORr4iYr8wxl45RwoxbUEPSr9uh76Ox9pvhwzY/s1600-h/11.JPG

圖二 用Matlab把資料載入 遺漏的資料會顯示NaN
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzzVZR6OmV7OJRGy_4qHHuswfY1JJ9K_uQ00a_XCaN7oqiAvrIOaNVfHgCnr1OczAdaJvO6p4XJbgzn7QbhvrfwEWE6wqJYuIEeb66QXN8GhkZd_9bREe84mFoxeyaPY63QHX0oSdHxSo/s1600-h/12.JPG

圖三 用處理方法一處理 (合併資料) 注意看年份的排序 而且從第五行開始處理
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwesaPRU24mIoEXEKMeNQamu9Uj4vpHnAzh1DAAOIzTUOHxn67lXQpXshQ0yrAYHQ56nig1ZfKZfFjxBy7fUiwLDSIyWlKMjNjLQbVOhLkB2DZWXuKXnaf6S82X2SEUFUTa-tuG97PD9M/s1600-h/13.JPG

圖四 用處理方法二處理 (內插補遺) 從第五行開始處理
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZhCmxWC0zKIs_vfZHDdYuxyz72N1FyHtRuWTpB3C1AyWuGQpRUd5om6fDCdWuOfSrHIjMqgwvoTi50JvuRmZ5MRo0nKGV4sX3Ja9S0ZY_YoTQ3ioxmp9uO5fH9F5Vifhws3FxeanpZM8/s1600-h/14.JPG

沒有留言: