去除異常值的好方法?
我正在研究軟件構建的統計數據。我有關於通過/失敗和經過時間的每個構建的數據,我們每週生成約 200 個這些數據。
成功率很容易匯總,我可以說任何一周都通過了 45%。但我也想匯總經過的時間,並且我想確保我不會錯誤地歪曲數據。想我最好問問專業人士:-)
假設我有 10 個持續時間。它們代表通過和失敗的情況。一些構建會立即失敗,這使得持續時間異常短。有些在測試期間掛起並最終超時,導致持續時間很長。我們構建不同的產品,因此即使是成功的構建也會在 90 秒到 4 小時之間變化。
我可能會得到這樣的一套:
[50, 7812, 3014, 13400, 21011, 155, 60, 8993, 8378, 9100]
我的第一種方法是通過對集合進行排序並選擇中間值來獲得中間時間,在本例中為 7812(我沒有為偶數集合的算術平均值而煩惱。)
不幸的是,這似乎產生了很多變化,因為我只選擇了一個給定的值。因此,如果我要對這個值進行趨勢分析,它將在 5000-10000 秒之間反彈,具體取決於哪個構建處於中位數。
所以為了解決這個問題,我嘗試了另一種方法——刪除異常值,然後計算剩餘值的平均值。我決定把它分成三分位,只在中間的一個上工作:
[50, 60, 155, 3014, 7812, 8378, 8993, 9100, 13400, 21011] -> [50, 60, 155], [3014, 7812, 8378, 8993], [9100, 13400, 21011] -> [3014, 7812, 8378, 8993]
這對我來說似乎更好的原因有兩個:
- 我們不想對更快的構建採取任何行動,它們已經很好了
- 最長的構建可能是由超時引起的,並且會一直存在。我們有其他機制來檢測那些
所以在我看來,這就是我正在尋找的數據,但我擔心我已經通過移除真相來實現平滑。
這有爭議嗎?方法合理嗎?
謝謝!
考慮到您的目標,您的方法對我來說很有意義。它很簡單,很直接,它可以完成工作,而且你可能不想寫一篇關於它的科學論文。
在處理異常值時應該始終做的一件事是了解它們,而您已經在這方面做得很好。因此,改進您的方法的可能方法是:您可以使用有關哪些構建掛起的信息嗎?你提到你有“其他檢測這些的機制”——你能檢測到它們然後只從樣本中刪除它們嗎?
否則,如果您有更多數據,您可以考慮不刪除三分位數,而是刪除五分位數……但在某些時候,這可能不會產生太大影響。