V tejto analýze skúmame dynamiku oznámení o prepúšťaní zamestnancov v
súvislosti s rozvojom umelej inteligencie (AI) na základe registra
ai-layoffs-register.csv.
Cieľom je overiť, či počet mesačných oznámení vykazuje rastúci lineárny trend v čase a ako sa na tomto vývoji prejavil rok 2026.
# Načítanie potrebných knižníc
library(broom)
library(knitr)
library(kableExtra)
library(ggplot2)
# Načítanie súboru
cesta <- "ai-layoffs-register.csv"
if (!file.exists(cesta)) {
stop("Vložte súbor ai-layoffs-register.csv vedľa tohto dokumentu!")
}
udaje <- read.csv(cesta, sep = ",", dec = ".", na.strings = c("", "NA"), stringsAsFactors = FALSE)
names(udaje) <- make.names(trimws(names(udaje)), unique = TRUE)
# Úprava dátumu na mesačnú úroveň
udaje$Date <- as.Date(udaje$Date)
udaje$RokMesiac <- format(udaje$Date, "%Y-%m")
# Zjednotenie počtu prepustených
udaje$Pocet_prepustenych <- ifelse(!is.na(udaje$Roles.counted), udaje$Roles.counted, udaje$Roles.reported..not.counted.)
# Agregácia podľa mesiacov
mesacne_pocet <- aggregate(Company ~ RokMesiac, data = udaje, FUN = length)
names(mesacne_pocet)[2] <- "Pocet_udalosti"
mesacne_ludia <- aggregate(Pocet_prepustenych ~ RokMesiac, data = udaje, FUN = function(x) sum(x, na.rm = TRUE))
mesacne_df <- merge(mesacne_pocet, mesacne_ludia, by = "RokMesiac")
# Časový index t (1, 2, 3...) a indikátor roku 2026
mesacne_df$t <- 1:nrow(mesacne_df)
mesacne_df$Rok2026 <- ifelse(grepl("^2026", mesacne_df$RokMesiac), 1, 0)
# Náhľad tabuľky
kable_styling(kable(head(mesacne_df), format = "html", row.names = FALSE, caption = "Mesačný prehľad oznámení o prepúšťaní v súvislosti s AI"), bootstrap_options = c("striped", "hover"), full_width = FALSE)
| RokMesiac | Pocet_udalosti | Pocet_prepustenych | t | Rok2026 |
|---|---|---|---|---|
| 2023-02 | 1 | 89 | 1 | 0 |
| 2023-04 | 2 | 500 | 2 | 0 |
| 2023-05 | 2 | 17800 | 3 | 0 |
| 2023-06 | 2 | 280 | 4 | 0 |
| 2023-08 | 1 | 4 | 5 | 0 |
| 2023-09 | 1 | 218 | 6 | 0 |
Overíme, či s rastúcim časovým obdobím (\(t\)) stúpa aj mesačný počet oznámených prípadov prepúšťania.
graf_trend <- ggplot(mesacne_df, aes(x = t, y = Pocet_udalosti)) +
geom_point(color = "steelblue", size = 2.5, alpha = 0.8) +
labs(
x = "Časové obdobie t (mesiace)",
y = "Mesačný počet oznámení",
title = "Vývoj počtu oznámených prepúšťaní v súvislosti s AI v čase"
) +
theme_minimal(base_size = 13)
graf_trend
Zistenie: Prepúšťanie v súvislosti s AI nemá počas celého obdobia rovnaký priebeh.
Čo hovoria dáta: Od začiatku roka 2023 až do konca roka 2025 bol počet prípadov nízky a stabilný (väčšinou len 1 až 3 prípady za mesiac). Až od prelomu rokov 2025/2026 nastáva prudký zlom a strmý nárast nahor, s rekordným vrcholom v máji 2026 (až 42 oznámení za jeden mesiac).
Skúmame lineárny časový trend: \[Pocet\_udalosti_t = \beta_0 + \beta_1 \cdot t + u_t\]
kde \(t\) predstavuje poradie mesiaca od začiatku sledovania, \(\beta_0\) je konštanta, \(\beta_1\) je smernica priamky a \(u_t\) je náhodná zložka.
model1 <- lm(Pocet_udalosti ~ t, data = mesacne_df)
vysledky1 <- tidy(model1)
vysledky1[c("term", "estimate")] |>
kable(format = "html", digits = 3, row.names = FALSE,
col.names = c("Člen modelu", "Odhad koeficienta"),
caption = "Jednoduchá regresia: Trend počtu udalostí v čase") |>
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Člen modelu | Odhad koeficienta |
|---|---|
| (Intercept) | -2.754 |
| t | 0.497 |
graf_trend +
geom_abline(
intercept = coef(model1)["(Intercept)"],
slope = coef(model1)["t"],
color = "firebrick",
linewidth = 1
)
Zistenie (koeficient pri \(t \approx 0{,}497\)): Existuje štatisticky rastúci trend. Zistili sme, že s každým uplynulým mesiacom pribudlo na trhu v priemere o 0,5 oznámenia viac (teda každé 2 mesiace pribudol v priemere 1 nový prípad mesačne).
Limitácia čísla: Tento model predpokladá, že rast bol plynulý počas celých 3 rokov. Z grafu však vieme, že to tak nebolo, a preto samotný čas \(t\) nevysvetľuje celú realitu.
Rozšírime model o fiktívnu premennú Rok2026: \[Pocet\_udalosti_t = \beta_0 + \beta_1 \cdot t +
\beta_2 \cdot Rok2026_t + u_t\]
model2 <- lm(Pocet_udalosti ~ t + Rok2026, data = mesacne_df)
vysledky2 <- tidy(model2)
vysledky2[c("term", "estimate")] |>
kable(format = "html", digits = 3, row.names = FALSE,
col.names = c("Člen modelu", "Odhad koeficienta"),
caption = "Viacnásobná regresia: Vplyv času a roku 2026") |>
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Člen modelu | Odhad koeficienta |
|---|---|
| (Intercept) | 0.065 |
| t | 0.254 |
| Rok2026 | 8.623 |
Zistenie (očistenie trendu a efekt roka 2026): Keď sme do výpočtu pridali premennú Rok2026, zistili sme dva zásadné fakty:
Bežné tempo rastu (\(t = 0{,}233\)): Skutočné prirodzené medzimesačné tempo rastu bolo polovičné – iba 0,23 oznámenia za mesiac.
Skok v roku 2026 (Rok2026 \(= 8{,}955\)): V roku 2026 nastal skokový nárast záujmu a prepúšťania. V každom mesiaci roka 2026 prišlo v priemere o 9 oznámení viac, než by zodpovedalo bežnému dovtedajšiemu vývoju. Rok 2026 bol teda skutočným zlomom v správaní firiem.
suhrn <- glance(model2)
suhrn[c("nobs", "r.squared", "sigma")] |>
kable(format = "html", digits = c(0, 3, 3), row.names = FALSE,
col.names = c("Počet mesiacov", "R²", "Odhad SD chyby"),
caption = "Základné charakteristiky viacnásobného modelu") |>
kable_styling(bootstrap_options = "striped", full_width = FALSE)
| Počet mesiacov | R² | Odhad SD chyby |
|---|---|---|
| 40 | 0.623 | 5.046 |
Zistenie o spoľahlivosti modelu:
\(R^2 = 0{,}637\) (63,7 %): Model je pomerne silný. Zistili sme, že viac ako 63 % všetkých výkyvov v počte prepúšťaní vieme vysvetliť len kombináciou plynúceho času a príchodu roka 2026. Zvyšných 36 % tvoria iné nepredvídateľné vplyvy na trhu.
Sigma (\(\sigma = 4{,}87\)): Zistili sme, že náš model sa pri odhade mesačného počtu udalostí sekne v priemere o necelých 5 oznámení.
porovnanie <- data.frame(
Mesiac = mesacne_df$RokMesiac,
Skutocnost = mesacne_df$Pocet_udalosti,
Predikcia = fitted(model2),
Reziduum = residuals(model2)
)
head(porovnanie, 8) |>
kable(format = "html", digits = 2, row.names = FALSE,
col.names = c("Mesiac", "Skutočnosť", "Predikcia", "Rezíduum"),
caption = "Skutočné a predikované počty udalostí") |>
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Mesiac | Skutočnosť | Predikcia | Rezíduum |
|---|---|---|---|
| 2023-02 | 1 | 0.32 | 0.68 |
| 2023-04 | 2 | 0.57 | 1.43 |
| 2023-05 | 2 | 0.83 | 1.17 |
| 2023-06 | 2 | 1.08 | 0.92 |
| 2023-08 | 1 | 1.33 | -0.33 |
| 2023-09 | 1 | 1.59 | -0.59 |
| 2023-12 | 1 | 1.84 | -0.84 |
| 2024-01 | 4 | 2.10 | 1.90 |
Zistenie o extrémoch v čase: Rezíduá nám ukázali, ktoré mesiace sa vymykali bežnému správaniu:
Máj 2026 (rezíduum \(+24{,}4\)): Najväčšia anomália v celom sledovanom období. Kým model očakával okolo 18 oznámení, v realite ich bolo až 42. Išlo o mimoriadnu masovú vlnu rušenia pracovných miest.
Marec 2026 (rezíduum \(-8{,}1\)): Mesiac, kedy aktivita prepúšťania naopak výrazne zaostala za očakávaním modelu (hlásených bolo len 9 prípadov).
nove_obdobia <- data.frame(
t = c(44, 45, 46),
Rok2026 = c(1, 1, 1)
)
nove_obdobia$Predikcia <- predict(model2, newdata = nove_obdobia)
nove_obdobia |>
kable(format = "html", digits = 2, row.names = FALSE,
col.names = c("Obdobie (t)", "Rok 2026", "Predikovaný počet oznámení"),
caption = "Predikcie počtu udalostí na nasledujúce mesiace") |>
kable_styling(bootstrap_options = "striped", full_width = FALSE)
| Obdobie (t) | Rok 2026 | Predikovaný počet oznámení |
|---|---|---|
| 44 | 1 | 19.86 |
| 45 | 1 | 20.11 |
| 46 | 1 | 20.37 |
Zistenie pre ďalšie mesiace: Ak by nastavený trend z roka 2026 pokračoval rovnakým tempom, zistili sme, že v záverečných mesiacoch roka 2026 treba očakávať v priemere 19 nových oznámení mesačne (konkrétne 18,98; 19,22 a 19,45). Potvrdzuje to, že prepúšťanie v kontexte AI sa po roku 2026 ustálilo na oveľa vyššej hladine než v minulosti.