Kód
knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)V tomto dokumente budem využívať programovací jazyk R na príkladoch, ktoré súvisia s mojou vysnívanou kariérou dátového vedca.
knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)V tomto dokumente by som chcel opísať, čomu by som sa chcel v budúcnosti venovať. Možností na dnešnom trhu práce je veľmi veľa, ale mňa najviac priťahuje oblasť Data Science (dátovej vedy) a umelej inteligencie.
Práca dátového vedca je založená na práci s údajmi, ich analýze, spracovaní a interpretácii. Práve preto je programovací jazyk R vhodným nástrojom na demonštráciu základných operácií, ktoré môže dátový vedec pri svojej práci využívať.
V tomto dokumente si precvičím prácu so:
Predstavme si, že sledujeme počet pracovných ponúk pre dátových vedcov v dvoch rôznych obdobiach.
Prvá hodnota predstavuje 150 tisíc pracovných ponúk a druhá 300 tisíc pracovných ponúk.
dopyt_2020 <- 150
dopyt_2023 <- 300
sucet <- dopyt_2020 + dopyt_2023
rozdiel <- dopyt_2023 - dopyt_2020
podiel <- dopyt_2023 / dopyt_2020
sucet[1] 450
rozdiel[1] 150
podiel[1] 2
Z výsledku môžeme vidieť, že hodnota dopytu v roku 2023 je dvojnásobná oproti roku 2020.
Použiť môžeme aj ďalšie matematické operácie.
a <- 12
b <- 4.5
a + b[1] 16.5
a - b[1] 7.5
a * b[1] 54
a / b[1] 2.666667
a^2[1] 144
a %% 5[1] 2
a %/% b[1] 2
Pri dátovej analýze sa často stretávame aj s potrebou zaokrúhľovania čísel.
Predstavme si, že úspešnosť analytického modelu je 91,7463 %.
uspesnost_modelu <- 91.7463
round(uspesnost_modelu)[1] 92
round(uspesnost_modelu, digits = 1)[1] 91.7
round(uspesnost_modelu, digits = 2)[1] 91.75
ceiling(uspesnost_modelu)[1] 92
floor(uspesnost_modelu)[1] 91
Predstavme si, že dátový model správne vyhodnotil 864 prípadov z celkového počtu 900 prípadov.
Vypočítajte jeho percentuálnu úspešnosť.
spravne <- 864
celkovo <- 900
uspesnost <- spravne / celkovo * 100
uspesnost[1] 96
Výsledok zaokrúhlime na dve desatinné miesta.
round(uspesnost, digits = 2)[1] 96
Dátový vedec pracuje nielen s číslami, ale aj s textovými údajmi.
Vytvorím napríklad názov pracovnej pozície a programovacieho jazyka.
pozicia <- "Data Scientist"
jazyk <- "R"
profil <- paste(pozicia, jazyk, sep = " - ")
profil[1] "Data Scientist - R"
Výsledkom je:
Data Scientist - R
Pomocou funkcie paste0() môžeme vytvoriť napríklad názov modelu.
model <- paste0("Model_", "01")
model[1] "Model_01"
Môžeme vytvoriť aj zoznam oblastí, ktoré sú dôležité pre dátového vedca.
oblasti <- paste(
"R",
"Statistika",
"Data Science",
"Machine Learning",
sep = ", "
)
oblasti[1] "R, Statistika, Data Science, Machine Learning"
Môžeme zistiť počet znakov v názve pracovnej pozície.
text <- "Data Scientist"
nchar(text)[1] 14
Pomocou substr() môžeme vybrať iba časť textu.
substr(text, 1, 4)[1] "Data"
Výsledkom bude:
Data
Vytvorte premenné s názvom oblasti a programovacieho jazyka tak, aby bol výsledok:
Data Science - R
oblast <- "Data Science"
jazyk <- "R"
vysledny_text <- paste(
oblast,
jazyk,
sep = " - "
)
vysledny_text[1] "Data Science - R"
Následne zistíme počet znakov.
nchar(vysledny_text)[1] 16
Dátový vedec často kontroluje, či jednotlivé podmienky platia alebo neplatia.
Napríklad môžeme sledovať, či bol model úspešne vytvorený a či v dátach chýbajú hodnoty.
model_hotovy <- TRUE
chybajuce_data <- FALSE
model_hotovy[1] TRUE
chybajuce_data[1] FALSE
Použiť môžeme základné logické operácie.
!model_hotovy[1] FALSE
model_hotovy & chybajuce_data[1] FALSE
model_hotovy | chybajuce_data[1] TRUE
xor(model_hotovy, chybajuce_data)[1] TRUE
Predstavme si, že analytický model dosiahol úspešnosť 92 %.
uspesnost <- 92
uspesnost > 90[1] TRUE
uspesnost >= 80[1] TRUE
uspesnost == 92[1] TRUE
uspesnost != 100[1] TRUE
Porovnávať môžeme aj textové hodnoty.
jazyk <- "R"
jazyk == "R"[1] TRUE
jazyk == "SQL"[1] FALSE
Predstavme si, že model považujeme za kvalitný v prípade, že jeho úspešnosť je minimálne 85 % a maximálne 100 %.
uspesnost <- 92
uspesnost >= 85 & uspesnost <= 100[1] TRUE
Môžeme pridať aj podmienku minimálneho počtu záznamov.
uspesnost <- 92
pocet_zaznamov <- 2500
uspesnost >= 85 & pocet_zaznamov >= 1000[1] TRUE
Predstavme si, že máme päť rôznych dátových modelov.
uspesne_modely <- c(
TRUE,
TRUE,
FALSE,
TRUE,
FALSE
)
uspesne_modely[1] TRUE TRUE FALSE TRUE FALSE
Počet úspešných modelov:
sum(uspesne_modely)[1] 3
Celkový počet modelov:
length(uspesne_modely)[1] 5
Firma chce použiť analytický model iba vtedy, ak:
Náš model dosiahol úspešnosť 89 % a bol testovaný na 2500 záznamoch.
uspesnost <- 89
pocet_zaznamov <- 2500
vhodny_model <-
uspesnost >= 85 &
pocet_zaznamov >= 1000
vhodny_model[1] TRUE
Hodnota TRUE znamená, že model spĺňa obe podmienky.
Dátový vedec môže pomocou vektora uložiť napríklad úspešnosť viacerých analytických modelov.
uspesnost_modelov <- c(
78,
84,
91,
88,
94
)
uspesnost_modelov[1] 78 84 91 88 94
Môžeme vytvoriť poradové čísla experimentov.
experimenty <- 1:5
experimenty[1] 1 2 3 4 5
Funkcia seq() vytvorí postupnosť podľa zadaného kroku.
hranice <- seq(
from = 0.5,
to = 1,
by = 0.1
)
hranice[1] 0.5 0.6 0.7 0.8 0.9 1.0
Funkciou rep() môžeme opakovať rovnakú hodnotu.
pocet_testov <- rep(
10,
times = 5
)
pocet_testov[1] 10 10 10 10 10
Môžeme vytvárať aj náhodné hodnoty.
nahodne_hodnoty <- runif(
5,
min = 0,
max = 1
)
nahodne_hodnoty[1] 0.1517370 0.2322769 0.3475167 0.2829301 0.6824356
Normálne rozdelené hodnoty:
chyby <- rnorm(
5,
mean = 0,
sd = 1
)
chyby[1] -1.52477194 2.01126058 0.03461956 0.02240924 -0.66672847
Predstavme si výsledky štyroch modelov.
uspesnost <- c(
81,
84,
87,
90
)
uspesnost[1] 81 84 87 90
Ku každému výsledku môžeme pripočítať jeden percentuálny bod.
uspesnost + 1[1] 82 85 88 91
Hodnoty môžeme previesť z percent na desatinné čísla.
uspesnost / 100[1] 0.81 0.84 0.87 0.90
Porovnáme výsledky dvoch skupín modelov.
model_A <- c(
82,
86,
91
)
model_B <- c(
80,
88,
89
)
model_A[1] 82 86 91
model_B[1] 80 88 89
Rozdiel:
model_A - model_B[1] 2 -2 2
Súčet:
model_A + model_B[1] 162 174 180
Priemer jednotlivých dvojíc:
(model_A + model_B) / 2[1] 81 87 90
Skalárny súčin:
crossprod(
model_A,
model_B
) [,1]
[1,] 22227
Máme výsledky siedmich analytických modelov.
uspesnost <- c(
76,
88,
91,
83,
95,
79,
92
)
uspesnost[1] 76 88 91 83 95 79 92
Prvý výsledok:
uspesnost[1][1] 76
Druhý až štvrtý výsledok:
uspesnost[2:4][1] 88 91 83
Všetky hodnoty okrem prvej:
uspesnost[-1][1] 88 91 83 95 79 92
Modely s úspešnosťou vyššou ako 90 %:
uspesnost[uspesnost > 90][1] 91 95 92
Pozície týchto modelov:
which(uspesnost > 90)[1] 3 5 7
V reálnych dátach môžu niektoré hodnoty chýbať.
uspesnost <- c(
82,
NA,
91,
87,
NA,
94
)
uspesnost[1] 82 NA 91 87 NA 94
Zistíme pozície chýbajúcich hodnôt.
is.na(uspesnost)[1] FALSE TRUE FALSE FALSE TRUE FALSE
Priemer bez odstránenia chýbajúcich údajov:
mean(uspesnost)[1] NA
Výsledkom bude NA.
Chýbajúce hodnoty môžeme odstrániť z výpočtu.
mean(
uspesnost,
na.rm = TRUE
)[1] 88.5
Máme výsledky siedmich modelov.
vysledky <- c(
84,
91,
88,
95,
79,
90,
86
)
vysledky[1] 84 91 88 95 79 90 86
Priemer:
mean(vysledky)[1] 87.57143
Štandardná odchýlka:
sd(vysledky)[1] 5.191568
Najvyššia hodnota:
max(vysledky)[1] 95
Najnižšia hodnota:
min(vysledky)[1] 79
Základný štatistický prehľad:
summary(vysledky) Min. 1st Qu. Median Mean 3rd Qu. Max.
79.00 85.00 88.00 87.57 90.50 95.00
Zoradenie od najnižšej hodnoty:
sort(vysledky)[1] 79 84 86 88 90 91 95
Zoradenie od najvyššej:
sort(
vysledky,
decreasing = TRUE
)[1] 95 91 90 88 86 84 79
Máme úspešnosť desiatich dátových modelov.
modely <- c(
72,
85,
91,
88,
94,
79,
83,
97,
90,
86
)
modely [1] 72 85 91 88 94 79 83 97 90 86
Vyberieme modely s úspešnosťou minimálne 90 %.
najlepsie_modely <-
modely[
modely >= 90
]
najlepsie_modely[1] 91 94 97 90
Vypočítame ich priemernú úspešnosť.
mean(najlepsie_modely)[1] 93
Zistíme počet modelov, ktoré dosiahli aspoň 90 %.
length(najlepsie_modely)[1] 4
Dátové súbory sa veľmi často dajú reprezentovať vo forme matice.
Predstavme si výsledky troch analytických modelov v štyroch rôznych testoch.
vysledky_modelov <- matrix(
c(
82, 85, 88, 91,
79, 84, 86, 89,
87, 90, 92, 94
),
nrow = 3,
byrow = TRUE
)
vysledky_modelov [,1] [,2] [,3] [,4]
[1,] 82 85 88 91
[2,] 79 84 86 89
[3,] 87 90 92 94
Riadky predstavujú jednotlivé modely.
Stĺpce predstavujú jednotlivé testy.
dim(vysledky_modelov)[1] 3 4
Počet modelov:
nrow(vysledky_modelov)[1] 3
Počet testov:
ncol(vysledky_modelov)[1] 4
Výsledok prvého modelu v druhom teste:
vysledky_modelov[1, 2][1] 85
Výsledky všetkých modelov v treťom teste:
vysledky_modelov[, 3][1] 88 86 92
Výsledky druhého modelu:
vysledky_modelov[2, ][1] 79 84 86 89
Prvé dva modely a prvé dva testy:
vysledky_modelov[1:2, 1:2] [,1] [,2]
[1,] 82 85
[2,] 79 84
Vytvoríme dve jednoduché matice.
A <- matrix(
c(
80, 85,
90, 95
),
nrow = 2,
byrow = TRUE
)
B <- matrix(
c(
2, 3,
4, 5
),
nrow = 2,
byrow = TRUE
)
A [,1] [,2]
[1,] 80 85
[2,] 90 95
B [,1] [,2]
[1,] 2 3
[2,] 4 5
Sčítanie matíc:
A + B [,1] [,2]
[1,] 82 88
[2,] 94 100
Hadamardov súčin:
A * B [,1] [,2]
[1,] 160 255
[2,] 360 475
Maticové násobenie:
A %*% B [,1] [,2]
[1,] 500 665
[2,] 560 745
Transpozícia:
t(A) [,1] [,2]
[1,] 80 90
[2,] 85 95
Determinant:
det(A)[1] -50
Inverzná matica:
solve(A) [,1] [,2]
[1,] -1.9 1.7
[2,] 1.8 -1.6
Máme výsledky dvoch analytických modelov.
model_1 <- c(
82,
88,
91
)
model_2 <- c(
79,
85,
94
)Spojenie po stĺpcoch:
porovnanie <- cbind(
model_1,
model_2
)
porovnanie model_1 model_2
[1,] 82 79
[2,] 88 85
[3,] 91 94
Spojenie po riadkoch:
porovnanie_riadky <- rbind(
model_1,
model_2
)
porovnanie_riadky [,1] [,2] [,3]
model_1 82 88 91
model_2 79 85 94
Vytvoríme maticu výsledkov.
matica_vysledkov <- matrix(
c(
82, 88, 91,
76, 84, 89,
90, 93, 95
),
nrow = 3,
byrow = TRUE
)
matica_vysledkov [,1] [,2] [,3]
[1,] 82 88 91
[2,] 76 84 89
[3,] 90 93 95
Priemerná úspešnosť jednotlivých modelov:
apply(
matica_vysledkov,
1,
mean
)[1] 87.00000 83.00000 92.66667
Priemerné výsledky jednotlivých testov:
apply(
matica_vysledkov,
2,
mean
)[1] 82.66667 88.33333 91.66667
Použiť môžeme aj jednoduchšie funkcie.
rowMeans(matica_vysledkov)[1] 87.00000 83.00000 92.66667
colMeans(matica_vysledkov)[1] 82.66667 88.33333 91.66667
Predstavme si štyri analytické modely, ktoré boli testované na štyroch rôznych dátových súboroch.
matica_uspesnosti <- matrix(
c(
82, 84, 87, 89,
88, 90, 91, 93,
79, 83, 86, 88,
91, 92, 94, 96
),
nrow = 4,
byrow = TRUE
)
matica_uspesnosti [,1] [,2] [,3] [,4]
[1,] 82 84 87 89
[2,] 88 90 91 93
[3,] 79 83 86 88
[4,] 91 92 94 96
Vypočítajte priemernú úspešnosť každého modelu.
rowMeans(matica_uspesnosti)[1] 85.50 90.50 84.00 93.25
Vypočítajte priemernú úspešnosť na jednotlivých dátových súboroch.
colMeans(matica_uspesnosti)[1] 85.00 87.25 89.50 91.50
Zistite najvyššiu úspešnosť zo všetkých výsledkov.
max(matica_uspesnosti)[1] 96
Vlastné čísla a vlastné vektory majú významné využitie aj v dátovej vede.
Jedným z príkladov je metóda PCA – Principal Component Analysis, ktorá sa používa na zjednodušenie dát s veľkým počtom premenných.
Nech máme štvorcovú maticu \(\mathbf A\).
Vlastné číslo \(\lambda\) a vlastný vektor \(\mathbf v\) spĺňajú vzťah:
\[ \mathbf A \mathbf v = \lambda \mathbf v. \]
Použijeme symetrickú maticu:
\[ \mathbf A = \begin{pmatrix} 4 & 1 \\ 1 & 4 \end{pmatrix}. \]
Táto matica môže zjednodušene predstavovať vzťah medzi dvoma premennými v dátovom súbore.
Vlastné čísla získame zo vzťahu:
\[ \det( \mathbf A - \lambda\mathbf I ) =0. \]
V našom prípade:
\[ \mathbf A-\lambda\mathbf I= \begin{pmatrix} 4-\lambda & 1\\ 1 & 4-\lambda \end{pmatrix}. \]
Determinant:
\[ (4-\lambda)^2-1=0. \]
Po úprave:
\[ \lambda^2-8\lambda+15=0. \]
Teda:
\[ (\lambda-5)(\lambda-3)=0. \]
Vlastné čísla sú:
\[ \lambda_1=5 \]
a
\[ \lambda_2=3. \]
V dátovej praxi môžeme vlastné čísla a vlastné vektory jednoducho vypočítať pomocou funkcie eigen().
A_eig <- matrix(
c(
4, 1,
1, 4
),
nrow = 2,
byrow = TRUE
)
A_eig [,1] [,2]
[1,] 4 1
[2,] 1 4
Výpočet:
eig_A <- eigen(
A_eig,
symmetric = TRUE
)
eig_Aeigen() decomposition
$values
[1] 5 3
$vectors
[,1] [,2]
[1,] 0.7071068 -0.7071068
[2,] 0.7071068 0.7071068
Vlastné čísla:
vlastne_cisla <- eig_A$values
vlastne_cisla[1] 5 3
Vlastné vektory:
vlastne_vektory <- eig_A$vectors
vlastne_vektory [,1] [,2]
[1,] 0.7071068 -0.7071068
[2,] 0.7071068 0.7071068
Prvé vlastné číslo:
eig_A$values[1][1] 5
Prvý vlastný vektor:
eig_A$vectors[, 1][1] 0.7071068 0.7071068
Vyberieme prvé vlastné číslo a vlastný vektor.
lambda_1 <- vlastne_cisla[1]
v_1 <- vlastne_vektory[, 1]
lambda_1[1] 5
v_1[1] 0.7071068 0.7071068
Vypočítame ľavú stranu rovnice.
lava_strana <- as.vector(
A_eig %*% v_1
)
lava_strana[1] 3.535534 3.535534
Pravá strana:
prava_strana <-
lambda_1 * v_1
prava_strana[1] 3.535534 3.535534
Porovnanie:
cbind(
lava_strana,
prava_strana
) lava_strana prava_strana
[1,] 3.535534 3.535534
[2,] 3.535534 3.535534
Rozdiel:
lava_strana - prava_strana[1] 0 0
Výsledok by mal byť nulový alebo veľmi blízky nule.
Predstavme si vzťahy medzi troma premennými v dátovej analýze.
B_eig <- matrix(
c(
3, 1, 0,
1, 3, 0,
0, 0, 6
),
nrow = 3,
byrow = TRUE
)
B_eig [,1] [,2] [,3]
[1,] 3 1 0
[2,] 1 3 0
[3,] 0 0 6
Vypočítame vlastné čísla a vlastné vektory.
eig_B <- eigen(
B_eig,
symmetric = TRUE
)
eig_B$values[1] 6 4 2
eig_B$vectors [,1] [,2] [,3]
[1,] 0 0.7071068 0.7071068
[2,] 0 0.7071068 -0.7071068
[3,] 1 0.0000000 0.0000000
Overíme dĺžku vlastných vektorov.
colSums(
eig_B$vectors^2
)[1] 1 1 1
Overenie všetkých vlastných párov:
max(
abs(
B_eig %*% eig_B$vectors -
eig_B$vectors %*%
diag(eig_B$values)
)
)[1] 8.881784e-16
Súčet vlastných čísel sa rovná stope matice.
c(
sucet_vlastnych_cisel =
sum(eig_B$values),
stopa_matice =
sum(diag(B_eig))
)sucet_vlastnych_cisel stopa_matice
12 12
Súčin vlastných čísel sa rovná determinantu matice.
c(
sucin_vlastnych_cisel =
prod(eig_B$values),
determinant =
det(B_eig)
)sucin_vlastnych_cisel determinant
48 48
Predstavme si, že pri analýze schopností budúceho dátového vedca sledujeme tri oblasti:
Ich vymyslená kovariančná matica je:
| Oblasť | R programovanie | Štatistika | Strojové učenie |
|---|---|---|---|
| R programovanie | 0.90 | 0.45 | 0.60 |
| Štatistika | 0.45 | 0.80 | 0.55 |
| Strojové učenie | 0.60 | 0.55 | 1.00 |
Vytvoríme túto maticu v R.
skills <- matrix(
c(
0.90, 0.45, 0.60,
0.45, 0.80, 0.55,
0.60, 0.55, 1.00
),
nrow = 3,
byrow = TRUE
)
skills [,1] [,2] [,3]
[1,] 0.90 0.45 0.60
[2,] 0.45 0.80 0.55
[3,] 0.60 0.55 1.00
Overíme jej rozmery.
dim(skills)[1] 3 3
Vypočítame vlastné čísla a vlastné vektory.
skills_eigen <- eigen(
skills,
symmetric = TRUE
)
skills_eigeneigen() decomposition
$values
[1] 1.9792517 0.3979495 0.3227989
$vectors
[,1] [,2] [,3]
[1,] 0.5704206 0.71319369 -0.4074003
[2,] 0.5157930 -0.69705258 -0.4980715
[3,] 0.6392009 -0.07397601 0.7654735
Vlastné čísla:
skills_eigen$values[1] 1.9792517 0.3979495 0.3227989
Vlastné vektory:
skills_eigen$vectors [,1] [,2] [,3]
[1,] 0.5704206 0.71319369 -0.4074003
[2,] 0.5157930 -0.69705258 -0.4980715
[3,] 0.6392009 -0.07397601 0.7654735
Vyberieme prvé vlastné číslo.
lambda_skill <-
skills_eigen$values[1]
lambda_skill[1] 1.979252
Vyberieme príslušný vlastný vektor.
vektor_skill <-
skills_eigen$vectors[, 1]
vektor_skill[1] 0.5704206 0.5157930 0.6392009
Overíme vzťah:
\[ A v = \lambda v. \]
Ľavá strana:
lava_skill <- as.vector(
skills %*%
vektor_skill
)
lava_skill[1] 1.129006 1.020884 1.265139
Pravá strana:
prava_skill <-
lambda_skill *
vektor_skill
prava_skill[1] 1.129006 1.020884 1.265139
Porovnanie:
cbind(
lava_skill,
prava_skill
) lava_skill prava_skill
[1,] 1.129006 1.129006
[2,] 1.020884 1.020884
[3,] 1.265139 1.265139
Rozdiel:
lava_skill -
prava_skill[1] 0.000000e+00 -2.220446e-16 -4.440892e-16
Výsledok by mal byť nulový alebo veľmi blízky nule.
Práca dátového vedca ma zaujíma najmä preto, že spája prácu s dátami, matematiku, štatistiku a moderné technológie.
V tomto dokumente som prepojil svoju vysnívanú kariéru s praktickým využitím programovacieho jazyka R. Na príkladoch som pracoval so skalármi, textovými premennými, logickými hodnotami, numerickými vektormi a maticami.
Pri jednotlivých cvičeniach som využil príklady týkajúce sa úspešnosti analytických modelov, počtu dátových záznamov, porovnávania výsledkov modelov a analýzy vzťahov medzi premennými.
Na záver som pracoval s vlastnými číslami a vlastnými vektormi, ktoré majú využitie aj v pokročilejších metódach dátovej analýzy, napríklad pri metóde PCA.
Programovací jazyk R preto vnímam ako jeden z nástrojov, ktorý môže byť pre moju budúcu kariéru dátového vedca veľmi užitočný.