SQL Server 標準偏差: STDEVP, STDEV

標準偏差: STDEVP, STDEV

標準偏差とは、データの平均値から見た「ばらつき具合」を数値で表したもので、標準偏差の値が小さいほど、散らばり度合いが小さいことが示されます。

指定したデータが、全てであるデータの値がとる標準偏差(standard deviation) が欲しい場合、STDEVP 関数を使います。
指定したデータが、全体の内の「標本」(抜き出した一部分)として考え、そのデータの値がとる標本標準偏差(sample standard deviation) が欲しい場合、STDEV 関数を使います。

STDEVPの数値の求め方は、
・平均値を算出する
・各データと平均値の差を求める
・各差を2乗して
・2乗した全ての求めた数値を足す
・最後にデータの数で割る(分散)
・分散の平方根を求める

STDEVの数値の求め方は、
・平均値を算出する
・各データと平均値の差を求める
・各差を2乗して
・2乗した全ての求めた数値を足す
・最後にデータ-1の数で割る(*日本工業規格)(標本分散)
・標本分散の平方根を求める
以上となりますが・・・

「標準偏差」や「分散」という言葉自体をあまり聞いたことのない方にとっては、何を言っているのか、非常に難しい説明と感じることでしょう。
わかりづらいと感じた方は、次のように覚えてください。

「計算された数値が、小さいほどデータのばらつきが少ない」
という意味で、つまり、出てきた数値が「0」に近いほどばらつきの無いデータということが分かる手法になります。

標準偏差のよいところは、標準偏差は単位の次元がデータと同じなのでデータの散らばり具合が把握しやすいと言えます。

STDEVP

構文:STDEVP( [ ALL | DISTINCT ] expression )
引数:ALL すべての値にこの集計関数を適用します。 ALL は既定値です。
   DISTINCT 重複する値は 1 つだけ有効データとします。
   expression 整数式です。 集計関数とサブクエリは使用できません。

戻り値の型は、float です。

下のSQL例文を載せておきます。

declare @tbl1 table(c_point int)
insert into @tbl1 (c_point) values (30)
insert into @tbl1 (c_point) values (40)
insert into @tbl1 (c_point) values (20)
insert into @tbl1 (c_point) values (60)
insert into @tbl1 (c_point) values (60)
insert into @tbl1 (c_point) values (70)
insert into @tbl1 (c_point) values (80)

--ALL
--NULLはカウントされません
select STDEVP(c_point) as [STDEVP] from @tbl1

--DISTINCT
--60が重複しているので結果が異なります
select STDEVP(DISTINCT c_point) as [STDEVP_DISTINCT] from @tbl1

-- STDEVP(c_point)を検証
--平均値を算出する
declare @avg float
select @avg=AVG(cast(c_point as float)) from @tbl1

--各データと平均値の差を求める
declare @tbl2 table(c_point float)
insert into @tbl2 select c_point-@avg from @tbl1

--各差を2乗して
update @tbl2 set c_point=c_point*c_point

--2乗した全ての求めた数値を足す
declare @sum float
select @sum=sum(c_point) from @tbl2

--データの数で割る
declare @varp float
select @varp=@sum/count(c_point) from @tbl2

--平方根を求める
select sqrt(@varp) as [STDEVP(c_point)検証値]
STDEVP 結果

STDEVP 結果

STDEV

構文:STDEV( [ ALL | DISTINCT ] expression )
引数:ALL すべての値にこの集計関数を適用します。 ALL は既定値です。
   DISTINCT 重複する値は 1 つだけ有効データとします。
   expression 整数式です。 集計関数とサブクエリは使用できません。

戻り値の型は、float です。

下のSQL例文を載せておきます。

declare @tbl1 table(c_point int)
insert into @tbl1 (c_point) values (30)
insert into @tbl1 (c_point) values (40)
insert into @tbl1 (c_point) values (4)
insert into @tbl1 (c_point) values (60)
insert into @tbl1 (c_point) values (60)
insert into @tbl1 (c_point) values (80)

--ALL
--NULLはカウントされません
select STDEV(c_point) as [STDEV] from @tbl1

--DISTINCT
--60が重複しているので結果が異なります
select STDEV(DISTINCT c_point) as [STDEV_DISTINCT] from @tbl1

-- VAR(c_point)を検証
--平均値を算出する
declare @avg float
select @avg=AVG(cast(c_point as float)) from @tbl1

--各データと平均値の差を求める
declare @tbl2 table(c_point float)
insert into @tbl2 select c_point-@avg from @tbl1

--各差を2乗して
update @tbl2 set c_point=c_point*c_point

--2乗した全ての求めた数値を足す
declare @sum float
select @sum=sum(c_point) from @tbl2

--データの数で割る
--各観測値の平均値からの偏差の二乗の和を観測個数から1を引いた数で割ったばらつきの尺度
declare @var float
select @var=@sum/(count(c_point)-1) from @tbl2

--平方根を求める
select sqrt(@var) as [STDEV(c_point)検証値]
STDEV 結果

STDEV 結果

以上、SQL Server STDEV, STDEVP 標準偏差でした。