一、outliers的定義及常見表現形式
Outlier指的是在樣本中分布不同於其他數據點的極端值。其表現形式有以下幾種:
1、數據分布不均:outliers會導致整個數據集的分布變得不均勻,從而對單樣本或整體分析產生影響。
<div class="container">
<div class="chart"></div>
</div>
.chart {
width: 100%;
vertical-align: top;
}
2、偏差值較大:outliers對數據的平均值和標準差產生大的偏差,可能會誤導數據分析的結論。
var data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1000];
function getAvg(data) {
var sum = 0;
data.forEach(function(num) {
sum += num;
});
return sum / data.length;
}
3、離散程度較大:outliers會導致方差值的急劇升高,進而使數據的離散程度變得更大。
function getVariance(data) {
var mean = getAvg(data);
var sum = 0;
data.forEach(function(num) {
sum += Math.pow((num - mean), 2);
});
return sum / (data.length - 1);
}
二、outliers的識別方法與常見工具
1、箱線圖
箱線圖可以很好地識別數據中的outliers。箱子代表數據分布的中間50%部分,其上面的線表示數據中的第75個百分位,下面的線表示數據中的第25個百分位。在不考慮outliers的情況下,位於這個範圍之外的點可能是outliers。
<div class="container">
<svg width="500" height="500">
<line x1="20" y1="250" x2="480" y2="250" stroke="gray" />
<line x1="20" y1="100" x2="480" y2="100" stroke="gray" />
<line x1="20" y1="400" x2="480" y2="400" stroke="gray" />
<line x1="20" y1="250" x2="20" y2="400" stroke="gray" />
<line x1="20" y1="250" x2="20" y2="100" stroke="gray" />
<rect x="100" y="150" width="300" height="200" stroke="black" fill="transparent" />
<line x1="100" y1="250" x2="400" y2="250" stroke="black" />
<line x1="200" y1="150" x2="200" y2="350" stroke="black" />
<line x1="300" y1="150" x2="300" y2="350" stroke="black" />
</svg>
</div>
2、離群值檢查器:該庫可用於在給定的數據集中查找離群值。
const Outlier = require('outlier');
const data = [10, 12, 20, 45, 1000, 1020];
const outlier = new Outlier();
const results = outlier.save(data).analyze();
console.log(results);
3、對數容忍:該算法通過對數據進行對數變換來發現outliers並確定其相對程度。
function getLogTolerance(data, factor) {
const mean = getAvg(data);
const stdev = Math.sqrt(getVariance(data));
return data.map(x => Math.abs(x - mean)).map(x => x / stdev).map(x => Math.log(1 + factor * x));
}
三、outliers應用實踐與解決方法
1、數據清洗:將outliers從數據集中移除。這可以通過使用各種技術(如InterQuartile Range等)來識別和刪除異常值來實現。
function removeOutliers(data) {
const q1 = quantile(data, 0.25);
const q3 = quantile(data, 0.75);
const iqr = q3 - q1;
const minimum = q1 - 1.5 * iqr;
const maximum = q3 + 1.5 * iqr;
return data.filter(x => x >= minimum && x <= maximum);
}
2、數據轉換:使用基於對數或指數的轉換來調整數據,以保留outliers的貢獻同時減弱其對平均值和方差的影響。
function processOutliers(data) {
const transformedData = data.map(x => Math.log(x + 1));
const mean = getAvg(transformedData);
const stdev = Math.sqrt(getVariance(transformedData));
return data.map(x => x > mean + 1.5 * stdev ? mean + 1.5 * stdev : x);
}
3、建模技術:一些機器學習和數據挖掘技術,如聚類和異常檢測,可以識別和排除outliers。
from sklearn.covariance import EllipticEnvelope
import numpy as np
data = np.array([[-2, 2], [2, 2], [0, 4], [0, 12]])
model = EllipticEnvelope(contamination=0.25)
model.fit(data)
inliers = np.asarray(model.predict(data) == 1)
outliers = np.asarray(model.predict(data) == -1)
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/258178.html