Main Content

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

filloutliers

データの外れ値の検出と置き換え

説明

B = filloutliers(A,fillmethod) は、A 内の外れ値を検出し、fillmethod に従って外れ値を置き換えます。たとえば、filloutliers(A,"previous") は、外れ値を前の非外れ値の要素に置き換えます。

  • A が行列の場合、filloutliersA の各列を個別に処理します。

  • A が多次元配列の場合、filloutliers は、サイズが 1 に等しくない A の最初の次元に沿って演算します。

  • A が table または timetable の場合、filloutliersA の各変数で別々に動作します。

既定での外れ値とは、中央値からの距離が中央絶対偏差 (MAD) の 3 倍を超えている値です。

filloutliers の機能を対話的に使用するには、ライブ スクリプトに [外れ値データの削除] タスクを追加します。

B = filloutliers(A,fillmethod,findmethod) は外れ値を検出するメソッドを指定します。たとえば、filloutliers(A,"previous","mean") は、標準偏差の 3 倍を超えて平均値から離れている A の要素を外れ値として定義します。

B = filloutliers(A,fillmethod,"percentiles",threshold) は、外れ値を threshold で指定された百分位数の範囲外にある点として定義します。threshold 引数は、[10 90] など、百分位数の上下のしきい値を含む 2 要素の行ベクトルです。

B = filloutliers(A,fillmethod,movmethod,window) は、ウィンドウの長さ window をもつ移動ウィンドウの平均値または中央値を使用して、局所外れ値を検出します。たとえば、filloutliers(A,"previous","movmean",5) は、5 要素のウィンドウの局所平均値から、局所標準偏差の 3 倍を超えて離れている要素を外れ値として識別します。

B = filloutliers(___,dim) は、前述の任意の構文について、演算の対象とする A の次元を指定します。たとえば、filloutliers(A,"linear",2) は行列 A の各行を処理します。

B = filloutliers(___,Name,Value) は、名前と値の引数を 1 つ以上使用して、外れ値の検出および置き換えを行うための追加のパラメーターを指定します。たとえば、filloutliers(A,"previous","SamplePoints",t) は時間ベクトル t の対応する要素を基準として A の外れ値を検出します。

[B,TF]= filloutliers(___) は、元は外れ値だった B の埋め込み済みの要素の位置を示す logical 配列 TF も返します。

[B,TF,L,U,C] = filloutliers(___) は、外れ値検出メソッドで使用された下限しきい値 L、上限しきい値 U、および中心値 C も返します。

すべて折りたたむ

"linear" メソッドを使用してデータのベクトルの外れ値を埋め、埋められたデータを可視化します。

2 つの外れ値を含むデータのベクトルを作成します。

A = [57 59 60 100 59 58 57 58 300 61 62 60 62 58 57];

線形内挿を使用して外れ値を置き換えます。

B = filloutliers(A,"linear");

元のデータと、外れ値が埋められたデータをプロットします。

plot(A)
hold on
plot(B,"o-")
legend("Original Data","Filled Data")

データの table にある外れ値を特定し、"nearest" 埋め込みメソッドを使用して外れ値を埋め、クリーニング済みのデータを可視化します。

データの timetable を作成し、データを可視化して潜在的な外れ値を特定します。

T = hours(1:15);
V = [57 59 60 100 59 58 57 58 300 61 62 60 62 58 57];
A = timetable(T',V');
plot(A.Time,A.Var1)

データの外れ値を埋めます。ここで、外れ値は平均値から標準偏差の 3 倍を超えた位置にある点として定義されています。外れ値を最も近い非外れ値の要素に置き換えます。

B = filloutliers(A,"nearest","mean")
B=15×1 timetable
    Time     Var1
    _____    ____

    1 hr      57 
    2 hr      59 
    3 hr      60 
    4 hr     100 
    5 hr      59 
    6 hr      58 
    7 hr      57 
    8 hr      58 
    9 hr      61 
    10 hr     61 
    11 hr     62 
    12 hr     60 
    13 hr     62 
    14 hr     58 
    15 hr     57 

同じグラフに、元のデータと、外れ値が埋められたデータをプロットします。

hold on
plot(B.Time,B.Var1,"o-")
legend("Original Data","Filled Data")

移動中央値を使用して、時間ベクトルに対応する正弦波内の局所外れ値を検出して埋めます。

局所外れ値を含むデータのベクトルを作成します。

x = -2*pi:0.1:2*pi;
A = sin(x);
A(47) = 0;

A のデータに対応する時間ベクトルを作成します。

t = datetime(2017,1,1,0,0,0) + hours(0:length(x)-1);

外れ値を、スライディング ウィンドウ内の局所中央値から、スケーリングされた局所 MAD の 3 倍を超えた位置にある点として定義します。ウィンドウ サイズを 5 時間に設定し、t の点を基準として A の外れ値の位置を検出します。"clip" メソッドを使用して計算したしきい値で外れ値を埋めます。

[B,TF,L,U,C] = filloutliers(A,"clip","movmedian",hours(5),"SamplePoints",t);

元のデータと、外れ値が埋められたデータをプロットします。

plot(t,A)
hold on
plot(t,B,"o-")
legend("Original Data","Filled Data")

対角上に外れ値を含むデータの行列を作成します。

A = randn(5,5) + diag(1000*ones(1,5))
A = 5×5
103 ×

    1.0005   -0.0013   -0.0013   -0.0002    0.0007
    0.0018    0.9996    0.0030   -0.0001   -0.0012
   -0.0023    0.0003    1.0007    0.0015    0.0007
    0.0009    0.0036   -0.0001    1.0014    0.0016
    0.0003    0.0028    0.0007    0.0014    1.0005

各行のデータに基づいて外れ値をゼロで埋めて、その新しい値を表示します。

[B,TF] = filloutliers(A,0,2);
B
B = 5×5

         0   -1.3077   -1.3499   -0.2050    0.6715
    1.8339         0    3.0349   -0.1241   -1.2075
   -2.2588    0.3426         0    1.4897    0.7172
    0.8622    3.5784   -0.0631         0    1.6302
    0.3188    2.7694    0.7147    1.4172         0

インデックス ベクトルとして TF を使用して、検出された外れ値とその埋め込まれた値にアクセスできます。

[A(TF) B(TF)]
ans = 5×2
103 ×

    1.0005         0
    0.9996         0
    1.0007         0
    1.0014         0
    1.0005         0

2 つの外れ値を含むベクトルを作成し、外れ値の位置を検出します。

A = [57 59 60 100 59 58 57 58 300 61 62 60 62 58 57];
detect = isoutlier(A)
detect = 1x15 logical array

   0   0   0   1   0   0   0   0   1   0   0   0   0   0   0

"nearest" メソッドを使用して外れ値を埋めます。検出メソッドを使用する代わりに、isoutlier によって検出された外れ値の位置を指定します。

B = filloutliers(A,"nearest","OutlierLocations",detect)
B = 1×15

    57    59    60    59    59    58    57    58    61    61    62    60    62    58    57

"clip" 埋め込みメソッドを使用して、データのベクトルの外れ値を置き換えます。

外れ値があるデータのベクトルを作成します。

A = [60 59 49 49 58 100 61 57 48 58];

既定の "median" メソッドで外れ値を検出し、"clip" 埋め込みメソッドを使用して外れ値を上限しきい値に置き換えます。

[B,TF,L,U,C] = filloutliers(A,"clip");

元のデータ、埋められた外れ値があるデータ、および外れ値検出メソッドで決定されたしきい値と中心値をプロットします。中心値はデータの中央値で、上限および下限しきい値は中央値から上下に MAD の 3 倍離れた値です。

plot(A)
hold on
plot(B,"o-")
yline([L U C],":",["Lower Threshold","Upper Threshold","Center Value"])
legend("Original Data","Filled Data")

R2024a 以降

table を作成し、10 より大きい値として定義されている外れ値を埋めます。埋める外れ値の位置を示す logical 変数 loc の table を作成します。次に、filloutliers で名前と値の引数 OutlierLocations を使用して、既知の外れ値の位置を指定します。

A = [1; 4; 9; 12; 3];
B = [9; 0; 6; 2; 1];
C = [14; 4; 2; 3; 8];
T = table(A,B,C)
T=5×3 table
    A     B    C 
    __    _    __

     1    9    14
     4    0     4
     9    6     2
    12    2     3
     3    1     8

loc = T>10
loc=5×3 table
      A        B        C  
    _____    _____    _____

    false    false    true 
    false    false    false
    false    false    false
    true     false    false
    false    false    false

T = filloutliers(T,10,OutlierLocations=loc)
T=5×3 table
    A     B    C 
    __    _    __

     1    9    10
     4    0     4
     9    6     2
    10    2     3
     3    1     8

入力引数

すべて折りたたむ

入力データ。ベクトル、行列、多次元配列、table または timetable として指定します。

  • A が table の場合、その変数の型は double または single でなければなりません。または、DataVariables 引数を使用して double または single の変数を明示的にリストすることもできます。doublesingle 以外のデータ型の変数を含む table を操作する場合、変数を指定すると便利です。

  • A が timetable の場合、filloutliers は table 要素のみを処理します。行時間がサンプル点として使用されている場合、行時間は一意で、かつ昇順にリストされていなければなりません。

データ型: double | single | table | timetable

外れ値を置き換えるための埋め込みメソッド。次の値のいずれかとして指定します。

埋め込みメソッド説明
数値スカラー指定したスカラー値
"center"findmethod で求めた中心値
"clip"findmethod で求めた下限しきい値よりも小さな要素についての下限しきい値、findmethod で求めた上限しきい値よりも大きな要素についての上限しきい値
"previous"前の非外れ値
"next"次の非外れ値
"nearest"最も近い非外れ値
"linear"隣接する非外れ値の線形内挿
"spline"区分的 3 次スプライン内挿
"pchip"形状維持区分的 3 次スプライン内挿
"makima"修正 Akima 3 次エルミート内挿 (数値、durationdatetime のデータ型のみ)

データ型: double | single | char | string

外れ値を検出するメソッド。次の値のいずれかとして指定します。

メソッド説明
"median"外れ値は、スケーリングされた MAD の 3 倍を超えて中央値から離れている要素と定義されます。スケーリングされた MAD は c*median(abs(A-median(A))) と定義されます。ここで、c=-1/(sqrt(2)*erfcinv(3/2)) です。
"mean"外れ値は、標準偏差の 3 倍を超えて平均値から離れている要素と定義されます。このメソッドは "median" より高速ですが、ロバスト性は低下します。
"quartiles"外れ値は、上位四分位数 (75%) から上に、または下位四分位数 (25%) から下に、四分位範囲の 1.5 倍を超える要素と定義されます。このメソッドは、A のデータが正規分布でない場合に便利です。
"grubbs"外れ値の検出にグラブス検定を使用します。これにより、仮説検定に基づいて反復ごとに 1 つの外れ値が除去されます。このメソッドは A のデータが正規分布であることを前提としています。
"gesd"外れ値に対して一般化 ESD 検定を使用して、外れ値を検出します。この反復メソッドは "grubbs" に似ていますが、複数の外れ値が相互にマスキングしている場合に、より効果的に機能します。

百分位数のしきい値。区間 [0,100] 内の要素をもつ 2 要素の行ベクトルとして指定します。最初の要素は百分位数の下限しきい値を示し、2 番目の要素は百分位数の上限しきい値を示します。threshold の最初の要素は、2 番目の要素より小さくなければなりません。

たとえば、しきい値が [10 90] の場合、外れ値は 10 番目の百分位数を下回る点、および 90 番目の百分位数を超える点として定義されます。

外れ値を検出する移動メソッド。次の値のいずれかとして指定します。

メソッド説明
"movmedian"外れ値は、window で指定されたウィンドウの長さでの局所中央値から、スケーリングされた局所 MAD の 3 倍を超えて離れている要素と定義されます。このメソッドは "Hampel フィルター" とも呼ばれます。
"movmean"外れ値は、window で指定されたウィンドウの長さでの局所平均値から、局所標準偏差の 3 倍を超えて離れている要素と定義されます。

ウィンドウの長さ。正の整数スカラー、正の整数の 2 要素ベクトル、正の duration スカラーまたは正の duration の 2 要素ベクトルとして指定します。

window が正の整数スカラーである場合、ウィンドウは現在の要素を中心にして配置され、window-1 個の隣接する要素を含みます。window が偶数である場合、ウィンドウは現在の要素および直前の要素を中心にして配置されます。

window が正の整数の 2 要素ベクトル [b f] である場合、ウィンドウには現在の要素、b 個前までの要素、f 個後までの要素が含まれます。

A が timetable であるか、SamplePointsdatetime ベクトルまたは duration ベクトルとして指定されている場合、windowduration 型でなければならず、ウィンドウはサンプル点を基準に計算されます。

操作次元。正の整数スカラーとして指定します。値を指定しない場合、既定値は、サイズが 1 ではない最初の配列の次元です。

mn 列の入力行列 A を考えます。

  • filloutliers(A,fillmethod,1) は、A の各列のデータに従って外れ値を埋め、mn 列の行列を返します。

    filloutliers(A,fillmethod,1) column-wise operation

  • filloutliers(A,fillmethod,2) は、A の各行のデータに従って外れ値を埋め、mn 列の行列を返します。

    filloutliers(A,fillmethod,2) row-wise operation

入力データが table または timetable の場合、dim はサポートされず、演算は各 table 変数または timetable 変数に沿って個別に行われます。

名前と値の引数

引数のオプションのペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は重要ではありません。

例: filloutliers(A,"center","mean",ThresholdFactor=4)

R2021a より前では、コンマを使用してそれぞれの名前と値を区切り、Name を引用符で囲みます。

例: filloutliers(A,"center","mean","ThresholdFactor",4)

データ オプション

すべて折りたたむ

サンプル点。サンプル点のベクトル、または次の表のいずれかのオプション (入力データが table の場合) として指定します。サンプル点はデータの x 軸の位置を表し、並べ替える必要があり、一意の要素を含まなければなりません。サンプル点は等間隔でサンプリングされている必要はありません。既定の設定はベクトル [1 2 3 ...] です。

入力データが table の場合は、次のいずれかのオプションを使用して、サンプル点を table 変数として指定できます。

インデックス方式

変数名:

  • string スカラーまたは文字ベクトル

  • "A" または 'A'A という名前の変数

変数インデックス:

  • table 内の変数の位置を参照するインデックス番号

  • logical ベクトル。通常、このベクトルの長さは変数の数と同じですが、末尾の 0 値や false 値は省略できます。

  • 3 — table の 3 番目の変数

  • [false false true] — 3 番目の変数

関数ハンドル:

  • 入力として table 変数をとり、logical スカラーを返す関数ハンドル

  • @isnumeric — 数値を含んでいる 1 つの変数

変数の型:

  • 指定した型の 1 つの変数を選択する vartype 添字

  • vartype("numeric") — 数値を含んでいる 1 つの変数

メモ

入力データが timetable の場合、この名前と値の引数はサポートされません。timetable では、行時間のベクトルをサンプル点として使用します。別のサンプル点を使用するには、目的のサンプル点が行時間に含まれるように timetable を編集しなければなりません。

移動ウィンドウは、サンプル点を基準にして定義されます。たとえば、t が入力データに対応する時間のベクトルである場合、filloutliers(rand(1,10),"previous","movmean",3,"SamplePoints",t) には t(i)-1.5 から t(i)+1.5 までの時間間隔を表すウィンドウがあります。

サンプル点ベクトルのデータ型が datetime または duration である場合、移動ウィンドウの長さの型は duration でなければなりません。

例: filloutliers([1 100 3 4],"nearest","SamplePoints",[1 2.5 3 4])

例: filloutliers(T,"nearest","SamplePoints","Var1")

データ型: single | double | datetime | duration

演算の対象とする table 変数。次の表のオプションのいずれかとして指定します。DataVariables の値は、入力 table 内のどの変数を埋めるかを示します。指摘された変数に関連付けられるデータ型は double または single でなければなりません。

DataVariables で指定されていない table 内のその他の変数は、埋められずに出力に渡されます。

インデックス方式

変数名:

  • string または文字ベクトル

  • string 配列または文字ベクトルの cell 配列

  • pattern オブジェクト

  • "A" または 'A'A という名前の変数

  • ["A" "B"] または {'A','B'}A および B という名前の 2 つの変数

  • "Var"+digitsPattern(1)"Var" の後に数字 1 桁が続く名前の変数

変数インデックス:

  • table 内の変数の位置を参照するインデックス番号

  • 数値のベクトル

  • logical ベクトル。通常、このベクトルの長さは変数の数と同じですが、末尾の 0 値や false 値は省略できます。

  • 3 — table の 3 番目の変数

  • [2 3] — table の 2 番目と 3 番目の変数

  • [false false true] — 3 番目の変数

関数ハンドル:

  • 入力として table 変数をとり、logical スカラーを返す関数ハンドル

  • @isnumeric — 数値を含んでいるすべての変数

変数の型:

  • 指定した型の変数を選択する vartype 添字

  • vartype("numeric") — 数値を含んでいるすべての変数

例: filloutliers(A,"previous","DataVariables",["Var1" "Var2" "Var4"])

値置換インジケーター。A が table または timetable の場合に、次の logical 値または数値のいずれかとして指定します。

  • true または 1 — 外れ値を含む入力 table 変数を、埋め込み済みの table 変数に置き換えます。

  • false または 0 — 外れ値をチェック済みのすべての table 変数を含む入力 table を追加します。追加される変数の外れ値は埋められます。

入力データがベクトル、行列、または多次元配列の場合、ReplaceValues はサポートされません。

例: filloutliers(T,"previous","ReplaceValues",false)

外れ値検出オプション

すべて折りたたむ

検出しきい値の係数。非負のスカラーとして指定します。

"median" メソッドおよび "movmedian" メソッドでは、検出しきい値の係数で、スケーリングされた MAD の係数が置き換えられます。検出しきい値の係数の既定値は 3 です。

"mean" メソッドおよび "movmean" メソッドでは、検出しきい値の係数で平均値からの標準偏差の係数が置き換えられます。検出しきい値の係数の既定値は 3 です。

"grubbs" メソッドおよび "gesd" メソッドでの検出しきい値の係数は、0 ~ 1 の範囲のスカラーです。値が 0 に近くなると外れ値の数が少なくなり、値が 1 に近くなると外れ値の数が多くなります。既定の検出しきい値の係数は 0.05 です。

"quartiles" メソッドでは、検出しきい値の係数により四分位数間範囲の係数が置き換えられます。検出しきい値の係数の既定値は 1.5 です。

"percentiles" メソッドが指定されている場合、この名前と値の引数はサポートされません。

GESD により埋められる外れ値の最大数。正の整数スカラーとして指定します。MaxNumOutliers 値は、"gesd" メソッドにより埋められる外れ値の最大数を指定します。たとえば、filloutliers(A,"linear","gesd","MaxNumOutliers",5) は最大で 5 つの外れ値を埋めます。

MaxNumOutliers の既定値は、A の要素数の 10% に最も近い整数です。外れ値の最大数に大きい値を設定すると、すべての外れ値を検出する可能性が高くなりますが、それと引き換えに計算効率が低下します。

"gesd" メソッドは、非外れ値の入力データがほぼ正規分布からサンプリングされていると仮定します。データがこのようにサンプリングされていない場合、埋められる外れ値の数が MaxNumOutliers 値を上回ることがあります。

既知の外れ値インジケーター。logical ベクトル、行列、多次元配列、または logical 変数を含む table または timetable (R2024a 以降) として指定します。

OutlierLocations が配列の場合は、A と同じサイズでなければなりません。OutlierLocations が table または timetable の場合は、演算対象の入力 table 変数と同じサイズと名前をもつ logical 変数を含めなければなりません。

値が 1 (true) の要素は、A の外れ値の位置を示します。値が 0 (false) の要素は、非外れ値を示します。OutlierLocations を指定した場合、filloutliers は外れ値検出メソッドを使用しません。代わりに、既知の外れ値インジケーターの要素を使用して、外れ値を定義します。

findmethod を指定した場合、OutlierLocations を指定することはできません。

データ型: logical

出力引数

すべて折りたたむ

埋め込まれたデータ。ベクトル、行列、多次元配列、table または timetable として返されます。

B は、ReplaceValues の値が false の場合を除き、A と同じサイズになります。ReplaceValues の値が false の場合、B の幅は入力データの幅と指定したデータ変数の数の合計となります。

埋め込まれたデータのインジケーター。logical ベクトル、行列または多次元配列として返されます。値が 1 (true) の要素は、元は外れ値だった B の埋め込まれた要素に対応します。値が 0 (false) の要素は、変更されていない要素に対応します。

TF は、B と同じサイズになります。

データ型: logical

外れ値検出メソッドで使用された下限しきい値。スカラー、ベクトル、行列、多次元配列、table または timetable として返されます。たとえば、既定の外れ値検出メソッドの下限しきい値は、入力データの中央値より MAD の 3 倍分小さい値です。

外れ値検出に findmethod を使用する場合、L のサイズは、操作次元 (長さ 1) 以外のすべての次元で A と同じになります。movmethod を使用する場合、L のサイズは A と同じになります。

外れ値検出メソッドで使用された上限しきい値。スカラー、ベクトル、行列、多次元配列、table または timetable として返されます。たとえば、既定の外れ値検出メソッドの上限しきい値は、入力データの中央値より MAD の 3 倍分大きい値です。

外れ値検出に findmethod を使用する場合、U のサイズは、操作次元 (長さ 1) 以外のすべての次元で A と同じになります。movmethod を使用する場合、U のサイズは A と同じになります。

外れ値検出メソッドで使用された中心値。スカラー、ベクトル、行列、多次元配列、table または timetable として返されます。たとえば、既定の外れ値検出メソッドの中心値は、入力データの中央値です。

外れ値検出に findmethod を使用する場合、C のサイズは、操作次元 (長さ 1) 以外のすべての次元で A と同じになります。movmethod を使用する場合、C のサイズは A と同じになります。

詳細

すべて折りたたむ

中央絶対偏差

N 個のスカラー観測値からなる有限長ベクトル A の中央絶対偏差 (MAD) は、i = 1,2,...,N について、次のように定義されます。

MAD = median(|Aimedian(A)|)

スケーリングされた MAD は c*median(abs(A-median(A))) と定義されます。ここで、c=-1/(sqrt(2)*erfcinv(3/2)) です。

代替機能

ライブ エディター タスク

filloutliers の機能を対話的に使用するには、ライブ スクリプトに [外れ値データの削除] タスクを追加します。

Clean Outlier Data task in the Live Editor

参照

[1] NIST/SEMATECH e-Handbook of Statistical Methods, https://www.itl.nist.gov/div898/handbook/, 2013.

拡張機能

バージョン履歴

R2017a で導入

すべて展開する