Main Content

prctile

データ セットの百分位数

説明

P = prctile(A,p) は、区間 [0,100] のパーセンテージ p について入力データ A での要素の百分位数を返します。

  • A がベクトルの場合、P はスカラーまたは p と同じ長さのベクトルです。P(i) には百分位数 p(i) が含まれます。

  • A が行列の場合、P は行ベクトルまたは行列であり、P の行数は length(p) と等しくなります。Pi 行目には、A の各列の百分位数 p(i) が含まれます。

  • A が多次元配列の場合、P には、サイズが 1 より大きい最初の配列の次元に沿って計算された百分位数が含まれます。

P = prctile(A,p,"all")x ですべての要素の百分位数を返します。

P = prctile(A,p,dim) は、次元 dim に沿って処理します。たとえば、A が行列の場合、prctile(A,p,2) は各行の要素について動作します。

P = prctile(A,p,vecdim) は、ベクトル vecdim で指定されている次元に沿って動作します。たとえば、A が行列の場合、prctile(A,p,[1 2])A のすべての要素について動作します。これは、次元 1 と次元 2 で定義された配列スライスに行列内のすべての要素が含まれるためです。

P = prctile(___,"Method",method) では、前述の構文の任意の入力引数の組み合わせを使用して、method の値に応じて、正確な百分位数または近似百分位数のいずれかが返されます。

すべて折りたたむ

特定のパーセンテージのデータ セットの百分位数を計算します。

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

rng default % for reproducibility
A = randn(1,7)
A = 1×7

    0.5377    1.8339   -2.2588    0.8622    0.3188   -1.3077   -0.4336

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

P = prctile(A,42)
P = -0.1026

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

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

rng default % for reproducibility
A = randn(3,5,2)
A = 
A(:,:,1) =

    0.5377    0.8622   -0.4336    2.7694    0.7254
    1.8339    0.3188    0.3426   -1.3499   -0.0631
   -2.2588   -1.3077    3.5784    3.0349    0.7147


A(:,:,2) =

   -0.2050    1.4090   -1.2075    0.4889   -0.3034
   -0.1241    1.4172    0.7172    1.0347    0.2939
    1.4897    0.6715    1.6302    0.7269   -0.7873

A のすべての要素の 40 番目と 60 番目の百分位数を求めます。

P = prctile(A,[40 60],"all")
P = 2×1

    0.3307
    0.7213

P(1)A の 40 番目の百分位数であり、P(2)A の 60 番目の百分位数です。

指定したパーセンテージのデータ行列の列と行に沿って百分位数を計算します。

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

A = (1:5)'*(2:6)
A = 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

A の列ごとに 25 番目、50 番目、75 番目の百分位数を計算します。

P = prctile(A,[25 50 75],1)
P = 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

行列 P の各列には、行列 A の対応する列の 3 つの百分位数が含まれます。712、および 17A の 3 列目の 25 番目、50 番目、75 番目の百分位数であり、要素は 4、8、12、16、20 です。P = prctile(A,[25 50 75]) も同じ結果を返します。

A 行に沿って 25 番目、50 番目、75 番目の百分位数を計算します。

P = prctile(A,[25 50 75],2)
P = 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

行列 P の各行には、行列 A の対応する行の 3 つの百分位数が含まれます。2.754、および 5.25A の最初の行の 25 番目、50 番目、75 番目の百分位数であり、要素は 2、3、4、5、6 です。

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

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

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

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


A(:,:,2) =

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

操作次元として次元 1 および 2 を指定して、A の各ページの 40 番目と 60 番目の百分位数を計算します。

Ppage = prctile(A,[40 60],[1 2])
Ppage = 
Ppage(:,:,1) =

    6.5000
    9.5000


Ppage(:,:,2) =

   21.5000
   24.5000

Ppage(1,1,1)A の最初のページの 40 番目の百分位数であり、Ppage(2,1,1)A の最初のページの 60 番目の百分位数です。

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

Pcol = prctile(A,[40 60],[1 3])
Pcol = 2×5

    2.9000    5.9000    8.9000   11.9000   14.9000
   16.1000   19.1000   22.1000   25.1000   28.1000

Pcol(1,4)A(:,4,:) 内の要素の 40 番目の百分位数であり、Pcol(2,4)A(:,4,:) 内の要素の 60 番目の百分位数です。

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

tall 配列に対して計算を実行すると、MATLAB® は並列プール (Parallel Computing Toolbox™ がある場合の既定) またはローカル MATLAB セッションのいずれかを使用します。Parallel Computing Toolbox がある場合にローカル MATLAB セッションを使用してサンプルを実行するには、関数mapreducerを使用してグローバル実行環境を変更します。

mapreducer(0)

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

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

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

tt = tall(ds)
tt =

  Mx1 tall table

    ArrTime
    _______

      735  
     1124  
     2218  
     1431  
      746  
     1547  
     1052  
     1134  
       :
       :
A = tt{:,:}
A =

  Mx1 tall double column vector

         735
        1124
        2218
        1431
         746
        1547
        1052
        1134
         :
         :

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

p = 50;
Pexact = prctile(A,p)
Pexact =

  tall double

    ?

A の 50 番目の近似百分位数を計算します。"approximate" メソッドを指定して、百分位数を計算するためにT-Digestに基づいた近似アルゴリズムを使用します。

Papprox = prctile(A,p,"Method","approximate")
Papprox =

  MxNx... tall double array

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

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

[Pexact,Papprox] = gather(Pexact,Papprox)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 4: Completed in 1.2 sec
- Pass 2 of 4: Completed in 0.47 sec
- Pass 3 of 4: Completed in 0.74 sec
- Pass 4 of 4: Completed in 0.62 sec
Evaluation completed in 4 sec
Pexact = 1522
Papprox = 1.5220e+03

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

異なる次元に沿って指定したパーセンテージの tall 行列の正確な百分位数および近似百分位数を計算します。

tall 配列に対して計算を実行すると、MATLAB® は並列プール (Parallel Computing Toolbox™ がある場合の既定) またはローカル MATLAB セッションのいずれかを使用します。Parallel Computing Toolbox がある場合にローカル MATLAB セッションを使用してサンプルを実行するには、関数mapreducerを使用してグローバル実行環境を変更します。

mapreducer(0)

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

varnames = ["ArrDelay","ArrTime","DepTime","ActualElapsedTime"];
ds = datastore("airlinesmall.csv","TreatAsMissing","NA", ...
    "SelectedVariableNames",varnames);
tt = tall(ds);
A = tt{:,varnames}
A =

  Mx4 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 番目の次元に沿って A の 25 番目、50 番目、75 番目の正確な百分位数を計算します。

p = [25 50 75];
Pexact = prctile(A,p,2)
Pexact =

  MxNx... tall double array

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

関数が最初の次元に沿って演算し、p がパーセンテージのベクトルである場合、t-digest に基づいた近似アルゴリズムを使用して百分位数を計算する必要があります。並べ替えに基づいたアルゴリズムを使用して tall 配列の最初の次元に沿って百分位数を求めるのは、計算負荷が高い処理です。

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

Papprox = prctile(A,p,"Method","approximate")
Papprox =

  MxNx... tall double array

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

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

[Pexact,Papprox] = gather(Pexact,Papprox);
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 2.6 sec
Evaluation completed in 3.4 sec

A の 2 番目の次元に沿って 25 番目、50 番目、75 番目の正確な百分位数の最初の 5 行を表示します。

Pexact(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

行列 Pexact の各行には、A の対応する行の 3 つの百分位数が含まれます。30.5347.5、および 688.5 はそれぞれ A 内の最初の行の 25 番目、50 番目、75 番目の百分位数です。

最初の次元に沿って A の 25 番目、50 番目、75 番目の近似百分位数を表示します。

Papprox
Papprox = 3×4
103 ×

   -0.0070    1.1148    0.9322    0.0700
         0    1.5220    1.3350    0.1020
    0.0110    1.9180    1.7400    0.1510

行列 Papprox の各列には、A 内の対応する列の 3 つの百分位数が含まれます。Papprox の最初の列には、A の最初の列の百分位数が含まれます。

入力引数

すべて折りたたむ

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

データ型: single | double

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

例: 25

例: [25, 50, 75]

データ型: single | double

演算の対象の次元。正の整数のスカラーとして指定します。次元を指定しない場合、既定値はサイズが 1 より大きい最初の配列次元です。

入力行列 A およびパーセンテージ p のベクトルを考えます。

  • P = prctile(A,p,1)p 内のパーセンテージの A 内の列の百分位数を計算します。

  • P = prctile(A,p,2)p 内のパーセンテージの A 内の行の百分位数を計算します。

次元 dim は、長さが p と同じである P の次元を示します。

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

演算の対象の次元のベクトル。正の整数のベクトルとして指定します。各要素は入力データの次元を表します。

指定された最小の操作次元の出力 P のサイズは、p の長さに等しくなります。vecdim で指定されたその他の操作次元の P のサイズは 1 です。vecdim で指定されていないすべての次元の P のサイズは入力データと同じままです。

2×3×3 の入力配列 A およびパーセンテージ p を考えます。prctile(A,p,[1 2]) では、1 と 2 が操作次元であり、min([1 2]) = 1 であるため、length(p)×1×3 の配列が返されます。返された配列の各ページには、A の対応するページの要素の百分位数が含まれます。

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

百分位数を計算するメソッド。次の値のいずれかとして指定します。

  • "exact" — 並べ替えを使用するアルゴリズムを使って正確な百分位数を計算します。

  • "approximate"T-Digest を使用するアルゴリズムを使って近似百分位数を計算します。

詳細

すべて折りたたむ

線形内挿

線形内挿は線形多項式を使用して、ベクトルまたは配列 x の点における基となる関数 Y = f(X) の値である yi = f(xi) を求めます。y1 = f(x1) および y2 = f(x2) であるデータ点 (x1, y1) および (x2, y2) について、線形内挿では、次のように 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 の場合のスケーリング関数を示しています。

Scaling function plotted with q on the x-axis and k on the y-axis

このスケーリング関数は分位数 q をスケーリング係数 k に変換して、q の可変サイズのステップを求めています。そのため、クラスター サイズは不均等です (中央の分位数付近では大きく、q = 0 および q = 1 付近では小さくなっています)。クラスターが小さいほど、データの両端付近でより高い精度が得られます。

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

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

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

アルゴリズム

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

  1. A の並べ替えられた要素は、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. prctileA 内の要素の最小値または最大値を、その範囲外のパーセンテージに対応する百分位数に割り当てます。

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 より前に導入

すべて展開する

参考

| |