스튜아지스의 방법은 통계학 책의 거의 처음 부분에 나오는 내용이다. 스튜아지스는 계급의 수를 결정하는 방법으로 다음과 같은 공식을 만들었다.
- 데이터의 총 개수, Max값, Min값을 구한다. 이 때 Max값, Min값을 구할 때는 이상치를 제거하는 것이 좋다.
- 스튜아지스의 방법을 이용하여 계급의 수(k)를 구한다.
- 윗 단계에서 구해진 계급의 수 k를 이요하여 값의 범위를 구한다.
- 구해진 범위로 데이터를 구분한다.
다음은 SQL Server 2005에서 T-SQL 구현한 예이다.
DECLARE
@k int
, @r bigint
, @avg bigint
, @sigma bigint
, @min bigint
, @max bigint
, @cnt int
, @min_real bigint
, @max_real bigint
--1 + (LOG10(N) / LOG10(2))
SELECT
@sigma = STDEV(Score)
, @avg = AVG(Score)
, @min_real = MIN(Score)
, @max_real = MAX(Score)
FROM #Score
-- 이상치 제거후 구간을 구한다.: 평균 - (1.5 * 표준편차) ~ 평균 + (1.5 * 표준편차)
SELECT
@r = (MAX(Score) - MIN(Score)) / (1 + (LOG10(COUNT(*)) / LOG10(2)))
, @k = (1 + (LOG10(COUNT(*)) / LOG10(2)))
, @cnt = COUNT(*)
, @min = MIN(Score)
, @max = MAX(Score)
FROM #Score
WHERE Score > @avg - (3 * @sigma)
AND Score < @avg + (3 * @sigma)
;WITH Dumy(Seq)
AS
(
SELECT 1 Seq
UNION ALL
SELECT Seq + 1 FROM Dumy
WHERE Seq + 1 <= @k
), Grade
AS
(
SELECT
(@k - Seq ) + 1 Grade
, @min + ((Seq-1) * @r) BeginScore
, @min + (Seq * @r) EndScore
FROM Dumy
), RealGrade
AS
(
SELECT Grade, BeginScore, EndScore FROM Grade
UNION ALL
SELECT Grade + 1, @min_real, EndScore + 1
FROM Grade
WHERE Grade = (SELECT MAX(Grade) FROM Grade)
UNION ALL
SELECT Grade - 1, BeginScore + 1, @max_real
FROM Grade
WHERE Grade = (SELECT MIN(Grade) FROM Grade)
)
SELECT
B.Grade
, COUNT(*) AccountCnt
, SUM(NetAMT) NetAMT
FROM #Score A
INNER JOIN RealGrade B
ON A.Score BETWEEN B.BeginScore AND B.EndScore
GROUP BY
B.Grade
ORDER BY 1