Uvod

U ovom seminarskom radu smo se bavili predviđanjem cena noćenja u Rimu, u apartmanima ili studijima koje je moguće pronaći na sajtu Airbnb. Za predikciju smo koristili linearnu regresiju.

Sređivanje baze podataka

Najpre smo od oka razdvojili numeričke, logičke, kategoričke i tekstualne prediktore. Zatim smo prediktore razvrstali po značaju, izdvojili smo one koje možemo izmeniti za potrebe predikcije. Uočili smo potom da postoje prediktori sa nedostajećim vrednostima u određenim opservacijama. Razdvojili smo one kod kojih nedostaje zanemarljivo mali broj vrednosti od drugih kod kojih nedostaje značajnije više vrednosti. U prvom slučaju smo isključili opservacije kod kojih nedostaju vrednosti prediktora, a u drugom smo isključili prediktore.

Primetili smo potom da postoje podaci koji su logički (True/False) koji su po tipu podataka kategorički. Takve podatke smo modifikovali i dodelili im numeričke vrednosti (1/0). Deskriptivni prediktor koji opisuje okolinu apartmana smo prepravili i svakoj opservaciji dodelili vrednost obima opisa okruženja. Prediktor koji sadrži sve pogodnosti koje apartman sa sobom nudi smo zamenili sa brojem pogodnosti koje nudi. Isto smo uradili i sa prediktorom koji referišu na pristupačnost hosta (na koji način je sve moguće pristupiti mu). Prediktor koji ukazuje na datum pristupa hosta platformi smo zamenili brojem godina proteklih od trenutka pristupa hosta. Takođe smo morali da modifikujemo kolonu koja sadrži cene noćenja jer je bila tekstualnog tipa, preveli smo je u broj.

Na kraju smo isključili opservacije čiju vrednost cene smo smatrali autlajerom, zarad boljih performansi. Tako sređenu bazu smo sačuvali i potom koristili za modelovanje i predikciju.

Konstrukcija modela

Najpre smo iz baze podataka izdvojili trening, validacioni i test skup u razmeri 70:15:15.

Potom smo isključili prediktor \(bathroom\_text\) jer ima previše faktora i pravi problem pri predikciji na trening i test skupu. Isključili smo prediktor \(description\) kao opisni i osim pomenuta dva, isključili smo sve one prediktore čija značajnost pri modelovanju je mala do nepostojeće. Ispitali smo međusobnu korelaciju između preostalih numeričkih prediktora i iz grupa međusobno korelisanih izdvojili po jedan koji smo zadržali u modelu. Uočili smo tačno 4 grupe međusobno korelisanih prediktora i iz svake grupe izabrali predstavnika. Izuzetak smo napravili sa prediktorima \(beds\), \(bedrooms\) i \(amenities\) jer smo zadržavanjem istih došli do boljih performansi modela.

## corrplot 0.92 loaded

Pri ispitivanju prethodnog modela došli smo do sledećih zaključaka.

summary(lm2)$r.squared
## [1] 0.3066714
plot(lm2$res ~ lm2$fit)

qqPlot(rstandard(lm2)) #jasno uočljivo odstupanje od prave linije

ad.test(rstandard(lm2))
## 
##  Anderson-Darling normality test
## 
## data:  rstandard(lm2)
## A = 1088.7, p-value < 2.2e-16
cvm.test(rstandard(lm2))
## Warning in cvm.test(rstandard(lm2)): p-value is smaller than 7.37e-10, cannot be
## computed more accurately
## 
##  Cramer-von Mises normality test
## 
## data:  rstandard(lm2)
## W = 194.08, p-value = 7.37e-10

QQ plot ne daje baš najbolje rezultate. Međutim uočili smo da su pojedinačno plotovi zavisnosti reziduala u odnosu na prediktore simetrični oko nule, pa smatramo da je taj uslov ispunjen. Sa druge strane, Anderson-Darlingovom i Kramer-fon Mizesov testovi ukazuju na to da uslov normalnosti nisu ispunjeni, jer je p-vrednost značajno manja od praga značajnosti 0.05. Jasno uočljivo smanjenje disperzija sa povećanjem ocene cene.

plot(rstandard(lm2) ~ fitted(lm2))

plot(rstandard(lm2)^2 ~ fitted(lm2))

bptest(lm2)
## 
##  studentized Breusch-Pagan test
## 
## data:  lm2
## BP = 466.28, df = 27, p-value < 2.2e-16

p-vrednost je jako mala, pa odbacujemo hipotezu o homoskedastičnosti. Pokušali smo da ispravimo to različitim transformacijama zavisne promenljive (logaritmovanjem, korenovanjem, kvadriranjem i Box-Cox) međutim, najbolje rešenje dobili smo primenom težinske regresije.

wt <- 1/fitted(lm2)^2
lm3 <- update(lm2, weights = wt)

summary(lm3)$r.squared 
## [1] 0.7826885
bptest(lm3) 
## 
##  studentized Breusch-Pagan test
## 
## data:  lm3
## BP = 0.10173, df = 27, p-value = 1
plot((rstandard(lm3))^(1/2) ~ fitted(lm3)) 

Dobijena vrednost \(R^2\) skora je značajno veća, deluje da smo problem heteroskedastičnosti rešili, i raspršenost disperzija je u značajnoj meri je ravnomernija, iako i dalje nije idealna.

Predikcija cene noćenja

Uporedili smo srednje-kvadratne greške modela i u odnosu na to odlučili koji model ćemo iskoristiti kao finalni.

prediction2 <- round(predict(lm2, newdata = validation_data))
prediction3 <- round(predict(lm3, newdata = validation_data))

(mse2 <- mean((prediction2 - validation_data$price)^2))
## [1] 13086.76
(mse3 <- mean((prediction3 - validation_data$price)^2))
## [1] 14826.97

Manju grešku ima model 2, međutim, razlika nije velika a kako model 3 ima ispunjen uslov homoskedastičnosti, kao i značajno veći R^2 skor, odlučili smo da to bude naš finalni linearni model. Probali smo još i da za nijansu popravimo model koji smo izabrali kao konačni.

Dobili smo slične performanse kao kod modela 3, a kako je model 4 jednostavniji (uključuje manje prediktora) odlučili smo da njega iskoristimo kao finalni model.

prediction <- predict(lm, newdata = test_data)
(mse <- mean((prediction - test_data$price)^2))
## [1] 13222.28

Zaključak

U ovom seminarskom radu bavili smo se određivanjem cena noćenja u Rimu dostupnih na platformi Airbnb i za te potrebe poslužili smo se težinskom linearnom regresijom. Kao rezultat konstrukcije modela i predikcije cene, postigli smo to da naš model ima \(R^2 = 0.78\) i \(MSE_{test} = 13222.28\), \(MSE_{trening} = 14812.67\).