Юли 212009
 

Днес си блъскам главата над сления проблем:

Имам няколко стойности, примерно брой хора, които са влизали между 8:00 и 10:00 часа в сградата, за една седмица назад (може и за повече, ако се налага). Примерно:
Понеделник: 1180
Вторник: 1177
Сряда: 1184
Четвъртък: 1197
Петък:1148
Събота: 1181
Неделя: 1155

За днес имам числото Х. Искам да проверя дали Х е нормално, или се различава значително от другите в множеството.

Най-простият отговор е да намеря средноаритметично на старите стойности и да гледам дали се различавам с повече от зададен процент. Средноаритметичното в случая е 1174.57. Ако приемем, че е допустима разлика от 10%, тогава всяко число между 1068 и 1292 ще се приеме за нормално.

Днес, обаче, има стачка и никой не идва. Така за днес имам стойност 0 и получавам аларма, че нещо не е наред (както се очаква).

Обаче утре за сравнение ще имам следнтие данни:

Вторник: 1177
Сряда: 1184
Четвъртък: 1197
Петък:1148
Събота: 1181
Неделя: 1155
Понеделник: 0

Средноаретметичното е 1006 и границите стават много ралзични: от 914 до 1106. Лесно се вижда, че никоя от „нормалните“ за миналата седмица стойности не влиза и ако дойдат, примерно 1150 души, аз ще получа аларма, че нещо не е наред. И така ще получавам „фалшиви“ грешки цяла седмица, докато нулата не излезе от статистиката.

Въпроса ми е има ли някакъв (за предпочитане, относително прост) метод да се избегне това? Т.е. стойности, които очевидно не принадлежат на множеството, да не се взимат предвид, или поне да влияят по-слабо на стойността, с която сравнявам (средноаритметичната в случая). Сигурен съм, че този проблем е решен и не ми се иска да откривам топлата вода 🙂

 Posted by at 11:54

  15 Responses to “Help! – въпрос на статистика”

  1. Принципно, средноаритметичното се влияе много от екстремални стойности, докато медиана се влия в относително по-малка степен. Вместо да сравняваш средноаритметично, сравнявай с медиана.

  2. като по някакъв алгоритъм определиш горна и долна трим граници, един вариант е ей този

    select power(10.00,log_a + 3.00*log_stdv) as hTr,
    power(10.00,log_a – 3.00*log_stdv) as lTr
    from
    (select sum(log10(a))/count(*) as log_a,
    stdevp(log10(a)) as log_stdv
    from tst1024
    where a >0
    ) as a

    така заместваш стойностите над hTr с hTr , тези под lTr с lTr и отново определяш трим граници и тогава може да изключиш тези над и под

  3. Стойността 0 в случая се нарича outlier – не знам на български как се казва. Подобни outliers много изкривяват информацията, когато ползваш аритметична средна. saskak е прав, че с медиана е много по-точно. В краен случай, тъй като това е стойност, получена съвсем по изключение, може просто да я пренебрегнеш – така няма да ти прецаква сметките. Но наистина не е хубаво да се разчита твърде много на аритметичната средна. Добре е тя да се разглежда в съвкупност с модата и медианата, както и със стандартното отклонение на разпределението. Така се придобива по-добра представа.

  4. Виж примерно тук 😉

  5. В случая нулата наистина е outlier. Имай предвид обаче, че влиянието в момента е много голямо, защото извадката ти е малка (само 5 наблюдения). При повече стойности в извадката, влиянието не би трябвало да е толкова голямо и 0 просто ще си бъде съвсем в края на лявото рамо. Необходима ти е по-голяма извдка, поне 30 наблюдения, колкото повече – толкова по-добре. Освен това имай предвид, че в случая не е съвсем удачно да се използва нормално разределение, защото няма как да имаш отрицателни стойности за броя на влезналите, т.е. разпределението със сигурност не ти е нормално и ако определяш горната и долната граница с тази презумпция, не е е съвсем коректно. Все пак, ако извдката ти е достатъчно голяма (>30), то можеш да се позовеш на т.нар. central limit theorem – http://en.wikipedia.org/wiki/Central_limit_theorem

  6. Иначе в малко по-практически аспект, можеш да използваш някои от вариациите за средната, които третират въпроса с outlier-ите. Ето каков пише в един учебник:
    Other approaches to handling extreme values involve variations of arithmetic mean. The trimmed mean is computed by exclucing a stated small percent of the lowest and highest values and then computing an arithmetic mean of the remaining values. For example, a 5 percent trimmed mean discards lowest 2.5% and the largest 2.5 percent of values and computes the mean of the remaining 95 percent of values. … A Winsorized mean assigns a stated percent of the lowest values equal to one specified low value, and a stated percent of the highest values equal to one specified high value, then computes a mean from restated data. For example, a 95 percent Winsorized mean sets the bottom 2.5 percent of values equal to 2.5th percentil value and the upper 2.5 percent equal to the 97.5 percentile value.
    Учебника е Quantitative Methods for Investment Analysis, CFA Institute Investment Series, Secon edition, стр. 107, бележката под линия.

  7. Благодаря за чудесните предложения!

    Медианата май е точно това, което ми трябва. Като цяло изобщо не се влияе от екстремни стойности (освен ако не са екстремни повече от пловината стойности и то все в една посока). А се смята много лесно – има си такава функция в Oracle 🙂

    Стандартното отклонение не виждам как ще ми помогне. Т.е. видам как може да ме предлази от фалшиви аларми (ако гледам днешната стойност да е в рамките на стандартното отклонение от среднаоретметичното), но може да пропусне истински проблем. В конкретния пример стандартното отклонение след нулата е 444, средноаретметичното е 1006 и това ще проеме за нормални едни стойости от рода на 600-700. Със сигурност пропускам нещо.

    Това, че при повече наблюдения статистиката е по-точна е ясно, моя проблем е какво да правя ако имам калпави (т.е. малко) данни.

    Идеята за trimmed mean ми мина през главата (макар да не знаех, че се казва така). Но не се сещам как да я реализирам относително лесно. Е, няма невъзможно неща, но след като имам готово решение (median), нещата са предрешени

  8. Интересно, а как определяш долната и горната граница на „нормалността“? След като явно не използваш стандартното отклонение… А иначе не ти трябват чак толкова много данни – месец и половина – два. Все пак беше написал, че може и за повече ако се налага…

  9. Границите ги определям „на око“, примерно 10%. Естествено, осъзнавам че това е малко тъпо и бих се радвал на други предложения – ако не за конкретния случай, може да ги използвам друг път. Но стандартното отклонение се влияе силно от outlier стойностите. А премахването на outliners ще стане трудно. Иначе стандартно отклонение на множество без outliners май е перфектно решение.

    В момента работя с данните за 1 седмица. Преко сили мога да хавана данните за петнайсетина дни. Но с повече данни ще претоваря твърде много процедурата по извличането (в моя конкретен случай). За това търся начин да мина с данните, кото имам. Е все пак не съм и с 2-3 стойности.

    Всъщност ако видя, че не става така, ще се стегна и ще го напиша цялото на PLSQL (а не на SQL). Тогава ще може всичко 🙂

  10. Между другото, за да бъде едно разпределение „нормално“, трябва ли винаги да е около нулата? Мислех, че може да е нормално и да е изместено в X

  11. Пък Швейк задал на психиатрите следната задача: една сграда има 6 етажа, на всеки етаж има по 8 прозореца, на колко години е бабата на портиера?

  12. За между другото, едно нормално разпределение се определя от стандартното отклонение (standard deviation) и средно аритметичното (mean), докато стандартното нормално разпределение (standard normal distribution) се определя от стандартно отклонение = 1 и средно = 0. Така че, ако имаш стандартно разпределение, можеш лесно да го трансформираш в стандартно нормално разпределение (от всяка стойност изваждаш средното и делиш на стандартното отклонение). Много е рядко да срещнеш нормално разпределение което има стандартно отклонение точно 1 и средно точно 0.
    Боян е прав че можеш да използваш central limit theorem, ако имаш брой на стойности >=30 и в този случай 95% от генералната популацията от наблюдения ще е в границата на +-1.96*стандартното отклонение. В твоя случай обаче, тъй като имаш много малко стоийности, варияцията ти е много голяма.

    Много думи за нищо. Де факто, с малка извадка от 7-14 стойности и сравнение с едно число не можеш кой знае какви изводи да направиш.

  13. Да, и аз прочетох, че нормалното разпределение може да се използва при поне 30 наблюдения. При по-малко се използва t-разпределение.

    Дали са много думи за нищо… за мен, лично, не са. Научих за медианата, която ми върши работа веднага. Освен това започнах да осъзнавам, че основният ми проблем (освен оntliners) е малкият брой наблюдения: нещо, което вчера смятах за относително малък проблем. Да не забравяме, че всичко това остава в нета и евентуалните ползи (колкото и да са малки) не са само за мен и само сега 🙂

  14. […] 3 дни зададох на учтивите блогочитетели един статистически въпрос. […]

  15. Има един метод (не знам как се казва), който се използва за изглаждане на пикове, примерно при пресмятане на FPS.

    NewAverage = NewValue; // init
    while(1)
    {
    OldAverage = NewAverage;
    NewAverage = OldAverage*0.9 + NewValue*0.1

    NewValue = [откъдето я вземаш там 🙂 ]
    }

    Така влиянието на всяка нова стойност е малко и ако в множеството ти от стойности преобладават нормални стойности, то средната ще е винаги близо до истината. Сборът на коефициентите (0.9 и 0.1) винаги трябва да дава 1 (100%). Може да експериментираш с пропорцията, това ще повлияе на чувствителността.

    Малко съм закъснял с тази информация, но дано помогна. 🙂

Sorry, the comment form is closed at this time.