Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MATLAB 内の欠損データ

欠損データの処理は、データ前処理で一般的に行われるタスクです。欠損値はデータ内の意味のあるイベントを表していることもありますが、多くの場合、信頼できないか、使用できないデータ点を表しています。いずれにしても、MATLAB® には欠損データを処理するための多くのオプションがあります。

欠損データの作成と整理

MATLAB での欠損値の形式は、データ型によって異なります。たとえば、double などの数値データ型では NaN (非数) を使用して欠損値を表します。

x = [NaN 1 2 3 4];

missing 値を使用して、欠損している数値データや他の型 (datetimestringcategorical など) のデータを表すこともできます。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)

Figure contains an axes object. The axes object contains an object of type line.

しかし、そのデータの平均を計算すると、結果は 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

参考

| | |

関連するトピック