« George Lakoff om det politiska språket | Main | Författarkopplingar och andra kulturrekommenderare »

oktober 29, 2003

Extremvärdesanalys av webbesök

Extremvärdesanalys (extreme value analysis) är en fascinerande statistisk metod där man, med hjälp tidigare värden, kan estimera förväntat maximalt värde i framtiden. T.ex. kan man estimera maximal vattennivå i en flod, och kan då anpassa resurser (skydd) efter detta värde.

Ett förklarande exempel med nyttan av extremvärdesanalys finns i On Extremes and Crashes (PDF) av Alexander J. McNeil. Se även nedan för andra referenser.

Analys
Här görs två extremvärdesanalyser (i R) av antal besök per dag på min sajt (www.hakank.org). Båda analyserna har som startdatum 2003-06-18, dagen jag började blogga.

Nyttan att göra en extremvärdesanalys på min sajt är kanske inte så stor eftersom det är är så få besök. För mig är det snarare att stilla nyfikenheten. Däremot kan det vara viktigt för mer välbesökta sajter för att anpassa antal servers etc.


Datafiler
Datafilerna finns här: blogg_tid_sep30.dat samt blogg_tid_oct28.dat. De tre fälten i filerna är månad, dag, antal besök. Endast det tredje värdet används nedan.


30 september-analysen
Först den analys som gjordes för en knapp månad sedan, som använder data från 2003-06-18 till och med 2003-09-30. Vi ser sedan hur väl analysen slog ut.

Paketet evir kan laddas ner här. Se även referenserna nedan.
> library(evir)
# ta bara med tredje kolumnen, dvs besöken
> web.hits.sep30<-read.table("blogg_tid_sep30.dat",h=T,sep=" ")[,3]
Nu använder vi evirs funktioner gev samt rlevel.gev för att estimera extremvärdet. Parametern 100 i rlevel.gev anger hur många dagar framåt man vill studera.
> web.hits.sep30.gev<-gev(web.hits.sep30)
> rlevel.gev(web.hits.sep30.gev,100)
[1] 1367.577 1578.583 2071.990
De tre värden som rlevel.gev returneras är:
- den lägre 5%-gränsen i konfidensintervallet (1367.577)
- det förväntade maximumvärdet (1578.583)
- den högre 95%-gränsen i konfidensintervallet (2071.990)

Så, de närmsta 100 dagarna efter 30 september kunde jag som max förvänta mig 1578 besök. Det fanns 5% sannolikhet att det skulle bli fler än 2072 besök eller färre än 1368 besök per dag.

Låt oss nu även studera de kommande 30 dagarna (dvs oktober). Vi kan då kan kontrollera hur bra förutsägelsen var. En sådan 30-dags-analys ger:
> rlevel.gev(web.hits.sep30.gev,30)
[1] 1192.267 1326.222 1586.469
dvs förväntat max-värde för de 30 närmsta dagarna är (var) 1326 träffar, med konfidensintervallen 1192 respektive 1586 besök.

Facit
Vilket maxvärde blev det då under oktober (så långt vi nu kommit i månaden)? Vi läser in datafilen och ser vilket maxvärdet det blev:
> web.hits.oct28<-read.table("blogg_tid_oct28.dat",h=T,sep=" ")[,3]
> max(web.hits.oct28)
[1] 2051
Det blev 2051 träffar, vilket var rätt oväntat. Och skoj för mig!

Vi kan nu även studera de kumulerade max-värdena (till och med 28 oktober), dvs de som efterhand blir max-värden. Detta görs med funktionen cummax. Man ser här hur länge ett visst värde varit max-värde, tills ett nytt sådant kommer.
> cummax(web.hits.oct28)
  [1]  674  739  739  739  739  739  739  739  739  739  739  739  739  739  739
 [16]  739  739  739  739  739  739  739  739  813  813  813  813  813  813  813
 [31]  813  813  813  813  813  813  813  956  956  956  956  956  956  956  956
 [46]  956  956  956  956  991  991  991  991  991  991  991  991  991  991  991
 [61]  991  991 1107 1107 1107 1107 1107 1107 1107 1107 1107 1107 1107 1107 1107
 [76] 1107 1107 1107 1107 1107 1107 1107 1107 1107 1520 1520 1520 1520 1520 1520
 [91] 1520 1520 1676 1676 1676 1676 1676 1676 1676 1676 1676 1676 1676 1676 1676
[106] 1676 1676 1676 1676 1676 1710 1710 1710 1710 1710 1710 1710 1710 1710 1710
[121] 1710 1710 1710 1710 1710 1710 2051 2051 2051 2051 2051 2051 2051
För att enbart lista de uppkomna max-värden används unique:
> unique(cummax(web.hits.oct28))
 [1]  674  739  813  956  991 1107 1520 1676 1710 2051

28 oktober-analysen
Här är den (nyss gjorda) analysen som nu inkluderar de besök som gjorts till och med 28 oktober (fortfarande från 2003-06-18).
> web.hits.oct28.gev <- gev(web.hits.oct28)
Vi testar först med 30 dagar:
> rlevel.gev(web.hits.oct28.gev,30)
[1] 1572.685 1804.349 2244.556
Dvs, den närmsta månaden kan jag förvänta mig max 1804 besök. Det finns dock 5% chans (risk, möjlighet) att det blir över 2245 besök. Med 100 dagar:
> rlevel.gev(web.hits.oct28.gev,100)
[1] 1886.486 2295.388 2823.097
Låt oss avsluta med estimeringen av max-värdet under det kommande året (365 dagar).
> rlevel.gev(web.hits.oct28.gev,365)
[1] 2185.355 2880.037 4725.287
Oj!


Plot
Här är en plot på antal besök per dag, från 18 juni till 28 oktober. Inget fancy men man ser tendenserna tydligt.
> plot(web.hits.oct28,type="l")



Att läsa och ladda ner
Här är ett urval av det material om extremvärdesanalys jag stött på.

Introduktioner: It's a record
The extreme value fallacy On Extremes and Crashes (PDF)

Mer teoretisk är Statistical Methods for Extreme Values (PS) av Stuart Coles och Jonathan Tawn.

Några som skrivit om ämnet:
Alec Stephenson
Stuart Coles
Alexander J. McNeil

Coles har även skrivit boken An Introduction to Statistical Modeling of Extreme Values som jag skulle vilja lägga rabarber på, men den är rätt dyr ($79.95).

Det finns några R-paket att ladda ner. Se Software for Extreme Value Theory (Stephensons sajt). Där finns bland annat paketet evir som jag använde i analyserna.

Posted by hakank at oktober 29, 2003 11:12 FM Posted to