S využitím databázy hotel_booking.csv database. V databáze sa nachádzajú údaje o hotelových rezerváciach, počte hostí, pošte dní pobytu, časový interval medzi rezerváciou a pobytom…
Pri ďalšej práci budeme používať knižnice
library(zoo)
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(tseries)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(lmtest)
library(sandwich)
library(car)
## Loading required package: carData
rm(list=ls())
Rozdhodli sme sa zamerať len na najzaujímavejšie číselné údaje spomedzi dostupných dát, a to is_canceled (či bola rezervácia zrušená), lead_time (počet dní medzi rezerváciou a pobytom), arrival_date_week_number (číslo týždňa pobytu v roku), stays_in_weekend_nights (počet víkondových dní pobytu), stays_in_week_nights (počet pracovných dní pobytu), previous_cancellations (počet predošlých zrušených rezervácií) a previous_bookings_not_canceled (počet nezrušených predošlých rezervácií).
udaje <- read.csv("Ekonometria/hotel_bookings.csv", header = TRUE, sep = ",", dec = ".")
udaje.new <- udaje[udaje$is_canceled == 1,
c("lead_time","arrival_date_week_number","stays_in_weekend_nights",
"stays_in_week_nights","previous_cancellations","previous_bookings_not_canceled")]
column_medians <- sapply(udaje.new, median, na.rm = TRUE)
udaje_imputed <- udaje.new
for (col in names(udaje.new)) {
udaje_imputed[[col]][is.na(udaje_imputed[[col]])] <- column_medians[col]
}
udaje.new <- udaje_imputed
sapply(udaje.new, is.numeric) # rýchla kontrola typov
## lead_time arrival_date_week_number
## TRUE TRUE
## stays_in_weekend_nights stays_in_week_nights
## TRUE TRUE
## previous_cancellations previous_bookings_not_canceled
## TRUE TRUE
Teraz chceme vidieť tvar údajov.
head(udaje.new)
# Determine number of plots
num_plots <- length(names(udaje.new))
num_plots
## [1] 6
# Set the layout: 2 rows × 2 columns
par(mfrow = c(2, 3))
par(mar = c(4, 4, 2, 1)) # Adjust margins (optional)
# Loop through columns and plot each boxplot
for (col in names(udaje.new)) {
boxplot(udaje.new[[col]], main = col, xlab = "Value", col = "lightblue")
}
# Add a global caption / title
mtext("Boxploty jednotlivých premenných", outer = TRUE, cex = 1.4, font = 2)
# Reset layout to default (1 plot per figure)
#par(mfrow = c(1, 1))
Boxploty krásne vykreslujú stav jednotlivých premenných. Najviac výrazné sú outliery, ľudia, ktorí príliš často rušia rezervácie, alebo využívajú hotel namiesto prenájmu apartmánu na dlhú dobu.
colnames(udaje.new)
## [1] "lead_time" "arrival_date_week_number"
## [3] "stays_in_weekend_nights" "stays_in_week_nights"
## [5] "previous_cancellations" "previous_bookings_not_canceled"
model <- lm(lead_time ~ +1 + arrival_date_week_number + stays_in_weekend_nights + stays_in_week_nights + previous_cancellations + previous_bookings_not_canceled, data=udaje.new)
model
##
## Call:
## lm(formula = lead_time ~ +1 + arrival_date_week_number + stays_in_weekend_nights +
## stays_in_week_nights + previous_cancellations + previous_bookings_not_canceled,
## data = udaje.new)
##
## Coefficients:
## (Intercept) arrival_date_week_number
## 101.342 1.498
## stays_in_weekend_nights stays_in_week_nights
## -8.162 3.395
## previous_cancellations previous_bookings_not_canceled
## 7.649 -5.576
Objekt triedy lm() nám poskytuje niekoľko výsledkov:
summary(model)
##
## Call:
## lm(formula = lead_time ~ +1 + arrival_date_week_number + stays_in_weekend_nights +
## stays_in_week_nights + previous_cancellations + previous_bookings_not_canceled,
## data = udaje.new)
##
## Residuals:
## Min 1Q Median 3Q Max
## -265.77 -89.10 -24.55 68.37 504.79
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 101.34182 1.50034 67.546 < 2e-16 ***
## arrival_date_week_number 1.49792 0.04234 35.375 < 2e-16 ***
## stays_in_weekend_nights -8.16160 0.62500 -13.059 < 2e-16 ***
## stays_in_week_nights 3.39482 0.33535 10.123 < 2e-16 ***
## previous_cancellations 7.64900 0.41774 18.310 < 2e-16 ***
## previous_bookings_not_canceled -5.57589 0.81776 -6.818 9.32e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 116.2 on 44218 degrees of freedom
## Multiple R-squared: 0.04101, Adjusted R-squared: 0.0409
## F-statistic: 378.2 on 5 and 44218 DF, p-value: < 2.2e-16
Podľa výsledku lineárnej regresie vidíme, že všetky nami vybrané údaje štatisticky významné pre sledovanie počtu dní medzi rezerváciou a pobytom.
# Nastaviť rozloženie 2 x 2
par(mfrow = c(2, 2))
# Vykresliť všetky 4 diagnostické grafy modelu
plot(model)
Diagnostické grafy regresného modelu
# (Voliteľné) pridať spoločný nadpis
#mtext("Diagnostické grafy regresného modelu", outer = TRUE, cex = 1.2, font = 2)
# Resetovať layout
par(mfrow = c(1, 1))
Na základe diagnostických grafov možno konštatovať, že: - predpoklady
lineárneho modelu nie sú úplne splnené - reziduá nevykazujú konštantný
rozptyl - rozdelenie reziduí sa odchyľuje od normálneho
- niektoré pozorovania majú výrazný vplyv na výsledky
Podľa výsledku lm modelu sú všetky naše dáta relevantné, ale grafy nám nevychádzajú až tak pekne, ako by sme si želali. Preto si upravíme outliery.
# normality tests
residuals <- residuals(model)
jb_test <- jarque.bera.test(residuals)
jb_test
##
## Jarque Bera Test
##
## data: residuals
## X-squared = 9237.4, df = 2, p-value < 2.2e-16
# outlier test (see p-value for Bonferroni correction)
outlier_test <- outlierTest(model)
outlier_test
## No Studentized residuals with Bonferroni p < 0.05
## Largest |rstudent|:
## rstudent unadjusted p-value Bonferroni p
## 65232 4.346172 1.3884e-05 0.61402