Vytvorenie dátového rámca

V tomto cvičení pracujeme s malou databázou 10 zamestnancov výrobnej firmy.

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

Zamestnanec <- c("Novák", "Kováčová", "Hrivnák", "Šimek", "Polák",
                 "Tóthová", "Urban", "Marek", "Klein", "Holubová")

Oddelenie <- c("Výroba", "Administratíva", "Výroba", "Výroba", "Údržba",
               "Administratíva", "Údržba", "Výroba", "Administratíva", "Údržba")

DlzkaRoky <- c(6, 3, 8, 2, 10, 4, 5, 1, 2, 7)
TreningHod <- c(30, 20, 40, 15, 45, 25, 35, 10, 18, 38)
PlatEUR <- c(1600, 1300, 1800, 1200, 1900, 1350, 1700, 1150, 1250, 1750)
Vykonnost <- c(85, 74, 90, 68, 95, 77, 88, 65, 70, 91)

udaje <- data.frame(Zamestnanec, Oddelenie, DlzkaRoky, TreningHod, PlatEUR, Vykonnost)

kable(udaje, caption = "Základná databáza pracovníkov") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped","hover"))
Základná databáza pracovníkov
Zamestnanec Oddelenie DlzkaRoky TreningHod PlatEUR Vykonnost
Novák Výroba 6 30 1600 85
Kováčová Administratíva 3 20 1300 74
Hrivnák Výroba 8 40 1800 90
Šimek Výroba 2 15 1200 68
Polák Údržba 10 45 1900 95
Tóthová Administratíva 4 25 1350 77
Urban Údržba 5 35 1700 88
Marek Výroba 1 10 1150 65
Klein Administratíva 2 18 1250 70
Holubová Údržba 7 38 1750 91

Práca s dplyr

Vyber pracovníkov s výkonnosťou nad 80 a zoraď podľa platu.

udaje %>%
  filter(Vykonnost > 80) %>%
  arrange(desc(PlatEUR)) %>%
  kable(caption = "Pracovníci s výkonnosťou nad 80, zoradení podľa platu") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped","hover"))
Pracovníci s výkonnosťou nad 80, zoradení podľa platu
Zamestnanec Oddelenie DlzkaRoky TreningHod PlatEUR Vykonnost
Polák Údržba 10 45 1900 95
Hrivnák Výroba 8 40 1800 90
Holubová Údržba 7 38 1750 91
Urban Údržba 5 35 1700 88
Novák Výroba 6 30 1600 85

Sumarizácia podľa oddelení

udaje %>%
  group_by(Oddelenie) %>%
  summarise(
    PriemerVykon = mean(Vykonnost),
    PriemerPlat = mean(PlatEUR),
    PriemerTrening = mean(TreningHod),
    n = n(),
    .groups = "drop"
  ) %>%
  kable(digits = 1, caption = "Priemerné hodnoty podľa oddelení") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped","hover"))
Priemerné hodnoty podľa oddelení
Oddelenie PriemerVykon PriemerPlat PriemerTrening n
Administratíva 73.7 1300.0 21.0 3
Výroba 77.0 1437.5 23.8 4
Údržba 91.3 1783.3 39.3 3

Vizualizácie (ggplot2)

library(ggplot2)

# Stĺpcový graf
ggplot(udaje, aes(x = Zamestnanec, y = Vykonnost, fill = Oddelenie)) +
  geom_col() +
  theme_minimal() +
  labs(title = "Výkonnosť zamestnancov podľa oddelenia",
       x = "Zamestnanec", y = "Výkonnosť (0–100)") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Scatter plot: Vykonnosť vs. Tréningové hodiny

ggplot(udaje, aes(x = TreningHod, y = Vykonnost, color = Oddelenie)) +
  geom_point(size = 3) +
  geom_smooth(method = "lm", se = FALSE, linetype = "dashed") +
  theme_minimal() +
  labs(title = "Vzťah medzi tréningom a výkonnosťou",
       x = "Tréningové hodiny", y = "Výkonnosť")

T-test – porovnanie oddelení

Porovnáme Výrobu a Administratívu z hľadiska priemernej výkonnosti:

t.test(
  udaje$Vykonnost[udaje$Oddelenie == "Výroba"],
  udaje$Vykonnost[udaje$Oddelenie == "Administratíva"]
)

    Welch Two Sample t-test

data:  udaje$Vykonnost[udaje$Oddelenie == "Výroba"] and udaje$Vykonnost[udaje$Oddelenie == "Administratíva"]
t = 0.51265, df = 3.6181, p-value = 0.6379
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -15.49634  22.16301
sample estimates:
mean of x mean of y 
 77.00000  73.66667 

Interpretácia: Ak p-hodnota < 0.05 → rozdiel medzi oddeleniami je štatisticky významný. -> nie je štat. významný (0.6379)

Jednoduchá lineárna regresia

model <- lm(Vykonnost ~ DlzkaRoky + TreningHod, data = udaje)
summary(model)

Call:
lm(formula = Vykonnost ~ DlzkaRoky + TreningHod, data = udaje)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.6642 -0.9590 -0.1071  0.7449  2.6241 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  54.9321     1.9132  28.713  1.6e-08 ***
DlzkaRoky    -0.1661     0.7372  -0.225  0.82814    
TreningHod    0.9480     0.1836   5.162  0.00131 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.575 on 7 degrees of freedom
Multiple R-squared:  0.9834,    Adjusted R-squared:  0.9787 
F-statistic: 207.8 on 2 and 7 DF,  p-value: 5.849e-07

Interpretácia:

Model ukázal, že tréningové hodiny majú silný a štatisticky významný vplyv na výkonnosť – s každou ďalšou hodinou tréningu sa výkon zvýši približne o 0,95 bodu. Premenná dĺžka zamestnania nemá významný efekt a asi by si mala vyradiť z modelu (+ máme malo ) pričom model ako celok vysvetľuje až 98 % variability výkonnosti pracovníkov.

library(broom)

coef.tbl <- tidy(model, conf.int = TRUE)
coef.tbl %>%
  kable(digits = 3, caption = "OLS model: Výkonnosť ~ Dĺžka + Tréning") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped","hover"))
OLS model: Výkonnosť ~ Dĺžka + Tréning
term estimate std.error statistic p.value conf.low conf.high
(Intercept) 54.932 1.913 28.713 0.000 50.408 59.456
DlzkaRoky -0.166 0.737 -0.225 0.828 -1.909 1.577
TreningHod 0.948 0.184 5.162 0.001 0.514 1.382
LS0tCnRpdGxlOiAiTW9qYSBkYXRhYsOhemEgKElaKSIKYXV0aG9yOiAiSWdvciBaZWxlbmF5IgpkYXRlOiAiMjAyNS0xMC0xMSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdGhlbWU6IGRhcmtseQogICAgaGlnaGxpZ2h0OiBweWdtZW50cwogICAgZWRpdG9yX29wdGlvbnM6IAogIG1hcmtkb3duOiAKICAgIHdyYXA6IDcyCi0tLQojIFZ5dHZvcmVuaWUgZMOhdG92w6lobyByw6FtY2EKViB0b210byBjdmnEjWVuw60gcHJhY3VqZW1lIHMgbWFsb3UgZGF0YWLDoXpvdSAxMCB6YW1lc3RuYW5jb3YgdsO9cm9ibmVqIGZpcm15LgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKClphbWVzdG5hbmVjIDwtIGMoIk5vdsOhayIsICJLb3bDocSNb3bDoSIsICJIcml2bsOhayIsICLFoGltZWsiLCAiUG9sw6FrIiwKICAgICAgICAgICAgICAgICAiVMOzdGhvdsOhIiwgIlVyYmFuIiwgIk1hcmVrIiwgIktsZWluIiwgIkhvbHVib3bDoSIpCgpPZGRlbGVuaWUgPC0gYygiVsO9cm9iYSIsICJBZG1pbmlzdHJhdMOtdmEiLCAiVsO9cm9iYSIsICJWw71yb2JhIiwgIsOaZHLFvmJhIiwKICAgICAgICAgICAgICAgIkFkbWluaXN0cmF0w612YSIsICLDmmRyxb5iYSIsICJWw71yb2JhIiwgIkFkbWluaXN0cmF0w612YSIsICLDmmRyxb5iYSIpCgpEbHprYVJva3kgPC0gYyg2LCAzLCA4LCAyLCAxMCwgNCwgNSwgMSwgMiwgNykKVHJlbmluZ0hvZCA8LSBjKDMwLCAyMCwgNDAsIDE1LCA0NSwgMjUsIDM1LCAxMCwgMTgsIDM4KQpQbGF0RVVSIDwtIGMoMTYwMCwgMTMwMCwgMTgwMCwgMTIwMCwgMTkwMCwgMTM1MCwgMTcwMCwgMTE1MCwgMTI1MCwgMTc1MCkKVnlrb25ub3N0IDwtIGMoODUsIDc0LCA5MCwgNjgsIDk1LCA3NywgODgsIDY1LCA3MCwgOTEpCgp1ZGFqZSA8LSBkYXRhLmZyYW1lKFphbWVzdG5hbmVjLCBPZGRlbGVuaWUsIERsemthUm9reSwgVHJlbmluZ0hvZCwgUGxhdEVVUiwgVnlrb25ub3N0KQoKa2FibGUodWRhamUsIGNhcHRpb24gPSAiWsOha2xhZG7DoSBkYXRhYsOhemEgcHJhY292bsOta292IikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsImhvdmVyIikpCmBgYAojIFByw6FjYSBzIGRwbHlyCgojIyBWeWJlciBwcmFjb3Zuw61rb3YgcyB2w71rb25ub3PFpW91IG5hZCA4MCBhIHpvcmHEjyBwb2TEvmEgcGxhdHUuCmBgYHtyfQp1ZGFqZSAlPiUKICBmaWx0ZXIoVnlrb25ub3N0ID4gODApICU+JQogIGFycmFuZ2UoZGVzYyhQbGF0RVVSKSkgJT4lCiAga2FibGUoY2FwdGlvbiA9ICJQcmFjb3Zuw61jaSBzIHbDvWtvbm5vc8Wlb3UgbmFkIDgwLCB6b3JhZGVuw60gcG9kxL5hIHBsYXR1IikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsImhvdmVyIikpCmBgYAojIyBTdW1hcml6w6FjaWEgcG9kxL5hIG9kZGVsZW7DrQoKYGBge3J9CnVkYWplICU+JQogIGdyb3VwX2J5KE9kZGVsZW5pZSkgJT4lCiAgc3VtbWFyaXNlKAogICAgUHJpZW1lclZ5a29uID0gbWVhbihWeWtvbm5vc3QpLAogICAgUHJpZW1lclBsYXQgPSBtZWFuKFBsYXRFVVIpLAogICAgUHJpZW1lclRyZW5pbmcgPSBtZWFuKFRyZW5pbmdIb2QpLAogICAgbiA9IG4oKSwKICAgIC5ncm91cHMgPSAiZHJvcCIKICApICU+JQogIGthYmxlKGRpZ2l0cyA9IDEsIGNhcHRpb24gPSAiUHJpZW1lcm7DqSBob2Rub3R5IHBvZMS+YSBvZGRlbGVuw60iKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwiaG92ZXIiKSkKYGBgCiMgVml6dWFsaXrDoWNpZSAoZ2dwbG90MikKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKCiMgU3TEunBjb3bDvSBncmFmCmdncGxvdCh1ZGFqZSwgYWVzKHggPSBaYW1lc3RuYW5lYywgeSA9IFZ5a29ubm9zdCwgZmlsbCA9IE9kZGVsZW5pZSkpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnModGl0bGUgPSAiVsO9a29ubm9zxaUgemFtZXN0bmFuY292IHBvZMS+YSBvZGRlbGVuaWEiLAogICAgICAgeCA9ICJaYW1lc3RuYW5lYyIsIHkgPSAiVsO9a29ubm9zxaUgKDDigJMxMDApIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmBgYAojIFNjYXR0ZXIgcGxvdDogVnlrb25ub3PFpSB2cy4gVHLDqW5pbmdvdsOpIGhvZGlueQoKYGBge3J9CmdncGxvdCh1ZGFqZSwgYWVzKHggPSBUcmVuaW5nSG9kLCB5ID0gVnlrb25ub3N0LCBjb2xvciA9IE9kZGVsZW5pZSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh0aXRsZSA9ICJWesWlYWggbWVkemkgdHLDqW5pbmdvbSBhIHbDvWtvbm5vc8Wlb3UiLAogICAgICAgeCA9ICJUcsOpbmluZ292w6kgaG9kaW55IiwgeSA9ICJWw71rb25ub3PFpSIpCmBgYApULXRlc3Qg4oCTIHBvcm92bmFuaWUgb2RkZWxlbsOtCgojIyBQb3Jvdm7DoW1lIFbDvXJvYnUgYSBBZG1pbmlzdHJhdMOtdnUgeiBoxL5hZGlza2EgcHJpZW1lcm5laiB2w71rb25ub3N0aToKCmBgYHtyfQp0LnRlc3QoCiAgdWRhamUkVnlrb25ub3N0W3VkYWplJE9kZGVsZW5pZSA9PSAiVsO9cm9iYSJdLAogIHVkYWplJFZ5a29ubm9zdFt1ZGFqZSRPZGRlbGVuaWUgPT0gIkFkbWluaXN0cmF0w612YSJdCikKYGBgCkludGVycHJldMOhY2lhOiBBayBwLWhvZG5vdGEgPCAwLjA1IOKGkiByb3pkaWVsIG1lZHppIG9kZGVsZW5pYW1pIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LiAtPiBuaWUgamUgxaF0YXQuIHbDvXpuYW1uw70gKDAuNjM3OSkKCiMgSmVkbm9kdWNow6EgbGluZcOhcm5hIHJlZ3Jlc2lhCmBgYHtyfQptb2RlbCA8LSBsbShWeWtvbm5vc3QgfiBEbHprYVJva3kgKyBUcmVuaW5nSG9kLCBkYXRhID0gdWRhamUpCnN1bW1hcnkobW9kZWwpCmBgYApJbnRlcnByZXTDoWNpYToKCk1vZGVsIHVrw6F6YWwsIMW+ZSB0csOpbmluZ292w6kgaG9kaW55IG1hasO6IHNpbG7DvSBhIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IHZwbHl2IG5hIHbDvWtvbm5vc8WlIOKAkyBzIGthxb5kb3UgxI9hbMWhb3UgaG9kaW5vdSB0csOpbmluZ3Ugc2EgdsO9a29uIHp2w73FoWkgcHJpYmxpxb5uZSBvIDAsOTUgYm9kdS4gUHJlbWVubsOhIGTEusW+a2EgemFtZXN0bmFuaWEgbmVtw6EgdsO9em5hbW7DvSBlZmVrdCBhIGFzaSBieSBzaSBtYWxhIHZ5cmFkacWlIHogbW9kZWx1ICgrIG3DoW1lIG1hbG8gKSBwcmnEjW9tIG1vZGVsIGFrbyBjZWxvayB2eXN2ZXTEvnVqZSBhxb4gOTggJSB2YXJpYWJpbGl0eSB2w71rb25ub3N0aSBwcmFjb3Zuw61rb3YuCgpgYGB7cn0KbGlicmFyeShicm9vbSkKCmNvZWYudGJsIDwtIHRpZHkobW9kZWwsIGNvbmYuaW50ID0gVFJVRSkKY29lZi50YmwgJT4lCiAga2FibGUoZGlnaXRzID0gMywgY2FwdGlvbiA9ICJPTFMgbW9kZWw6IFbDvWtvbm5vc8WlIH4gRMS6xb5rYSArIFRyw6luaW5nIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsImhvdmVyIikpCmBgYAoK