通过SQL Server中的标准偏差消除异常值

Dav*_*fer 3 sql sql-server statistics sql-server-2008

我试图通过标准偏差消除SQL Server 2008中的异常值.我想只在特定列中包含值的记录在该列平均值的+/- 1标准差内.

我怎么能做到这一点?

ame*_*vin 16

如果您假设事件的钟形曲线分布,那么只有68%的值将在距离平均值1个标准差内(95%由2个标准偏差覆盖).

我将加载一个带有范围标准偏差的变量(使用stdev/stdevp sql函数导出),然后选择适当数量的标准偏差范围内的值.

declare @stdtest table (colname varchar(20), colvalue int)

insert into @stdtest (colname, colvalue) values ('a', 2)
insert into @stdtest (colname, colvalue) values ('b', 4)
insert into @stdtest (colname, colvalue) values ('c', 4)
insert into @stdtest (colname, colvalue) values ('d', 4)
insert into @stdtest (colname, colvalue) values ('e', 5)
insert into @stdtest (colname, colvalue) values ('f', 5)
insert into @stdtest (colname, colvalue) values ('g', 7)
insert into @stdtest (colname, colvalue) values ('h', 9)

declare @std decimal
declare @mean decimal
declare @lower decimal
declare @higher decimal
declare @noofstds int

select @std = STDEV(colvalue), @mean = AVG(colvalue) from @stdtest

--68%
set @noofstds = 1
select @lower = @mean - (@noofstds * @std)
select @higher = @mean + (@noofstds * @std)

select @lower, @higher, * from @stdtest where colvalue between @lower and @higher

--returns rows with a colvalue between 3 and 7 inclusive

--95%
set @noofstds = 2
select @lower = @mean - (@noofstds * @std)
select @higher = @mean + (@noofstds * @std)

select @lower, @higher, * from @stdtest where colvalue between @lower and @higher

--returns rows with a colvalue between 1 and 9 inclusive
Run Code Online (Sandbox Code Playgroud)

  • 99%由正负三个标准偏差覆盖,但仅在您的人口真实地由正态分布表示时才有效.6西格玛范围之外的值被认为是罕见的,但在现实生活中往往并非如此. (3认同)