Code
knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)Téma: dostupnosť bývania na Slovensku
knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)V tomto cvičení skúšam základné operácie v R na téme z prvého zadania, teda na dostupnosti bývania na Slovensku. Používam údaje o cenách bytov (NBS) a o mzdách (ŠÚ SR).
cena_m2 <- 3262 # priemerna cena bytu za m2, 4. stvrtrok 2025 (NBS)
plocha <- 70 # velkost bytu v m2
mzda <- 1620 # priemerna hruba mzda 2025 (SU SR)
cena_bytu <- cena_m2 * plocha # nasobenie
rocna_mzda <- mzda * 12
roky <- cena_bytu / rocna_mzda # kolko rokov treba pracovat na byt
cena_bytu; rocna_mzda; roky[1] 228340
[1] 19440
[1] 11.74588
round(roky, 1) # zaokruhlenie na 1 desatinne miesto[1] 11.7
ceiling(roky) # najblizsie vyssie cele cislo[1] 12
floor(roky) # najblizsie nizsie cele cislo[1] 11
Koľko celých mesačných platov stojí byt a koľko je to rokov a mesiacov?
mesiace <- floor(cena_bytu / mzda)
mesiace[1] 140
mesiace %/% 12 # cele roky[1] 11
mesiace %% 12 # zvysne mesiace[1] 8
Byt teda stojí približne 11 rokov a 8 mesiacov hrubej mzdy.
kraj <- "Bratislavsky"
typ <- "kraj"
paste(kraj, typ) # spojenie s medzerou[1] "Bratislavsky kraj"
paste0("ceny_", 2025) # spojenie bez medzery[1] "ceny_2025"
paste("BA", "KE", "PO", sep = ",") # spojenie s oddelovacom[1] "BA,KE,PO"
x <- "Dostupnost byvania"
nchar(x) # pocet znakov[1] 18
substr(x, 1, 10) # prvych 10 znakov[1] "Dostupnost"
rast_cien <- 12.0 # rast cien byvania v roku 2025 v % (NBS)
rast_mzdy <- 6.3 # rast miezd v roku 2025 v % (SU SR)
p <- rast_cien > rast_mzdy # rastu ceny rychlejsie ako mzdy?
q <- rast_mzdy > 10 # rastu mzdy o viac ako 10 %?
p; q[1] TRUE
[1] FALSE
!p # NOT - negacia[1] FALSE
p & q # AND - a sucasne[1] FALSE
p | q # OR - alebo[1] TRUE
cena_m2 > 3000[1] TRUE
kraj == "Bratislavsky"[1] TRUE
kraj != "Presovsky"[1] TRUE
Je splátka hypotéky 958 € dostupná, ak by nemala byť vyššia ako 40 % mzdy a zároveň máme našetrených aspoň 10 % ceny bytu?
splatka <- 958 # priblizna splatka (90 % uver, 30 rokov, 3,8 %)
uspory <- 15000
splatka <= 0.4 * mzda # splatka do 40 % mzdy?[1] FALSE
uspory >= 0.1 * cena_bytu # mame na akontaciu?[1] FALSE
(splatka <= 0.4 * mzda) & (uspory >= 0.1 * cena_bytu) # obe naraz[1] FALSE
Ani jedna podmienka nie je splnená, takže pri priemernej mzde je byt nedostupný.
roky_v <- 2020:2025 # postupnost rokov
mzdy <- c(1133, 1211, 1304, 1430, 1524, 1620) # priemerna mzda (SU SR)
plochy <- seq(from = 40, to = 100, by = 20) # byty 40 az 100 m2
rep(3262, times = 3) # 3x ta ista cena[1] 3262 3262 3262
runif(3, min = 3000, max = 3500) # 3 nahodne ceny za m2[1] 3008.744 3038.738 3477.771
mzdy; plochy[1] 1133 1211 1304 1430 1524 1620
[1] 40 60 80 100
mzdy * 12 # rocne mzdy[1] 13596 14532 15648 17160 18288 19440
plochy * cena_m2 # ceny bytov roznych velkosti[1] 130480 195720 260960 326200
diff(mzdy) # medzirocny narast v eurach[1] 78 93 126 94 96
rast <- round(diff(mzdy) / mzdy[-6] * 100, 1) # medzirocny rast v %
rast[1] 6.9 7.7 9.7 6.6 6.3
mzdy[1] # prvy prvok (2020)[1] 1133
mzdy[4:6] # posledne tri roky[1] 1430 1524 1620
mzdy[mzdy > 1400] # mzdy vacsie ako 1400[1] 1430 1524 1620
which(mzdy > 1400) # ktore prvky to su?[1] 4 5 6
Ceny bývania za m² po štvrťrokoch, hodnotu za 2. štvrťrok 2025 nemám.
ceny_q <- c(2700, NA, 2814, 2906, 3005)
is.na(ceny_q)[1] FALSE TRUE FALSE FALSE FALSE
mean(ceny_q) # NA[1] NA
mean(ceny_q, na.rm = TRUE) # bez NA[1] 2856.25
mean(mzdy)[1] 1370.333
max(mzdy)[1] 1620
summary(mzdy) Min. 1st Qu. Median Mean 3rd Qu. Max.
1133 1234 1367 1370 1500 1620
sort(rast, decreasing = TRUE)[1] 9.7 7.7 6.9 6.6 6.3
V koľkých rokoch rástla mzda o viac ako 7 % a o koľko eur spolu?
sum(rast > 7)[1] 2
sum(diff(mzdy)[rast > 7])[1] 219
Mzda a cena za m² v štyroch krajoch (približné údaje podľa WOOD & Company a Financer.sk).
mzda_kraj <- c(1949, 1399, 1195, 1354)
cena_kraj <- c(3190, 2102, 1860, 1538)
K <- cbind(mzda_kraj, cena_kraj) # spojenie po stlpcoch
rownames(K) <- c("BA", "KE", "PO", "BB")
K mzda_kraj cena_kraj
BA 1949 3190
KE 1399 2102
PO 1195 1860
BB 1354 1538
dim(K)[1] 4 2
K[1, 2] # cena v BA[1] 3190
K[, 1] # vsetky mzdy BA KE PO BB
1949 1399 1195 1354
K["PO", ] # riadok Presovskeho krajamzda_kraj cena_kraj
1195 1860
apply(K, 2, mean) # priemer po stlpcochmzda_kraj cena_kraj
1474.25 2172.50
t(K) # transpozicia BA KE PO BB
mzda_kraj 1949 1399 1195 1354
cena_kraj 3190 2102 1860 1538
Pre každý kraj vypočítajte, koľko rokov hrubej mzdy stojí byt 70 m², a nájdite najdostupnejší kraj.
roky_kraj <- 70 * K[, 2] / (K[, 1] * 12)
round(roky_kraj, 1) BA KE PO BB
9.5 8.8 9.1 6.6
which.min(roky_kraj) # najdostupnejsi krajBB
4
Pre štvorcovú maticu \(\mathbf A\) platí, že vlastné číslo \(\lambda\) a vlastný vektor \(\mathbf v \ne \mathbf 0\) spĺňajú vzťah
\[ \mathbf A \mathbf v = \lambda \mathbf v. \]
Budeme pracovať s variančno-kovariančnou maticou, ktorá je vždy symetrická, preto použijeme eigen(..., symmetric = TRUE).
C2 <- cov(K) # variancno-kovariancna matica (mzda, cena za m2)
C2 mzda_kraj cena_kraj
mzda_kraj 107830.2 217309.2
cena_kraj 217309.2 513507.7
isSymmetric(C2) # je matica symetricka?[1] TRUE
eig_C2 <- eigen(C2, symmetric = TRUE)
eig_C2$values # vlastne cisla (zostupne)[1] 607934.52 13403.39
eig_C2$vectors # vlastne vektory v stlpcoch [,1] [,2]
[1,] 0.3985295 -0.9171555
[2,] 0.9171555 0.3985295
lambda_1 <- eig_C2$values[1]
v_1 <- eig_C2$vectors[, 1]
as.vector(C2 %*% v_1) # lava strana[1] 242279.8 557570.5
lambda_1 * v_1 # prava strana[1] 242279.8 557570.5
c(sucet_vlastnych_cisel = sum(eig_C2$values), stopa = sum(diag(C2)))sucet_vlastnych_cisel stopa
621337.9 621337.9
c(sucin_vlastnych_cisel = prod(eig_C2$values), determinant = det(C2))sucin_vlastnych_cisel determinant
8148386156 8148386156
K mzdám a cenám v krajoch pridajte tretiu premennú, počet rokov hrubej mzdy na byt 70 m². Vytvorte variančno-kovariančnú maticu 3 × 3, vypočítajte jej vlastné čísla a vlastné vektory, overte ich a zistite, aký podiel celkovej variability pripadá na prvé vlastné číslo.
D <- cbind(K, Roky = roky_kraj) # matica 4 x 3
C3 <- cov(D) # kovariancna matica 3 x 3
round(C3, 2) mzda_kraj cena_kraj Roky
mzda_kraj 107830.25 217309.17 180.32
cena_kraj 217309.17 513507.67 685.08
Roky 180.32 685.08 1.67
eig_C3 <- eigen(C3, symmetric = TRUE)
eig_C3$values[1] 6.079353e+05 1.340426e+04 7.789461e-04
round(eig_C3$vectors, 4) [,1] [,2] [,3]
[1,] -0.3985 0.9171 0.0069
[2,] -0.9172 -0.3985 -0.0043
[3,] -0.0012 -0.0080 1.0000
# overenie vsetkych troch parov naraz (rozdiel ma byt takmer 0)
max(abs(C3 %*% eig_C3$vectors - eig_C3$vectors %*% diag(eig_C3$values)))[1] 1.164153e-10
# vlastne vektory maju dlzku 1 a su navzajom kolme
colSums(eig_C3$vectors^2)[1] 1 1 1
round(t(eig_C3$vectors) %*% eig_C3$vectors, 10) [,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1
# podiel variability prveho vlastneho cisla v %
round(eig_C3$values[1] / sum(eig_C3$values) * 100, 2)[1] 97.84
Prvé vlastné číslo vysvetľuje takmer celú variabilitu. Mzdy a ceny sa medzi krajmi hýbu spolu, pričom väčšiu váhu má cena (má väčší rozptyl). Premenná „roky“ má malý rozptyl, a preto na výsledok vplýva len minimálne.
Help k funkcii eigen: R: eigen().