Преди 3 дни зададох на учтивите блогочитетели един статистически въпрос. Това, че получих отговори, при това то доста (като за моя блог), ме кара да се чувствам задължен да споделя решението, до което достигнах. Естествено, не мога да претендирам, че е перфектно (или окончателно). Но успях да се вслушам в препоръките и да измисля начин на извличане, при който:
– извличам данните за произволен период (в случая – 90 дни)
– от множеството премахвам всички наблюдения, чиито стойности са под 11% или над 89% (това има още да се доработва, в момента не се държи добре при много еднакви стойности)
– взимам медиана и средно отклонение, с които да правя сравнение на текущата стойност. Не съм намерил начин да взема лесно очакваната стойност (expected value), за това разчитам на медианата
– имам голям контрол върху периодите, за които извършвам наблюденията: примерно мога да премахна уикендите, наблюдавам само за опредени часове и т.н. (това го правя с pl/sql, иначе заявката става твърде брадата)
Както се досещате, смятам с такава заявка да следя определен процес в работата си. В момента тествам решението, за да уточня параметрите. Но за сега се получи нещо такова:
select sum(decode(period, 0, rec_cnt, 0)) Current_records,
median(case
when rec_rank < 0.11 then
null
when rec_rank > 0.89 then
null
else
rec_cnt
end) Records_median,
stddev(case
when rec_rank < 0.11 then
null
when rec_rank > 0.89 then
null
else
rec_cnt
end) Records_deviation,
from (select percent_rank() over(order by rec_cnt) rec_rank, rec_cnt, period
from (select get_sum_period_hrs(input_time) period, sum(people_count) rec_cnt
from input_stats
where input_time > sysdate - 90
group by get_sum_period_hrs(input_time))
where period >= 0)
Това работи с таблица, в която имам статистика за наблюдаваните стойности, която се попълва на произволен кратък интервал (няколко минути). Ако използвам аналогията от предния пост, в таблицата имам колонка input_time
(кога е направен текущия запис) и people_count
(колко души са влезли след последния запис). Имам функция get_sum_period_hrs
, която ми връща 0 за текущия период, >0 за предишен период на наблюдение и <0 за записи, които са извън желаните от мен периоди на наблюдение.
Не смятам това решение за съвършено или дори за добър пример, но се чувствам длъжен да споделя резултата след като получих толкова помощ от вас 🙂