SQLで度数分布を作成するには、数値データを範囲(ビン)ごとに分けて集計します。
CASE式を利用した度数分布の作成
基本的な手順は次の通りです。
SalesテーブルのAmount列で度数分布を作成する例です。
SELECT
CASE
WHEN Amount < 100 THEN '0-99'
WHEN Amount >= 100 AND Amount < 200 THEN '100-199'
WHEN Amount >= 200 AND Amount < 300 THEN '200-299'
ELSE '300以上'
END AS Amount_Range,
COUNT(*) AS Frequency
FROM Sales
GROUP BY
CASE
WHEN Amount < 100 THEN '0-99'
WHEN Amount >= 100 AND Amount < 200 THEN '100-199'
WHEN Amount >= 200 AND Amount < 300 THEN '200-299'
ELSE '300以上'
END
ORDER BY Amount_Range;
このクエリでは、CASE
文を使ってAmount
の範囲ごとにグループ化し、COUNT(*)
で各範囲の件数(頻度)をカウントします。
等間隔のビンを利用した度数分布の作成
数値範囲を自動的に計算する場合、特定の幅(ビン幅)で分割できます。
SELECT
FLOOR(Amount / 100) * 100 AS Amount_Range_Start,
FLOOR(Amount / 100) * 100 + 99 AS Amount_Range_End,
COUNT(*) AS Frequency
FROM Sales
GROUP BY
FLOOR(Amount / 100)
ORDER BY
Amount_Range_Start;
このクエリでは、FLOOR(Amount / 100) * 100
によって100
ごとの範囲に分割し、その範囲の件数をカウントしています。
Amount_Range_Start
とAmount_Range_End
を使って範囲の表示も行います。
ビンの範囲を事前に定義したテーブルを使用する方法
度数分布の範囲を柔軟に定義するために、ビンの範囲を格納したテーブルを作成することもできます。
-- Binテーブルの作成
CREATE TABLE Bins (
Bin_Start INT,
Bin_End INT
);
-- Binテーブルのデータ挿入
INSERT INTO Bins (Bin_Start, Bin_End) VALUES
(0, 99), (100, 199), (200, 299), (300, 399);
-- 度数分布の作成
SELECT
CONCAT(Bin_Start, '-', Bin_End) AS Amount_Range,
COUNT(Sales.Amount) AS Frequency
FROM
Bins
LEFT JOIN
Sales ON Sales.Amount BETWEEN Bins.Bin_Start AND Bins.Bin_End
GROUP BY
Bin_Start, Bin_End
ORDER BY
Bin_Start;
この方法では、範囲を定義するビンテーブルを使用して度数分布を作成できます。
上記の方法で、SQLを使って度数分布を効率的に作成できます。