我目前有一个数据库,其中包含一些标记错误的价格数据。
示例数据:
Product - Price - SalesDateProdA - 10 - 1/1/2016ProdB - 20 - 1/2/2016ProdA - 100 - 1/3/2016ProdB - 20 - 1/4/2016ProdB - 21 - 1/5/2016ProdA - 11 - 1/6/2016
在这个数据集中,记录“ProdA – 100 – 1/3/2016”是有错误的。很可能是输入价格的人犯了打字错误。此外,不同日子上的ProdA可能会改变其价格,这使得这个问题变得有趣。
有什么工具可以帮助我识别这种类型的记录?SQL能帮助我检测异常数据点吗?我应该开始研究机器学习来解决这个问题吗?
回答:
这个问题有点主观,但你可以识别那些数值与平均值相差最远的行。我会通过计算z分数并查看最大/最小的z分数来做到这一点。
z分数是数值减去平均值再除以标准差。这里是一个计算的例子:
select t.*, (price - avg_price) / nullif(std_price, 0) as z_pricefrom t join (select product, avg(price) as avg_price, stdev(price) as std_price from t group by product ) tt on t.product = tt.productorder by abs(z_price) desc;
标准差的函数可能会因你使用的数据库而异,但大多数数据库都支持这种函数。