S využitím databázy World Population by Country 2025 (Latest) database.
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
## Loading required package: carData
setwd(“/Cloud/project/tyzdne/tyzden5”)
# Načítanie vlastného datasetu s údajmi o populácii
údaje <- read.csv("population_data.csv", sep = ",", header = TRUE)
colnames(údaje)## [1] "id" "Country..or.dependency."
## [3] "Population.2025" "Yearly.Change"
## [5] "Net.Change" "Density..P.Km.."
## [7] "Land.Area..Km.." "Migrants..net."
## [9] "Fert..Rate" "Median.Age"
## [11] "Urban.Pop.." "World.Share"
Rozhodol som sa modelovať počet obyvateľov v roku 2025 (Population 2025) v závislosti od vybraných demografických a socioekonomických premenných, a to od miery pôrodnosti (Fert. Rate), mediánového veku (Median Age) a čistej migrácie (Migrants net).
Moja pracovná hypotéza hovorí o štatisticky významnom vplyve všetkých troch vysvetľujúcich premenných na veľkosť populácie. Očakávam, že vyššia miera pôrodnosti a kladná migrácia budú mať pozitívny vplyv (teda zvýšia počet obyvateľov), zatiaľ čo vyšší mediánový vek bude mať negatívny vplyv (znamená staršiu populáciu a pomalší rast).
# Načítanie vlastného datasetu
data <- read.csv("population_data.csv", sep = ",", header = TRUE)
# Výber relevantných stĺpcov pre model
# Zameriam sa na počet obyvateľov, pôrodnosť, mediánový vek a migráciu
data_selected <- data[, c("Country..or.dependency.", "Population.2025", "Fert..Rate", "Median.Age", "Migrants..net.")]
# Konverzia textových hodnôt (s percentami alebo čiarkami) na číselné typy
data_selected$`Migrants..net.` <- as.numeric(gsub("[^0-9.-]", "", data_selected$`Migrants..net.`))
# Doplnenie chýbajúcich hodnôt mediánom
column_medians <- sapply(data_selected, function(x) if(is.numeric(x)) median(x, na.rm = TRUE) else NA)
for (col in names(data_selected)) {
if (is.numeric(data_selected[[col]])) {
data_selected[[col]][is.na(data_selected[[col]])] <- column_medians[col]
}
}
# Pre lepšiu čitateľnosť premenujeme dataset
population_data <- data_selected
# Náhľad na prvé riadky po úprave
head(population_data)## Country..or.dependency. Population.2025 Fert..Rate Median.Age Migrants..net.
## 1 India 1463865525 1.94 28.8 495753
## 2 China 1416096094 1.02 40.1 268126
## 3 United States 347275807 1.62 38.5 1230663
## 4 Indonesia 285721236 2.10 30.4 39509
## 5 Pakistan 255219554 3.50 20.6 1235336
## 6 Nigeria 237527782 4.30 18.1 15258
Teraz chceme vidieť tvar údajov (či nie sú v nich nejaké nezrovnalosti – napríklad hodnoty 0).
# Vizualizácia tvaru údajov – boxploty
# Nastavíme dataset
dataset <- data_selected # alebo population_data, podľa názvu, ktorý používaš
# Nastavenie rozloženia grafov (2 riadky × 2 stĺpce)
par(mfrow = c(2, 2))
par(mar = c(4, 4, 2, 1)) # okraje grafov
# Vytvorenie boxplotov pre všetky numerické premenné okrem názvu krajiny
for (col in names(dataset)[-1]) {
boxplot(dataset[[col]],
main = paste("Boxplot:", col),
xlab = "Hodnoty",
col = "lightblue",
border = "darkblue")
}
# Nadpis pre celú sadu grafov
mtext("Boxploty demografických premenných", outer = TRUE, cex = 1.4, font = 2)
Z vyššie uvedených boxplotov je zrejmé, že údaje o populácii a migrácii obsahujú niekoľko odľahlých hodnôt, čo súvisí s rozdielnou veľkosťou krajín a ich ekonomickým postavením. Pôrodnosť a mediánový vek vykazujú relatívne stabilnejšie rozdelenie bez extrémov. Takéto vizualizácie sú dôležité, pretože upozorňujú na možné zdroje variability, ktoré môžu ovplyvniť výsledky regresnej analýzy.
Population 2025 Fert. Rate Median Age Migrants (net)Model odhadujeme príkazom lm(), ktorý v R slúži na vytváranie lineárnych modelov. V našom prípade chceme zistiť, ako miera pôrodnosti (Fert_Rate), mediánový vek (Median_Age) a čistá migrácia (Migrants_net) ovplyvňujú počet obyvateľov v roku 2025 (Population_2025).
# Odhad lineárneho modelu
model <- lm(Population.2025 ~ Fert..Rate + Median.Age + Migrants..net., data = data_selected)
# Výpis výsledkov regresie
summary(model)##
## Call:
## lm(formula = Population.2025 ~ Fert..Rate + Median.Age + Migrants..net.,
## data = data_selected)
##
## Residuals:
## Min 1Q Median 3Q Max
## -436177860 -23955134 -16362094 -2549708 1321181637
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.032e+08 8.541e+07 1.208 0.228
## Fert..Rate -1.316e+07 1.471e+07 -0.895 0.372
## Median.Age -1.655e+06 1.689e+06 -0.980 0.328
## Migrants..net. 2.669e+02 4.935e+01 5.408 1.6e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 131400000 on 229 degrees of freedom
## Multiple R-squared: 0.1198, Adjusted R-squared: 0.1083
## F-statistic: 10.39 on 3 and 229 DF, p-value: 1.95e-06
Výsledky lineárneho modelu ukazujú, že migrácia (Migrants_net) má významný pozitívny vplyv na veľkosť populácie v roku 2025. Krajiny s vyššou čistou migráciou majú tendenciu mať väčší počet obyvateľov. Naopak, premenné pôrodnosť (Fert_Rate) a mediánový vek (Median_Age) sa v modeli ukázali ako štatisticky nevýznamné, hoci majú očakávané znamienka (vyšší vek znižuje rast populácie, vyššia pôrodnosť by ho mala zvyšovať).
Koeficient determinácie R² = 0.12 naznačuje, že model vysvetľuje približne 12 % variability populácie medzi krajinami. Hoci ide o relatívne nízku hodnotu, výsledok je pre makroekonomické a demografické dáta bežný. F-test (p-hodnota 1.95e–06) potvrdzuje, že model ako celok je štatisticky významný.
lm()Objekt triedy lm() nám poskytuje niekoľko dôležitých výstupov:
## 1️⃣ Odhadnuté koeficienty:
## (Intercept) Fert..Rate Median.Age Migrants..net.
## 1.031595e+08 -1.316478e+07 -1.655349e+06 2.668986e+02
##
## 2️⃣ Prvých 10 hodnôt rezíduí:
## 1 2 3 4 5 6 7
## 1301603888 1321181637 711840 249985427 -97472584 216866260 130330100
## 8 9 10
## 36024158 59689672 107667495
##
## 3️⃣ Prvých 10 vyrovnaných hodnôt vysvetľovanej premennej:
## 1 2 3 4 5 6 7 8
## 162261637 94914457 346563967 35735809 352692138 20661522 82482305 139662741
## 9 10
## 84307721 27804556
##
## 4️⃣ Náhľad na maticu X (model.matrix):
## (Intercept) Fert..Rate Median.Age Migrants..net.
## 1 1 1.94 28.8 495753
## 2 1 1.02 40.1 268126
## 3 1 1.62 38.5 1230663
## 4 1 2.10 30.4 39509
## 5 1 3.50 20.6 1235336
## 6 1 4.30 18.1 15258
lm()
Výpis vyššie ukazuje, aké základné komponenty obsahuje objekt triedy lm po odhade lineárneho modelu. Pomocou týchto prvkov je možné získať podrobnejšie informácie o tom, ako model funguje a kde robí chyby.
Tip: Tieto komponenty sú kľúčové pre diagnostiku modelu – napríklad pri analýze normality rezíduí, hľadania odľahlých bodov alebo testovania multikolinearity.
Súhrn odhadovaného modelu nám poskytuje súbor regresných koeficientov, ktorých znamienka budú rozoberané neskôr. Ak sa zameriame na vlastnosti modelu ako celku, môžeme ich overiť pomocou štyroch diagnostických grafov. Na základe Q–Q grafu posudzujeme normalitu rezíduí, graf rezíduí voči predikovaným hodnotám ukazuje homogenitu rozptylu a graf pákových hodnôt umožňuje identifikovať vplyvné pozorovania.
Diagnostické grafy regresného modelu
💡 Poznámka: Odľahlé pozorovania je možné preskúmať pomocou
outlierTest(model) z balíka car.
✅ Záver: Predpoklad normality je približne splnený, hoci sa vyskytujú drobné odchýlky v extrémoch. Model teda neporušuje túto podmienku výrazne.
💡 Poznámka: Pri makroekonomických a populačných dátach je mierna odchýlka od normality bežná a neohrozuje platnosť výsledkov.
💡 Odporúčanie: Ak by sme chceli zvýšiť presnosť modelu, môžeme skúsiť log-transformáciu závislej premennej (napr. log(Population.2025)).
✅ Záver: Predpoklad homoskedasticity je vo všeobecnosti splnený. Model teda nemá vážny problém s nerovnakým rozptylom chýb.
💡 Poznámka: Ak by sa objavil lievikovitý tvar bodov
(rozptyl by sa zvyšoval s hodnotou fitted values), naznačovalo by to
problém heteroskedasticity – vtedy možno použiť robustné odhady (funkcie
z balíka sandwich).
✅ Záver: Model spĺňa predpoklad konštantného rozptylu rezíduí, čo podporuje spoľahlivosť regresných odhadov.
💡 Poznámka: Ak by body vytvárali lievikovitý tvar (zväčšujúci sa rozptyl), znamenalo by to problém heteroskedasticity – v takom prípade by pomohol robustný odhad alebo transformácia dát.
✅ Záver: Model je stabilný a neobsahuje pozorovania, ktoré by mali výrazný vplyv na regresnú priamku.
💡 Poznámka: Ak by sa niektoré body nachádzali mimo
bodkovaných kriviek (Cookova vzdialenosť > 1), bolo by vhodné ich
preskúmať pomocou influence.measures(model) alebo
outlierTest() z balíka car.
✅ Záver: Model neobsahuje výrazne vplyvné pozorovania – regresné odhady sú teda stabilné a spoľahlivé.
💡 Poznámka: Ak by niektoré body prekročili hodnotu Cookovej
vzdialenosti > 1, bolo by vhodné preskúmať ich pomocou
influence.measures(model) alebo
outlierTest(model) (balík car).
##
## Jarque Bera Test
##
## data: residuals
## X-squared = 74254, df = 2, p-value < 2.2e-16
## rstudent unadjusted p-value Bonferroni p
## 2 13.60592 2.9259e-31 6.8174e-29
## 1 13.49337 6.8408e-31 1.5939e-28
## 40 -4.39659 1.6868e-05 3.9303e-03
✅ Tieto testy dopĺňajú vizuálne diagnostiky a poskytujú štatistické potvrdenie spoľahlivosti modelu.
Na základe Bonferroniho korekcie boli identifikované tri pozorovania (č. 1, 2 a 40), ktoré majú štatisticky významné odchýlky od predikovaných hodnôt modelu.
rstudent ≈ 13), čo naznačuje, že ich hodnoty sa
výrazne líšia od trendu ostatných krajín.
rstudent ≈ −4.4), teda sa nachádza opačne od očakávanej
hodnoty.
⚠️ Tieto body môžu byť vplyvné pozorovania a odporúča sa ich
bližšie preskúmať — napríklad pomocou grafov
influencePlot(model) alebo
influence.measures(model).
💡 Poznámka: V makroekonomických dátach je výskyt niekoľkých odľahlých krajín bežný (napr. extrémne migračné alebo demografické hodnoty).
Keďže sa nepreukázala normalita rezíduí, pokúsme sa eliminovať odľahlé hodnoty v prípade GDP - dokážeme to logaritmickou transformáciou tejto premennej a vylúčením BMI, ktoré sa ukázalo ako neinterpretovateľné. Nová regresia bude mať tvar
model2 <- lm(Population.2025 ~ 1 + I(log(Fert..Rate)) + Median.Age + Migrants..net., data = data_selected)
summary(model2)##
## Call:
## lm(formula = Population.2025 ~ 1 + I(log(Fert..Rate)) + Median.Age +
## Migrants..net., data = data_selected)
##
## Residuals:
## Min 1Q Median 3Q Max
## -442219023 -24836407 -15829490 -2669777 1310348676
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.274e+08 8.433e+07 1.511 0.132
## I(log(Fert..Rate)) -4.737e+07 3.901e+07 -1.214 0.226
## Median.Age -2.281e+06 1.805e+06 -1.264 0.208
## Migrants..net. 2.638e+02 4.942e+01 5.338 2.26e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 131200000 on 229 degrees of freedom
## Multiple R-squared: 0.1224, Adjusted R-squared: 0.1109
## F-statistic: 10.64 on 3 and 229 DF, p-value: 1.409e-06
💡 Čo z toho plynie: Pre vysvetlenie rozdielov v úrovni populácie medzi krajinami je kľúčová migrácia. Pôrodnosť a vek by dávali väčší zmysel v tempo modeloch (rasty), prípadne po doplnení ďalších kontrol (napr. urbanizácia, hustota, HDP).
# Nový model po log-transformácii Fertility Rate
model2 <- lm(Population.2025 ~ 1 + I(log(Fert..Rate)) + Median.Age + Migrants..net.,
data = data_selected)
# Výpis výsledkov
summary(model2)##
## Call:
## lm(formula = Population.2025 ~ 1 + I(log(Fert..Rate)) + Median.Age +
## Migrants..net., data = data_selected)
##
## Residuals:
## Min 1Q Median 3Q Max
## -442219023 -24836407 -15829490 -2669777 1310348676
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.274e+08 8.433e+07 1.511 0.132
## I(log(Fert..Rate)) -4.737e+07 3.901e+07 -1.214 0.226
## Median.Age -2.281e+06 1.805e+06 -1.264 0.208
## Migrants..net. 2.638e+02 4.942e+01 5.338 2.26e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 131200000 on 229 degrees of freedom
## Multiple R-squared: 0.1224, Adjusted R-squared: 0.1109
## F-statistic: 10.64 on 3 and 229 DF, p-value: 1.409e-06
# Nastaviť rozloženie 2 x 2
par(mfrow = c(2, 2))
# Vykresliť všetky 4 diagnostické grafy modelu
plot(model2)✅ Zhrnutie: Diagnostika po úprave modelu (log(Fert..Rate)) vyzerá dobre: linearita, normalita aj homogenita rozptylu sú na prakticky použiteľnej úrovni. Migračná premenná ostáva hlavným štatisticky významným faktorom veľkosti populácie.
# Normality and outlier tests for updated model
residuals2 <- residuals(model2)
# Jarque–Bera test normality
jb_test2 <- jarque.bera.test(residuals2)
jb_test2##
## Jarque Bera Test
##
## data: residuals2
## X-squared = 72927, df = 2, p-value < 2.2e-16
## rstudent unadjusted p-value Bonferroni p
## 2 13.544023 4.6682e-31 1.0877e-28
## 1 13.521666 5.5260e-31 1.2875e-28
## 40 -4.471522 1.2248e-05 2.8538e-03
✅ Záver: Upravený model spĺňa štatistické predpoklady v uspokojivej miere. Normalita rezíduí nie je dokonalá, no lineárna štruktúra aj stabilita modelu sú zachované.
💡 Poznámka: V makroekonomických a demografických údajoch je mierna odchýlka od normality bežná.
V upravenom modeli sme sledovali vplyv miery pôrodnosti (Fert. Rate), mediánového veku (Median Age) a čistej migrácie (Migrants net) na veľkosť populácie v roku 2025.
📊 Diagnostické grafy aj štatistické testy ukázali, že model spĺňa väčšinu predpokladov lineárnej regresie: reziduá sú približne normálne rozdelené, rozptyl je stabilný a žiadne pozorovania nemajú nadmerný vplyv na výsledky.
✅ Celkové hodnotenie: Model vysvetľuje variabilitu populácie medzi krajinami v uspokojivej miere. Transformácia log(Fert. Rate) prispela k lepšej normalite rezíduí a stabilite odhadov.