乱雑な欠損データの整理
この例では、データセット配列内の観測のうち欠損データが見られる観測の検索、整理、削除を行う方法を示します。
標本データを読み込みます。
スプレッドシート messy.xlsx
からデータをインポートします。
messyData = dataset('XLSFile',fullfile(matlabroot,'help/toolbox/stats/examples','messy.xlsx'))
messyData = var1 var2 var3 var4 var5 'afe1' '3' 'yes' '3' 3 'egh3' '.' 'no' '7' 7 'wth4' '3' 'yes' '3' 3 'atn2' '23' 'no' '23' 23 'arg1' '5' 'yes' '5' 5 'jre3' '34.6' 'yes' '34.6' 34.6 'wen9' '234' 'yes' '234' 234 'ple2' '2' 'no' '2' 2 'dbo8' '5' 'no' '5' 5 'oii4' '5' 'yes' '5' 5 'wnk3' '245' 'yes' '245' 245 'abk6' '563' '' '563' 563 'pnj5' '463' 'no' '463' 463 'wnn3' '6' 'no' '6' 6 'oks9' '23' 'yes' '23' 23 'wba3' '' 'yes' 'NaN' 14 'pkn4' '2' 'no' '2' 2 'adw3' '22' 'no' '22' 22 'poj2' '-99' 'yes' '-99' -99 'bas8' '23' 'no' '23' 23 'gry5' 'NA' 'yes' 'NaN' 21
スプレッドシートからデータをインポートする場合、dataset
は数値以外の要素が含まれている変数を文字ベクトルの cell 配列として読み取ります。このため、変数 var2
は文字ベクトルの cell 配列になります。テキスト ファイルからデータをインポートする場合、オプション TreatAsEmpty
を使用すると、数値以外の式で欠損データとして扱うものを柔軟に指定できます。
messy.xlsx
には、欠損データ インジケーターが多数あります。具体的には次のようなものが挙げられます。
空のセル
ピリオド (
.
)NA
NaN
-99
欠損値が含まれる観測を検索します。
ismissing
を使用して、欠損値が少なくとも 1 つある観測のサブセットを表示します。
ix = ismissing(messyData,'NumericTreatAsMissing',-99,... 'StringTreatAsMissing',{'NaN','.','NA'}); messyData(any(ix,2),:)
ans = var1 var2 var3 var4 var5 'egh3' '.' 'no' '7' 7 'abk6' '563' '' '563' 563 'wba3' '' 'yes' 'NaN' 14 'poj2' '-99' 'yes' '-99' -99 'gry5' 'NA' 'yes' 'NaN' 21
既定では、ismissing
は次の欠損値インジケーターを認識します。
NaN
(数値配列の場合)''
(文字配列の場合)<undefined>
(categorical 配列の場合)
NumericTreatAsMissing
および StringTreatAsMissing
オプションを使用すると、他の値を欠損値として認識できます。
文字配列を double 配列に変換します。
str2double
を使用すると、数値型として扱うべき char
変数を変換することができます。
messyData.var2 = str2double(messyData.var2); messyData.var4 = str2double(messyData.var4)
messyData = var1 var2 var3 var4 var5 'afe1' 3 'yes' 3 3 'egh3' NaN 'no' 7 7 'wth4' 3 'yes' 3 3 'atn2' 23 'no' 23 23 'arg1' 5 'yes' 5 5 'jre3' 34.6 'yes' 34.6 34.6 'wen9' 234 'yes' 234 234 'ple2' 2 'no' 2 2 'dbo8' 5 'no' 5 5 'oii4' 5 'yes' 5 5 'wnk3' 245 'yes' 245 245 'abk6' 563 '' 563 563 'pnj5' 463 'no' 463 463 'wnn3' 6 'no' 6 6 'oks9' 23 'yes' 23 23 'wba3' NaN 'yes' NaN 14 'pkn4' 2 'no' 2 2 'adw3' 22 'no' 22 22 'poj2' -99 'yes' -99 -99 'bas8' 23 'no' 23 23 'gry5' NaN 'yes' NaN 21
var2
と var4
が数値配列になります。この変換では、str2double
で変数 var2
と var4
の数値以外の要素を NaN
に置き換えています。ただし、数値型の欠損値インジケーターである -99
は変更されません。同じ関数を多数のデータセット配列変数に適用する場合、datasetfun
を使用すると便利な場合があります。たとえば、次のコードを使用すると、var2
と var4
の両方を同時に数値配列に変換できます。
messyData(:,[2,4]) = datasetfun(@str2double,messyData, ... 'DataVars',[2,4],'DatasetOutput',true);
欠損値インジケーターを置き換えます。
コード -99
で表されている欠損値に MATLAB® 標準の数値欠損値インジケーター NaN
を適用するようにデータを整理します。
messyData = replaceWithMissing(messyData,'NumericValues',-99)
messyData = var1 var2 var3 var4 var5 'afe1' 3 'yes' 3 3 'egh3' NaN 'no' 7 7 'wth4' 3 'yes' 3 3 'atn2' 23 'no' 23 23 'arg1' 5 'yes' 5 5 'jre3' 34.6 'yes' 34.6 34.6 'wen9' 234 'yes' 234 234 'ple2' 2 'no' 2 2 'dbo8' 5 'no' 5 5 'oii4' 5 'yes' 5 5 'wnk3' 245 'yes' 245 245 'abk6' 563 '' 563 563 'pnj5' 463 'no' 463 463 'wnn3' 6 'no' 6 6 'oks9' 23 'yes' 23 23 'wba3' NaN 'yes' NaN 14 'pkn4' 2 'no' 2 2 'adw3' 22 'no' 22 22 'poj2' NaN 'yes' NaN NaN 'bas8' 23 'no' 23 23 'gry5' NaN 'yes' NaN 21
観測が完全であるデータセット配列を作成します。
完全な観測のみで構成され、欠損値がない新しいデータセット配列を作成します。
ix = ismissing(messyData); completeData = messyData(~any(ix,2),:)
completeData = var1 var2 var3 var4 var5 'afe1' 3 'yes' 3 3 'wth4' 3 'yes' 3 3 'atn2' 23 'no' 23 23 'arg1' 5 'yes' 5 5 'jre3' 34.6 'yes' 34.6 34.6 'wen9' 234 'yes' 234 234 'ple2' 2 'no' 2 2 'dbo8' 5 'no' 5 5 'oii4' 5 'yes' 5 5 'wnk3' 245 'yes' 245 245 'pnj5' 463 'no' 463 463 'wnn3' 6 'no' 6 6 'oks9' 23 'yes' 23 23 'pkn4' 2 'no' 2 2 'adw3' 22 'no' 22 22 'bas8' 23 'no' 23 23
参考
dataset
| ismissing
| replaceWithMissing