Skaláre, text, logika, vektory, matice a vlastné čísla na príkladoch z basketbalu

Autor

Richard Vladyka
(s pomocou claude.ai)

Publikované

1. septembra 2026

1 Úvod

Tento notebook demonštruje základné operácie v jazyku R s:

  • skalárnymi číslami (t. j. 1 číslo),
  • textovými (znakovými) reťazcami,
  • logickými (boolovskými) hodnotami,
  • numerickými vektormi,
  • maticami,
  • vlastnými číslami a vlastnými vektormi.

Väčšinu ukážok sme postavili na štatistikách z basketbalu (NBA). Hodnoty sú ilustratívne a slúžia len na precvičenie.


2 Skaláre (jednočíselné hodnoty)

2.1 Numerické skaláre

Kód
# Priradenie konštanty do premennej
a <- 24      # napr. body hráča v zápase
b <- 4.5     # napr. asistencie hráča v zápase

# Aritmetika
sum_ab     <- a + b      # súčet
diff_ab    <- a - b      # rozdiel
prod_ab    <- a * b      # násobenie
quot_ab    <- a / b      # delenie
power_ab   <- a ^ b      # umocňovanie
mod_ab     <- a %% 5     # zvyšok po delení piatimi (modulo)
int_div_ab <- a %/% b    # celočíselné delenie

# Zaokrúhľovanie
round_b <- round(b)      # zaokrúhlenie na najbližšie celé číslo
ceil_b  <- ceiling(b)    # najbližšie vyššie celé číslo
floor_b <- floor(b)      # najbližšie nižšie celé číslo

a; b
[1] 24
[1] 4.5
Kód
sum_ab; diff_ab; prod_ab; quot_ab; power_ab; mod_ab; int_div_ab
[1] 28.5
[1] 19.5
[1] 108
[1] 5.333333
[1] 1625364
[1] 4
[1] 5
Kód
round_b; ceil_b; floor_b
[1] 4
[1] 5
[1] 4
TipPoznámky
  • ^ je operátor umocňovania.
  • %% je modulo, teda zvyšok po delení; %/% je celočíselné delenie.
  • round(x, digits = 0) zaokrúhľuje na zadaný počet desatinných miest. R pri hodnote presne uprostred zaokrúhľuje na párne číslo, preto round(4.5) dá 4, ale round(5.5) dá 6.

2.2 Príklad z NBA: úspešnosť streľby

Kód
trojky_trafene <- 9
trojky_pokusy  <- 17

uspesnost_3p <- trojky_trafene / trojky_pokusy * 100
uspesnost_3p
[1] 52.94118
Kód
round(uspesnost_3p, 1)   # zaokrúhlenie na 1 desatinné miesto
[1] 52.9

2.3 Malé cvičenie

Vypočítajte:

\[\frac{(18^2-9)}{5}\]

Kód
(18^2 - 9) / 5
[1] 63

3 Text

3.1 Vytváranie textových premenných a práca s nimi

Kód
meno    <- "Nikola"                         # obsah textovej premennej meno
priezv  <- "Jokic"                          # obsah textovej premennej priezv
cele    <- paste(meno, priezv)              # spojenie s medzerou
bez_med <- paste0(meno, priezv)             # spojenie bez medzery
csv_riadok <- paste("Denver", "Boston", "Miami", sep = ",")  # oddeľovač ","

meno; priezv; cele; bez_med; csv_riadok
[1] "Nikola"
[1] "Jokic"
[1] "Nikola Jokic"
[1] "NikolaJokic"
[1] "Denver,Boston,Miami"

3.2 Dĺžka textového reťazca a podreťazec

Kód
x <- "Triple-double!"
nchar(x)                # počet znakov
[1] 14
Kód
substr(x, 1, 6)         # podreťazec od 1. do 6. znaku
[1] "Triple"
Kód
toupper(x)              # veľké písmená
[1] "TRIPLE-DOUBLE!"
Kód
tolower(x)              # malé písmená
[1] "triple-double!"

3.3 Príklad z NBA: tímové skratky

Kód
tim <- "Golden State Warriors"
skratka <- toupper(substr(tim, 1, 3))
paste("Skratka tímu", tim, "je", skratka)
[1] "Skratka tímu Golden State Warriors je GOL"
Tip

Knižnica stringr ponúka mnoho ďalších možností práce s textom, no základné funkcie R pokrývajú väčšinu bežných potrieb.


4 Logické (boolovské) hodnoty

4.1 Základy

Kód
p <- TRUE     # hráč dal aspoň 20 bodov
q <- FALSE    # hráč mal aspoň 10 asistencií

!p            # NOT
[1] FALSE
Kód
p & q         # AND
[1] FALSE
Kód
p | q         # OR
[1] TRUE
Kód
xor(p, q)     # exclusive OR - platí práve jedno z p, q
[1] TRUE

4.2 Logický výsledok porovnávania

Kód
25 < 30
[1] TRUE
Kód
12 >= 12
[1] TRUE
Kód
"Lakers" == "Lakers"
[1] TRUE
Kód
"Lakers" != "Celtics"   # != znamená "nerovná sa"
[1] TRUE
Kód
!TRUE
[1] FALSE

4.3 Zložitejšie logické operácie

Kód
body <- 27
asistencie <- 11
doskoky <- 4

body > 20 & asistencie > 10      # súčasne (logický prienik)
[1] TRUE
Kód
body > 40 | asistencie > 15      # alebo (logické zjednotenie)
[1] FALSE
Kód
# Double-double: aspoň 10 v dvoch štatistikách
double_double <- (body >= 10) + (asistencie >= 10) + (doskoky >= 10) >= 2
double_double
[1] TRUE
Tip

Pri zložitejších podmienkach používajte okrúhle zátvorky ().

4.4 Zlučovanie logických hodnôt do vektora

Kód
# Skóroval hráč v posledných 4 zápasoch aspoň 25 bodov?
vals <- c(TRUE, FALSE, TRUE, TRUE)
sum(vals)      # počet zápasov s aspoň 25 bodmi (TRUE = 1)
[1] 3
Kód
mean(vals)     # podiel takýchto zápasov
[1] 0.75

5 Numerické vektory

5.1 Generovanie vektorov

Kód
set.seed(2026)   # aby boli náhodné čísla reprodukovateľné

v1 <- c(3, 6, 9, 12)                      # zadanie prvkov ručne
v2 <- 1:8                                 # postupnosť 1, 2, ..., 8
v3 <- seq(from = 0, to = 2, by = 0.5)     # postupnosť s krokom 0.5
v4 <- rep(2, times = 6)                   # 2, 2, 2, 2, 2, 2
v5 <- runif(5)                            # rovnomerné rozdelenie na [0, 1]
v6 <- rnorm(5)                            # normálne rozdelenie N(0, 1)

v1; v2; v3; v4; v5; v6
[1]  3  6  9 12
[1] 1 2 3 4 5 6 7 8
[1] 0.0 0.5 1.0 1.5 2.0
[1] 2 2 2 2 2 2
[1] 0.6986735 0.5565305 0.1401400 0.2857233 0.5553690
[1] -1.9577250  1.0848713  0.2039567  0.5011464  1.0301596

5.2 Príklad z NBA: body v 5 zápasoch

Kód
body_zapasy <- c(31, 28, 35, 22, 40)
names(body_zapasy) <- paste("Zápas", 1:5)
body_zapasy
Zápas 1 Zápas 2 Zápas 3 Zápas 4 Zápas 5 
     31      28      35      22      40 

5.3 Aritmetické operácie s vektormi

Kód
v <- c(2, 4, 6, 8)
v + 10                # každý prvok zväčšíme o 10
[1] 12 14 16 18
Kód
v * 3                 # každý prvok vynásobíme 3
[1]  6 12 18 24
Kód
(v + 1) / 2
[1] 1.5 2.5 3.5 4.5
Kód
exp(v)                # exponenciálna funkcia z každého prvku
[1]    7.389056   54.598150  403.428793 2980.957987
Kód
sum(c(1, 2, 3) * c(2, 2, 2))             # skalárny súčin - výsledok je skalár
[1] 12
Kód
crossprod(c(1, 2, 3), c(2, 2, 2))        # skalárny súčin - výsledok je matica 1x1
     [,1]
[1,]   12
Kód
c(1, 2, 3) * c(2, 2, 2)                  # Hadamardov súčin (po prvkoch)
[1] 2 4 6

5.4 Operácie s dvoma vektormi rovnakého rozmeru

Kód
body    <- c(31, 28, 35, 22, 40)
minuty  <- c(36, 34, 38, 30, 41)

length(body)
[1] 5
Kód
length(minuty)
[1] 5
Kód
body / minuty                 # body na minútu v každom zápase
[1] 0.8611111 0.8235294 0.9210526 0.7333333 0.9756098
Kód
round(body / minuty * 36, 1)  # prepočet na 36 minút
[1] 31.0 29.6 33.2 26.4 35.1
Varovanie

Pri operáciách po prvkoch musia mať oba vektory rovnakú dĺžku. Pri rôznych dĺžkach R vektor kratší “recykluje”, čo býva zdrojom chýb.

5.5 Indexovanie a výber prvkov vektora

Kód
x <- c(25, 14, 33, 8, 41, 19, 30)   # body v 7 zápasoch

x[1]           # prvý prvok
[1] 25
Kód
x[2:4]         # druhý až štvrtý prvok
[1] 14 33  8
Kód
x[-1]          # všetky prvky okrem prvého
[1] 14 33  8 41 19 30
Kód
x[x > 25]      # zápasy s viac ako 25 bodmi
[1] 33 41 30
Kód
which(x > 25)  # poradie týchto zápasov
[1] 3 5 7

5.6 Práca s chýbajúcimi hodnotami

Kód
# Hráč v 2. a 4. zápase nenastúpil (DNP) - chýbajúce hodnoty NA
y <- c(22, NA, 30, NA, 27)
is.na(y)
[1] FALSE  TRUE FALSE  TRUE FALSE
Kód
mean(y)                  # NA
[1] NA
Kód
mean(y, na.rm = TRUE)    # NA ignorujeme
[1] 26.33333

5.7 Základné štatistiky a usporiadanie prvkov

Kód
z <- c(18, 25, 31, 12, 27)
mean(z)                      # priemer
[1] 22.6
Kód
sd(z)                        # smerodajná odchýlka
[1] 7.569676
Kód
max(z)                       # maximum
[1] 31
Kód
summary(z)                   # rýchly prehľad
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   12.0    18.0    25.0    22.6    27.0    31.0 
Kód
sort(z)                      # vzostupne
[1] 12 18 25 27 31
Kód
sort(z, decreasing = TRUE)   # zostupne
[1] 31 27 25 18 12

5.8 Malé cvičenie

Vytvorte vektor w s číslami 1 až 30 a vypočítajte súčet všetkých nepárnych čísel.

Kód
w <- 1:30
sum(w[w %% 2 == 1])
[1] 225

6 Matice

6.1 Vytvorenie matíc

Kód
m       <- matrix(1:12, nrow = 3, ncol = 4)             # hodnoty po stĺpcoch
m_byrow <- matrix(1:12, nrow = 3, byrow = TRUE)         # hodnoty po riadkoch
m; m_byrow
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12

6.2 Príklad z NBA: body troch hráčov v štyroch zápasoch

Kód
body_mat <- matrix(c(30, 25, 28, 33,
                     22, 27, 31, 24,
                     18, 20, 15, 26),
                   nrow = 3, byrow = TRUE,
                   dimnames = list(c("Hráč A", "Hráč B", "Hráč C"),
                                   paste("Zápas", 1:4)))
knitr::kable(body_mat, caption = "Body hráčov v jednotlivých zápasoch")
Body hráčov v jednotlivých zápasoch
Zápas 1 Zápas 2 Zápas 3 Zápas 4
Hráč A 30 25 28 33
Hráč B 22 27 31 24
Hráč C 18 20 15 26

6.3 Rozmery matice

Kód
dim(m)       # (riadky, stĺpce)
[1] 3 4
Kód
nrow(m); ncol(m)
[1] 3
[1] 4

6.4 Adresovanie prvkov matice

Kód
body_mat[1, 2]            # Hráč A, 2. zápas
[1] 25
Kód
body_mat[, 3]             # všetci hráči v 3. zápase
Hráč A Hráč B Hráč C 
    28     31     15 
Kód
body_mat["Hráč B", ]      # všetky zápasy hráča B
Zápas 1 Zápas 2 Zápas 3 Zápas 4 
     22      27      31      24 
Kód
body_mat[1:2, 2:3]        # podmatica: riadky 1-2, stĺpce 2-3
       Zápas 2 Zápas 3
Hráč A      25      28
Hráč B      27      31

6.5 Maticové operácie

Kód
A <- matrix(c(2, 0, 1, 3), nrow = 2)
B <- matrix(c(1, 4, 2, 5), nrow = 2)

A + B        # sčítanie matíc
     [,1] [,2]
[1,]    3    3
[2,]    4    8
Kód
A * B        # Hadamardov súčin (po prvkoch)
     [,1] [,2]
[1,]    2    2
[2,]    0   15
Kód
A %*% B      # násobenie matíc
     [,1] [,2]
[1,]    6    9
[2,]   12   15
Kód
t(A)         # transpozícia
     [,1] [,2]
[1,]    2    0
[2,]    1    3
Kód
det(A)       # determinant
[1] 6
Kód
solve(A)     # inverzia (ak existuje)
     [,1]       [,2]
[1,]  0.5 -0.1666667
[2,]  0.0  0.3333333

6.6 Zlučovanie vektorov do matíc

Kód
body_hrac1 <- c(30, 25, 28)
body_hrac2 <- c(22, 27, 31)

cbind(body_hrac1, body_hrac2)   # po stĺpcoch
     body_hrac1 body_hrac2
[1,]         30         22
[2,]         25         27
[3,]         28         31
Kód
rbind(body_hrac1, body_hrac2)   # po riadkoch
           [,1] [,2] [,3]
body_hrac1   30   25   28
body_hrac2   22   27   31

6.7 Štatistiky po riadkoch (stĺpcoch) matice

Kód
apply(body_mat, 1, mean)   # priemer bodov každého hráča (po riadkoch)
Hráč A Hráč B Hráč C 
 29.00  26.00  19.75 
Kód
apply(body_mat, 2, sum)    # súčet bodov v každom zápase (po stĺpcoch)
Zápas 1 Zápas 2 Zápas 3 Zápas 4 
     70      72      74      83 
Kód
rowMeans(body_mat)         # to isté skrátene
Hráč A Hráč B Hráč C 
 29.00  26.00  19.75 
Kód
colSums(body_mat)
Zápas 1 Zápas 2 Zápas 3 Zápas 4 
     70      72      74      83 

6.8 Malé cvičenie

Vytvorte maticu 4x4 s hodnotami 1 až 16 po riadkoch, vypočítajte stĺpcové sumy a súčin matíc \(M^T M\).

Kód
M2 <- matrix(1:16, nrow = 4, byrow = TRUE)
colSums(M2)
[1] 28 32 36 40
Kód
t(M2) %*% M2
     [,1] [,2] [,3] [,4]
[1,]  276  304  332  360
[2,]  304  336  368  400
[3,]  332  368  404  440
[4,]  360  400  440  480

7 Vlastné čísla a vlastné vektory matíc

7.1 Čo znamenajú?

Nech \(\mathbf A\) je štvorcová matica. Vlastné číslo \(\lambda\) a príslušný vlastný vektor \(\mathbf h \ne \mathbf 0\) spĺňajú vzťah

\[ \mathbf A \mathbf h = \lambda \mathbf h. \]

Násobenie maticou \(\mathbf A\) teda pôsobí na vlastný vektor ako násobenie číslom \(\lambda\): smer ostáva zachovaný (pri \(\lambda < 0\) sa obráti) a dĺžka sa násobí hodnotou \(|\lambda|\).

7.2 Príklad 2 × 2: ručný výpočet

Použijeme symetrickú maticu (\(\mathbf A^T = \mathbf A\)), aké sa používajú napríklad ako variančno-kovariančné matice:

\[ \mathbf A = \begin{pmatrix} 3 & 1 \\ 1 & 3 \end{pmatrix}. \]

Z podmienky \((\mathbf A - \lambda \mathbf I)\mathbf h = \mathbf 0\) má sústava netriviálne riešenie práve vtedy, keď \(\det(\mathbf A-\lambda \mathbf I)=0\), teda

\[ \begin{vmatrix} 3-\lambda & 1 \\ 1 & 3-\lambda \end{vmatrix} = \lambda^2-6\lambda+8 = (\lambda-4)(\lambda-2) = 0 \quad\Longrightarrow\quad \lambda_1=4,\ \lambda_2=2. \]

Vlastné vektory dostaneme dosadením do \((\mathbf A-\lambda\mathbf I)\mathbf h=\mathbf 0\) a normalizáciou na dĺžku 1:

  • pre \(\lambda_1=4\) dostávame \(-h_{1}+h_{2}=0\), teda \(h_1=h_2\),
  • pre \(\lambda_2=2\) dostávame \(h_{1}+h_{2}=0\), teda \(h_2=-h_1\).

\[ \mathbf h_1= \begin{pmatrix} \sqrt{1/2}\\ \sqrt{1/2} \end{pmatrix}, \qquad \mathbf h_2= \begin{pmatrix} \sqrt{1/2}\\ -\sqrt{1/2} \end{pmatrix}. \]

Každý nenulový násobok týchto vektorov je tiež vlastným vektorom. Keďže je \(\mathbf A\) symetrická, vlastné vektory sú navzájom kolmé: \(\mathbf h_1^T\mathbf h_2 = \tfrac12 - \tfrac12 = 0\).

7.3 Výpočet pomocou funkcie eigen()

Funkcia eigen() je súčasťou základného R. Argument symmetric = TRUE použijeme, keď vieme, že matica je symetrická.

Kód
A_eig <- matrix(c(3, 1,
                  1, 3),
                nrow = 2, byrow = TRUE)

eig_A <- eigen(A_eig, symmetric = TRUE)   # výsledok je list
eig_A
eigen() decomposition
$values
[1] 4 2

$vectors
          [,1]       [,2]
[1,] 0.7071068 -0.7071068
[2,] 0.7071068  0.7071068
Kód
lambda_A <- eig_A$values     # vlastné čísla
V_A      <- eig_A$vectors    # vlastné vektory v stĺpcoch

# Overenie vzťahu A v = lambda v pre prvý vlastný pár
all.equal(as.vector(A_eig %*% V_A[, 1]), lambda_A[1] * V_A[, 1])
[1] TRUE

Znak $ vyberá pomenovanú zložku listu (eig_A$values, eig_A$vectors). R vracia vlastné čísla zostupne a vlastné vektory s jednotkovou dĺžkou; od našich ručne zvolených sa môžu líšiť znamienkom, pretože \(\mathbf v\) aj \(-\mathbf v\) sú rovnako správne.

7.4 Geometrické znázornenie

Pri vlastnom vektore zostáva jeho obraz \(\mathbf A\mathbf x\) na tej istej priamke ako \(\mathbf x\): vľavo je 4-krát dlhší, vpravo 2-krát.

Kód
local({
  povodne <- par(mfrow = c(1, 2), mar = c(4, 4, 3, 1), bg = "white")
  on.exit(par(povodne))

  priklady <- list(c(1, 1), c(1, -1))
  nazvy <- c("Vlastný vektor: lambda = 4",
             "Vlastný vektor: lambda = 2")

  for (j in seq_along(priklady)) {
    x_plot  <- priklady[[j]]
    Ax_plot <- as.vector(A_eig %*% x_plot)
    plot(NA, xlim = c(-2, 5), ylim = c(-3, 5),
         asp = 1, xlab = "Prvá súradnica", ylab = "Druhá súradnica",
         main = nazvy[j], cex.main = 0.9)
    abline(h = 0, v = 0, col = "grey80")
    arrows(0, 0, Ax_plot[1], Ax_plot[2],
           col = "#e56020", lwd = 4, length = 0.12)
    arrows(0, 0, x_plot[1], x_plot[2],
           col = "#1d428a", lwd = 2, lty = 2, length = 0.10)
    legend("topleft", legend = c("x", "Ax"),
           col = c("#1d428a", "#e56020"),
           lty = c(2, 1), lwd = c(2, 4), bty = "n", cex = 0.8)
  }
})

Vektor x (modrá, prerušovaná) a jeho obraz Ax (oranžová) pre dva vlastné vektory.

7.5 Matica 3 × 3, stopa a determinant

Pre štvorcovú maticu platí: súčet vlastných čísel sa rovná stope matice (súčtu diagonálnych prvkov) a ich súčin sa rovná determinantu.

Kód
B_eig <- matrix(c(3, 1, 0,
                  1, 3, 0,
                  0, 0, 5), nrow = 3, byrow = TRUE)
eig_B <- eigen(B_eig, symmetric = TRUE)
eig_B$values                                    # 5, 4, 2
[1] 5 4 2
Kód
c(sucet_vlastnych_cisel = sum(eig_B$values),    # obe hodnoty sú 11
  stopa_matice          = sum(diag(B_eig)))
sucet_vlastnych_cisel          stopa_matice 
                   11                    11 
Kód
c(sucin_vlastnych_cisel = prod(eig_B$values),   # obe hodnoty sú 40
  determinant           = det(B_eig))
sucin_vlastnych_cisel           determinant 
                   40                    40 

7.6 Malé cvičenie 1: vlastné čísla variančno-kovariančnej matice

Pre variančno-kovariančnú maticu štatistík hráča (body, doskoky, asistencie na zápas) vypočítajte vlastné čísla a vlastné vektory.

Štatistika Body Doskoky Asistencie
Body 36.00 6.00 8.00
Doskoky 6.00 9.00 2.50
Asistencie 8.00 2.50 6.25
Kód
# Vytvorenie matice
C <- matrix(c(
  36.00, 6.00, 8.00,    # Body
   6.00, 9.00, 2.50,    # Doskoky
   8.00, 2.50, 6.25     # Asistencie
), nrow = 3, byrow = TRUE,
dimnames = list(c("Body", "Doskoky", "Asistencie"),
                c("Body", "Doskoky", "Asistencie")))

C
           Body Doskoky Asistencie
Body         36     6.0       8.00
Doskoky       6     9.0       2.50
Asistencie    8     2.5       6.25

7.6.1 Riešenie

Matica \(\mathbf C\) je symetrická, preto použijeme symmetric = TRUE.

Kód
eig_C    <- eigen(C, symmetric = TRUE)
lambda_C <- eig_C$values
V_C      <- eig_C$vectors
dimnames(V_C) <- list(rownames(C), paste0("h", 1:3))

lambda_C          # vlastné čísla (zostupne)
[1] 39.376583  7.880701  3.992716
Kód
round(V_C, 4)     # vlastné vektory v stĺpcoch
               h1      h2      h3
Body       0.9473  0.2568 -0.1916
Doskoky    0.2072 -0.9472 -0.2449
Asistencie 0.2444 -0.1923  0.9504

Kontrola výsledku – vzťah \(\mathbf C\mathbf h = \lambda \mathbf h\) pre všetky tri vlastné páry naraz, stopa, determinant a ortogonalita:

Kód
# 1. C h = lambda h (každý stĺpec V_C vynásobíme príslušným lambda)
all.equal(C %*% V_C, V_C %*% diag(lambda_C), check.attributes = FALSE)
[1] TRUE
Kód
# 2. Súčet vlastných čísel = stopa, súčin = determinant
c(sucet_vlastnych_cisel = sum(lambda_C), stopa = sum(diag(C)))
sucet_vlastnych_cisel                 stopa 
                51.25                 51.25 
Kód
c(sucin_vlastnych_cisel = prod(lambda_C), determinant = det(C))
sucin_vlastnych_cisel           determinant 
                 1239                  1239 
Kód
# 3. Vlastné vektory sú ortonormálne: V^T V = I
round(t(V_C) %*% V_C, 10)
   h1 h2 h3
h1  1  0  0
h2  0  1  0
h3  0  0  1
Kód
# 4. Kladná definitnosť: všetky vlastné čísla > 0
all(lambda_C > 0)
[1] TRUE

Z kladných vlastných čísel vyplýva, že \(\mathbf C\) je kladne definitná (žiadna štatistika nie je lineárnou kombináciou ostatných).

7.6.2 Spektrálny rozklad

Pre symetrickú maticu platí \(\mathbf C = \mathbf V \boldsymbol\Lambda \mathbf V^T\), kde \(\boldsymbol\Lambda=\mathrm{diag}(\lambda_1,\lambda_2,\lambda_3)\).

Kód
C_znovu <- V_C %*% diag(lambda_C) %*% t(V_C)
round(C_znovu, 4)
           Body Doskoky Asistencie
Body         36     6.0       8.00
Doskoky       6     9.0       2.50
Asistencie    8     2.5       6.25
Kód
all.equal(C, C_znovu, check.attributes = FALSE)
[1] TRUE

7.6.3 Podiel vysvetlenej variability

Celková variabilita (súčet rozptylov) je stopa matice. Každé vlastné číslo z nej vysvetľuje svoj podiel – ide o základ analýzy hlavných komponentov (PCA).

Kód
podiel <- lambda_C / sum(lambda_C) * 100

data.frame(
  Komponent  = paste0("PK", 1:3),
  Vlastne_cislo = round(lambda_C, 3),
  Podiel_percent = round(podiel, 1),
  Kumulativne_percent = round(cumsum(podiel), 1)
)
Komponent Vlastne_cislo Podiel_percent Kumulativne_percent
PK1 39.377 76.8 76.8
PK2 7.881 15.4 92.2
PK3 3.993 7.8 100.0

Podiel celkovej variability pripadajúci na jednotlivé vlastné čísla matice C.

Kód
par(mar = c(4, 4, 2, 1), bg = "white")
barplot(podiel, names.arg = paste0("PK", 1:3),
        col = "#1d428a", border = NA, ylim = c(0, 100),
        ylab = "Podiel variability (%)", main = "Scree graf")

Podiel celkovej variability pripadajúci na jednotlivé vlastné čísla matice C.
Kód
# Zloženie prvého hlavného komponentu (smer najväčšej variability)
round(V_C[, 1], 3)
      Body    Doskoky Asistencie 
     0.947      0.207      0.244 
PoznámkaInterpretácia

Prvé vlastné číslo vysvetľuje zhruba tri štvrtiny celkovej variability. Zodpovedajúci vlastný vektor má všetky zložky rovnakého znamienka, čo znamená, že štatistiky hráča sa v zápasoch menia spoločne: v zápase, v ktorom hráč zaznamená viac bodov, má spravidla aj viac doskokov a asistencií. Najväčšiu váhu má štatistika Body, pretože má najväčší rozptyl (36). Znamienko vlastného vektora je ľubovoľné (\(\mathbf h\) aj \(-\mathbf h\) sú správne), dôležité sú vzájomné pomery a znamienka jeho zložiek.

7.7 Malé cvičenie 2: od údajov k vlastným číslam

V praxi variančno-kovariančnú maticu nedostaneme hotovú, ale vypočítame ju z nameraných údajov. Máme štatistiky jedného hráča z 10 zápasov (ilustratívne hodnoty).

Kód
X <- cbind(
  Body       = c(28, 35, 22, 31, 40, 25, 33, 29, 38, 21),
  Doskoky    = c( 8, 10,  6,  9, 12,  7, 11,  8, 10,  5),
  Asistencie = c( 6,  9,  4,  7, 10,  5,  8,  7,  9,  3)
)
rownames(X) <- paste("Zápas", 1:10)
head(X, 4)
        Body Doskoky Asistencie
Zápas 1   28       8          6
Zápas 2   35      10          9
Zápas 3   22       6          4
Zápas 4   31       9          7

7.7.1 a) Variančno-kovariančná a korelačná matica

Kód
S <- cov(X)          # výberová variančno-kovariančná matica
round(S, 2)
            Body Doskoky Asistencie
Body       41.51   13.64      14.60
Doskoky    13.64    4.93       4.91
Asistencie 14.60    4.91       5.29
Kód
R <- cov2cor(S)      # korelačná matica (štandardizovaná S)
round(R, 3)
            Body Doskoky Asistencie
Body       1.000   0.953      0.985
Doskoky    0.953   1.000      0.961
Asistencie 0.985   0.961      1.000

7.7.2 b) Vlastné čísla a vlastné vektory matice \(\mathbf S\)

Kód
eig_S    <- eigen(S, symmetric = TRUE)
lambda_S <- eig_S$values
V_S      <- eig_S$vectors
dimnames(V_S) <- list(colnames(X), paste0("PK", 1:3))

round(lambda_S, 3)
[1] 51.207  0.416  0.110
Kód
round(V_S, 3)
             PK1    PK2    PK3
Body       0.900  0.368 -0.235
Doskoky    0.299 -0.911 -0.283
Asistencie 0.318 -0.185  0.930
Kód
# Kontrola: stopa a determinant
c(sucet = sum(lambda_S), stopa = sum(diag(S)))
   sucet    stopa 
51.73333 51.73333 
Kód
c(sucin = prod(lambda_S), determinant = det(S))
      sucin determinant 
   2.342387    2.342387 

7.7.3 c) Hlavné komponenty (skóre) a ich rozptyl

Vycentrované údaje premietneme do smerov vlastných vektorov. Rozptyl \(j\)-tej hlavnej komponenty sa rovná \(\lambda_j\) a komponenty sú navzájom nekorelované.

Kód
X_c    <- scale(X, center = TRUE, scale = FALSE)   # centrovanie
skore  <- X_c %*% V_S                              # skóre hlavných komponentov

round(apply(skore, 2, var), 3)    # rozptyly skóre = vlastné čísla
   PK1    PK2    PK3 
51.207  0.416  0.110 
Kód
round(cov(skore), 6)              # nediagonálne prvky sú nulové
         PK1      PK2      PK3
PK1 51.20739 0.000000 0.000000
PK2  0.00000 0.415974 0.000000
PK3  0.00000 0.000000 0.109966

7.7.4 d) Porovnanie s funkciou prcomp()

Kód
pca <- prcomp(X)                  # PCA z kovariančnej matice (bez škálovania)

round(pca$sdev^2, 3)              # rovnaké ako vlastné čísla S
[1] 51.207  0.416  0.110
Kód
round(summary(pca)$importance, 3) # podiely vysvetlenej variability
                         PC1   PC2   PC3
Standard deviation     7.156 0.645 0.332
Proportion of Variance 0.990 0.008 0.002
Cumulative Proportion  0.990 0.998 1.000

Vlastné čísla z eigen() a štvorce smerodajných odchýlok z prcomp() sú rovnaké; vlastné vektory sa môžu líšiť len znamienkom.

7.7.5 e) Kovariančná vs. korelačná matica

Kód
eig_R <- eigen(R, symmetric = TRUE)

round(eig_R$values, 3)
[1] 2.934 0.052 0.014
Kód
sum(eig_R$values)                              # = počet premenných (stopa R = 3)
[1] 3
Kód
round(eig_R$values / sum(eig_R$values) * 100, 1)   # podiely v %
[1] 97.8  1.7  0.5
VarovaniePozor na mierku

Vlastné čísla kovariančnej matice závisia od jednotiek merania: štatistika s najväčším rozptylom (body) dominuje prvej komponente. Pri korelačnej matici sú všetky premenné štandardizované (rozptyl 1), preto má každá rovnakú váhu a súčet vlastných čísel sa rovná počtu premenných. Ak sa štatistiky merajú v rôznych jednotkách, zvyčajne je vhodnejšie použiť korelačnú maticu (prcomp(X, scale. = TRUE)).

7.7.6 f) Zhrnutie

  • Vlastné čísla \(\lambda_j\) variančno-kovariančnej matice sú rozptyly hlavných komponentov a ich súčet je celková variabilita (stopa).
  • Vlastné vektory sú navzájom kolmé smery, v ktorých sa údaje menia najviac (prvý vektor), druhý najviac atď.
  • Súčin vlastných čísel je determinant (tzv. zovšeobecnený rozptyl); ak je niektoré vlastné číslo blízke nule, štatistiky sú takmer lineárne závislé.

Nápoveda k funkcii eigen(): R: eigen().