måndag 7 oktober 2019

Om bloggstatistik och filtrering


Figur 1. Månadsvisa besökstal från juli 2010 till september 2019.

Verktyget Blogger som denna blogg utnyttjar erbjuder en del möjligheter att få fram besöksstatistik. Man kan exempelvis få fram vilka som är de mest lästa inläggen, eller vilka som är de vanligaste sökorden. Man kan även se antalet bloggvisningar per månad, vilket detta inlägg kommer kretsa kring. Samtidigt kommer jag åter igen passa på att folkbilda lite kring matematik genom att diskutera filtrering av tidsserier/signaler. Detta är något som mitt licentiatarbete kretsade kring när det begav sig.

I figuren ovan ser ni hur det månatliga besökstalet har utvecklat sig sedan jag startade bloggen för ganska exakt tio år sedan. Detta är ett exempel på en signal eller tidsserie. Det förstnämnda begreppet används främst av elektroingenjörer medan det sistnämnda föredras av statistiker. Själv är jag varken eller, men föredrar nog termen tidsserie. Men oavsett så handlar det alltså om någon kvantitet som varierar över tid. Detta kan beteckna med x(t) om man har värden för godtyckliga tidpunkter t, alternativt med x_1*, x_2,..., x_k om man har värden vid diskreta tidpunkter, exempelvis månad 1, 2 o.s.v. Det sistnämnda är förstås det som gäller vid praktiska tillämpningar, och min månatliga bloggstatistik är inget undantag.

Som ni ser i figur 1 så är kurvan ganska hackig. Detta beror delvis på slumpens skördar om vad som drar läsare och när folk råkar titta förbi. Det är också något ganska typiskt för tidsserier i olika grad. Ett aktuellt exempel är tidsserier för global medeltemperatur som svänger ganska vilt. I andra fall kan det handla om mindre variationer på grund av mätfel eller annat brus. Oavsett vilket kan det finnas anledning att försöka reducera dessa variationer av olika anledningar. Gäller det mätbrus eller liknande så finns det en underliggande "korrekt" tidsserie som man kan sträva efter att återskapa. I vårt fall (och även i exemplet med global temperatur) så är det inte lika enkelt att definiera vad som är "korrekt" underliggande data. Men man kan till exempel vilja eliminera effekten av periodiska fenomen. De tekniker som härvidlag används brukar gå under samlingsnamnet filtrering. Filtrering kan beskrivas och förstås ur två aspekter, tid eller frekvens. Vi börjar med det förstnämnda och låter det sistnämnda bli överkurs för den som orkar.

Tidsaspekten

Den enklaste filtreringen utgörs av så kallade glidande medelvärden. Det innebär att vi för varje datapunkt tar medelvärdet av det aktuella värdet samt ett antal näraliggande datapunkter. I vårt fall kan man till exempel för en given månad beräkna medelvärdet av besökstalen för den månaden, föregående samt nästkommande. Om någon månad skulle ha ovanligt högt besöksantal exempelvis på grund av många spambesök (det har hänt flera gånger) så kommer denna effekt spridas ut på tre månader. Man kan förstås medelvärdesbilda över ännu fler månader och sprida ut effekten ännu mer.

Något annat som man kan eliminera med filtrering är periodiska, säsongsbetonade fenomen. Det är ganska tydligt att jag har lägre besöksfrekvens under semestertider; främst under juli, men även juni, augusti och i någon mån december. Genom att applicera ett glidande medelvärdesfilter över tolv månader så kommer alla sådana här säsongsfenomen elimineras och fram träder i stället den långsiktiga utvecklingen. I figur 2 visas originalserien, samt glidande medelvärde med 3, 6 respektive 12 månader. Notera hur de säsongsrelaterade dipparna helt har försvunnit i den 12-månadersfiltrerade versionen.

Figur 2

Det relativt enkla konceptet glidande medelvärde går att generalisera. Exempelvis vill man kanske ge högre vikt till den aktuella månaden. Ett vettigt* sätt att göra detta på är att räkna den nuvarande månaden dubbelt så mycket som föregående och nästkommande. För månad 5 (säg) innebär detta att man beräknar (x_4 + 2*x_5 + x_6)/4. Man säger att detta filtret har mask (1/4, 1/2, 1/4). Man kan upprepa detta enkla filter flera gånger, vilket motsvarar filtrering med allt bredare masker. Upprepar man det en gång får man exempelvis masken (1/16, 1/4, 3/8, 1/4, 1/16). Dessa filter kallas i bland spline-filter på grund av kopplingen till spline-interpolation. I figur 3 har vi kört spline-filter motsvarande upprepning av filtret med mask (1/4, 1/2, 1/4) 1, 3, 6 respektive 12 gånger.

Figur 3.

Notera att säsongsvariationerna inte försvinner lika tydligt med spline-filtren. Vilket filter som är bäst eller mest korrekt är inte så lätt att svara på. Det beror på vad man vill åstadkomma, samt på en ej försumbar del av subjektivitet.

Frekvenssaspekten

Nu kommer vi in på det som jag ägnade mitt licentiatarbete åt på 90-talet. Den franske fysikern och matematikern Jean-Baptiste Joseph Fourier insåg på 1800-talet att alla** funktioner kan skrivas som en summa (eller integral) av överlagrade harmoniska svängningar vid olika frekvenser. Detta kallas allmänt Fourier-analys. Steget att beräkna amplitud (och fas) för de olika frekvenserna kallas Fourier-transformen. I figur 4 har jag ritat upp Fouriertransformen (amplituden) av tidsserien. Observera att den största amplituden fås i nollfrekvensen; detta är tidsseriens medelvärde. Enheten för frekvens på horisontalaxeln är "per månad", så årsvariationer borde ge ett bidrag runt 1/12 ≈ 0,8. Vi kan tydligt se en sådan kulle även om den inte är jätteframträdande. Att den är en smula utsmetad beror troligen på att säsongsvariationerna är ganska långt från en ren sinussvängning. Det finns en lika stor kulle vid frekvensen 0,17-0,18 som skulle kunna förklaras med halvårsvariationer. I övrigt är det ganska jämnt utsmetat över hela frekvensbandet vilket är ett tecken på "vitt brus"; statistiskt i tid okorrelerade variationer.

Figur 4.

Det som händer när man applicerar ett filter är att olika frekvensers amplitud multipliceras med en faktor. Dessa faktorer kallas för filtrets frekvenssvar, och i figur 5 har jag ritat upp dessa frekvenssvar för de filter som har använts i figur 2 och 3. Översta raden innehåller medelvärdesfilter med bredd 3, 6 och 12, och undre raden motsvarande för spline-filter.

Figur 5.

Notera att samtliga dessa filter har egenskapen att ju högre frekvens, desto högre dämpning av amplituden. Effekten är mer påtaglig ju bredare filtret är. Dipparna vid noll motsvarar utsläckning av periodiska fenomen. Notera också att spline-filtren har en skarpare övergång mellan låg och hög dämpning. Inom digital signalbehandling försöker man ofta designa filter så med väldigt tydliga övergångar mellan frekvensband där man önskar signalen opåverkad, och frekvensband som man helt vill släcka ut. Detta är i sig ett helt forskningsområde som jag inte ska gå in på mer. I stället har jag i figur 6 respektive 7 slutligen ritat upp Fourier-transformerna för de filtrerade signalerna jämte originalet. Här syns bland annat tydligt hur frekvensen 1/12 har släckts med medelvärdesfiltret över tolv månader (figur 6, nedre högra grafen).

Figur 6.

Figur 7.
Det finns naturligtvis massvis mer jag skulle kunna säga i ämnet, i synnerhet fönstrade Fourier-transformer, wavelets och annan mer sofisitikerad tid-frekvenssanalys som jag pysslade med när det bagav sig. Men det är hög tid att avsluta här.

* Notationen x_k är ett etablerat sätt att skriva så kallade subskript (googla subscript!) när ens verktyg inte tillåter detta på ett snyggt sätt.
** Nåja, nästa alla.

Inga kommentarer:

Skicka en kommentar