MATLAB 内の欠損データ
欠損データの処理は、データ前処理で一般的に行われるタスクです。欠損値はデータ内の意味のあるイベントを表していることもありますが、多くの場合、信頼できないか、使用できないデータ点を表しています。いずれにしても、MATLAB® には欠損データを処理するための多くのオプションがあります。
欠損データの作成と整理
MATLAB での欠損値の形式は、データ型によって異なります。たとえば、double
などの数値データ型では NaN
(非数) を使用して欠損値を表します。
x = [NaN 1 2 3 4];
missing
値を使用して、欠損している数値データや他の型 (datetime
、string
、categorical
など) のデータを表すこともできます。MATLAB は、missing
値をそのデータのネイティブな型に自動的に変換します。
xDouble = [missing 1 2 3 4]
xDouble = 1×5
NaN 1 2 3 4
xDatetime = [missing datetime(2014,1:4,1)]
xDatetime = 1x5 datetime
NaT 01-Jan-2014 01-Feb-2014 01-Mar-2014 01-Apr-2014
xString = [missing "a" "b" "c" "d"]
xString = 1x5 string
<missing> "a" "b" "c" "d"
xCategorical = [missing categorical({'cat1' 'cat2' 'cat3' 'cat4'})]
xCategorical = 1x5 categorical
<undefined> cat1 cat2 cat3 cat4
欠損データとして扱うのが望ましいものの、MATLAB において NaN
のような標準の MATLAB 欠損値ではない値がデータセットに含まれている場合があります。関数 standardizeMissing
を使用すると、それらの値をそのデータ型の標準欠損値に変換できます。たとえば、NaN
の他に 4 を double
の欠損値として扱います。
xStandard = standardizeMissing(xDouble,[4 NaN])
xStandard = 1×5
NaN 1 2 3 NaN
欠損値をデータセットの一部として維持するが、残りのデータからそれらを分離するとします。いくつかの MATLAB 関数を使用して、その後の処理を行う前に欠損値の配置を制御できます。たとえば、関数 sort
で 'MissingPlacement'
オプションを使用して、NaN
をデータの末尾に移動します。
xSort = sort(xStandard,'MissingPlacement','last')
xSort = 1×5
1 2 3 NaN NaN
欠損データの検索、置換、および無視
MATLAB で欠損値が明示的に作成されていなくても、既存のデータのインポート、またはデータの計算によって発生することがあります。データ内の欠損値を認識していないと、後続の計算または解析で誤りを招く可能性があります。
たとえば、NaN
値を含むベクトルを知らずにプロットすると、関数 plot
はその値を無視して残りの点を通常どおりにプロットするため、NaN
は表示されません。
nanData = [1:9 NaN]; plot(1:10,nanData)
しかし、そのデータの平均を計算すると、結果は NaN
になります。この場合、データに NaN
が含まれていることを事前に認識し、平均を計算する前にそれを無視または削除するよう選択するほうが有益です。
meanData = mean(nanData)
meanData = NaN
データ内の NaN
を見つける 1 つの方法は、関数 isnan
を使用することです。この関数は、すべての NaN
値の場所を示す logical 配列を返します。
TF = isnan(nanData)
TF = 1x10 logical array
0 0 0 0 0 0 0 0 0 1
同様に、関数 ismissing
は複数のデータ型について、データの欠損値の場所を返します。
TFdouble = ismissing(xDouble)
TFdouble = 1x5 logical array
1 0 0 0 0
TFdatetime = ismissing(xDatetime)
TFdatetime = 1x5 logical array
1 0 0 0 0
複数のデータ型の変数で構成された table または timetable を処理するとします。データ型に関係なく、ismissing
を 1 回呼び出すことによって、すべての欠損値を見つけることができます。
xTable = table(xDouble',xDatetime',xString',xCategorical')
xTable=5×4 table
Var1 Var2 Var3 Var4
____ ___________ _________ ___________
NaN NaT <missing> <undefined>
1 01-Jan-2014 "a" cat1
2 01-Feb-2014 "b" cat2
3 01-Mar-2014 "c" cat3
4 01-Apr-2014 "d" cat4
TF = ismissing(xTable)
TF = 5x4 logical array
1 1 1 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
欠損値は、処理または解析に使用できないデータを表していることがあります。fillmissing
を使用して欠損値を別の値に置き換えるか、rmmissing
を使用して欠損値をすべて削除します。
xFill = fillmissing(xStandard,'constant',0)
xFill = 1×5
0 1 2 3 0
xRemove = rmmissing(xStandard)
xRemove = 1×3
1 2 3
多くの MATLAB 関数では、あらかじめ明示的に特定、埋め込み、または削除することなく、欠損値を無視できます。たとえば、NaN
値を含むベクトルの総和を計算した場合、結果は NaN
になります。しかし、関数 sum
で 'omitnan'
オプションを使用すると、総和において NaN
を直接無視できます。
sumNan = sum(xDouble)
sumNan = NaN
sumOmitnan = sum(xDouble,'omitnan')
sumOmitnan = 10
参考
ismissing
| fillmissing
| standardizeMissing
| missing