Práca s databázou

Author

Romana Černáková
(s využitím verejne dostupných kódov)

Published

October 21, 2026

knitr::opts_chunk$set(
    echo = TRUE,
    message = FALSE,
    warning = FALSE
)

Spracované a inšpirované Notebookom Jason Locklin: Introduction to R for Education Data Analysis and Visualization

Práca s údajmi

Tradičná práca s databázou

Pre prácu s údajmi (databázou) používame najčastejšie dátový typ .data.frame.. Je to tabuľka, ktorá pozostáva zo stĺpcov rozličných typov. Jeden riadok pritom predstavuje jeden záznam databázy.

Príklad

Majme údaje o HICP krajín Európskej únie za marec až december v roku 2025. V tabuľke máme premenné krajina a marec 2025, april 2025 maj 2025.

# Working with data frames

  Krajina = c("Česko", "Slovensko", "Poľsko", "Rakúsko")
  Marec_2025 = c(154.9, 148.1, 153.1, 138.27)
  April_2025 = c(154.7, 148.15, 153.6, 138.64)
  Maj_2025 = c(155.5, 148.92, 153.4, 138.4)

Tieto tri premenné nie sú zatiaľ nijako prepojené, predstavujú izolované stĺpce tabuľky. Do tabuľky ich spojíme nasledovne

udaje <- data.frame(Krajina, Marec_2025, April_2025, Maj_2025)
print(udaje)
    Krajina Marec_2025 April_2025 Maj_2025
1     Česko     154.90     154.70   155.50
2 Slovensko     148.10     148.15   148.92
3    Poľsko     153.10     153.60   153.40
4   Rakúsko     138.27     138.64   138.40

Vysvetlenie: DataFrame má tri stĺpce: Meno, Vek a Body. Niektoré operácie s údajmi organizovanými v .data.frame. sú uvedené nasledovne

print(udaje$Marec_2025)                 # takto adresujeme jednotlivé premenné v data.frame
[1] 154.90 148.10 153.10 138.27
print(mean(udaje$Marec_2025))           # priemerny vek
[1] 148.5925
print(udaje[Krajina =="Česko",])     # adresovanie celého riadku
  Krajina Marec_2025 April_2025 Maj_2025
1   Česko      154.9      154.7    155.5
print(udaje[3,])                 # ina moznost adresovania celeho riadku
  Krajina Marec_2025 April_2025 Maj_2025
3  Poľsko      153.1      153.6    153.4
print(udaje[,2:3])               # vypisanie druheho a tretieho stlpca tabulky
  Marec_2025 April_2025
1     154.90     154.70
2     148.10     148.15
3     153.10     153.60
4     138.27     138.64
print(udaje[1,1])                # vypisanie jednej bunky tabulky
[1] "Česko"
summary(udaje)                   # zakladna deskriptivna statistika celej tabulky
      Krajina    Marec_2025      April_2025       Maj_2025    
 Length   :4   Min.   :138.3   Min.   :138.6   Min.   :138.4  
 N.unique :4   1st Qu.:145.6   1st Qu.:145.8   1st Qu.:146.3  
 N.blank  :0   Median :150.6   Median :150.9   Median :151.2  
 Min.nchar:5   Mean   :148.6   Mean   :148.8   Mean   :149.1  
 Max.nchar:9   3rd Qu.:153.6   3rd Qu.:153.9   3rd Qu.:153.9  
               Max.   :154.9   Max.   :154.7   Max.   :155.5  

Ak chceme pridať k tabuľke dodatočný stĺpec, potom to robíme nasledovne

Jun_2025 <- c(155.8, 149.32, 153.5, 138.77)
udaje <- cbind(udaje,Jun_2025)
print(udaje)
    Krajina Marec_2025 April_2025 Maj_2025 Jun_2025
1     Česko     154.90     154.70   155.50   155.80
2 Slovensko     148.10     148.15   148.92   149.32
3    Poľsko     153.10     153.60   153.40   153.50
4   Rakúsko     138.27     138.64   138.40   138.77

Ak chceme pridať riadok, potom

# New record (must match column order/types)
novy.riadok <- data.frame(Krajina = "Maďarsko", Marec_2025 = 173.12, April_2025 = 173.2, Maj_2025 = 173.72, Jun_2025 = 174.03)

# Append
udaje <- rbind(udaje, novy.riadok)
print(udaje)
    Krajina Marec_2025 April_2025 Maj_2025 Jun_2025
1     Česko     154.90     154.70   155.50   155.80
2 Slovensko     148.10     148.15   148.92   149.32
3    Poľsko     153.10     153.60   153.40   153.50
4   Rakúsko     138.27     138.64   138.40   138.77
5  Maďarsko     173.12     173.20   173.72   174.03

Tabuľky v prostredí kableextra

library(knitr)
library(kableExtra)
kable(
  udaje,
#  format,
digits = 2,
#  row.names = NA,
#  col.names = NA,
  align=c("l","c","l","r"),
  caption = "Toto je tabuľka"
#  label = NULL,
#  format.args = list(),
#  escape = TRUE,
 # ...
) %>%
      kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center")
Toto je tabuľka
Krajina Marec_2025 April_2025 Maj_2025 Jun_2025
Česko 154.90 154.70 155.50 155.80
Slovensko 148.10 148.15 148.92 149.32
Poľsko 153.10 153.60 153.40 153.50
Rakúsko 138.27 138.64 138.40 138.77
Maďarsko 173.12 173.20 173.72 174.03

Tidyverse - moderná práca s údajmi

Tidyverse je súbor knižníc, ktoré majú zjednodušiť prácu s údajmi. Majú jednotný komunikačný štandard, vzájomne sa doplňujú.

# Load tidyverse
library(tidyverse)

dplyr - pre manipuláciu s údajmi

.dplyr. poskytuje základné možnosti manipulácie s údajmi, ako napr.:

  1. filter(): vyberá riadky

  2. select(): vyberá stĺpce

  3. mutate(): vytvára nové stĺpce tabuľky

  4. arrange(): triedi riadky

  5. summarise(): sumarizuje

V nasledovnej ukážke využijeme tzv. .pipes. %>% alebo %<% umožňuje posielať výsledky z jednej funkcie priamo do volanie nasledovnej funkcie. To umožňuje ľahšiu čitateľnosť kódov, konvencia sa ujala a má široké použitie.

Výber a triedenie

# výber a následné triedenie
udaje %>%
  filter(Marec_2025 > 160) %>%     # vybera zaznamy s poctom v Marec_2025 viac, ako 160
  arrange(desc(Marec_2025)) %>%     # vysledny subor triedi zostupne podla premennej Marec_2025
kable %>%
    kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center"
  )
Krajina Marec_2025 April_2025 Maj_2025 Jun_2025
Maďarsko 173.12 173.2 173.72 174.03

Zoskupenie a sumarizácia

# Zoskupí and sumarizuje
udaje %>%
  group_by(Krajina) %>%      # zoskupi zaznamy podla premennej Krajina a vypocita za kazdu skupinu jej priemer HICP
  summarise(                # a taktiez spocita pocetnosti oboch skupin
    Priemer_HICP = mean(c(Marec_2025, April_2025, Maj_2025, Jun_2025)),
    count = n()
  ) %>%
 kable(
    caption = "Priemerný HICP podľa krajiny",
    col.names = c("Krajina", "Priemer HICP", "Počet"),
    align = "c"
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center"
  )
Priemerný HICP podľa krajiny
Krajina Priemer HICP Počet
Maďarsko 173.5175 1
Poľsko 153.4000 1
Rakúsko 138.5200 1
Slovensko 148.6225 1
Česko 155.2250 1

Vytváranie novej premennej

# Vytváranie novej premennej
udaje %>%
  mutate(
    Zmena_HICP = round(Jun_2025 - Marec_2025, 2),
    Trend = case_when(
      Zmena_HICP > 0 ~ "Nárast",
      Zmena_HICP < 0 ~ "Pokles",
      TRUE ~ "Bez zmeny"
    )
  ) %>%
  kable(
    caption = "Zmena HICP podľa krajiny",
    col.names = c(
      "Krajina",
      "Marec 2025",
      "Apríl 2025",
      "Máj 2025",
      "Jún 2025",
      "Zmena HICP",
      "Trend"
    ),
    digits = 2
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center"
  )
Zmena HICP podľa krajiny
Krajina Marec 2025 Apríl 2025 Máj 2025 Jún 2025 Zmena HICP Trend
Česko 154.90 154.70 155.50 155.80 0.90 Nárast
Slovensko 148.10 148.15 148.92 149.32 1.22 Nárast
Poľsko 153.10 153.60 153.40 153.50 0.40 Nárast
Rakúsko 138.27 138.64 138.40 138.77 0.50 Nárast
Maďarsko 173.12 173.20 173.72 174.03 0.91 Nárast

Import údajov z .csv alebo .xls

Ja som si zvolila údaje z databázy Eurostatu Eurostat – databáza HICP, ktorá obsahuje údaje o harmonizovanom indexe spotrebiteľských cien (HICP) v jednotlivých krajinách. Z databázy som si stiahla súbor vo formáte xlsx s názvom prc_hicp_midx__custom_23398413_spreadsheet a dáta som následne očistila. Údaje sa týkajú mesačného vývoja HICP v roku 2025, konkrétne od marca do decembra, a umožňujú porovnávať vývoj cenovej hladiny medzi vybranými krajinami Európskej únie. V prvom riadku sú uvedené názvy stĺpcov, ktoré budú v ďalšom spracovaní vystupovať ako premenné.

Náhľad na xls databázu otvorenú v tabuľkovom procesore

Náhľad na csv databázu otvorenú v textovom procesore

Potom už stačí importovať údaje do .data.frame., a to nasledovne

udaje <- read.csv2(
  "HICP_monthly_data_2025.csv",
  header = TRUE,
  check.names = FALSE
)
head(udaje)
   Country 2025-03 2025-04 2025-05 2025-06 2025-07 2025-08 2025-09 2025-10
1  Belgium  135.71  134.79  134.67  135.32  134.17  136.19  135.76  136.26
2 Bulgaria  142.53  140.76  140.84  141.44  143.49  143.68  142.81  143.42
3  Czechia  154.90  154.70  155.50  155.80  156.50  156.50  155.30  156.10
4  Denmark  120.40  120.50  120.50  120.90  122.90  122.00  121.80  122.50
5  Germany  131.00  131.60  131.80  131.90  132.40  132.50  132.80  133.20
6  Estonia  159.76  161.61  161.85  163.64  164.55  166.05  164.19  164.34
  2025-11 2025-12
1  136.61  137.04
2  143.64  143.83
3  155.50  155.00
4  121.90  121.40
5  132.60  132.80
6  163.55  162.91

Grafy

ggplot2 - knižnica pre grafy

Výber a následné triedenie

udaje.2025 <- read.csv2(
  "HICP_monthly_data_2025.csv",
  header = TRUE,
  check.names = FALSE
)

head(udaje.2025)
   Country 2025-03 2025-04 2025-05 2025-06 2025-07 2025-08 2025-09 2025-10
1  Belgium  135.71  134.79  134.67  135.32  134.17  136.19  135.76  136.26
2 Bulgaria  142.53  140.76  140.84  141.44  143.49  143.68  142.81  143.42
3  Czechia  154.90  154.70  155.50  155.80  156.50  156.50  155.30  156.10
4  Denmark  120.40  120.50  120.50  120.90  122.90  122.00  121.80  122.50
5  Germany  131.00  131.60  131.80  131.90  132.40  132.50  132.80  133.20
6  Estonia  159.76  161.61  161.85  163.64  164.55  166.05  164.19  164.34
  2025-11 2025-12
1  136.61  137.04
2  143.64  143.83
3  155.50  155.00
4  121.90  121.40
5  132.60  132.80
6  163.55  162.91
colnames(udaje.2025)
 [1] "Country" "2025-03" "2025-04" "2025-05" "2025-06" "2025-07" "2025-08"
 [8] "2025-09" "2025-10" "2025-11" "2025-12"

Knižnica .ggplot2. je v súčasnosti najčastejšie používaná grafická knižnica, pričom predpripravené kódy k jednotlivým obrázkom si viete nájsť v R Graph Gallery. Tu si uvedieme jednoduchšie z nich.

Scatter plot

# Basic scatter plot
# Basic scatter plot
library(ggplot2)
ggplot(udaje, aes(x = `2025-03`, y = `2025-12`)) +
  geom_point() +
  theme_minimal() +
  labs(title = "HICP index", x = "Marec 2025", y = "December 2025")

Boxplot

# Boxplot HICP podľa mesiacov
library(ggplot2)

ggplot(
  tidyr::pivot_longer(
    udaje,
    cols = `2025-03`:`2025-12`,
    names_to = "Mesiac",
    values_to = "HICP"
  ),
  aes(x = Mesiac, y = HICP)
) +
  geom_boxplot(fill = "lightblue", color = "darkblue") +
  labs(
    title = "HICP podľa mesiacov v roku 2025",
    x = "Mesiac",
    y = "HICP"
  ) +
  theme_minimal()

Základné štatistiky.

knitr - tabuľka

library(dplyr)
library(knitr)

# Základné štatistiky HICP podľa mesiacov
hicp.stats <- udaje %>%
  summarise(
    n = n(),
    mean = mean(c(`2025-03`, `2025-04`, `2025-05`,
                  `2025-06`, `2025-07`, `2025-08`,
                  `2025-09`, `2025-10`, `2025-11`,
                  `2025-12`), na.rm = TRUE),
    sd = sd(c(`2025-03`, `2025-04`, `2025-05`,
              `2025-06`, `2025-07`, `2025-08`,
              `2025-09`, `2025-10`, `2025-11`,
              `2025-12`), na.rm = TRUE),
    min = min(c(`2025-03`, `2025-04`, `2025-05`,
                `2025-06`, `2025-07`, `2025-08`,
                `2025-09`, `2025-10`, `2025-11`,
                `2025-12`), na.rm = TRUE),
    median = median(c(`2025-03`, `2025-04`, `2025-05`,
                      `2025-06`, `2025-07`, `2025-08`,
                      `2025-09`, `2025-10`, `2025-11`,
                      `2025-12`), na.rm = TRUE),
    max = max(c(`2025-03`, `2025-04`, `2025-05`,
                `2025-06`, `2025-07`, `2025-08`,
                `2025-09`, `2025-10`, `2025-11`,
                `2025-12`), na.rm = TRUE)
  )

# Create knitr table
kable(hicp.stats, digits = 2, caption = "Základné štatistiky HICP za marec až december 2025")
Základné štatistiky HICP za marec až december 2025
n mean sd min median max
27 137.75 15.04 116.86 132.96 174.87

alebo krajšie tabuľky s pomocou .kableExtra.:

library(dplyr) library(knitr) library(kableExtra)

Základné štatistiky HICP podľa mesiacov

hicp.stats <- udaje %>% summarise( n = n(), mean = mean(c(2025-03, 2025-04, 2025-05, 2025-06, 2025-07, 2025-08, 2025-09, 2025-10, 2025-11, 2025-12), na.rm = TRUE), sd = sd(c(2025-03, 2025-04, 2025-05, 2025-06, 2025-07, 2025-08, 2025-09, 2025-10, 2025-11, 2025-12), na.rm = TRUE), min = min(c(2025-03, 2025-04, 2025-05, 2025-06, 2025-07, 2025-08, 2025-09, 2025-10, 2025-11, 2025-12), na.rm = TRUE), q25 = quantile(c(2025-03, 2025-04, 2025-05, 2025-06, 2025-07, 2025-08, 2025-09, 2025-10, 2025-11, 2025-12), 0.25, na.rm = TRUE), median = median(c(2025-03, 2025-04, 2025-05, 2025-06, 2025-07, 2025-08, 2025-09, 2025-10, 2025-11, 2025-12), na.rm = TRUE), q75 = quantile(c(2025-03, 2025-04, 2025-05, 2025-06, 2025-07, 2025-08, 2025-09, 2025-10, 2025-11, 2025-12), 0.75, na.rm = TRUE), max = max(c(2025-03, 2025-04, 2025-05, 2025-06, 2025-07, 2025-08, 2025-09, 2025-10, 2025-11, 2025-12), na.rm = TRUE) )

Formátovaná tabuľka

hicp.stats %>% kable( digits = 2, caption = “Základné štatistiky HICP za marec až december 2025” ) %>% kable_styling( full_width = FALSE, bootstrap_options = c(“striped”, “hover”, “condensed”) ) %>% column_spec(1, bold = TRUE) %>% row_spec(0, bold = TRUE, background = “#f2f2f2”) %>% add_header_above(c(” ” = 1, “HICP – základné štatistiky” = 7))




#### t-test: Porovnanie priemeru HICP v marci a decembri 2025


::: {.cell}

```{.r .cell-code}
t.test(
  udaje$`2025-03`,
  udaje$`2025-12`,
  paired = TRUE
)

    Paired t-test

data:  udaje$`2025-03` and udaje$`2025-12`
t = -5.9132, df = 26, p-value = 3.08e-06
alternative hypothesis: true mean difference is not equal to 0
95 percent confidence interval:
 -2.810527 -1.360585
sample estimates:
mean difference 
      -2.085556 

:::

ANOVA: Comparing Reading Scores Across Programs

anova.result <- aov(
  hodnoty ~ Mesiac,
  data = tidyr::pivot_longer(
    udaje,
    cols = -Country,
    names_to = "Mesiac",
    values_to = "hodnoty"
  )
)
summary(anova.result)
             Df Sum Sq Mean Sq F value Pr(>F)
Mesiac        9    159   17.67   0.076      1
Residuals   260  60709  233.50               

Lineárna regresia: Vysvetlenie HICP v decembri 2025

model <- lm(`2025-12` ~ `2025-03` + `2025-06`, data = udaje)
summary(model)

Call:
lm(formula = `2025-12` ~ `2025-03` + `2025-06`, data = udaje)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.5337 -0.8241 -0.2245  0.2915  7.2157 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept)  -3.4492     3.2567  -1.059   0.3001   
`2025-03`     0.7614     0.2170   3.509   0.0018 **
`2025-06`     0.2763     0.2192   1.260   0.2196   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.776 on 24 degrees of freedom
Multiple R-squared:  0.9882,    Adjusted R-squared:  0.9872 
F-statistic:  1004 on 2 and 24 DF,  p-value: < 2.2e-16
# install.packages(c("broom", "kableExtra", "dplyr", "stringr"))
library(broom)
library(dplyr)
library(kableExtra)
library(stringr)

coef.tbl <- tidy(model, conf.int = TRUE) %>%
  mutate(
    term = dplyr::recode(term,
      "(Intercept)" = "Konštanta",
      "2025-03" = "Marec 2025",
      "2025-06" = "Jún 2025"
    ),
    stars = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01  ~ "**",
      p.value < 0.05  ~ "*",
      p.value < 0.1   ~ "·",
      TRUE            ~ ""
    )
  ) %>%
  transmute(
    Premenná = term,
    Odhad = estimate,
    `Štandardná chyba` = std.error,
    `t-hodnota` = statistic,
    `p-hodnota` = p.value,
    `95% interval spoľahlivosti` =
      str_c("[", round(conf.low, 3), ", ", round(conf.high, 3), "]"),
    Významnosť = stars
  )

coef.tbl %>%
  kable(
    digits = 3,
    caption = "Regresné koeficienty modelu HICP (december 2025 ~ marec 2025 + jún 2025)"
  ) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("striped", "hover", "condensed")
  ) %>%
  column_spec(1, bold = TRUE) %>%
  row_spec(0, bold = TRUE, background = "#f2f2f2") %>%
  footnote(
    general = "Významnosť: *** p < 0,001; ** p < 0,01; * p < 0,05; · p < 0,1.",
    threeparttable = TRUE
  )
Regresné koeficienty modelu HICP (december 2025 ~ marec 2025 + jún 2025)
Premenná Odhad Štandardná chyba t-hodnota p-hodnota 95% interval spoľahlivosti Významnosť
Konštanta -3.449 3.257 -1.059 0.300 [-10.171, 3.272]
`2025-03` 0.761 0.217 3.509 0.002 [0.314, 1.209] **
`2025-06` 0.276 0.219 1.260 0.220 [-0.176, 0.729]
Note:
Významnosť: *** p < 0,001; ** p < 0,01; * p < 0,05; · p < 0,1.
fit.tbl <- glance(model) %>%
  transmute(
    `R-kvadrát` = r.squared,
    `Upravený R-kvadrát` = adj.r.squared,
    `F-štatistika` = statistic,
    `p-hodnota F-testu` = p.value,
    AIC = AIC,
    BIC = BIC,
    `Počet pozorovaní` = nobs
  )

fit.tbl %>%
  kable(
    digits = 3,
    caption = "Štatistiky regresného modelu HICP"
  ) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("condensed")
  )
Štatistiky regresného modelu HICP
R-kvadrát Upravený R-kvadrát F-štatistika p-hodnota F-testu AIC BIC Počet pozorovaní
0.988 0.987 1003.821 0 112.465 117.648 27

Info zdroje pre ďalšie štúdium

R Project

Posit

Community Resources