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

时间:2010-06-19 21:44:10

标签: sql sql-server sql-server-2008 statistics

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

我该如何做到这一点?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

SQL中有一个名为STDEV的聚合函数,它将为您提供标准偏差。这是困难的部分 - 然后只需找到平均值和+/-一个STDEV值之间的范围。

这是你可以做的一种方式 -

    create table #test
(
   testNumber int
   )

   INSERT INTO #test (testNumber)
   SELECT  2
   UNION ALL 
   SELECT 4
   UNION ALL 
   SELECT 4
   UNION ALL 
   SELECT 4
   UNION ALL 
   SELECT 5
   UNION ALL 
   SELECT 5
   UNION ALL 
   SELECT 7
   UNION ALL 
   SELECT 9

   SELECT testNumber FROM #test t
   JOIN (
    SELECT STDEV (testnumber) as [STDEV], AVG(testnumber) as mean
    FROM #test
        ) X on t.testNumber >= X.mean - X.STDEV AND t.testNumber <= X.mean + X.STDEV

答案 2 :(得分:0)

我要小心并考虑你在做什么。抛弃异常值可能意味着您丢弃的信息可能不适合预先构思的世界观,这可能是完全错误的。那些异常值可能是罕见的“黑天鹅”,虽然不像你想象的那么罕见,而且非常重要。

您没有提供您正在做的事情的背景或解释。引用满足您特定案例需求的功能或技术很容易,但我认为在提供其他信息之前发布警告是合适的。