グラフにフィードされるデータベースがあります。なんらかの理由で、時々、私の PHP スクリプトが非常に大きなスパイクをデータベースに挿入します...
ご覧のとおり、グラフにはランダムなスパイクがあり、データが時々 300 から 3000 になり、再び 300 に戻ります。
私が必要としているのは、これらのテーブルを整理し、前後の行よりも大幅に大きいデータを削除する方法です。
私は少しGoogleの調査を行いましたが、何も思いつきません!
前もって感謝します。
グラフにフィードされるデータベースがあります。なんらかの理由で、時々、私の PHP スクリプトが非常に大きなスパイクをデータベースに挿入します...
ご覧のとおり、グラフにはランダムなスパイクがあり、データが時々 300 から 3000 になり、再び 300 に戻ります。
私が必要としているのは、これらのテーブルを整理し、前後の行よりも大幅に大きいデータを削除する方法です。
私は少しGoogleの調査を行いましたが、何も思いつきません!
前もって感謝します。
これらの「外れ値」データ ポイントを削除するには、いくつかの方法があります。
標準偏差の N 倍を超えて平均と異なるポイントを削除できます。たとえば、データが正規分布している場合、上位 2.5% がほぼ削除されます。
delete from datapoints where value > (select avg(value)+2*stddev(value)
from datapoints);
または、データの上位 1% を直接削除して、データの 99 パーセンタイルを残すこともできます。パーセンタイル ポイントを効率的に見つけるのは難しい問題ですが、次のような方法でうまくいく可能性があります。
set @rownum = 0;
@percentile = select value from (select value, @rownum:=@rownum+1 as rownum from datapoints) D
where rownum > (select 0.99*count(value) from datapoints) limit 1;
delete from datapoints where value > @percentile;
これらのアプローチは、データの一般的な傾向やサイクルに関係なく、一般的に異常に大きいすべてのデータ ポイントを削除します。これは、谷のスパイクが検出されない可能性があることを意味します。これらのケースを処理するには、より高度なアルゴリズムが必要です。たとえば、最初のアプローチを変更して、特定の環境のデータポイントに基づいて外れ値を削除できます。
delete from datapoints d2 where value >
(select avg(value)+2*stddev(value)
from datapoints d1
where d1.dt between d2.dt - interval 2 hour
and d2.dt + interval 2 hour);
特定のしきい値 (ここでは 300 を使用) を超える値を持つすべての行を削除するだけの場合は、次を使用できます。
DELETE FROM table WHERE value > 300;
それらが挿入されないようにするには、挿入時に値をテストし、しきい値を下回る行のみを挿入します。
if ($data['value'] < 300) {
// insert
}