ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

prctile

データセットの百分位数

説明

Y = prctile(X,p) は、区間 [0,100] 内のパーセンテージ p に対する、データ ベクトルまたは配列 X 内の要素の百分位数を返します。

  • X がベクトルである場合、Y は要求された百分位数の個数と同じ長さ (length(p)) のスカラーまたはベクトルになります。Y(i) には百分位数 p(i) が格納されます。

  • X が行列である場合、Y は行ベクトルまたは行列になります。Y の行数は、要求された百分位数の個数 (length(p)) に等しくなります。Yi 行目は X の各列の p(i) 百分位数を含みます。

  • 多次元配列の場合、prctileX の最初の大きさが 1 でない最初の次元に対して作用します。

Y = prctile(X,p,'all') は、X のすべての要素の百分位数を返します。

Y = prctile(X,p,dim) は、作用次元 dim に沿った百分位数を返します。

Y = prctile(X,p,vecdim) は、ベクトル vecdim で指定された次元における百分位数を返します。たとえば X が行列である場合、次元 1 および 2 によって定義される配列スライスには行列のそれぞれの要素がすべて含まれるため、prctile(X,50,[1 2])X のすべての要素の 50 番目の百分位数を返します。

Y = prctile(___,'Method',method) は、前の構文における任意の入力引数を組み合わせて使用し、method の値に基づいて厳密な百分位数または近似百分位数のいずれかを返します。

すべて折りたたむ

サイズが 10 のデータセットを作成します。

rng('default'); % for reproducibility
x = normrnd(5,2,1,10)
x = 1×10

    6.0753    8.6678    0.4823    6.7243    5.6375    2.3846    4.1328    5.6852   12.1568   10.5389

42 番目の百分位数を計算します。

Y = prctile(x,42)
Y = 5.6709

配列のすべての値の百分位数を求めます。

3 x 5 x 2 の配列 X を作成します。

X = reshape(1:30,[3 5 2])
X = 
X(:,:,1) =

     1     4     7    10    13
     2     5     8    11    14
     3     6     9    12    15


X(:,:,2) =

    16    19    22    25    28
    17    20    23    26    29
    18    21    24    27    30

X の要素の 40 番目および 60 番目の百分位数を求めます。

Y = prctile(X,[40 60],'all')
Y = 2×1

   12.5000
   18.5000

Y(1)X の 40 番目の百分位数、Y(2)X の 60 番目の百分位数です。

指定されたパーセンテージにおける、データ行列の列と行に対する百分位数を計算します。

5 行 5 列のデータ行列を作成します。

X = (1:5)'*(2:6)
X = 5×5

     2     3     4     5     6
     4     6     8    10    12
     6     9    12    15    18
     8    12    16    20    24
    10    15    20    25    30

X の列に対する 25、50、75 番目の百分位数を計算します。

Y = prctile(X,[25 50 75],1)
Y = 3×5

    3.5000    5.2500    7.0000    8.7500   10.5000
    6.0000    9.0000   12.0000   15.0000   18.0000
    8.5000   12.7500   17.0000   21.2500   25.5000

Y の行は、X の列の百分位数に対応します。たとえば、要素 (4, 8, 12, 16, 20) が含まれている X の 3 列目の 25、50、75 番目の百分位数は、それぞれ 7、12、17 になります。Y = prctile(X,[25 50 75]) は同じ百分位行列を返します。

X の行に対する 25、50、75 番目の百分位数を計算します。

Y = prctile(X,[25 50 75],2)
Y = 5×3

    2.7500    4.0000    5.2500
    5.5000    8.0000   10.5000
    8.2500   12.0000   15.7500
   11.0000   16.0000   21.0000
   13.7500   20.0000   26.2500

Y の行は、X の行の百分位数に対応します。たとえば、(2, 3, 4, 5, 6) の要素をもつ X の最初の行の 25、50、75 番目の百分位数は、それぞれ 2.75、4、5.25 になります。

複数の次元に沿った多次元配列の百分位数を同時に求めます。

3 x 5 x 2 の配列 X を作成します。

X = reshape(1:30,[3 5 2])
X = 
X(:,:,1) =

     1     4     7    10    13
     2     5     8    11    14
     3     6     9    12    15


X(:,:,2) =

    16    19    22    25    28
    17    20    23    26    29
    18    21    24    27    30

作用次元として 1 番目の次元と 2 番目の次元を指定して、X の各ページの 40 番目および 60 番目の百分位数を求めます。

Ypage = prctile(X,[40 60],[1 2])
Ypage = 
Ypage(:,:,1) =

    6.5000
    9.5000


Ypage(:,:,2) =

   21.5000
   24.5000

たとえば、Ypage(1,1,1)X の 1 ページ目の 40 番目の百分位数、Ypage(2,1,1)X の 1 ページ目の 60 番目の百分位数です。

作用次元として 1 番目の次元と 3 番目の次元を指定して、各 X(:,i,:) スライスの要素の 40 番目および 60 番目の百分位数を求めます。

Ycol = prctile(X,[40 60],[1 3])
Ycol = 2×5

    2.9000    5.9000    8.9000   11.9000   14.9000
   16.1000   19.1000   22.1000   25.1000   28.1000

たとえば、Ycol(1,4)X(:,4,:) の要素の 40 番目の百分位数、Ycol(2,4)X(:,4,:) の要素の 60 番目の百分位数です。

特定のパーセンテージに対して、tall 列ベクトルの厳密な百分位数および近似百分位数を計算します。

airlinesmall データセットのデータストアを作成します。datastore によって NaN 値に置き換えられるようにするため、'NA' 値を欠損データとして扱います。変数 ArrTime を処理するよう指定します。

ds = datastore('airlinesmall.csv','TreatAsMissing','NA',...
    'SelectedVariableNames','ArrTime');

データストアの先頭に tall table を作成し、tall table から tall ベクトルにデータを抽出します。

t = tall(ds) % Tall table
Starting parallel pool (parpool) using the 'local' profile ...
connected to 6 workers.

t =

  M×1 tall table

    ArrTime
    _______

      735  
     1124  
     2218  
     1431  
      746  
     1547  
     1052  
     1134  
       :
       :
x = t{:,:}   % Tall vector
x =

  M×1 tall double column vector

         735
        1124
        2218
        1431
         746
        1547
        1052
        1134
         :
         :

x の厳密な 50 番目の百分位数を計算します。x が tall 列ベクトル、p がスカラーであるため、既定では prctile は厳密な百分位数値を返します。

p = 50;
yExact = prctile(x,p)
yExact =

  M×N×... tall double array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :

Preview deferred. Learn more.

x の 50 番目の近似百分位数を計算します。t-digestに基づく近似アルゴリズムを百分位数の計算に使用するため、'Method','approximate' を指定します。

yApprox = prctile(x,p,'Method','approximate')
yApprox =

  M×N×... tall double array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :

Preview deferred. Learn more.

tall 配列を評価し、gather を使用して結果をメモリに格納します。

[yExact,yApprox] = gather(yExact,yApprox)
Evaluating tall expression using the Parallel Pool 'local':
- Pass 1 of 4: Completed in 9.7 sec
- Pass 2 of 4: Completed in 0.7 sec
- Pass 3 of 4: Completed in 1.8 sec
- Pass 4 of 4: Completed in 1 sec
Evaluation completed in 16 sec
yExact = 1522
yApprox = 1.5220e+03

近似百分位数の値と厳密な百分位数の値は、表示されている 4 桁まで同じです。

別々の次元に沿って指定されたパーセンテージについて、tall 行列の厳密な百分位数および近似百分位数を計算します。

airlinesmall データセットの変数のサブセットが含まれている tall 行列 X を作成します。tall 配列からデータを抽出する手順の詳細については、特定のパーセンテージに対する tall ベクトルの百分位数を参照してください。

varnames = {'ArrDelay','ArrTime','DepTime','ActualElapsedTime'}; % Subset of variables in the data set
ds = datastore('airlinesmall.csv','TreatAsMissing','NA',...
    'SelectedVariableNames',varnames); % Datastore
t = tall(ds);     % Tall table
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).
X = t{:,varnames} % Tall matrix
X =

  M×4 tall double matrix

           8         735         642          53
           8        1124        1021          63
          21        2218        2055          83
          13        1431        1332          59
           4         746         629          77
          59        1547        1446          61
           3        1052         928          84
          11        1134         859         155
          :          :            :           :
          :          :            :           :

1 以外の次元に沿って作用する場合、関数 prctile は厳密な百分位数のみを計算し、これによってt-digestに基づく近似アルゴリズムではなく、並べ替えに基づくアルゴリズム (アルゴリズムを参照) の使用による効率的な計算を可能にします。

2 番目の次元に沿って、X の 25 番目、50 番目および 75 番目の厳密な百分位数を計算します。

p = [25 50 75]; % Vector of percentages
Yexact = prctile(X,p,2)
Yexact =

  M×N×... tall double array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :

Preview deferred. Learn more.

関数が 1 番目の次元に沿って作用し、p がパーセンテージのベクトルである場合、百分位数の計算では t-digest に基づく近似アルゴリズムを使用しなければなりません。並べ替えに基づくアルゴリズムを使用して tall 配列の 1 番目の次元に沿って百分位数を求めると、計算負荷が高くなります。

1 番目の次元に沿って、X の 25 番目、50 番目および 75 番目の近似百分位数を計算します。既定の次元は 1 なので、dim の値を指定する必要はありません。

Yapprox = prctile(X,p,'Method','approximate')
Yapprox =

  M×N×... tall double array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :

Preview deferred. Learn more.

tall 配列を評価し、gather を使用して結果をメモリに格納します。

[Yexact,Yapprox] = gather(Yexact,Yapprox);
Evaluating tall expression using the Parallel Pool 'local':
- Pass 1 of 1: Completed in 9.9 sec
Evaluation completed in 12 sec

X の 2 番目の次元に沿った 25 番目、50 番目および 75 番目の厳密な百分位数の先頭 5 行を表示します。

Yexact(1:5,:)
ans = 5×3
103 ×

    0.0305    0.3475    0.6885
    0.0355    0.5420    1.0725
    0.0520    1.0690    2.1365
    0.0360    0.6955    1.3815
    0.0405    0.3530    0.6875

行列 Yexact の各行には、X の対応する行の 3 つの百分位数が格納されます。たとえば、30.5347.5 および 688.5 はそれぞれ X の 1 行目の 25 番目、50 番目および 75 番目の百分位数です。

1 番目の次元に沿って、X の 25 番目、50 番目および 75 番目の近似百分位数を表示します。

Yapprox
Yapprox = 3×4
103 ×

   -0.0070    1.1149    0.9321    0.0700
         0    1.5220    1.3350    0.1020
    0.0110    1.9180    1.7400    0.1510

行列 Yapprox の各行は、行列 X の各列の 3 つの百分位数に対応します。たとえば、Yapprox の 1 列目の要素は (–7, 0, 11) であり、X の 1 列目の百分位数が格納されています。

入力引数

すべて折りたたむ

ベクトルまたは配列として指定される入力データ。

データ型: double | single

百分位数計算の対象となるパーセンテージ。0 ~ 100 のスカラー、またはスカラーのベクトルを指定します。

例: 25

例: [25, 50, 75]

データ型: double | single

X の百分位数を求める対象となる次元。正の整数を指定します。たとえば、行列 X に対して、dim = 1 の場合に prctileX の列の百分位数を返し、dim = 2 の場合に prctileX の行の百分位数を返します。多次元配列 X では、Ydim 番目の次元の長さが p の長さに等しくなります。

データ型: double | single

次元のベクトル。正の整数ベクトルを指定します。vecdim の各要素は、入力配列 X の次元を表します。出力 Y の長さは、指定された作用次元の中で最小の次元 (つまり min(vecdim)) では length(p)、残りの作用次元では 1 になります。他の次元の長さは、XY で同じになります。

たとえば、2 x 3 x 3 の配列 X があり、p = [20 40 60 80] であるとします。この場合、prctile(X,p,[1 2]) は配列を返します。この配列の各ページには、X の対応するページの要素の 20 番目、40 番目、60 番目および 80 番目の百分位数が格納されます。1 と 2 が作用次元であり、min([1 2]) = 1 および length(p) = 4 なので、出力は 4 x 1 x 3 の配列になります。

データ型: single | double

百分位数の計算方法。'exact' または 'approximate' を指定します。既定では、prctile は並べ替えを使用するアルゴリズムによって厳密な百分位数を返します。prctile に対して 'method','approximate' を指定すると、t-digestを使用するアルゴリズムによって近似百分位数を取得できます。

データ型: char | string

出力引数

すべて折りたたむ

データ ベクトルまたは配列の百分位数。スカラーまたは 1 つ以上のパーセンテージ値の配列として返されます。

  • X がベクトルである場合、Y は要求された百分位数の個数と同じ長さ (length(p)) のスカラーまたはベクトルになります。Y(i) には p(i) 番目の百分位数が格納されます。

  • X が d 次元の配列である場合、Y は配列になり、最小の作用次元の長さは要求された百分位数の個数 (length(p)) に等しくなります。

詳細

すべて折りたたむ

多次元配列

"多次元配列" は、3 つ以上の次元をもつ配列です。たとえば、1 x 3 x 4 の配列は 3 次元配列です。

大きさが 1 でない最初の次元

"大きさが 1 でない最初の次元" とは、配列の次元のうちサイズが 1 ではない最初の次元です。たとえば X が 1 x 2 x 3 x 4 の配列の場合、X の大きさが 1 でない最初の次元は 2 番目の次元です。

線形内挿

線形内挿は線形多項式を使用して yi = f(xi)、つまりベクトルまたは配列 x の各点における基礎関数 Y = f(X) の値を求めます。データ点 (x1,y1) および (x2, y2) があり、y1 = f(x1) および y2 = f(x2) の場合、線形内挿では x1 と x2 の間にある x について y = f(x) を次のように計算します。

y=f(x)=y1+(xx1)(x2x1)(y2y1).

同様に、100(1.5/n) 番目の百分位数が y1.5/n、100(2.5/n) 番目の百分位数が y2.5/n である場合、線形内挿では 100(2.3/n) 番目の百分位数 y2.3/n を次のように計算します。

y2.3n=y1.5n+(2.3n1.5n)(2.5n1.5n)(y2.5ny1.5n).

t-digest

t-digest[2]は、データセットの経験的累積分布関数 (CDF) のスパース表現である確率的データ構造です。t-digest は、特にデータ分布の裾の付近において、精度を制御できる方法で、順位に基づく統計量 (百分位数や分位数など) の近似値をオンライン データまたは分散したデータから計算するために役立ちます。

t-digest は、別々の区画に振り分けられているデータに対し、データの各区画について個別に分位数の推定値 (および百分位数の推定値) を計算してから、メモリ範囲と計算の相対精度 (第 q 分位数に対して q(1q)) を一定に保ったまま推定値を結合します。これらの理由から、t-digest は tall 配列の処理に対して実用的です。

別々の区画に振り分けられている配列の分位数を推定するため、まずデータの各区画に t-digest を構築します。t-digest は区画内のデータをクラスター化し、重心の値と累積加重 (クラスターに寄与する標本数を表す) によって各クラスターを要約します。t-digest では q = 0.5 付近の CDF の領域表現には大きいクラスター (重心間隔が広い) を、q = 0 または q = 1 付近の CDF の領域表現には小さいクラスター (重心間隔が狭い) を使用します。

t-digest は、クラスター サイズの制御に、圧縮パラメーター δ により分位数 q をインデックス k にマッピングするスケーリング関数を使用します。つまり、次のようになります。

k(q,δ)=δ(sin1(2q1)π+12),

マッピング k は単調であり、最小値は k(0,) = 0、最大値は k(1,) = δ です。

= 10 の場合のスケーリング関数

スケーリング関数は、q に可変サイズのステップを与えるため、分位数 q をスケール係数 k に変換します。この結果、クラスター サイズは不均一になります (中心の分位数の付近では大きくなり、q = 0 または q = 1 の付近では小さくなります)。より小さいクラスターによってデータの両端付近の精度が向上します。

重みと位置がある新しい観測値で t-digest を更新するには、新しい観測値に最も近いクラスターを求めます。そして、更新されたクラスターの重みがサイズの制限を超えないという条件で、重みを追加し、加重平均に基づいてクラスターの重心を更新します。

データの各区画の独立した t-digest は、t-digest の和集合をとり、重心をマージすることにより結合できます。t-digest を結合するには、はじめにすべての独立した t-digest のクラスターをクラスターの重みの降順で並べ替えます。そして、サイズの制限を満たす場合は、隣接するクラスターをマージして新しい t-digest を形成します。

データセット全体を表す t-digest を形成すると、t-digest の各クラスターの端点 (または境界) を推定し、各クラスターの端点間で内挿を使用して正確な分位数の推定値を求めることができます。

アルゴリズム

prctile は、n 要素のベクトル X について、以下のように並べ替えに基づくアルゴリズムを使用して百分位数を返します。

  1. X 内の並べ替えられた要素を、100(0.5/n) 番目、100(1.5/n) 番目、...、100([n - 0.5]/n) 番目の百分位数として使用します。以下に例を示します。

    • {6, 3, 2, 10, 1} のような 5 要素のデータ ベクトルでは、並べ替えた後の要素 {1, 2, 3, 6, 10} はそれぞれ 10、30、50、70、90 番目の百分位数に相当します。

    • {6, 3, 2, 10, 8, 1} のような 6 要素のデータ ベクトルでは、並べ替えた後の要素 {1, 2, 3, 6, 8, 10} はそれぞれ (50/6)、(150/6)、(250/6)、(350/6)、(450/6)、(550/6) 番目の百分位数に相当します。

  2. prctile線形内挿を使用して 100(0.5/n) と 100([n – 0.5]/n) の間のパーセンテージの百分位数を計算します。

  3. prctile は、X 内の要素の最小値または最大値をその範囲外のパーセンテージに対応する百分位数に割り当てます。

prctileNaN を欠損値として認識し、削除します。

参照

[1] Langford, E. “Quartiles in Elementary Statistics”, Journal of Statistics Education. Vol. 14, No. 3, 2006.

[2] Dunning, T., and O. Ertl. “Computing Extremely Accurate Quantiles Using T-Digests.” August 2017.

拡張機能

R2006a より前に導入