maanantai 30. marraskuuta 2015

SARIMA ja kampanjan vaikutuksen arvioiminen R-ohjelmalla

Käsittelen nyt SARIMA:a ja kampanjan vaikutuksen arvioimista. Haluan tietää, onko mainoskampanjalla ollut vaikutusta myyntiin. Käyttämässäni harjoitusaineistossa kampanja on pidetty aikavälillä 01/01/2009- 31/03/2009. On hyvä muistaa, että mainoskampanjan vaikutus voi ulottua kampanjan kestoa pidemmälle aikavälille. Esimerkiksi ihmiset saattavat ostaa tuotetta vasta kuukauden päästä kampanjan loppumisesta, kun mainos palautuu mieleen. Ajatellaan mainoskampanja tässä vain mainostamiseksi, eli oletetaan, ettei meillä ole kampanjahintaa. Tällä tavoin voimme mitata myyntiä ja olettaa myös, että kohonneet myyntiluvut tarkoittavat uutta tuloa, koska myyntikatteet pysyvät samoina kuin ennen kampanjaa. Tehtävänä on nyt saada selville, onko kampanja ollut hyödyllinen, eli onko se lisännyt myyntiä (kampanjan tarkempi hyöty selviää tietysti vasta, kun sen kokonaiskustannukset ovat tiedossa) Alla olevasta kuvasta näemme yrityksen myynnit sekä kampanjan aikavälin. Pyrin ensin ennustamaan myynnit kampanjan aikavälille, jos kampanjaa ei olisi pidetty. Eli muodostan SARIMA-mallin ja ennustan myynnit perustuen puhtaasti myyntihistoriaan. Tämän jälkeen vähennän ennustetut myynnit toteutuneista ja näemme, onko kampanja ollut hyödyllinen.


Käytän ennustamisessa Rob J Hyndman:n suosittelemaa tapaa, jossa jaan datan ns. Training periodiin ja Test periodiin. Training periodissa muodostan mallin ja ennustan sillä Test periodin arvoja vastaan. Testaan siis mallia oikeaan dataan ennen kuin ennustan sillä halutulle aikavälille. Tällä tavoin en ennusta täysin tuntemattomaan, vaan mallini on onnistunut ennustamisessa jo aiemmin, eli on ennustanut parhaiten Test periodin aikana. Hyndman neuvoo, että Test periodiksi tulisi valita vähintään yhtä pitkä aikaväli kuin ennustusaikaväli on, eli jos ennustamme 12 kuukautta, niin Test periodin on oltava vähintään 12 kuukautta. On tärkeää huomata, että ns. Forecast accuracy:a, eli ennustustarkkuutta mitataan tällä tavoin eikä sillä, miten hyvin malli sopii Training periodin dataan. Tosin voimme mallia valitessamme hyödyntää malleja, joissa on alhaisin Akaike Information Criteria (AIC)-arvo, eli ikään kuin esikarsimme malleja AIC-arvon perusteella. AIC-arvo kertoo mallien suhteellisesta paremmuudesta, eli malli, jossa AIC on pienin on suhteellisesti paras malli, koska informaatiokadon estimaatti on pienin. Hyndman:n mukaan AIC-arvoa ei voi käyttää mallien vertailuun, jos differensointien määrä vaihtelee, eli AIC-arvoa voi vertailla vain jos differensoinnit ovat samat. Esimerkiksi voimme vertailla malleja, joissa on yksi kausidifferensointi keskenään.

Dataa katsomalla huomaamme, että meidän on kokeiltava ns. Box-Cox-transformaatiota, eli muunnamme aineiston logaritmi-muotoon. Tällä tavoin varianssi pysyy aikavälillä suhteellisen vakiona, joka on tärkeä oletus ARIMA:a/SARIMA:a, eli ns. Additiivisia malleja käytettäessä. Alla olevassa kuvassa näkyvät myynnit logaritmi-muunnoksen jälkeen. Vaikka alkuperäisessä muodossa myynnit kasvavat absoluuttisesti enemmän aikasarjan-lopussa, niin silti suhteellisesti kasvu on melko vakaata, joten logaritmi-muunnos on hyödyllinen.



Seuraavaksi voimme katsoa ACF (autokorrelaatio) ja PACF (osittaisautokorrelaatio) kuvat, jotta näemme, onko aikasarjassa yksikköjuurta (Unit root). Jo kuvia katsomatta on selvää, että sellainen on, koska keskiarvo vaihtelee ajanjakso aikana, eli esim. 1999-2000 välillä mitattu keskiarvo ei ole sama kuin vuosien 2004-2005 välillä mitattu. Meidän pitää muokata aineistoa differensoimalla, jotta pääsemme yksikköjuuresta eroon. Kuitenkin ennen differensointia on huomattava, että ainestossa on selkeä nouseva trendi, ja jos haluamme trendin mukaan malliimme, on meidän huomioitava se ennen differensointia, sillä differensointi poistaa trendin (Ajattele esim. kasvavaa trendillistä aikasarjaa 5,10,15,20, josta otamme peräkkäisten arvojen differensoinnin. Saamme sarjaksi 5,5,5 (10-5,15-10,20-15) eli aikasarja muuttuu vaakaviivaksi) . Voimme ottaa kausidifferensoinnin (Seasonal differencing) ja/tai differensoinnin (Differencing) peräkkäisille arvoille. Kausidifferensointi tarkoittaa, että vähennämme jokaisesta arvosta sen aiemman vuoden arvon: Esim. joulukuun 2001 kausidifferensoitu arvo on joulukuun 2001 arvo "miinus" joulukuun 2000 arvo. Peräkkäisten arvojen differensointi taas tarkoittaa, että joulukuun 2001 arvo saadaan vähentämällä siitä marraskuun 2001 arvo.

Jaan nyt aineiston "Trainingset":iin 01/1999-12/2007) ja "Testset":iin (01/2008-12/2008), jotta voin arvioida ennustustarkkuutta, josta edellä puhuttiin. Alla olevassa kuvassa ovat trainingsetin ACF- ja PACF -kuvat


ACF-kuvasta näemme vahvaa autokorrelaatiota monelle viivelle. Alla olevassa kuvassa ovat kuukausittaiset keskiarvot Trainingsetille ja näemme, että keskiarvot vaihtelevat kuukaudesta riippuen. Heinä-ja elokuu ovat selkeästi myynnillisesti parempia kuukausia kuin muut. (Kun kausivaihtelua ei esiinny, niin kuvan keskiarvot olisivat likimain samalla tasolla. )


Teen ensimmäiseksi kausidifferensoinnin ja katson sen jälkeen, onko toinen differensointi tarpeen. Kausidifferensointi kannattaa tehdä aina ensin, koska voi olla, että jo se riittää, eli toista peräkkäisten arvojen differensointia ei tarvita (Differensoinnissa katoaa informaatio (Trendi)). Tavoite on saada aineisto stationaariseen muotoon, jotta mallista saadut tulokset olisivat luotettavia. Ei-stationaarinen aineisto altistaa mallin tulokset autokorrelaatiolle, joka vääristää keskivirheet, eli esim. luottamusvälit eivät olisi luotettavia. Stationaarisessa aikasarjassa keskiarvo ja varianssi eivät vaihtele ajasta riippuen, joten sitä on mahdollista ennustaa. Stationaarisessa aikasarjassa muuttujan regressiokerroin on vakio ajasta riippumatta, kun taas yksikköjuurellisessa aikasarjassa regressiokertoimen tulisi muuttua ajassa, jotta se kuvaisi aikasarjaa oikein. Ei-stationaarisessa aikasarjassa (yksikköjuurellisessa) voisi olla esim. pitkiä nousuja ja tämän jälkeisiä pitkiä laskuja. Kuinka voisimme ennustaa tai kuvata tällaista aikasarjaa yhdellä regressiokertoimella? Stationaarisuus-ehto on tärkeä myös, koska silloin Law of the large numbers- ja Central limit theorem -lait pätevät.

Alla olevassa kuvassa on kausidifferensoitu aikasarja, joka ei ADF-testin mukaan sisällä yksikköjuurta. KPSS-testi osoittaa sarjan olevan nyt stationaarinen, vaikka asia ei silmämääräisesti aivan selvä olekaan.



Nyt kun aikasarja on stationaarisessa muodossa, voin katsoa ACF-ja PACF-kuvat, jotta saan informaatiota mallin valintaan. Yleistäen voisi sanoa, että ACF-kuvasta katsotaan tarvittavat MA-termit ja PACF-kuvasta tarvittavat AR-termit. Esimerkiksi ACF-kuvassa ensimmäisen viiveen autokorrelaatio viittaisi siihen, että MA-termi sopisi malliin. ACF-kuvan 12. viiveen kohdalla oleva piikki voi tarkoittaa, että MA-termi tulee lisätä myös kausivaihtelukomponenttiin. Lisää tietoa mallinvalinnasta löytyy Robert Nau:n sivuilta: http://people.duke.edu/~rnau/seasarim.htm



Voin myös käyttää Auto.arima-toimintoa Forecast-pakkauksesta. Auto.arima kertoo oman ehdotuksensa parhaaksi malliksi. Auto.arima ehdottaa kausidifferensointia+trendiä käytettäväksi. Auto.ariman ehdotus on tarkalleen ARIMA(2,0,0)(2,1,0)[12]+Drift. Ensimmäinen luku vasemmalla on AR-termien määrä, keskimmäinen on peräkkäisten arvojen differensointien lukumäärä, kolmas luku taas on MA-termien määrä. Näiden vieressä ovat vastaavat arvot kausivaihtelukomponentille. [12] kuvaa kausivaihtelun periodien lukumäärää.  Jos data olisi neljännesvuosittain julkaistua, niin periodien lukumäärä olisi 4.

Näytän seuraavaksi, miten trendin (Drift) lisääminen vaikuttaa mallin ennusteisiin. Alla olevassa kuvassa ovat ARIMA(2,1,0)(2,1,0)[12] ja ARIMA(2,0,0)(2,1,0[12]+Drift. Driftin lisäys on sama asia kuin lisäisi aikamuuttujan malliin, eli muuttujan joka alkaa arvosta 1 ja kasvaa yhdellä numerolla aina sarjan loppuun saakka. Esim 12 kuukauden pituisen aikasarjan aikamuuttuja voisi olla numerot 1-12. Trendin lisäys tarkoittaa sitä, että mallin ennusteet ovat trendin mukaisia. Se onko tämä hyvä vai huono asia on itse päätettävä. Hyndmann varoittaa trendin käytöstä, koska luottamusvälit ovat kapeita, kuten alla olevasta kuvasta näemme. Trendin käyttö mallissa voi tosiaan tuottaa liian optimistisen kuvan tulevaisuuden myynneistä.

Malli ilman trendiä (yläpuolella) ja malli trendin kanssa (alapuolella)
Nyt, kun aikasarja on stationaarisessa muodossa ja olen nähnyt ACF-ja PACF-kuvat sekä Auto.ariman mallisuosituksen voin valita malleja ja testata niitä testidataan, eli "Testset":n, jonka alussa tein. Ennustan siis eri malleilla aitoon vuoden 2008 dataan ja vertaan mallien tarkkuutta.
Valitsen tarkasteluun seuraavat mallit:
Malli1: ARIMA(2,0,0)(2,1,0)[12]+Drift
Malli2: ARIMA(2,0,0)(2,1,1)[12]+Drift
Malli3: ARIMA(2,0,0)(1,1,1)[12]+Drift
Malli4: ARIMA(2,0,2)(2,1,0)[12]+Drift
Malli5: ARIMA(1,0,2)(2,1,0)[12]+Drift

Seuraavaksi testaan, kuinka tarkasti mallit ennustavat vuoden 2008 arvot. R antaa erilaisia arvoja, kuten ME, RMSE, MAE,MPE,MAPE ja MASE. Malleista tarkoin on se, jolla kyseiset arvot ovat pienimmät. Ei ole kuitenkaan varmaa, että löytyisi malli, jossa kaikki arvot olisivat toisia pienempiä. Alla kuvassa mallit 1 ja 4 sekä niiden ennusteet vuodelle 2008
Kuten kuvista näkee on ennusteiden tarkkuudessa toivomisen varaa, eli kumpikin malli yliestimoi tulevia arvoja. Tätä selittää trendin mukana olo, eli kokeilen seuraavaksi samoja malleja 1 ja 4, kun trendi on otettu pois. Huom. Trendin/driftin pois ottaminen ei tarkoita, että ennusteet eivät edelleen kasvaisi, sillä kausivaihtelukomponentti sisältää AR-termin, eli SAR-termin (SAR=Seasonal AR). Jos haluat tietää enemmän SAR- ja SMA -termien vaikutuksesta malliin, niin katso sivun alaosan kappale SAR ja SMA.

Testaan vielä nämä mallit, kun olen lisännyt niihin SMA-termin (Seasonal MA-termi). SMA-termi voisi sopia malliin, koska ACF-kuvassa oli negatiivinen piikki 12-lagin kohdalla (ks. Rule 13: http://people.duke.edu/~rnau/arimrule.htm).


Nyt ennusteet osuvat jo paremmin. Parhaiten onnistuu viimeinen malli: ARIMA(2,0,2)(2,1,1)[12]. Varmistan vielä, että tällä mallilla ei esiinny residuaalien autokorrelaatiota. Käytän testaamiseen Ljung-Box-testiä ja testi ei hylkää nollahypoteesia, joten virhetermeissä ei esiinny autokorrelaatiota. Käytän siis tätä mallia.

Seuraavaksi ennustan valitulla mallilla ARIMA(2,0,2)(2,1,1)[12] kaksi vuotta eteenpäin alkaen 01/2009, eli saamme ennusteet kampanjan ajalle ja kampanjan jälkeiselle ajalle. Olen kiinnostunut myös kampanjan jälkeisestä ajasta, koska kampanjan vaikutus on voinut kestää pidempään kuin kampanja.

Kuvasta näemme, että koko kampanjan ajan (01/2009-03/2009) toteutuneet myynnit ovat ennustettuja arvoja korkeammat. Tämä kertoo siitä, että kampanja on onnistunut ainakin myynnillisesti (Ottamatta kantaa kampanjan kokonaiskustannuksiin). Mielenkiintoinen seikka on, että kampanjan vaikutus näyttää ulottuvan vuoden 2009 loppuun saakka. Päättymiskohdan voi katsoa kohdasta, jossa luottamusväli leikkaa toteutuneet myynnit. Alla toteutuneiden myyntien ja ennustettujen myyntien (point forecasts) erotukset vuodelle 2009.

Jan   Feb   Mar   Apr   May  Jun   Jul   Aug   Sep   Oct   Nov   Dec
61.5 61.0  74.2  74.5   88.4   69.2 92.2 99.6   86.0  83.4  86.6  95.6

Alla on vielä toteutuneiden myyntien ja ennustettujen myyntien 95%:n luottamusvälin ylärajan erotus vuodelta 2009. Luottamusväli sisältää ylä-ja alarajan, joiden välissä piste-ennustus on.Huom. Piste-ennusteen luku ei sinällään ole yhtään luotettavampi luku kuin muukaan yksittäinen luku luottamusväliltä. Luottamusväli kertoo meille, että 95% kerroista, kun teemme luottamusvälin saamme oikean arvon luottamusvälillemme. Oikea luku voi olla siis mikä tahansa arvo luottamusvälillä, niinpä on varminta laskea kampanjan vaikutus luottamusvälin ylärajalta.

 Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
35.2  30.8  34.9  31.7   40.8    8.1  19.7  22.0   17.8  20.8  29.8  30.3



Tässä blogissa käsittelen kvantitatiivisia tutkimusmenetelmiä, kuten ARIMA:a, SARIMA:a ja Dynaamista regressiomallia. Käytän mm. SARIMA:a mainoskampanjan vaikutuksen analysointiin, jolloin tavoitteenani on pyrkiä vastaamaan kysymykseen "Onko mainoskampanjalla saatu aikaan lisää myyntiä?". Aineistona käytän tällöin aikasarjoja, eli aineistoja, jotka ovat ajallisessa järjetyksessä. Aikasarja-aineiston käyttö mahdollistaa kampanjan tutkimisen tietyllä aikavälillä. SARIMA mahdollistaa kampanjan vaikutuksen, kun saatavilla ovat ainoastaan tuotteen historialliset myyntimäärät, eli esim. Tuotteen X myynti aikavälillä 2005-2014.  Esittelen myöhemmin myös Dynaamista regressiomallia hyödyntävän tavan, jolla voimme tutkia kampanjan vaikutusta, kun myös muuta informaatiota (esim. mainostuskulut) on saatavilla. Pyrin esittämään mallit ymmärrettävästi ja yksinkertaisesti, koska olen huomannut, ettei tällaista tekstiä suomenkielellä vielä ole. Tämän vuoksi en pureudu mallien toimintaan juurikaan teoriatasolla, mutta selitän mallien toiminnat sanallisesti, jotta lukija saa intuitiivisen kuvan niiden toimintaperiaatteista. Aineiston käsittelyyn jne. käytän R-ohjelmaa.

Ensimmäisenä esittelen ARIMA-mallin. ARIMA:a käytetään aikasarja-analyysiin ja se soveltuu ennustamiseen. ARIMA perustuu siihen, että tietyn aikasarjan kehitystä (esim. myynnit 2005-2013) selitetään sen omalla historialla, eli voimme ennustaa tuotteen ensi kuukauden myyntiä tämän kuukauden myynneillä. ARIMA koostuu AR (Autoregressive)- ja MA (Moving average)  -prosesseista, jotka vaikuttavat käytännössä siihen, kuinka malli reagoi omiin historiallisiin arvoihinsa. Puhdas AR-prosessi tarkoittaa, että myynnit tänä kuukautena ovat riippuvaisia ainoastaan aiempien kuukausien myynneistä. AR-prosessit merkitään muodossa AR(x), jossa x tarkoittaa sitä, kuinka monta aiempaa myyntihistoriaa käytetään tulevan arvon ennustamiseen. Esim. AR(1) tarkoittaa, että tulevan kuukauden myyntiä selitetään vain tämän kuukauden myynnillä. AR(2) tarkoittaisi taas, että myös viime kuun myynti vaikuttaisi ennustettuun arvoon.

MA-prosessi on prosessi, joka on mielestäni hieman hankalampi ymmärtää intuitiivisesti. ARIMA-mallissa se tarkoittaa yleisesti shokkia, joka kohdistuu esim. myyntiin, mutta joka ei selity AR(x) -prosessilla. Esimerkiksi voimme ajatella kenkien myyntiä, jossa tapahtuu positiivinen kysyntäshokki esim. mainoskampanjan takia. Mikäli meillä olisi puhdas AR(1) -malli ja selittäisimme kenkien myyntiä ainoastaan viimeisimmän kuukauden myynneillä, niin kysyntäshokki jäisi vähälle huomiolle. AR(1) malli ei ota shokkia erikseen huomioon, kun se ennustaa seuraavaa kuukautta. Se on vain riippuvainen kenkien myynnistä, eli koska shokki lisäsi kenkien myyntiä, niin AR(1) ennustaa muutosta seuraavalla kuukaudelle. Lisäämällä MA -termin malliimme voimme hienosäätää mallia ja näin ottaa shokin erikseen huomioon, kun teemme ennustetta. Lisäämällä MA(1) -termin AR(1)-malliimme voimme ennustaa shokin vaikuttavan ensi kuukauden myyntiin. Lisäämällä MA(2) -termin malliimme voimme ennustaa shokin vaikuttavan vielä kahden kuukauden päähän. MA-prosessilla saamme siis normaalin AR-mallin sijaan mahdollisesti tarkempia ennustuksia. MA-prosessin avulla voimme esim. ennustaa, että myynnit laskevat shokin jälkeen nopeammin kuin pelkkä AR(1) -malli antaisi ymmärtää.

On huomattava, että MA-termin vaikutus on yleensä lyhytaikainen ennustuksissa, koska sitä varten tarvitsemme mallin ennustaman arvon sekä oikean arvon. Kun käytämme ARIMA:, tarvitsemme oikeaa historiallista dataa, josta ensin muodostamme mallimme. ARIMA-malli muodostetaan automaattisesti R-ohjelman toiminnoilla mallintamaan oikea dataa. Käytännössä ohjelma laskee AR:n ja MA:n parametrien arvot, jotka minimoivat mallin ja oikeiden arvojen erotuksen. Jos haluamme ennustaa ARIMA-mallilla esim.3 kuukautta eteenpäin ja meillä on AR(1)- ja MA(1) -termit mallissa, MA(1)-termi vaikuttaa ainoastaan ensimmäiseen ennusteeseen, eli aina kun meillä on MA mukana, niin tarvitsemme oikean historallisen arvon. AR(1)-prosessi taas pystyy jatkumaan, vaikka meillä ei ole historiallista arvoa, koska se saa arvonsa aiemmasta mallin arvosta. Esim. jos AR(1) -malli ennustaa helmikuulle 2009 myynniksi 150000€, niin sen ennuste maaliskuulle perustuu puhtaasti tähän jo ennustettuun arvoon, joten pitempien ennusteiden kanssa pitää olla varovainen.

ARIMA-esimerkin jälkeen käsittelen SARIMA:a, joka eroaa ARIMA:sta, koska kausivaihtelu (Seasonality) on otettu huomioon. Alla olevassa kuvassa näkyy kausivaihtelu, eli vaihtelu, joka on joka vuosi lähes samanlainen. Esim. kaupan alalla joulukuiset myyntipiikit ovat yleisiä.

Kuva 1. Firman X Oy myynnit 1999-2010.
Kuvasta näkyy myös vuosittaisen kausivaihtelun lisäksi selkeä nouseva trendi, joka tulee sekin ottaa huomioon ARIMA:ssa ja SARIMA:ssa. Kausivaihtelu ja trendi tulee ottaa huomioon, jotta saamme mallimme käyttäytymään, kuten historiallisesti myynnit kehittyvät. Jos emme ottaisi näitä huomioon, niin ennusteemme yllä olevaan kuvaan ei muistuttaisi historiallista muotoa, vaan olisi nouseva/laskeva/tasainen viiva. Toisaalta trendiä ei ole pakko ottaa ennusteissa huomioon, jos uskoo, ettei esim. kuvan nouseva trendi jatku. Mikäli trendi lisätään malliin, niin kuvan tapauksessa myös ennusteemme tulee nousemaan. Trendin lisäys voisi siis johtaa liian optimistisiin myyntiodotuksiin. ARIMA/SARIMA ei ota kantaa siihen, miksi kausivaihtelut ovat mitä ovat tai miksi trendi kehittyy tietyllä tavalla. Voimme kuitenkin hyödyntää kuvan informaatiota ja olettaa, että kausivaihtelut noudattavat samaa muotoa myös tulevaisuudessa. Jos emme tekisi näin ja ennustaisimme joulukuun myyntiä, niin arviomme menisi luultavasti alakanttiin. Ottamalla kausivaihtelun huomioon saamme ARIMA/SARIMA-mallimme korjaamaan ennusteen joulukuulle.

Käsittelen myös Dynaamista regressiomallia. Erityisesti esittelen tapauksen, jossa regressiomallin virhetermi on ARIMA-prosessi. Tällöin tavallinen regressiomalli ei riitä, koska virhetermeille asetetut oletukset eivät päde, joten mallista saadut tulokset eivät ole luotettavia. Dynaaminen regressiomalli tarkoittaa yleisesti sitä, että regressiomalli sisältää selittävänä tekijänä selitettävän tekijän viivästetyn arvon (lag:n), eli esim. myyntejä selittää myös aiemman kuukauden arvo. Aivan kuten ARIMA/SARIMA-malleissa. Dynaaminen regressiomalli antaa meille mahdollisuuden lisätä ARIMA/SARIMA-prosessiin myös muita selittäviä tekijöitä, eli voimme lisätä malliin esim. kilpailijan hinnoittelumuutokset ja omat markkinointikampanjat.