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