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 = 1×5 datetime
NaT 01-Jan-2014 01-Feb-2014 01-Mar-2014 01-Apr-2014
xString = [missing "a" "b" "c" "d"]
xString = 1×5 string
<missing> "a" "b" "c" "d"
xCategorical = [missing categorical({'cat1' 'cat2' 'cat3' 'cat4'})]xCategorical = 1×5 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 = 1×10 logical array
0 0 0 0 0 0 0 0 0 1
同様に、関数 ismissing は複数のデータ型について、データの欠損値の場所を返します。
TFdouble = ismissing(xDouble)
TFdouble = 1×5 logical array
1 0 0 0 0
TFdatetime = ismissing(xDatetime)
TFdatetime = 1×5 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 = 5×4 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