prctile
データ セットの百分位数
構文
説明
例
データ ベクトルの百分位数
特定のパーセンテージのデータ セットの百分位数を計算します。
サイズが 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 つの百分位数が含まれます。7
、12
、および 17
は A
の 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.75
、4
、および 5.25
は A
の最初の行の 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 列ベクトルの正確な百分位数および近似百分位数を計算します。
tall 配列に対して計算を実行すると、MATLAB® は並列プール (Parallel Computing Toolbox™ がある場合の既定) またはローカル MATLAB セッションのいずれかを使用します。Parallel Computing Toolbox がある場合にローカル MATLAB セッションを使用してサンプルを実行するには、関数mapreducer
を使用してグローバル実行環境を変更します。
mapreducer(0)
airlinesmall
データ セットのデータストアを作成します。"NA"
値を欠損データとして扱って、datastore
で NaN
値に置き換えられるようにします。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 0.97 sec - Pass 2 of 4: Completed in 0.34 sec - Pass 3 of 4: Completed in 0.59 sec - Pass 4 of 4: Completed in 0.43 sec Evaluation completed in 3 sec
Pexact = 1522
Papprox = 1.5220e+03
正確な百分位数と近似百分位数の値は、表示されている 4 桁までは同じです。
異なる次元に沿った tall 行列の百分位数
異なる次元に沿って指定したパーセンテージの 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.2 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.5
、347.5
、および 688.5
はそれぞれ A
内の最初の行の 25 番目、50 番目、75 番目の百分位数です。
最初の次元に沿って A
の 25 番目、50 番目、75 番目の近似百分位数を表示します。
Papprox
Papprox = 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
行列 Papprox
の各列には、A
内の対応する列の 3 つの百分位数が含まれます。Papprox
の最初の列には、A
の最初の列の百分位数が含まれます。
入力引数
A
— 入力配列
ベクトル | 行列 | 多次元配列
入力配列。ベクトル、行列または多次元配列として指定します。
データ型: single
| double
p
— 百分位数を計算するパーセンテージ
スカラー | ベクトル
百分位数を計算するパーセンテージ。0 から 100 のスカラーまたはスカラーのベクトルとして指定します。
例: 25
例: [25, 50, 75]
データ型: single
| double
dim
— 演算の対象の次元
正の整数スカラー
演算の対象の次元。正の整数のスカラーとして指定します。次元を指定しない場合、既定値はサイズが 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
vecdim
— 演算の対象の次元のベクトル
正の整数のベクトル
演算の対象の次元のベクトル。正の整数のベクトルとして指定します。各要素は入力データの次元を表します。
指定された最小の操作次元の出力 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
詳細
線形内挿
線形内挿は線形多項式を使用して、ベクトルまたは配列 x の点における基となる関数 Y = f(X) の値である yi = f(xi) を求めます。y1 = f(x1) および y2 = f(x2) であるデータ点 (x1, y1) および (x2, y2) について、線形内挿では、次のように x1 から x2 の与えられた x に対して y = f(x) を求めます。
同様に、100(1.5/n) 番目の百分位数が y1.5/n であり、100(2.5/n) 番目の百分位数が y2.5/n の場合、線形内挿は次のように 100(2.3/n) 番目の百分位数 y2.3/n を求めます。
T-Digest
T-digest [2] は、データ セットの経験的累積分布関数 (CDF) のスパース表現である確率データ構造です。T-digest は、特にデータ分布の裾近傍で制御可能な精度を実現する方法であり、オンライン データまたは分散データからランク ベースの統計量 (百分位数や分位数など) の近似値を計算する際に役立ちます。
異なる区画に分散されているデータについて、t-digest は、計算の一定のメモリ制限および一定の相対精度 (q 番目の分位数の場合は ) を保ちながら、データ区画ごとに別々に推定分位数 (および推定百分位数) を計算してから、推定値を結合します。そのため、t-digest は tall 配列の処理に有用です。
異なる区画に分散している配列の分位数を推定するために、まずデータの各区画で t-digest を作成します。t-digest は区画内のデータをクラスタリングし、重心値、およびクラスターに寄与しているサンプルの数を表す累積の重みによって各クラスターの要約を示します。t-digest は大規模なクラスター (間隔が広い重心) を使用して q = 0.5
に近い CDF の領域を表し、小規模なクラスター (間隔が狭い重心) を使用して q = 0
および q = 1
に近い CDF の領域を表します。
t-digest は、圧縮パラメーター δ を使って分位数 q をインデックス k にマッピングするスケーリング関数を使用してクラスター サイズを制御します。つまり、次のようになります。
ここで、マッピング k は単調増加であり、最小値は k(0,δ) = 0 で最大値は k(1,δ) = δ です。下図は、δ = 10 の場合のスケーリング関数を示しています。
このスケーリング関数は分位数 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
は次のように並べ替えに基づくアルゴリズムを使用して百分位数を返します。
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) 番目の百分位数に対応しています。
prctile
は線形内挿を使用して 100(0.5/n) から 100([n – 0.5]/n) までのパーセンテージの百分位数を計算します。prctile
はA
内の要素の最小値または最大値を、その範囲外のパーセンテージに対応する百分位数に割り当てます。
prctile
は NaN
を欠損値として扱って削除します。
参照
[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.
拡張機能
tall 配列
メモリの許容量を超えるような多数の行を含む配列を計算します。
使用上の注意事項および制限事項:
P = prctile(A,p)
は、A
が tall 列ベクトルである場合にのみ、(並べ替えに基づいたアルゴリズムを使用して) 正確な百分位数値を返します。P = prctile(A,p,dim)
は、次の "いずれか" の条件が存在している場合にのみ正確な百分位数を返します。A
が tall 列ベクトルである。A
が tall 配列であり、dim
が1
でない。たとえば、prctile(A,p,2)
は、tall 配列A
の行に沿って正確な百分位数を返します。
A
が tall 配列で、dim
が1
の場合、百分位数の計算に T-Digest に基づいた近似アルゴリズムを使用するためにmethod
を"approximate"
として指定する必要があります。たとえば、prctile(A,p,1,"Method","approximate")
は、tall 配列A
の列に沿って近似百分位数を返します。P = prctile(A,p,vecdim)
は、次の "いずれか" の条件が存在している場合にのみ正確な百分位数を返します。A
が tall 列ベクトルである。A
が tall 配列であり、vecdim
に1
が含まれていない。たとえば、A
が 3×5×2 の配列の場合、prctile(A,p,[2,3])
は各A(i,:,:)
スライス内の要素の正確な百分位数を返します。A
が tall 配列であり、vecdim
に1
およびサイズが 1 より大きいA
のすべての次元が含まれている。たとえば、A
が 10×1×4 の配列の場合、prctile(A,p,[1 3])
はA(:,1,:)
内の要素の正確な百分位数を返します。
A
が tall 配列であり、vecdim
に1
が含まれているが、サイズが 1 より大きいA
のすべての次元は含まれていない場合、method
を"approximate"
として指定して近似アルゴリズムを使用する必要があります。たとえば、A
が 10×1×4 の配列の場合、prctile(A,p,[1 2],"Method","approximate")
を使用してA
の各ページの近似百分位数を求めることができます。
詳細については、tall 配列を参照してください。
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意事項および制限事項:
"all"
およびvecdim
入力はサポートされていません。名前と値の引数
Method
はサポートされていません。dim
入力引数はコンパイル時の定数でなければなりません。dim
入力引数を指定しなかった場合、動作対象の (操作) 次元は生成されたコードで異なるものになる可能性があります。結果として、ランタイム エラーが発生する場合があります。詳細については、自動次元選択の制限事項 (MATLAB Coder)を参照してください。出力
P
がベクトルの場合、次のすべての条件が満たされていれば、P
の方向は MATLAB® と異なったものになります。dim
を指定していない。A
がコンパイル時には可変サイズ配列であり、可変サイズ ベクトルではないが、A
が実行時にはベクトルである。ベクトル
A
の方向がベクトルp
の方向と一致していない。
この場合、出力
P
は、p
の方向と一致せず、A
の方向と一致します。
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
使用上の注意事項および制限事項:
"all"
およびvecdim
入力はサポートされていません。名前と値の引数
Method
はサポートされていません。
詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
分散配列
Parallel Computing Toolbox™ を使用して、クラスターの結合メモリ上で大きなアレイを分割します。
この関数は分散配列を完全にサポートしています。詳細については、分散配列を使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2006a より前に導入R2022b: 小規模な入力データでのパフォーマンスの向上
より高速な入力解析により、関数 prctile
のパフォーマンスが向上しました。パフォーマンスの向上は、入力解析が計算時間の大半を占める場合に顕著です。この状況は、以下の場合に発生します。
入力データのサイズが小さい。
百分位数を計算するパーセンテージの数が小さい。
既定の操作次元に沿って計算する。
たとえば、次のコードは、3000 個の要素をもつ行列について 4 つの百分位数を計算します。直前のリリースと比較して、このコードは約 5 倍速くなっています。
function timingPrctile A = rand(300,10); for k = 1:3e3 P = prctile(A,[20 40 60 80]); end end
おおよその実行時間は以下のとおりです。
R2022a: 1.0 秒
R2022b: 0.2 秒
このコードの時間測定では、Windows® 10、Intel® Xeon® CPU E5-1650 v4 (3.60 GHz) 搭載のテスト システムで、関数 timeit
を使用しました。
timeit(@timingPrctile)
R2022a: Statistics and Machine Learning Toolbox から MATLAB に移行
以前は、prctile
では Statistics and Machine Learning Toolbox™ が必要でした。
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)