1. Úvod

Cieľom tejto práce je porovnať výsledky klasickej lineárnej regresie odhadovanej metódou OLS s výsledkami kvantilovej regresie na vlastných údajoch.

V práci používame dáta zo zápasov basketbalovej súťaže EuroLeague. Každé pozorovanie predstavuje jeden zápas. V datasete sa nachádzajú informácie o tímoch, dátume zápasu, počte bodov domácich a hostí, ako aj o bodoch v jednotlivých častiach zápasu.

Hlavná výskumná otázka je:

Ako počet bodov v prvom polčase súvisí s počtom bodov v druhom polčase a líši sa tento vzťah pri zápasoch s nízkym, stredným a vysokým počtom bodov v druhom polčase?

Na túto otázku použijeme dva prístupy:

Budeme odhadovať kvantilové regresie pre:

2. Dáta

Dataset načítame zo súboru euroleague_dset_csv_03_19.csv.

data_raw <- read_csv("cviko_8/euroleague_dset_csv_03_19.csv")
head(data_raw)
## # A tibble: 6 × 21
##   DATE   HT    AT       HS    AS   Q1H   Q1A   Q2H   Q2A   Q3H   Q3A   Q4H   Q4A
##   <chr>  <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 19.05… Anad… CSKA…    83    91    20    29    22    15    20    24    21    23
## 2 19.05… Fene… Real…     5    94    16    24    24    14    23    31    12    25
## 3 17.05… CSKA… Real…    95    90    18    22    25    23    22    28    30    17
## 4 17.05… Fene… Anad…    73    92    20    19    20    26    17    23    16    24
## 5 01.05… Anad… Barc…    80    71    23    28    24    14    14    15    19    14
## 6 26.04… Barc… Anad…    82    72    15    22    21    16    27    12    19    22
## # ℹ 8 more variables: P1H <dbl>, P1A <dbl>, P2H <dbl>, P2A <dbl>, P1T <dbl>,
## #   P2T <dbl>, HTT <dbl>, FTT <dbl>
glimpse(data_raw)
## Rows: 3,715
## Columns: 21
## $ DATE <chr> "19.05.2019", "19.05.2019", "17.05.2019", "17.05.2019", "01.05.20…
## $ HT   <chr> "Anadolu Efes SK", "Fenerbahce Ulker", "CSKA Moscow", "Fenerbahce…
## $ AT   <chr> "CSKA Moscow", "Real Madrid", "Real Madrid", "Anadolu Efes SK", "…
## $ HS   <dbl> 83, 5, 95, 73, 80, 82, 83, 82, 68, 77, 82, 57, 78, 72, 80, 68, 75…
## $ AS   <dbl> 91, 94, 90, 92, 71, 72, 92, 99, 102, 84, 89, 66, 63, 74, 82, 78, …
## $ Q1H  <dbl> 20, 16, 18, 20, 23, 15, 22, 16, 20, 18, 18, 19, 21, 16, 21, 18, 2…
## $ Q1A  <dbl> 29, 24, 22, 19, 28, 22, 20, 30, 26, 28, 23, 15, 8, 19, 20, 27, 17…
## $ Q2H  <dbl> 22, 24, 25, 20, 24, 21, 26, 25, 19, 21, 23, 15, 14, 18, 18, 19, 2…
## $ Q2A  <dbl> 15, 14, 23, 26, 14, 16, 19, 19, 26, 18, 13, 16, 18, 19, 26, 15, 1…
## $ Q3H  <dbl> 20, 23, 22, 17, 14, 27, 23, 20, 18, 20, 17, 12, 26, 25, 19, 15, 1…
## $ Q3A  <dbl> 24, 31, 28, 23, 15, 12, 29, 23, 32, 16, 22, 18, 15, 24, 27, 24, 1…
## $ Q4H  <dbl> 21, 12, 30, 16, 19, 19, 12, 21, 11, 18, 24, 11, 17, 13, 22, 16, 1…
## $ Q4A  <dbl> 23, 25, 17, 24, 14, 22, 24, 27, 18, 22, 31, 17, 22, 12, 9, 12, 20…
## $ P1H  <dbl> 42, 40, 43, 40, 47, 36, 48, 41, 39, 39, 41, 34, 35, 34, 39, 37, 4…
## $ P1A  <dbl> 44, 38, 45, 45, 42, 38, 39, 49, 52, 46, 36, 31, 26, 38, 46, 42, 3…
## $ P2H  <dbl> 41, 35, 52, 33, 33, 46, 35, 41, 29, 38, 41, 23, 43, 38, 41, 31, 3…
## $ P2A  <dbl> 47, 56, 45, 47, 29, 34, 53, 50, 50, 38, 53, 35, 37, 36, 36, 36, 3…
## $ P1T  <dbl> 86, 78, 88, 85, 89, 74, 87, 90, 91, 85, 77, 65, 61, 72, 85, 79, 7…
## $ P2T  <dbl> 88, 91, 97, 80, 62, 80, 88, 91, 79, 76, 94, 58, 80, 74, 77, 67, 6…
## $ HTT  <dbl> 86, 78, 88, 85, 89, 74, 87, 90, 91, 85, 77, 65, 61, 72, 85, 79, 7…
## $ FTT  <dbl> 174, 169, 185, 165, 151, 154, 175, 181, 170, 161, 171, 123, 141, …

V pôvodnom datasete používame najmä tieto premenné:

Ako závislú premennú používame P2T, teda počet bodov v druhom polčase. Táto voľba je vhodná preto, že nás zaujíma, či vývoj v prvom polčase súvisí s následným skórovaním v druhom polčase.

3. Úprava dát a tvorba premenných

Vytvoríme pracovný dataset, v ktorom upravíme dátum, vytvoríme rok zápasu a premennú vyjadrujúcu absolútny rozdiel v skóre po prvom polčase.

data_model <- data_raw %>%
  mutate(
    DATE = as.Date(DATE, format = "%d.%m.%Y"),
    year = as.numeric(format(DATE, "%Y")),
    year_c = year - min(year, na.rm = TRUE),
    first_half_points = P1T,
    second_half_points = P2T,
    halftime_margin = P1H - P1A,
    abs_halftime_margin = abs(halftime_margin),
    total_points = FTT
  ) %>%
  filter(
    !is.na(DATE),
    first_half_points > 0,
    second_half_points > 0
  )
head(data_model)
## # A tibble: 6 × 28
##   DATE       HT      AT       HS    AS   Q1H   Q1A   Q2H   Q2A   Q3H   Q3A   Q4H
##   <date>     <chr>   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2019-05-19 Anadol… CSKA…    83    91    20    29    22    15    20    24    21
## 2 2019-05-19 Fenerb… Real…     5    94    16    24    24    14    23    31    12
## 3 2019-05-17 CSKA M… Real…    95    90    18    22    25    23    22    28    30
## 4 2019-05-17 Fenerb… Anad…    73    92    20    19    20    26    17    23    16
## 5 2019-05-01 Anadol… Barc…    80    71    23    28    24    14    14    15    19
## 6 2019-04-26 Barcel… Anad…    82    72    15    22    21    16    27    12    19
## # ℹ 16 more variables: Q4A <dbl>, P1H <dbl>, P1A <dbl>, P2H <dbl>, P2A <dbl>,
## #   P1T <dbl>, P2T <dbl>, HTT <dbl>, FTT <dbl>, year <dbl>, year_c <dbl>,
## #   first_half_points <dbl>, second_half_points <dbl>, halftime_margin <dbl>,
## #   abs_halftime_margin <dbl>, total_points <dbl>
data_model %>%
  summarise(
    pocet_zapasov = n(),
    priemer_1_polcas = mean(first_half_points),
    median_1_polcas = median(first_half_points),
    priemer_2_polcas = mean(second_half_points),
    median_2_polcas = median(second_half_points),
    priemer_rozdiel_polcas = mean(abs_halftime_margin),
    median_rozdiel_polcas = median(abs_halftime_margin)
  ) %>%
  kable(digits = 2, caption = "Základné opisné štatistiky použitých premenných")
Základné opisné štatistiky použitých premenných
pocet_zapasov priemer_1_polcas median_1_polcas priemer_2_polcas median_2_polcas priemer_rozdiel_polcas median_rozdiel_polcas
3713 76.46 76 76.56 76 7.85 7

Grafické zobrazenie dát

Najprv zobrazíme vzťah medzi počtom bodov v prvom a druhom polčase.

ggplot(data_model, aes(x = first_half_points, y = second_half_points)) +
  geom_point(alpha = 0.4) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(
    title = "Vzťah medzi bodmi v prvom a druhom polčase",
    x = "Počet bodov v prvom polčase",
    y = "Počet bodov v druhom polčase"
  ) +
  theme_minimal()

4. Špecifikácia modelu

Základný OLS model má tvar:

\[ P2T_i = \beta_0 + \beta_1 P1T_i + \beta_2 AbsMargin_i + \beta_3 Year_i + u_i, \]

kde:

Pri OLS regresii odhadujeme podmienený priemer:

\[ E(P2T_i \mid X_i) = \beta_0 + \beta_1 P1T_i + \beta_2 AbsMargin_i + \beta_3 Year_i. \]

Pri kvantilovej regresii odhadujeme podmienený kvantil:

\[ Q_{\tau}(P2T_i \mid X_i) = \beta_0(\tau) + \beta_1(\tau)P1T_i + \beta_2(\tau)AbsMargin_i + \beta_3(\tau)Year_i. \]

5. Odhad OLS modelu

m_ols <- lm(
  second_half_points ~ first_half_points + abs_halftime_margin + year_c,
  data = data_model
)

summary(m_ols)
## 
## Call:
## lm(formula = second_half_points ~ first_half_points + abs_halftime_margin + 
##     year_c, data = data_model)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -39.666  -7.853  -0.064   7.166  45.749 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         58.54202    1.33568  43.829   <2e-16 ***
## first_half_points    0.22064    0.01708  12.915   <2e-16 ***
## abs_halftime_margin  0.04092    0.03044   1.344   0.1790    
## year_c               0.09951    0.03903   2.550   0.0108 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 11.11 on 3709 degrees of freedom
## Multiple R-squared:  0.04786,    Adjusted R-squared:  0.04709 
## F-statistic: 62.14 on 3 and 3709 DF,  p-value: < 2.2e-16

Interpretácia OLS výsledkov

Premenná first_half_points je štatisticky významná, keďže jej p-hodnota je menšia ako 0,05. Odhadnutý koeficient 0,221 znamená, že ak sa počet bodov v prvom polčase zvýši o jeden bod, počet bodov v druhom polčase sa v priemere zvýši približne o 0,221 bodu, pri nezmenených ostatných premenných.

Premenná abs_halftime_margin má kladný koeficient 0,041, ale nie je štatisticky významná na 5 % hladine významnosti. To znamená, že v OLS modeli nemáme dostatočný dôkaz, že veľkosť rozdielu po prvom polčase významne ovplyvňuje počet bodov v druhom polčase.

Premenná year_c je štatisticky významná na 5 % hladine významnosti. Koeficient 0,100 naznačuje, že v novších sezónach sa počet bodov v druhom polčase mierne zvyšoval.

Hodnota R-squared je približne 0,048, čo znamená, že model vysvetľuje približne 4,8 % variability počtu bodov v druhom polčase. Ide o nízku hodnotu, čo naznačuje, že skórovanie v druhom polčase závisí aj od mnohých ďalších faktorov, ktoré v modeli nie sú zahrnuté.

6. Odhad kvantilových regresií

Teraz odhadneme kvantilové regresie pre dolný kvartil, medián a horný kvartil.

m_q25 <- rq(
  second_half_points ~ first_half_points + abs_halftime_margin + year_c,
  tau = 0.25,
  data = data_model
)

m_q50 <- rq(
  second_half_points ~ first_half_points + abs_halftime_margin + year_c,
  tau = 0.50,
  data = data_model
)

m_q75 <- rq(
  second_half_points ~ first_half_points + abs_halftime_margin + year_c,
  tau = 0.75,
  data = data_model
)

Výsledky pre dolný kvartil

summary(m_q25)
## 
## Call: rq(formula = second_half_points ~ first_half_points + abs_halftime_margin + 
##     year_c, tau = 0.25, data = data_model)
## 
## tau: [1] 0.25
## 
## Coefficients:
##                     Value    Std. Error t value  Pr(>|t|)
## (Intercept)         52.66322  1.67057   31.52418  0.00000
## first_half_points    0.19083  0.02132    8.94934  0.00000
## abs_halftime_margin  0.06706  0.04272    1.56966  0.11658
## year_c               0.10664  0.04875    2.18750  0.02877

Interpretácia dolného kvartilu

Dolný kvartil, teda \(\tau = 0{,}25\), opisuje zápasy s nižším počtom bodov v druhom polčase.

Pri dolnom kvartile je koeficient pri first_half_points rovný 0,191 a je štatisticky významný. To znamená, že pri zápasoch s nižším počtom bodov v druhom polčase je vyšší počet bodov v prvom polčase spojený s vyšším dolným kvartilom počtu bodov v druhom polčase.

Koeficient pri abs_halftime_margin je kladný, ale nie je štatisticky významný na 5 % hladine významnosti. Preto nemožno tvrdiť, že veľkosť rozdielu po prvom polčase má v dolnej časti rozdelenia jednoznačný vplyv.

Premenná year_c je pri dolnom kvartile štatisticky významná. To naznačuje, že aj pri zápasoch s nižším skóre v druhom polčase existuje mierny rastúci trend v čase.

Výsledky pre medián

summary(m_q50)
## 
## Call: rq(formula = second_half_points ~ first_half_points + abs_halftime_margin + 
##     year_c, tau = 0.5, data = data_model)
## 
## tau: [1] 0.5
## 
## Coefficients:
##                     Value    Std. Error t value  Pr(>|t|)
## (Intercept)         57.78897  1.58853   36.37888  0.00000
## first_half_points    0.22730  0.02034   11.17730  0.00000
## abs_halftime_margin  0.07403  0.03549    2.08556  0.03709
## year_c               0.08368  0.04634    1.80576  0.07104

Interpretácia mediánu

Mediánová regresia, teda \(\tau = 0{,}50\), opisuje typický zápas z hľadiska počtu bodov v druhom polčase.

Pri mediánovej regresii je koeficient pri first_half_points rovný 0,227 a je štatisticky významný. To znamená, že pri typickom zápase je zvýšenie počtu bodov v prvom polčase o jeden bod spojené so zvýšením mediánu počtu bodov v druhom polčase približne o 0,227 bodu.

Koeficient pri abs_halftime_margin je rovný 0,074 a je štatisticky významný na 5 % hladine významnosti. To znamená, že pri mediáne väčší rozdiel po prvom polčase súvisí s mierne vyšším počtom bodov v druhom polčase.

Premenná year_c má kladný koeficient, ale jej p-hodnota je približne 0,071. To znamená, že na 5 % hladine významnosti nie je štatisticky významná, ale na 10 % hladine významnosti by sa dala považovať za slabo významnú.

Výsledky pre horný kvartil

summary(m_q75)
## 
## Call: rq(formula = second_half_points ~ first_half_points + abs_halftime_margin + 
##     year_c, tau = 0.75, data = data_model)
## 
## tau: [1] 0.75
## 
## Coefficients:
##                     Value    Std. Error t value  Pr(>|t|)
## (Intercept)         63.90968  2.07580   30.78797  0.00000
## first_half_points    0.24194  0.02664    9.08099  0.00000
## abs_halftime_margin  0.04839  0.04605    1.05085  0.29340
## year_c               0.12258  0.06087    2.01372  0.04411

Interpretácia horného kvartilu

Horný kvartil, teda \(\tau = 0{,}75\), opisuje zápasy s vyšším počtom bodov v druhom polčase.

Pri hornom kvartile je koeficient pri first_half_points rovný 0,242 a je štatisticky významný. To znamená, že pri zápasoch s vyšším počtom bodov v druhom polčase je zvýšenie počtu bodov v prvom polčase o jeden bod spojené so zvýšením horného kvartilu počtu bodov v druhom polčase približne o 0,242 bodu.

Koeficient pri abs_halftime_margin je kladný, ale nie je štatisticky významný. Preto nemožno tvrdiť, že veľkosť rozdielu po prvom polčase významne ovplyvňuje horný kvartil počtu bodov v druhom polčase.

Premenná year_c je štatisticky významná na 5 % hladine významnosti. To naznačuje, že pri zápasoch s vyšším počtom bodov v druhom polčase existuje mierny rastúci časový trend.

7. Porovnanie odhadnutých koeficientov

V tejto časti porovnáme koeficienty z OLS modelu a z kvantilových regresií.

coef_table <- rbind(
  OLS = coef(m_ols),
  Q25 = coef(m_q25),
  Q50 = coef(m_q50),
  Q75 = coef(m_q75)
)

kable(coef_table, digits = 4, caption = "Porovnanie odhadnutých koeficientov")
Porovnanie odhadnutých koeficientov
(Intercept) first_half_points abs_halftime_margin year_c
OLS 58.5420 0.2206 0.0409 0.0995
Q25 52.6632 0.1908 0.0671 0.1066
Q50 57.7890 0.2273 0.0740 0.0837
Q75 63.9097 0.2419 0.0484 0.1226

Interpretácia porovnania koeficientov

Porovnanie koeficientov ukazuje, či je vzťah medzi premennými rovnaký v rôznych častiach rozdelenia závislej premennej.

Pri premennej first_half_points môžeme porovnať koeficienty v dolnom, strednom a hornom kvartile. Ak je koeficient v hornom kvartile vyšší ako v dolnom kvartile, znamená to, že počet bodov v prvom polčase má silnejší vzťah s druhým polčasom pri zápasoch s vyšším počtom bodov v druhom polčase.

V našom prípade je koeficient pri first_half_points:

  • v OLS modeli: 0.221,
  • v dolnom kvartile: 0.191,
  • v mediáne: 0.227,
  • v hornom kvartile: 0.242.

Keďže koeficient v hornom kvartile je vyšší ako v dolnom kvartile, výsledky naznačujú, že vzťah medzi bodmi v prvom a druhom polčase je silnejší pri zápasoch s vyšším počtom bodov v druhom polčase. To znamená, že efekt nie je rovnaký v celom rozdelení závislej premennej.

8. Grafické porovnanie koeficientov

coef_long <- coef_table %>%
  as.data.frame() %>%
  rownames_to_column("model") %>%
  pivot_longer(
    cols = -model,
    names_to = "premenna",
    values_to = "koeficient"
  )

ggplot(coef_long, aes(x = model, y = koeficient, group = premenna)) +
  geom_line() +
  geom_point(size = 2) +
  facet_wrap(~ premenna, scales = "free_y") +
  labs(
    title = "Porovnanie koeficientov medzi OLS a kvantilovými regresiami",
    x = "Model",
    y = "Odhadnutý koeficient"
  ) +
  theme_minimal()

9. Záver

Výsledky OLS regresie ukázali, že počet bodov v prvom polčase má pozitívny a štatisticky významný vzťah s počtom bodov v druhom polčase. To znamená, že zápasy s vyšším skóre v prvom polčase majú tendenciu mať aj vyšší počet bodov v druhom polčase.

Kvantilová regresia ukázala, že tento vzťah nie je úplne rovnaký vo všetkých častiach rozdelenia. Koeficient pri počte bodov v prvom polčase rastie od dolného kvartilu cez medián až po horný kvartil. V dolnom kvartile je koeficient 0,191, v mediáne 0,227 a v hornom kvartile 0,242. To naznačuje, že vzťah medzi bodmi v prvom a druhom polčase je silnejší pri zápasoch, ktoré majú vyšší počet bodov v druhom polčase.

Naopak, premenná abs_halftime_margin nebola vo väčšine modelov štatisticky významná. Výnimkou je mediánová regresia, kde bola významná na 5 % hladine významnosti. Časový trend year_c bol vo väčšine modelov kladný, čo naznačuje mierny rast počtu bodov v druhom polčase v novších sezónach.

Celkovo môžeme povedať, že kvantilová regresia poskytla podrobnejší pohľad ako OLS. OLS ukázala iba priemerný vzťah, zatiaľ čo kvantilová regresia ukázala, že efekt počtu bodov v prvom polčase je silnejší v hornej časti rozdelenia počtu bodov v druhom polčase.