Main Content

discretize

データをビンまたはカテゴリにグループ化

説明

Y = discretize(X,edges) は、X の要素を含むビンのインデックスを返します。j 番目のビンには、1 <= j < Nedges(j) <= X(i) < edges(j+1) の場合に要素 X(i) が含まれます。ここで、N はビン数であり、length(edges) = N+1 です。最後のビンには、edges(N) <= X(i) <= edges(N+1) を満たす両側のエッジが含まれます。

[Y,E] = discretize(X,N) は、X 内のデータを N 個の一様な幅のビンに分割し、さらにビン エッジ E を返します。

[Y,E] = discretize(X,dur) は、datetime 配列 X または duration 配列 X を、時間の長さが dur の一様なビンに分割します。dur は、スカラーの duration、スカラーの calendarDuration または時間の単位にすることができます。たとえば、[Y,E] = discretize(X,'hour') は、X を duration が 1 時間の一様なビンに分割します。

[___] = discretize(___,values) は、前述の入力引数または出力引数の任意の組み合わせを使用して、ビン番号ではなく、values 内の対応する要素を返します。たとえば、X(1) がビン 5 にある場合、Y(1)5 ではなく、values(5) です。values は、ビン数と同じ長さをもつベクトルでなければなりません。

[___] = discretize(___,'categorical') は、各ビンがカテゴリとなる categorical 配列を作成します。ほとんどの場合、既定のカテゴリ名の形式は "[A,B)" (最後のビンでは "[A,B]") です。ここで、AB は連続するビン エッジです。dur を文字ベクトルとして指定すると、既定のカテゴリ名が特殊な形式になる場合があります。表示形式のリストについては、Y を参照してください。

[___] = discretize(___,'categorical',displayFormat) は、datetime または duration 配列入力の場合に、指定された datetime または duration の表示形式を出力のカテゴリ名に使用します。

[___] = discretize(___,'categorical',categoryNames) も、文字ベクトルの cell 配列 categoryNames を使用して Y のカテゴリに名前を付けます。categoryNames の長さはビン数と等しくなければなりません。

[___] = discretize(___,'IncludedEdge',side) は、各ビンに右側または左側のビン エッジのいずれを含めるかを指定します。ここで、side'left' または 'right' です。たとえば、side'right' の場合、両側のエッジを含む "最初" のビンを除く各ビンに、右側のビン エッジが含まれます。この場合、edges(j) < X(i) <= edges(j+1) であれば、j 番目のビンは要素 X(i) を含みます。ここで、1 < j <= N であり、N はビン数です。最初のビンは、edges(1) <= X(i) <= edges(2) を満たす左側エッジを含みます。side の既定値は 'left' です。

すべて折りたたむ

discretize を使用して数値を離散的なビンにグループ化します。edges は 5 つのビン エッジを定義するため、4 つのビンがあります。

data = [1 1 2 3 6 5 8 10 4 4]
data = 1×10

     1     1     2     3     6     5     8    10     4     4

edges = 2:2:10
edges = 1×5

     2     4     6     8    10

Y = discretize(data,edges)
Y = 1×10

   NaN   NaN     1     1     3     2     4     4     2     2

Y は、データの各要素が属するビンを示します。値 1 はビンの範囲外にあるため、Y にはそれらの要素に対応する NaN 値が含まれています。

乱数データを 3 つのビンにグループ化します。discretize で計算されたビン エッジを返すための 2 番目の出力を指定します。

X = randn(10,1);
[Y,E] = discretize(X,3)
Y = 10×1

     2
     2
     1
     2
     2
     1
     1
     2
     3
     2

E = 1×4

    -3     0     3     6

2016 年内の乱数の日付をもつ 10 行 1 列の datetime ベクトルを作成します。次に、datetime 値を月別にグループ化し、結果を categorical 配列として返します。

X = datetime(2016,1,randi(365,10,1))
X = 10x1 datetime
   24-Oct-2016
   26-Nov-2016
   16-Feb-2016
   29-Nov-2016
   18-Aug-2016
   05-Feb-2016
   11-Apr-2016
   18-Jul-2016
   15-Dec-2016
   18-Dec-2016

Y = discretize(X,'month','categorical')
Y = 10x1 categorical
     Oct-2016 
     Nov-2016 
     Feb-2016 
     Nov-2016 
     Aug-2016 
     Feb-2016 
     Apr-2016 
     Jul-2016 
     Dec-2016 
     Dec-2016 

duration 値を時間別にグループ化し、その結果をさまざまな表示形式で返します。

いくつかの乱数の duration 値を時間別にグループ化し、結果を categorical 配列として返します。

X = hours(abs(randn(1,10)))'
X = 10x1 duration
   0.53767 hr
    1.8339 hr
    2.2588 hr
   0.86217 hr
   0.31877 hr
    1.3077 hr
   0.43359 hr
   0.34262 hr
    3.5784 hr
    2.7694 hr

Y = discretize(X,'hour','categorical')
Y = 10x1 categorical
     [0 hr, 1 hr) 
     [1 hr, 2 hr) 
     [2 hr, 3 hr) 
     [0 hr, 1 hr) 
     [0 hr, 1 hr) 
     [1 hr, 2 hr) 
     [0 hr, 1 hr) 
     [0 hr, 1 hr) 
     [3 hr, 4 hr] 
     [2 hr, 3 hr) 

結果の表示を分単位の値に変更します。

Y = discretize(X,'hour','categorical','m')
Y = 10x1 categorical
     [0 min, 60 min) 
     [60 min, 120 min) 
     [120 min, 180 min) 
     [0 min, 60 min) 
     [0 min, 60 min) 
     [60 min, 120 min) 
     [0 min, 60 min) 
     [0 min, 60 min) 
     [180 min, 240 min] 
     [120 min, 180 min) 

形式を再び変更して、時、分および秒の値として表示します。

Y = discretize(X,'hour','categorical','hh:mm:ss')
Y = 10x1 categorical
     [00:00:00, 01:00:00) 
     [01:00:00, 02:00:00) 
     [02:00:00, 03:00:00) 
     [00:00:00, 01:00:00) 
     [00:00:00, 01:00:00) 
     [01:00:00, 02:00:00) 
     [00:00:00, 01:00:00) 
     [00:00:00, 01:00:00) 
     [03:00:00, 04:00:00] 
     [02:00:00, 03:00:00) 

values 入力として各ビンの右側エッジを使用します。各ビンの要素の値は常に、ビンの値未満です。

X = randi(100,1,10);
edges = 0:25:100;
values = edges(2:end);
Y = discretize(X,edges,values)
Y = 1×10

   100   100    25   100    75    25    50    75   100   100

'IncludedEdge' 入力を使用して、各ビンに右側のビン エッジを含めるように指定します。最初のビンには両側のエッジが含まれます。この結果を、ビンの左側エッジを含む既定の設定と比較します。

X = 1:2:11;
edges = [1 3 4 7 10 11];
Y = discretize(X,edges,'IncludedEdge','right')
Y = 1×6

     1     1     3     3     4     5

Z = discretize(X,edges)
Z = 1×6

     1     2     3     4     4     5

数値データを categorical 配列にグループ化します。結果を使用して、平均値の 1 標準偏差内のデータ量を確認します。

標準偏差で測定された平均値からの距離に従って、正規分布データをビンにグループ化します。

X = randn(1000,1);
edges = std(X)*(-3:3);
Y = discretize(X,edges, 'categorical', ...
    {'-3sigma', '-2sigma', '-sigma', 'sigma', '2sigma', '3sigma'});

Y に含まれる未定義の categorical 値は、平均値から標準偏差の 3 倍を超えて離れた X の要素に対応します。

Y の値をプレビューします。

Y(1:15)
ans = 15x1 categorical
     sigma 
     2sigma 
     -3sigma 
     sigma 
     sigma 
     -2sigma 
     -sigma 
     sigma 
     <undefined> 
     3sigma 
     -2sigma 
     <undefined> 
     sigma 
     -sigma 
     sigma 

データの約 68% が平均値から 1 標準偏差内にあることを確認します。

nnz(Y=='-sigma' | Y=='sigma')/numel(Y)
ans = 0.6910

入力引数

すべて折りたたむ

入力配列。ベクトル、行列または多次元配列として指定します。X にはビンに分配するデータが含まれます。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | datetime | duration

ビンのエッジ。増加する値をもつ数値ベクトルとして指定します。ビンのエッジには連続して繰り返される要素を含めることができます。edges の連続要素は、X のデータを分割するために discretize が使用する離散的なビンを形成します。既定では、最後のビンを除く各ビンは左側のエッジを含みます。最後のビンは両側のエッジを含みます。

edges には、要素が少なくとも 2 つなければなりません。これは、edges(1) が最初のビンの左側のエッジ、edges(end) が最後のビンの右側のエッジであるためです。

例: Y = discretize([1 3 5],[0 2 4 6]) は、値 135 を、それぞれ [0,2)[2,4)[4,6] のエッジをもつ 3 つのビンに分配します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | datetime | duration

ビンの数。スカラー整数として指定します。

discretize は、データを N 個の一様な幅のビンに分割し、データの範囲とオーバーラップする "きりのよい" 数字になるように、ビン エッジを選択します。X の最大および最小の要素は、通常はビン エッジと一致しません。データが不均等に分散している場合、中間のいくつかのビンは空になることがあります。ただし、最初のビンと最後のビンは、常に 1 つ以上のデータを含みます。

例: [Y,E] = discretize(X,5) は、X のデータを均一な幅の 5 つのビンに分配します。

一様なビンの期間。スカラーの duration、スカラーの calendarDuration または表の値のいずれかとして指定します。

dur を指定する場合、discretize は最大 65,536 個 (216) のビンを使用できます。指定したビンの期間にさらに多くのビンが必要となる場合、discretize は最大のビン数に対応する、より大きいビンの幅を使用します。

対応する入力説明
'second'

datetime または duration の値

各ビンは 1 秒です。

'minute'

datetime または duration の値

各ビンは 1 分です。

'hour'

datetime または duration の値

各ビンは 1 時間です。

'day'

datetime または duration の値

  • datetime 入力の場合、各ビンは 1 カレンダー日です。この値には、夏時間のシフトが考慮されます。

  • duration 入力の場合、各ビンは固定長の 1 日 (24 時間) です。

'week'

datetime 値

各ビンは 1 カレンダー週です。
'month'

datetime 値

各ビンは 1 カレンダー月です。
'quarter'

datetime 値

各ビンは 1 カレンダー四半期です。
'year'

datetime または duration の値

  • datetime 入力の場合、各ビンは 1 カレンダー年です。この値には、うるう日が考慮されます。

  • duration 入力の場合、各ビンは固定長の 1 年 (365.2425 日) です。

'decade'

datetime 値

各ビンは 10 年 (10 カレンダー年) です。
'century'

datetime 値

各ビンは 1 世紀 (100 カレンダー年) です。

例: [Y,E] = discretize(X,'hour') は、X を duration が 1 時間の一様なビンに分割します。

データ型: char | duration | calendarDuration

ビンの値。任意のデータ型のベクトルとして指定します。values の長さはビン数 length(edges)-1 と同じでなければなりません。出力の通常のビンのインデックスが values の要素に置き換えられます。つまり、X(1) がビン 2 に含まれる場合、discretizeY(1) を、2 ではなく values(2) として返します。

values が cell 配列の場合、すべての入力データが 1 つのビンに属していなければなりません。

例: Y = discretize(randi(5,10,1),[1 1.5 3 5],diff([1 1.5 3 5])) は、1 から 3 のインデックスではなく、ビンの幅を返します。

datetime と duration の表示形式。文字ベクトルとして指定します。displayFormat の値は Y の値を変更せず、表示のみを変更します。datetime 配列と duration 配列の有効な表示形式を使用して、displayFormat を指定できます。使用可能なオプションの詳細については、日付と時刻の表示形式の設定を参照してください。

例: discretize(X,'day','categorical','h') は、duration 配列の表示形式を指定します。

例: discretize(X,'day','categorical','yyyy-MM-dd') は、datetime 配列の表示形式を指定します。

データ型: char

categorical 配列のカテゴリ名。文字ベクトルの cell 配列として指定します。categoryNames の長さはビン数と等しくなければなりません。

例: Y = discretize(randi(5,10,1),[1 1.5 3 5],'categorical',{'A' 'B' 'C'}) は、データを 3 つのカテゴリ AB および C に分配します。

データ型: cell

各ビンに含めるエッジ。次の値のいずれかとして指定します。

  • 'left' — 両側のエッジを含む最後のビンを除いて、すべてのビンに左側のビン エッジが含まれます。これは既定値です。

  • 'right' — 両側のエッジを含む最初のビンを除いて、すべてのビンに右側のビン エッジが含まれます。

例: Y = discretize(randi(11,10,1),1:2:11,'IncludedEdge','right') は、各ビンに右側のビン エッジを含めます。

出力引数

すべて折りたたむ

ビン。数値ベクトル、行列、多次元配列または順序 categorical 配列として返されます。Y のサイズは X と同じで、各要素は X の対応する要素のビンの配置を表します。values が指定されている場合、Y のデータ型は values と同じです。範囲外の要素の表現は、出力のデータ型によって異なります。

  • 数値出力の場合、Y は、X に範囲外の要素 (X(i) < edges(1) または X(i) > edges(end)) がある場合、あるいは XNaN が含まれる場合に、NaN 値を含みます。

  • Y が categorical 配列である場合、範囲外の入力または NaN の入力に対して、未定義の要素を含みます。

  • values が整数データ型のベクトルである場合、範囲外の入力または NaN の入力に対して、Y0 を含みます。

構文 discretize(X,dur,'categorical') の場合、Y のカテゴリ名の既定の形式は次のとおりです。

dur の値カテゴリ名の既定の形式形式の例
'second'

グローバルな既定の形式

28-Jan-2016 10:32:06

'minute'
'hour'
'day'

グローバルな既定の日付形式

28-Jan-2016

'week'

[global_default_date_format, global_default_date_format)

[24-Jan-2016, 30-Jan-2016)

'month'

'MMM-uuuu'

Jun-2016

'quarter'

'QQQ uuuu'

Q4 2015

'year'

'uuuu'

2016

'decade'

'[uuuu, uuuu)'

[2010, 2020)

'century'

ビン エッジ。ベクトルとして返されます。ビン エッジが明示的に渡されない場合に discretize が計算したビン エッジを確認するには、この出力を指定します。

E は、discretize がビンのエッジを計算するたびに行ベクトルとして返されます。ビンのエッジを渡す場合、Eedges 入力の方向を保持します。

ヒント

  • discretize の動作は、関数 histcounts の動作と似ています。各ビンの要素数を調べるには、histcounts を使用します。一方、各要素が属するビンを調べる (要素数のカウントはしない) には、discretize を使用します。

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

バージョン履歴

R2015a で導入