Stručne: Táto práca porovnáva klasickú lineárnu regresiu s kvantilovou regresiou na firemných dátach. Hlavnou sledovanou premennou je zisk firmy a cieľom je zistiť, či sa vplyv tržieb líši pri nízkych, stredných a vysokých hodnotách zisku.

1 Úvod

Cieľom tejto práce je ukázať využitie kvantilovej regresie na reálnom datasete company_data.csv. Dataset obsahuje údaje o objednávkach, tržbách, nákladoch, zisku, produktoch, regiónoch a predajných kanáloch.

Podobne ako vo vzorovej práci použijeme princíp kvantilovej regresie, ale namiesto ukážkových dát ho aplikujeme na vlastný firemný dataset. Budeme skúmať, ako sa mení vzťah medzi tržbami (Sales) a ziskom (Profit) v rôznych častiach rozdelenia zisku.

Klasická lineárna regresia OLS odpovedá na otázku, ako sa mení priemerný zisk pri zmene tržieb. Kvantilová regresia ide ďalej a umožňuje zistiť, či je tento vzťah iný pri nízkych, stredných a vysokých hodnotách zisku.

2 Teoretický základ

V klasickej lineárnej regresii modelujeme podmienený priemer:

\[ E(y_i \mid x_i) = \beta_0 + \beta_1 x_i. \]

V kvantilovej regresii modelujeme podmienený kvantil:

\[ Q_{\tau}(y_i \mid x_i) = \beta_0(\tau) + \beta_1(\tau)x_i, \]

kde \(\tau\) označuje vybraný kvantil. Napríklad:

  • \(\tau = 0{,}25\) predstavuje 25. percentil,
  • \(\tau = 0{,}50\) predstavuje medián,
  • \(\tau = 0{,}75\) predstavuje 75. percentil.

Ak sa koeficienty medzi kvantilmi výrazne líšia, znamená to, že vplyv vysvetľujúcej premennej nie je rovnaký pre nízke, stredné a vysoké hodnoty závislej premennej.

3 Načítanie a príprava dát

company_data <- read.csv("company_data.csv", check.names = TRUE)

# Kontrola rozmerov datasetu
dim(company_data)
## [1] 15000    17
# Prvé riadky datasetu
head(company_data)
##   Order.ID Order.Date   Unit.Cost  Price Order.Qty Cost.of.Sales     Sales
## 1     7077  9/13/2017  76.0949677 304.00         9     684.85471 2714.7200
## 2      117  8/20/2016   7.4917528  12.99         4      29.96701   50.1414
## 3     7018   7/8/2016  10.1223377 159.99         9      91.10104 1395.1128
## 4      140  8/11/2018   0.5761533  25.69        18      10.37076  462.4200
## 5      491  7/15/2017 108.5087768 304.00         9     976.57899 2614.4000
## 6       58  10/2/2018  77.9850288 299.00        24    1871.64069 7056.4000
##       Profit Channel                 Promotion.Name
## 1 2029.86529   Store      European Spring Promotion
## 2   20.17439   Store      European Spring Promotion
## 3 1304.01176   Store      European Spring Promotion
## 4  452.04924   Store North America Spring Promotion
## 5 1637.82101  Online         Asian Spring Promotion
## 6 5184.75931  Online         Asian Summer Promotion
##                                     Product.Name      Manufacturer
## 1                   Contoso SLR Camera M143 Grey      Contoso, Ltd
## 2              Contoso 512MB MP3 Player E51 Blue      Contoso, Ltd
## 3 Contoso DVD 9-Inch Player Portable M300 Silver      Contoso, Ltd
## 4        NT Bluetooth Stereo Headphones E52 Pink Northwind Traders
## 5                   Contoso SLR Camera M143 Grey      Contoso, Ltd
## 6                 SV Car Video TFT7 M7000 Silver  Southridge Video
##   Product.Sub.Category              Product.Category        Region     City
## 1  Digital SLR Cameras       Cameras and camcorders         Europe   Moscow
## 2              MP4&MP3                         Audio        Europe   Moscow
## 3            Movie DVD Music, Movies and Audio Books        Europe   Moscow
## 4 Bluetooth Headphones                         Audio North America Bellevue
## 5  Digital SLR Cameras       Cameras and camcorders           Asia  Beijing
## 6            Car Video                  TV and Video          Asia  Beijing
##         Country
## 1        Russia
## 2        Russia
## 3        Russia
## 4 United States
## 5         China
## 6         China

Po načítaní dát R automaticky upravil názvy premenných tak, aby sa dali jednoducho používať v kóde. Napríklad názov Order Qty sa zmenil na Order.Qty a Unit Cost na Unit.Cost.

names(company_data)
##  [1] "Order.ID"             "Order.Date"           "Unit.Cost"           
##  [4] "Price"                "Order.Qty"            "Cost.of.Sales"       
##  [7] "Sales"                "Profit"               "Channel"             
## [10] "Promotion.Name"       "Product.Name"         "Manufacturer"        
## [13] "Product.Sub.Category" "Product.Category"     "Region"              
## [16] "City"                 "Country"

4 Výber premenných

Pre analýzu použijeme najmä tieto premenné:

  • Profit – zisk, závislá premenná,
  • Sales – tržby,
  • Price – cena produktu,
  • Order.Qty – objednané množstvo,
  • Unit.Cost – jednotkové náklady,
  • Region – región predaja,
  • Channel – predajný kanál.

Pre istotu odstránime riadky s chýbajúcimi hodnotami vo vybraných premenných.

analysis_data <- company_data %>%
  select(Profit, Sales, Price, Order.Qty, Unit.Cost, Region, Channel, Product.Category) %>%
  drop_na()

summary(analysis_data)
##      Profit            Sales              Price           Order.Qty      
##  Min.   : -838.4   Min.   :    4.75   Min.   :   0.95   Min.   :   4.00  
##  1st Qu.:  242.2   1st Qu.:  645.00   1st Qu.:  59.00   1st Qu.:   9.00  
##  Median : 1012.7   Median : 2301.18   Median : 205.00   Median :  10.00  
##  Mean   : 2105.8   Mean   : 3692.78   Mean   : 296.51   Mean   :  16.74  
##  3rd Qu.: 2573.1   3rd Qu.: 4767.72   3rd Qu.: 366.00   3rd Qu.:  13.00  
##  Max.   :55692.6   Max.   :78312.00   Max.   :2899.99   Max.   :1560.00  
##    Unit.Cost            Region            Channel          Product.Category  
##  Min.   :1.580e-03   Length:15000       Length:15000       Length:15000      
##  1st Qu.:1.685e+01   Class :character   Class :character   Class :character  
##  Median :6.969e+01   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :1.244e+02                                                           
##  3rd Qu.:1.643e+02                                                           
##  Max.   :1.896e+03

5 Deskriptívna štatistika

desc_table <- analysis_data %>%
  summarise(
    pocet_pozorovani = n(),
    priemerny_zisk = mean(Profit),
    median_zisku = median(Profit),
    minimum_zisku = min(Profit),
    maximum_zisku = max(Profit),
    priemerne_trzby = mean(Sales),
    median_trzieb = median(Sales)
  )

kable(desc_table, digits = 2, caption = "Základná deskriptívna štatistika")
Základná deskriptívna štatistika
pocet_pozorovani priemerny_zisk median_zisku minimum_zisku maximum_zisku priemerne_trzby median_trzieb
15000 2105.83 1012.68 -838.43 55692.57 3692.78 2301.18

Deskriptívna štatistika ukazuje, že v datasete existujú objednávky s veľmi rozdielnou úrovňou tržieb a zisku. Práve preto je vhodné použiť kvantilovú regresiu, pretože tá dokáže zachytiť rozdiely medzi nízkymi, strednými a vysokými hodnotami zisku.

6 Grafický pohľad na vzťah medzi tržbami a ziskom

Kvôli prehľadnosti grafu zobrazíme náhodnú vzorku pozorovaní. Modely však budú odhadnuté na celom datasete.

set.seed(123)
plot_data <- analysis_data %>%
  sample_n(size = min(2000, nrow(analysis_data)))
ggplot(plot_data, aes(x = Sales, y = Profit)) +
  geom_point(alpha = 0.35) +
  labs(
    title = "Vzťah medzi tržbami a ziskom",
    subtitle = "Každý bod predstavuje jednu objednávku",
    x = "Tržby (Sales)",
    y = "Zisk (Profit)"
  ) +
  theme_minimal()

Z grafu vidíme, že medzi tržbami a ziskom existuje pozitívny vzťah. Vyššie tržby sú vo všeobecnosti spojené s vyšším ziskom. Zároveň však neplatí, že všetky objednávky s rovnakými tržbami majú rovnaký zisk. Rozptyl zisku sa pri vyšších tržbách mení, čo je typická situácia, pri ktorej môže byť kvantilová regresia užitočnejšia ako samotná OLS regresia.

7 OLS regresia

Najskôr odhadneme klasický lineárny model, v ktorom vysvetľujeme zisk pomocou tržieb.

ols_simple <- lm(Profit ~ Sales, data = analysis_data)
summary(ols_simple)
## 
## Call:
## lm(formula = Profit ~ Sales, data = analysis_data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -18903.0   -375.8    128.2    407.7  16802.4 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -1.734e+02  1.535e+01   -11.3   <2e-16 ***
## Sales        6.172e-01  2.496e-03   247.3   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1503 on 14998 degrees of freedom
## Multiple R-squared:  0.8031, Adjusted R-squared:  0.8031 
## F-statistic: 6.116e+04 on 1 and 14998 DF,  p-value: < 2.2e-16

OLS regresia ukazuje priemerný vzťah medzi tržbami a ziskom. Koeficient pri premennej Sales hovorí, o koľko sa v priemere zmení zisk, ak sa tržby zvýšia o jednu jednotku.

8 Kvantilová regresia

Teraz odhadneme kvantilové regresie pre tri časti rozdelenia zisku:

    1. percentil – objednávky s nižším ziskom,
    1. percentil – mediánový zisk,
    1. percentil – objednávky s vyšším ziskom.
qr_25 <- rq(Profit ~ Sales, tau = 0.25, data = analysis_data)
qr_50 <- rq(Profit ~ Sales, tau = 0.50, data = analysis_data)
qr_75 <- rq(Profit ~ Sales, tau = 0.75, data = analysis_data)
coef_table <- rbind(
  OLS = coef(ols_simple),
  Q25 = coef(qr_25),
  Q50 = coef(qr_50),
  Q75 = coef(qr_75)
)

kable(coef_table, digits = 4, caption = "Porovnanie koeficientov OLS a kvantilovej regresie")
Porovnanie koeficientov OLS a kvantilovej regresie
(Intercept) Sales
OLS -173.3992 0.6172
Q25 -47.8141 0.3854
Q50 -27.1785 0.5940
Q75 -7.6748 0.7930

Ak sa koeficient pri Sales líši medzi jednotlivými kvantilmi, znamená to, že vplyv tržieb na zisk nie je rovnaký pre objednávky s nízkym, stredným a vysokým ziskom.

9 Grafické porovnanie regresných priamok

ggplot(plot_data, aes(x = Sales, y = Profit)) +
  geom_point(alpha = 0.25) +
  geom_abline(
    intercept = coef(ols_simple)[1],
    slope = coef(ols_simple)[2],
    linewidth = 1
  ) +
  geom_abline(
    intercept = coef(qr_25)[1],
    slope = coef(qr_25)[2],
    linetype = "dashed",
    linewidth = 1
  ) +
  geom_abline(
    intercept = coef(qr_50)[1],
    slope = coef(qr_50)[2],
    linetype = "dotdash",
    linewidth = 1
  ) +
  geom_abline(
    intercept = coef(qr_75)[1],
    slope = coef(qr_75)[2],
    linetype = "longdash",
    linewidth = 1
  ) +
  labs(
    title = "OLS a kvantilová regresia",
    subtitle = "Plná čiara = OLS, prerušované čiary = kvantilové regresie Q25, Q50 a Q75",
    x = "Tržby (Sales)",
    y = "Zisk (Profit)"
  ) +
  theme_minimal()

Graf ukazuje, ako sa odhadnuté regresné priamky líšia v rôznych častiach rozdelenia zisku. Ak majú kvantilové priamky rozdielny sklon, naznačuje to heterogénny vzťah medzi tržbami a ziskom.

10 Viaceré kvantily naraz

Okrem troch vybraných kvantilov môžeme odhadnúť aj celý rad kvantilov od 10. po 90. percentil.

taus <- seq(0.1, 0.9, by = 0.1)
qr_many <- rq(Profit ~ Sales, tau = taus, data = analysis_data)

coef_many <- data.frame(
  tau = taus,
  intercept = coef(qr_many)[1, ],
  slope_sales = coef(qr_many)[2, ]
)

kable(coef_many, digits = 4, caption = "Koeficient Sales pri rôznych kvantiloch")
Koeficient Sales pri rôznych kvantiloch
tau intercept slope_sales
tau= 0.1 0.1 -46.8499 0.2006
tau= 0.2 0.2 -59.1597 0.3443
tau= 0.3 0.3 -42.1156 0.4270
tau= 0.4 0.4 -36.2783 0.5141
tau= 0.5 0.5 -27.1785 0.5940
tau= 0.6 0.6 -18.9612 0.6710
tau= 0.7 0.7 -10.8338 0.7529
tau= 0.8 0.8 -5.3856 0.8333
tau= 0.9 0.9 -5.4373 0.9242
ggplot(coef_many, aes(x = tau, y = slope_sales)) +
  geom_line(linewidth = 1) +
  geom_point(size = 2) +
  geom_hline(yintercept = coef(ols_simple)[2], linetype = "dashed") +
  labs(
    title = "Vývoj koeficientu Sales naprieč kvantilmi",
    subtitle = "Čiarkovaná horizontálna čiara predstavuje koeficient z OLS regresie",
    x = "Kvantil (tau)",
    y = "Koeficient pri premennej Sales"
  ) +
  theme_minimal()

Tento graf je dôležitý, pretože ukazuje, či sa vplyv tržieb na zisk mení naprieč rozdelením zisku. Ak je čiara rastúca alebo klesajúca, znamená to, že efekt tržieb nie je rovnaký pre všetky úrovne zisku.

11 Rozšírený model s viacerými premennými

V jednoduchom modeli sme použili iba tržby. V praxi však môže zisk ovplyvňovať viac faktorov, napríklad cena, množstvo objednávky, jednotkové náklady, región alebo predajný kanál.

Preto odhadneme aj rozšírený model:

\[ Profit = \beta_0 + \beta_1 Sales + \beta_2 Price + \beta_3 OrderQty + \beta_4 UnitCost + \varepsilon. \]

ols_extended <- lm(Profit ~ Sales + Price + Order.Qty + Unit.Cost, data = analysis_data)
qr_extended_25 <- rq(Profit ~ Sales + Price + Order.Qty + Unit.Cost, tau = 0.25, data = analysis_data)
qr_extended_50 <- rq(Profit ~ Sales + Price + Order.Qty + Unit.Cost, tau = 0.50, data = analysis_data)
qr_extended_75 <- rq(Profit ~ Sales + Price + Order.Qty + Unit.Cost, tau = 0.75, data = analysis_data)
extended_table <- rbind(
  OLS = coef(ols_extended),
  Q25 = coef(qr_extended_25),
  Q50 = coef(qr_extended_50),
  Q75 = coef(qr_extended_75)
)

kable(extended_table, digits = 4, caption = "Rozšírený model: porovnanie koeficientov")
Rozšírený model: porovnanie koeficientov
(Intercept) Sales Price Order.Qty Unit.Cost
OLS 11.4087 0.5917 4.8466 -0.5768 -12.1992
Q25 4.3295 0.4800 5.2298 -1.4325 -10.7736
Q50 2.7004 0.5819 4.1809 -0.2700 -10.0000
Q75 10.1903 0.6919 3.3342 0.4043 -10.3165

Rozšírený model umožňuje kontrolovať aj ďalšie premenné. Vďaka tomu vieme lepšie posúdiť, či sa vplyv tržieb, ceny, množstva a nákladov líši pri nízkych, stredných a vysokých hodnotách zisku.

12 Porovnanie zisku podľa regiónu

Pre lepšie pochopenie datasetu sa pozrieme aj na priemerný zisk podľa regiónu.

region_summary <- analysis_data %>%
  group_by(Region) %>%
  summarise(
    pocet_objednavok = n(),
    priemerny_zisk = mean(Profit),
    median_zisku = median(Profit),
    .groups = "drop"
  ) %>%
  arrange(desc(priemerny_zisk))

kable(region_summary, digits = 2, caption = "Priemerný a mediánový zisk podľa regiónu")
Priemerný a mediánový zisk podľa regiónu
Region pocet_objednavok priemerny_zisk median_zisku
Asia 3050 2342.52 1120.63
North America 8869 2104.95 1013.38
Europe 3081 1874.04 915.78
ggplot(region_summary, aes(x = reorder(Region, priemerny_zisk), y = priemerny_zisk)) +
  geom_col() +
  coord_flip() +
  labs(
    title = "Priemerný zisk podľa regiónu",
    x = "Región",
    y = "Priemerný zisk"
  ) +
  theme_minimal()

13 Interpretácia výsledkov

Výsledky ukazujú, že medzi tržbami a ziskom existuje pozitívny vzťah. OLS regresia poskytuje jeden priemerný odhad tohto vzťahu. Kvantilová regresia však ukazuje, či sa tento vzťah líši medzi objednávkami s nízkym, stredným a vysokým ziskom.

Ak je koeficient Sales vyšší vo vyšších kvantiloch, znamená to, že pri objednávkach s vyšším ziskom majú tržby silnejší vplyv na zisk. Ak je naopak nižší, znamená to, že rast tržieb sa v hornej časti rozdelenia nepremieta do zisku rovnako výrazne.

Rozšírený model navyše ukazuje, že zisk môže byť ovplyvnený aj cenou, objednaným množstvom a jednotkovými nákladmi. Práve kvantilová regresia nám umožňuje vidieť, či tieto faktory pôsobia odlišne pri rôznych úrovniach zisku.

14 Záver

Kvantilová regresia je užitočným rozšírením klasickej lineárnej regresie. Zatiaľ čo OLS skúma priemerný vzťah medzi premennými, kvantilová regresia umožňuje analyzovať vzťah v rôznych častiach rozdelenia závislej premennej.

Na firemných dátach sme ukázali, že:

  1. tržby sú dôležitým faktorom pri vysvetľovaní zisku,
  2. vzťah medzi tržbami a ziskom sa môže líšiť podľa úrovne zisku,
  3. kvantilová regresia poskytuje detailnejší pohľad ako samotná OLS regresia,
  4. pri obchodných dátach je vhodné sledovať nielen priemerný efekt, ale aj správanie nízko a vysoko ziskových objednávok.

Z praktického hľadiska môže takáto analýza pomôcť firme lepšie pochopiť, ktoré objednávky prinášajú vyšší zisk a či sa faktory ovplyvňujúce zisk líšia medzi rôznymi skupinami objednávok.