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.
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.
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:
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.
company_data <- read.csv("company_data.csv", check.names = TRUE)
# Kontrola rozmerov datasetu
dim(company_data)## [1] 15000 17
## 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.
## [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"
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
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")| 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.
Kvôli prehľadnosti grafu zobrazíme náhodnú vzorku pozorovaní. Modely však budú odhadnuté na celom datasete.
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.
Najskôr odhadneme klasický lineárny model, v ktorom vysvetľujeme zisk pomocou tržieb.
##
## 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.
Teraz odhadneme kvantilové regresie pre tri časti rozdelenia zisku:
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")| (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.
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.
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")| 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.
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")| (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.
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")| 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()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.
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:
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.