maanantai 14. lokakuuta 2019

R-pähkinä


Ajatellaan, että myynti on kiinnostunut erilaisten myyntipiikkien kestosta. Myyntipäällikkö kysyy, minkä pituisia ovat keskimääräiseltä kestoltaan yli 12K €:n päivämyynnit. Hän on siis kiinnostunut siitä, kuinka kauan yli 12K €:n myynti kestää päivinä, kun se raja ylitetään. Esim. Jos viikon aikana tuo raja ylitetään tiistaina ja keskiviikkona, niin rajan ylittävä kesto on 2 päivää. Jos lisäksi raja ylittyy perjantaina, niin rajan ylittävät kestot ovat päivissä laskettuna 2 (ti, ke) ja 1 (pe). Näiden keskiarvo on 1.5 päivää.

Luodaan datasetti, jossa on myynnit sekä päivämäärä:

library(data.table)
library(ggplot2)
pvm <- seq(from=as.Date("2018/09/01"), to=as.Date("2019/09/15"),by=1)
myynti <- rnorm(length(pvm),mean=10000,sd=2000)
dt <- data.table(pvm,myynti)

#Tehdään kuva myynneistä
ggplot(data=dt,aes(x=pvm,y=myynti))+
  geom_line(color="blue")+
  labs(title="Myynnit 10/2018-09/2019",x="Päivämäärä",y="Myynti €")+
  theme(plot.title = element_text(hjust = 0.5),axis.text.x = element_text(angle = 90))+
  geom_hline(yintercept=12000, linetype="dashed", color = "red")
  


Alla myynnit. Myyntiä kiinnostaa yli 12K €:n ylittävät myynnit (kuvassa myyntiraja punaisella).





Tehtävä on hieman pulmallisempi kuin ensin ehkä vaikuttaa. Mistä tiedämme, milloin 12K € ylitetään ja minä päivänä ylitys loppuu? Entä miten osaamme siirtyä seuraavaan myyntipiikkiin, kun aiemman myyntipiikin kesto on laskettu?

Ratkaisu: 

Ongelman saa ratkaistua yllättävän "siististi". Ensin muutan myynnit binäärimuotoon, jotta saamme eristettyä 12K €:n ylittävät myynnit datasta sekä hyödynnettyä myöhemmin cumsum-funktiota.

dt[,myynnitbi := ifelse(myynti >12000,1,0)]

Alla nähdään, kuinka yli 12K € ylittävät myynnit saavat arvon 1.

pvm
myynti
myynnitbi
2018-09-01
10180
0
2018-09-02
12959
1
2018-09-03
9586
0
2018-09-04
11048
0
2018-09-05
9152
0
2018-09-06
9474
0


Seuraavana käytän cumsum-funktiota, koska sillä pystyy saamaan kaikki ne rivit, joissa myyntiraja on ylittynyt. Esim. yllä olevasta cumsum palauttaa kohdan "0 1", eli rivit 1 ja 2. Cumsum käy tämän jälkeen läpi seuraavan rivin ja palauttaa nollan, koska arvo on nolla. Jos cumsum löytää arvon 1, niin se palauttaa kaiken aina nollaan asti. Eli esim. jos meillä on viisi myyntipiikin ylittävää päivää putkeen, niin cumsum palauttaa 011111. Voimme tallentaa jokaisen tällaisen sarjan summan erilliseen vektoriin ja laskea lopuksi keskiarvon. Huom. summan voi ottaa, koska "1" edustaa aina yhtä päivää, eli esim. "011111" tarkoittaa viittä päivää. 


table_ <- head(dt)
for (i in 0:length(table_$myynnitbi)) {
print(table_$myynnitbi[cumsum(table_$myynnitbi==0) ==i])
}
numeric(0)
[1] 0 1
[1] 0
[1] 0
[1] 0
[1] 0
numeric(0)


Ratkaistaan myyntipiikkien keskimääräinen kesto:

 tulosvektori <- NULL #Alustetaan tulosvektori, johon myyntipiikkien kestot tallennetaan
  for (i in 0:length(dt$myynnitbi)) {
    
    tulosvektori[i+1] <- sum(dt$myynnitbi[cumsum(dt$myynnitbi == 0) == i])}
  print(mean(tulosvektori[tulosvektori>0]))
1.156

Vastaus kysymykseen on 1.16 päivää, eli myyntipiikit eivät olleet kestoltaan juuri päivää pidempiä. 



Ei kommentteja:

Lähetä kommentti