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

Práca s údajmi – originálne príklady Tradičná práca s databázou

Budeme pracovať s .data.frame., tabuľkou s riadkami a stĺpcami. Jeden riadok = jeden záznam.

#Príklad

Nové údaje o zamestnancoch, s premennými: Meno, Vek, Plat, Oddelenie:

Meno <- c("Adam", "Ema", "Lukáš", "Sofia")
Vek <- c(28, 34, 25, 41)
Plat <- c(2500, 3200, 2100, 4000)
Oddelenie <- c("IT", "Marketing", "IT", "Finance")

Spojíme ich do tabuľky:

zamestnanci <- data.frame(Meno, Vek, Plat, Oddelenie)
print(zamestnanci)
##    Meno Vek Plat Oddelenie
## 1  Adam  28 2500        IT
## 2   Ema  34 3200 Marketing
## 3 Lukáš  25 2100        IT
## 4 Sofia  41 4000   Finance

Príklady manipulácie:

print(zamestnanci$Plat)                  # výpis platu
## [1] 2500 3200 2100 4000
print(mean(zamestnanci$Vek))             # priemerný vek
## [1] 32
print(zamestnanci[Meno=="Ema",])         # riadok podľa mena
##   Meno Vek Plat Oddelenie
## 2  Ema  34 3200 Marketing
print(zamestnanci[2,])                   # druhý riadok
##   Meno Vek Plat Oddelenie
## 2  Ema  34 3200 Marketing
print(zamestnanci[,3:4])                 # 3. a 4. stĺpec
##   Plat Oddelenie
## 1 2500        IT
## 2 3200 Marketing
## 3 2100        IT
## 4 4000   Finance
print(zamestnanci[1,1])                  # jedna bunka
## [1] "Adam"
summary(zamestnanci)                     # základná štatistika
##      Meno                Vek             Plat       Oddelenie        
##  Length:4           Min.   :25.00   Min.   :2100   Length:4          
##  Class :character   1st Qu.:27.25   1st Qu.:2400   Class :character  
##  Mode  :character   Median :31.00   Median :2850   Mode  :character  
##                     Mean   :32.00   Mean   :2950                     
##                     3rd Qu.:35.75   3rd Qu.:3400                     
##                     Max.   :41.00   Max.   :4000

Pridanie nového stĺpca Skúsenosti:

Skusenosti <- c(5, 10, 3, 15)
zamestnanci <- cbind(zamestnanci, Skusenosti)
print(zamestnanci)
##    Meno Vek Plat Oddelenie Skusenosti
## 1  Adam  28 2500        IT          5
## 2   Ema  34 3200 Marketing         10
## 3 Lukáš  25 2100        IT          3
## 4 Sofia  41 4000   Finance         15

Pridanie riadku:

novy.riadok <- data.frame(Meno="Oliver", Vek=30, Plat=2700, Oddelenie="IT", Skusenosti=7)
zamestnanci <- rbind(zamestnanci, novy.riadok)
print(zamestnanci)
##     Meno Vek Plat Oddelenie Skusenosti
## 1   Adam  28 2500        IT          5
## 2    Ema  34 3200 Marketing         10
## 3  Lukáš  25 2100        IT          3
## 4  Sofia  41 4000   Finance         15
## 5 Oliver  30 2700        IT          7

Tabuľky s kableExtra

library(knitr)
library(kableExtra)

kable(zamestnanci,
      digits = 2,
      align=c("l","c","r","l","c"),
      caption="Zamestnanci firmy") %>%
  kable_styling(bootstrap_options=c("striped","hover","condensed"),
                full_width=FALSE,
                position="center")
Zamestnanci firmy
Meno Vek Plat Oddelenie Skusenosti
Adam 28 2500 IT 5
Ema 34 3200 Marketing 10
Lukáš 25 2100 IT 3
Sofia 41 4000 Finance 15
Oliver 30 2700 IT 7

Nové

# Interaktívna tabuľka s DT
library(DT)

datatable(zamestnanci, 
          options = list(pageLength = 5, autoWidth = TRUE),
          caption = 'Interaktívna tabuľka zamestnancov')

Tidyverse – moderná práca s údajmi

library(tidyverse)

dplyr – manipulácia

# Výber zamestnancov s platom > 2500 a zoradenie podľa platu
zamestnanci %>%
  filter(Plat > 2500) %>%
  arrange(desc(Plat)) %>%
  kable() %>%
  kable_styling(bootstrap_options=c("striped","hover"), full_width=FALSE)
Meno Vek Plat Oddelenie Skusenosti
Sofia 41 4000 Finance 15
Ema 34 3200 Marketing 10
Oliver 30 2700 IT 7

Zoskupenie a sumarizácia

zamestnanci %>%
  group_by(Oddelenie) %>%
  summarise(
    PriemPlat = mean(Plat),
    Pocet = n()
  ) %>%
  kable(caption="Priemerný plat podľa oddelenia") %>%
  kable_styling(full_width=FALSE)
Priemerný plat podľa oddelenia
Oddelenie PriemPlat Pocet
Finance 4000.000 1
IT 2433.333 3
Marketing 3200.000 1

Vytváranie novej premennej

zamestnanci %>%
  mutate(
    Kategoria = case_when(
      Plat >= 3500 ~ "Vysoký",
      Plat >= 2500 ~ "Stredný",
      TRUE ~ "Nízky"
    ),
    RokyDoDôchodku = 65 - Vek
  ) %>%
  kable() %>%
  kable_styling(full_width=FALSE)
Meno Vek Plat Oddelenie Skusenosti Kategoria RokyDoDôchodku
Adam 28 2500 IT 5 Stredný 37
Ema 34 3200 Marketing 10 Stredný 31
Lukáš 25 2100 IT 3 Nízky 40
Sofia 41 4000 Finance 15 Vysoký 24
Oliver 30 2700 IT 7 Stredný 35

Import údajov z CSV

# zamestnanci <- read.csv2("data/zamestnanci.csv", sep=";", dec=".", header=TRUE)
# head(zamestnanci)

Grafy – ggplot2

library(ggplot2)

# Scatter plot: vek vs plat
ggplot(zamestnanci, aes(x=Vek, y=Plat, color=Oddelenie)) +
  geom_point(size=3) +
  theme_minimal() +
  labs(title="Vek vs Plat", x="Vek", y="Plat (EUR)")

Nové

# Interaktívny scatter plot s plotly
library(plotly)

p <- ggplot(zamestnanci, aes(x=Vek, y=Plat, color=Oddelenie, text=paste("Meno:", Meno))) +
  geom_point(size=3) +
  theme_minimal() +
  labs(title="Vek vs Plat interaktívne", x="Vek", y="Plat (EUR)")

ggplotly(p)
# Boxplot plat podľa oddelenia
ggplot(zamestnanci, aes(x=Oddelenie, y=Plat, fill=Oddelenie)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title="Plat podľa oddelenia", x="Oddelenie", y="Plat (EUR)")

Základné štatistiky

zamestnanci %>%
  summarise(
    PriemPlat = mean(Plat),
    SDPlat = sd(Plat),
    MinPlat = min(Plat),
    MaxPlat = max(Plat),
    PriemVek = mean(Vek),
    SDVek = sd(Vek)
  ) %>%
  kable(caption="Základné štatistiky zamestnancov") %>%
  kable_styling(full_width=FALSE)
Základné štatistiky zamestnancov
PriemPlat SDPlat MinPlat MaxPlat PriemVek SDVek
2900 731.4369 2100 4000 31.6 6.188699
Lineárna regresia – predikcia platu

``` r
model <- lm(Plat ~ Vek + Skusenosti, data=zamestnanci)
summary(model)
## 
## Call:
## lm(formula = Plat ~ Vek + Skusenosti, data = zamestnanci)
## 
## Residuals:
##       1       2       3       4       5 
##  17.187  21.875 -20.312 -14.062  -4.687 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1306.25    1035.42  -1.262    0.334
## Vek           140.62      49.16   2.860    0.104
## Skusenosti    -29.69      64.87  -0.458    0.692
## 
## Residual standard error: 26.52 on 2 degrees of freedom
## Multiple R-squared:  0.9993, Adjusted R-squared:  0.9987 
## F-statistic:  1521 on 2 and 2 DF,  p-value: 0.0006571
library(broom)

tidy(model) %>%
  kable(digits=3, caption="OLS Regression Coefficients (Plat ~ Vek + Skusenosti)") %>%
  kable_styling(full_width=FALSE)
OLS Regression Coefficients (Plat ~ Vek + Skusenosti)
term estimate std.error statistic p.value
(Intercept) -1306.250 1035.418 -1.262 0.334
Vek 140.625 49.163 2.860 0.104
Skusenosti -29.687 64.867 -0.458 0.692