Dane przedstawiaja informacje o wyborze jednego z trzech hoteli (location) przez danego klienta (customer). Wybor dokonywany jest na podstawie ceny (price) w zlotych i liczby udogodnien (amenities) jak np. basen, parking, wyzywienie.
Chcemy zbudowac model objasniajacy wybor danego hotelu przez klienta.
Jest to zmienna jakosciowa, ale bez skali porzadkowej (nie mozna sensownie uszeregowac wartosci)
Zmienne objasniajace sa specificzne dla kategorii: kazdy hotel oferuje inna liczbe udogodnien preferowanych przez danego klienta. Podobnie cena za pobyt rozni sie w zaleznosci od hotelu. (Jednoczesnie klienci tez sa rozni, tzn. maja rozne preference co do udogodnien oraz otrzymuja oferty rozniace sie cena, bo np. maja rozne znizki )
Bedzie to zatem tzw. warunkowy model logitowy (conditional logit )
#1 Rozkład zmiennych
attach(hotels)
table(hotels$choice, hotels$location)
##
## Hotel A Hotel B Hotel C
## 0 32 38 32
## 1 19 13 19
table(choice, amenities)
## amenities
## choice 0 1 2 3 4 5 6 7 8 9 10
## 0 4 21 20 15 13 10 9 5 3 2 0
## 1 0 2 4 7 9 9 6 5 6 2 1
table(choice, price)
## price
## choice 289 335 337 338 339 340 342 343 344 345 346 347 348 350 353 354 355 356
## 0 1 0 0 2 1 1 3 1 3 1 1 1 0 1 0 0 0 2
## 1 0 1 1 3 1 0 2 1 0 1 1 0 1 1 2 1 2 0
## price
## choice 359 362 367 377 379 382 399 500 517 530 533 536 565 599 602 603 613 636
## 0 1 0 0 0 0 0 1 1 0 2 0 1 0 0 1 1 2 0
## 1 0 1 2 1 1 1 0 1 2 0 1 0 1 1 0 0 0 1
## price
## choice 653 655 656 657 658 659 660 661 662 663 664 665 666 667 668 671 672 674
## 0 1 0 0 1 1 4 2 2 0 4 3 4 1 1 1 1 1 0
## 1 0 1 1 0 0 0 1 0 2 0 2 0 0 0 0 0 0 1
## price
## choice 679 684 687 694 698 699 700 701 707 722 766 772 830 832 833 834 835 836
## 0 0 0 1 1 2 2 1 1 1 1 1 1 0 2 4 0 2 2
## 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
## price
## choice 837 838 839 841 845 848 852 854 855 860 862 863 865 871 876 878 882 890
## 0 3 2 1 2 1 0 1 1 0 1 1 2 2 1 2 2 1 1
## 1 1 1 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0
## price
## choice 918
## 0 1
## 1 0
Conditional logit oszacujemy za pomoca komendy mlogit. mlogit operuje na danych wlasnie w takim formacie jak nasze dane dot. wyboru hotelu. Jako zmienna zalezna podajemy choice, gdzie 1 oznacza wybor dokonany przez danego klienta, natomiast parametr alt.var mowi jakich altenatyw dotyczyl wybor:
condlog <- mlogit(choice ~ price + amenities, data=hotels, alt.var = "location")
Skomentuj istotnosc statystyczna oszacowanych wartosci wspolczynnikow
summary(condlog)
##
## Call:
## mlogit(formula = choice ~ price + amenities, data = hotels, alt.var = "location",
## method = "nr")
##
## Frequencies of alternatives:choice
## Hotel A Hotel B Hotel C
## 0.37255 0.25490 0.37255
##
## nr method
## 6 iterations, 0h:0m:0s
## g'(-H)^-1g = 2.78E-05
## successive function values within tolerance limits
##
## Coefficients :
## Estimate Std. Error z-value Pr(>|z|)
## (Intercept):Hotel B -0.1091367 0.5101548 -0.2139 0.830603
## (Intercept):Hotel C 0.1914519 0.5786439 0.3309 0.740748
## price -0.0041344 0.0013882 -2.9782 0.002899 **
## amenities 0.8826808 0.2101563 4.2001 2.668e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Log-Likelihood: -30.769
## McFadden R^2: 0.4435
## Likelihood ratio test : chisq = 49.042 (p.value = 2.2416e-11)
Mozemy przejsc na ilorazy szans dla latwiejszej interpretacji:
exp(condlog$coefficients)
## (Intercept):Hotel B (Intercept):Hotel C price amenities
## 0.8966079 1.2110065 0.9958742 2.4173715
## attr(,"names.sup.coef")
## character(0)
## attr(,"fixed")
## (Intercept):Hotel B (Intercept):Hotel C price amenities
## FALSE FALSE FALSE FALSE
## attr(,"sup")
## character(0)
Lub przy pomocy stargazer (to samo tylko ladniej wyglada):
stargazer(condlog, coef=list(exp(condlog$coefficients)), p.auto = FALSE, type='text', se=NULL) # library(stargazer)
##
## ===============================================
## Dependent variable:
## ---------------------------
## choice
## -----------------------------------------------
## (Intercept):Hotel B 0.897
## (0.510)
##
## (Intercept):Hotel C 1.211
## (0.579)
##
## price 0.996***
## (0.001)
##
## amenities 2.417***
## (0.210)
##
## -----------------------------------------------
## Observations 51
## R2 0.444
## Log Likelihood -30.769
## LR Test 49.042*** (df = 4)
## ===============================================
## Note: *p<0.1; **p<0.05; ***p<0.01
INTERPRETACJ CENY [0.996] Iloraz szans dla ceny wynosi 0.996, zatem wzrost ceny pobytu w danym hotelu o 1 zl powoduje spadek szanswybrania tego hotelu wzgledem pozostalych hoteli o ok. 0.4 %, ceteris paribus
INTERPRETACJA AMENITIES [2.417]: Przyrost udogodniej o 1 powoduje wzrost szans wybrania danego hotelu względem pozostałych hoteli o ok. 142%.
Jak mamy coś poniżej 1 to jest to spadek szans,
EFEKTY KRAŃCOWE:
effects(condlog, covariate = "price")
## Hotel A Hotel B Hotel C
## Hotel A -0.0008483782 0.0003459689 0.0005024093
## Hotel B 0.0003459689 -0.0008516350 0.0005056661
## Hotel C 0.0005024093 0.0005056661 -0.0010080754
INTERPRETACJA Przy pozostalych czynnikach ustalonych na przecietnym poziomie: Wzrost ceny pobytu w hotelu A o 1zl powoduje spadek prawdopodobienstwa wyboru tego hotelu o ok. 0.00085 i jednoczesnie wzrost prawdopodobienstwa wyboru hotelu B o ok. 0.00035 i hotelu C o ok. 0.0005 (zauwaz ze spadek prawdopod. oznacza wzrost pradwpodob. gdzies indziej, tzn. efekty krancowe beda sumowaly sie do 0)
Zinterpretuj dla zmiany ceny pobytu w hotelu C: Przy pozostalych czynnikach ustalonych na przecietnym poziomie: Wzrost ceny pobytu w hotelu A o 1zl powoduje spadek prawdopodobienstwa wyboru tego hotelu o ok. -0.001 i jednoczesnie wzrost prawdopodobienstwa wyboru hotelu A i hotelu B o ok. 0.0005.
effects(condlog, covariate = "amenities")
## Hotel A Hotel B Hotel C
## Hotel A 0.18112806 -0.07386408 -0.1072640
## Hotel B -0.07386408 0.18182339 -0.1079593
## Hotel C -0.10726386 -0.10795919 0.2152230
Wzrost liczby preferowanych udogodnień w hotelu A o 1 powoduje wzrost prawdopodobieństwa wyboru tego hotelu o ok. 0.18 i jednocześnie spadek prawdopodobieństwa wyboru hotelu B o ok. 0.07 i hotelu C o ok. 0.11 (znowu efekty krańcowe będą sumowały się do 0 ) i ewentualnie modyfikowac do pozadanych wartosci zm. objasniajacych (wystarczy zmodyfikowac tylko zm. objasniajace, reszte kolumn mozna zostawic, gdyz nie biora udzialu w predict).
Predykcja: ze wzgledu na specyficzny format danych wesciowych dla mlogit (a wiec i dla predict po mlogit). Najlatwiej “wyciac” wektor z danych wejsciowych Odp: prawdopodobnieństwo wybrania hotelu C wynosi 0.99.
przyklad<-hotels[1:3,]
head(przyklad)
## # A tibble: 3 x 5
## customer location price amenities choice
## <dbl> <chr> <dbl> <dbl> <dbl>
## 1 1 Hotel A 876 3 0
## 2 1 Hotel B 766 5 0
## 3 1 Hotel C 367 9 1
predict(condlog, newdata = przyklad)
## Hotel A Hotel B Hotel C
## 0.0005021636 0.0041461289 0.9953517075
Oszacuj prawdopodobienstwa wybrania kazdego z dostepnych hoteli dla przykladowego wektora zmiennych objasniajacych (czyli pewnej konkretnej oferty dostepnej dla danego klienta): 1) Hotel A: cena=600, liczba udogodnien=6 Hotel B: cena=500, liczba udogodnien=5 Hotel C: cena=400, liczba udogodnien=4
Odp: prawdopodobienstwo wybrania hotelu A wynosi prawie 0,49.
#TU SOBIE PODMIENIAMY
przykad1 = przyklad
przykad1$price = c(600, 500, 400)
przykad1$amenities = c(6,5,4)
przykad1
## # A tibble: 3 x 5
## customer location price amenities choice
## <dbl> <chr> <dbl> <dbl> <dbl>
## 1 1 Hotel A 600 6 0
## 2 1 Hotel B 500 5 0
## 3 1 Hotel C 400 4 1
predict(condlog, newdata = przykad1)
## Hotel A Hotel B Hotel C
## 0.4915036 0.2756378 0.2328586
Ktory hotel zostanie wybrany z najwiekszym prawdopodobienstwem ?
przykad2 = przyklad
przykad2$price = c(450, 500, 300)
przykad2$amenities = c(1,3,2)
przykad2
## # A tibble: 3 x 5
## customer location price amenities choice
## <dbl> <chr> <dbl> <dbl> <dbl>
## 1 1 Hotel A 450 1 0
## 2 1 Hotel B 500 3 0
## 3 1 Hotel C 300 2 1
predict(condlog, newdata = przykad2)
## Hotel A Hotel B Hotel C
## 0.09342499 0.39808509 0.50848993