Základné operácie v R

Téma: dostupnosť bývania na Slovensku

Author

Riano Vajas
(podľa predlohy V. Gazdu)

Published

October 19, 2026

Globálne nastavenie Chunkov

  • echo nastavuje, či chceme v dokumente vypisovať kódy R
  • message = FALSE potláča pracovné výstupy z R
  • warning = FALSE potláča varovania
Code
knitr::opts_chunk$set(
  echo = TRUE,
  message = FALSE,
  warning = FALSE
)

Úvod

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).


Skaláre (jednočíselné hodnoty)

Numerické skaláre

Code
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
Code
round(roky, 1)      # zaokruhlenie na 1 desatinne miesto
[1] 11.7
Code
ceiling(roky)       # najblizsie vyssie cele cislo
[1] 12
Code
floor(roky)         # najblizsie nizsie cele cislo
[1] 11

Malé cvičenie

Koľko celých mesačných platov stojí byt a koľko je to rokov a mesiacov?

Code
mesiace <- floor(cena_bytu / mzda)
mesiace
[1] 140
Code
mesiace %/% 12      # cele roky
[1] 11
Code
mesiace %% 12       # zvysne mesiace
[1] 8

Byt teda stojí približne 11 rokov a 8 mesiacov hrubej mzdy.


Text

Code
kraj <- "Bratislavsky"
typ  <- "kraj"
paste(kraj, typ)                       # spojenie s medzerou
[1] "Bratislavsky kraj"
Code
paste0("ceny_", 2025)                  # spojenie bez medzery
[1] "ceny_2025"
Code
paste("BA", "KE", "PO", sep = ",")     # spojenie s oddelovacom
[1] "BA,KE,PO"
Code
x <- "Dostupnost byvania"
nchar(x)            # pocet znakov
[1] 18
Code
substr(x, 1, 10)    # prvych 10 znakov
[1] "Dostupnost"

Logické (boolovské) hodnoty

Základy

Code
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
Code
!p              # NOT - negacia
[1] FALSE
Code
p & q           # AND - a sucasne
[1] FALSE
Code
p | q           # OR  - alebo
[1] TRUE

Porovnávanie

Code
cena_m2 > 3000
[1] TRUE
Code
kraj == "Bratislavsky"
[1] TRUE
Code
kraj != "Presovsky"
[1] TRUE

Malé cvičenie

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?

Code
splatka <- 958       # priblizna splatka (90 % uver, 30 rokov, 3,8 %)
uspory  <- 15000

splatka <= 0.4 * mzda                                   # splatka do 40 % mzdy?
[1] FALSE
Code
uspory >= 0.1 * cena_bytu                               # mame na akontaciu?
[1] FALSE
Code
(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ý.


Numerické vektory

Generovanie vektorov

Code
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
Code
runif(3, min = 3000, max = 3500)                 # 3 nahodne ceny za m2
[1] 3008.744 3038.738 3477.771
Code
mzdy; plochy
[1] 1133 1211 1304 1430 1524 1620
[1]  40  60  80 100

Operácie s vektormi

Code
mzdy * 12              # rocne mzdy
[1] 13596 14532 15648 17160 18288 19440
Code
plochy * cena_m2       # ceny bytov roznych velkosti
[1] 130480 195720 260960 326200
Code
diff(mzdy)             # medzirocny narast v eurach
[1]  78  93 126  94  96
Code
rast <- round(diff(mzdy) / mzdy[-6] * 100, 1)   # medzirocny rast v %
rast
[1] 6.9 7.7 9.7 6.6 6.3

Indexovanie

Code
mzdy[1]            # prvy prvok (2020)
[1] 1133
Code
mzdy[4:6]          # posledne tri roky
[1] 1430 1524 1620
Code
mzdy[mzdy > 1400]  # mzdy vacsie ako 1400
[1] 1430 1524 1620
Code
which(mzdy > 1400) # ktore prvky to su?
[1] 4 5 6

Chýbajúce hodnoty

Ceny bývania za m² po štvrťrokoch, hodnotu za 2. štvrťrok 2025 nemám.

Code
ceny_q <- c(2700, NA, 2814, 2906, 3005)
is.na(ceny_q)
[1] FALSE  TRUE FALSE FALSE FALSE
Code
mean(ceny_q)                 # NA
[1] NA
Code
mean(ceny_q, na.rm = TRUE)   # bez NA
[1] 2856.25

Základné štatistiky

Code
mean(mzdy)
[1] 1370.333
Code
max(mzdy)
[1] 1620
Code
summary(mzdy)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1133    1234    1367    1370    1500    1620 
Code
sort(rast, decreasing = TRUE)
[1] 9.7 7.7 6.9 6.6 6.3

Malé cvičenie

V koľkých rokoch rástla mzda o viac ako 7 % a o koľko eur spolu?

Code
sum(rast > 7)
[1] 2
Code
sum(diff(mzdy)[rast > 7])
[1] 219

Matice

Vytvorenie matice

Mzda a cena za m² v štyroch krajoch (približné údaje podľa WOOD & Company a Financer.sk).

Code
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
Code
dim(K)
[1] 4 2

Adresovanie a štatistiky

Code
K[1, 2]           # cena v BA
[1] 3190
Code
K[, 1]            # vsetky mzdy
  BA   KE   PO   BB 
1949 1399 1195 1354 
Code
K["PO", ]         # riadok Presovskeho kraja
mzda_kraj cena_kraj 
     1195      1860 
Code
apply(K, 2, mean) # priemer po stlpcoch
mzda_kraj cena_kraj 
  1474.25   2172.50 
Code
t(K)              # transpozicia
            BA   KE   PO   BB
mzda_kraj 1949 1399 1195 1354
cena_kraj 3190 2102 1860 1538

Malé cvičenie

Pre každý kraj vypočítajte, koľko rokov hrubej mzdy stojí byt 70 m², a nájdite najdostupnejší kraj.

Code
roky_kraj <- 70 * K[, 2] / (K[, 1] * 12)
round(roky_kraj, 1)
 BA  KE  PO  BB 
9.5 8.8 9.1 6.6 
Code
which.min(roky_kraj)    # najdostupnejsi kraj
BB 
 4 

Vlastné čísla a vlastné vektory

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).

Kovariančná matica miezd a cien v krajoch

Code
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
Code
isSymmetric(C2)     # je matica symetricka?
[1] TRUE
Code
eig_C2 <- eigen(C2, symmetric = TRUE)
eig_C2$values       # vlastne cisla (zostupne)
[1] 607934.52  13403.39
Code
eig_C2$vectors      # vlastne vektory v stlpcoch
          [,1]       [,2]
[1,] 0.3985295 -0.9171555
[2,] 0.9171555  0.3985295

Overenie vzťahu Av = λv

Code
lambda_1 <- eig_C2$values[1]
v_1 <- eig_C2$vectors[, 1]

as.vector(C2 %*% v_1)   # lava strana
[1] 242279.8 557570.5
Code
lambda_1 * v_1          # prava strana
[1] 242279.8 557570.5

Stopa a determinant

Code
c(sucet_vlastnych_cisel = sum(eig_C2$values), stopa = sum(diag(C2)))
sucet_vlastnych_cisel                 stopa 
             621337.9              621337.9 
Code
c(sucin_vlastnych_cisel = prod(eig_C2$values), determinant = det(C2))
sucin_vlastnych_cisel           determinant 
           8148386156            8148386156 

Malé cvičenie

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.

Code
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
Code
eig_C3 <- eigen(C3, symmetric = TRUE)
eig_C3$values
[1] 6.079353e+05 1.340426e+04 7.789461e-04
Code
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
Code
# 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
Code
# vlastne vektory maju dlzku 1 a su navzajom kolme
colSums(eig_C3$vectors^2)
[1] 1 1 1
Code
round(t(eig_C3$vectors) %*% eig_C3$vectors, 10)
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1
Code
# 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().