【SQL】統計量を求める -中央値、最頻値

  • 2022年9月2日
  • 2023年3月2日
  • DB
  • ,
DB

前回はSQLで平均値など統計量を求める方法を紹介しました。DBMS各種では、平均値などを求める関数が用意されています。

今回は順序集合集約関数である中央値や最頻値を求めていきたいと思います。今回もPostgreSQLを想定しています。

使用するテーブル

今回は以下のテーブルを作成し、MathTestから各種統計量を算出します。

CREATE TABLE Table1
    (`ID` int, `Name` varchar(9), `Class` varchar(1), `MathTest` int)
;
    
INSERT INTO Table1
    (`ID`, `Name`, `Class`,`MathTest`)
VALUES
    (1, 'Aoki', 'A', 66),
    (2, 'Yoshida', 'A', 80),
    (3, 'Yamashita', 'B', 52),
    (4, 'Saionji', 'B', 92),
    (5, 'Oka', 'B', 44)
;
サンプルデータ

中央値

PostgreSQLでは、中央値を求めるための直接的なメソッドは存在しません。ですが、パーセント値を求めるPERCENTILE_CONTを用いることで中央値を求めることができます。

PERCENTILE_CONTは、指定した項目でソートをしたか結果から、指定されたパーセント値に相当する行の値を返します。

PERCENTILE_CONT(percent) WITHIN GROUP(ORDER BY sorted_args [ASC|DESC])

percentには0~1の値で取得したいパーセンタイルの値を指定します。sorted_argsには中央値を取得したいデータの列名を指定します。デフォルトは昇順(ASK)です。

サンプル数が偶数の場合は、中央二値の平均値が返されます。例えばデータが[1,3,5,7]の場合、結果は3と5の平均である4が返されます。

以下の例では、MathTest列でソートして50%の値(中央値)を取得します。

SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY MathTest)
FROM table1;


>> percentile_cont
   66

最頻値

最頻値を求めるには、mode()を用います。

mode() WITHIN GROUP (ORDER BY sorted_args)

最頻値が複数ある場合は、任意の値1つが返されるので注意してください。

最頻値を求めてみます。今回は全ての値の度数が1で、たまたま’44’という値が返されます。

SELECT mode() WITHIN GROUP (ORDER BY MathTest)
FROM table1;

>> mode
   44

まとめ

中央値、最頻値といった統計量をSQLで求める方法を紹介しました。中央値を求めたPERCENTILE_CONT関数では、中央値以外のパーセンタイル値を取得することもできるので、活用してください!

ではでは👋