---
title: "MAT2 chatGPT"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
    vertical_layout: fill
    source_code: embed
---

```{css, echo=FALSE}
.sidebar { overflow: auto; }
.dataTables_scrollBody {
    height:95% !important;
    max-height:95% !important;
}
.chart-stage-flex {
    overflow:auto !important;
}
```

```{r setup, include=FALSE}
library(flexdashboard)
library(tidyverse)
library(readxl)
library(corrplot)
library(knitr)
library(kableExtra)
library(naniar)
library(bnlearn)
library(Rgraphviz)
library(gRain)
library(ggsankey)
library(tidymodels)
library(Boruta)
library(vip)
options(pillar.sigfig = 4)

studenti_RED_minus1 <- c("bcovic22@student.foi.hr",
                         "lkronast22@student.foi.hr",
                         "khozjan22@student.foi.hr",
                         "mkelemen22@student.foi.hr",
                         "dkurochki22@student.foi.hr")

raz <- read_excel("MAT2_2022_2023_RAZ.xlsx") %>% 
  select(mail)

izv <- read_excel("MAT2_2022_2023_IZV.xlsx") %>% 
  select(mail)

podaci <- read_excel("MAT2_2022_2023.xlsx") %>%
  mutate(Status = case_when(mail %in% izv$mail ~ "IZV",
                            mail %in% raz$mail ~ "RAZ",
                            .default = "RED"),
         OCJENA = case_when(mail %in% studenti_RED_minus1 ~ -1,
                            is.na(OCJENA) | OCJENA < 20 ~ 0,
                            OCJENA < 50 ~ 1,
                            OCJENA < 61 ~ 2,
                            OCJENA < 76 ~ 3,
                            OCJENA < 91 ~ 4,
                            .default = 5)) %>%
  mutate(DZ = rowSums(across(DZ1:DZ0), na.rm = TRUE), 
         KVIZ = DZ_KVIZ - DZ,
         ESEJ = ifelse(ESEJ == 0, NA, ESEJ)) %>%
  relocate(Status, .after = Prezime) %>%
  relocate(c(DZ:KVIZ, ESEJ:ANKETA), .before = KOL1) %>%
  select(Ime:KOL, USMENI, OCJENA) %>%
  mutate(UKUPNO = case_when(Status == "RED" ~ rowSums(across(DZ:KOL3), na.rm = TRUE),
                            .default = rowSums(across(ESEJ:KOL3), na.rm = TRUE))) %>%
  relocate(OCJENA, .after = last_col())

MAT2_KOL_redovni <- podaci %>% filter(Status == "RED", OCJENA != -1) %>%
  unite("student", Ime, Prezime, sep = " ") %>%
  select(c(student, KOL1:KOL3, DZ, KVIZ, ESEJ)) %>%
  pivot_longer(c(KOL1:KOL3, DZ, KVIZ, ESEJ), names_to = "aktivnost", values_to = "bodovi") %>%
  mutate(aktivnost = factor(aktivnost, levels=c('KOL1', 'KOL2', 'KOL3', 'KVIZ', 'DZ', 'ESEJ')))

korelacije_MAT2 <- podaci %>% filter(Status == "RED", OCJENA != -1) %>% 
  select(c(KOL1, KOL2, KOL3, KVIZ, DZ, ESEJ))
testRes_MAT2 <- cor.mtest(korelacije_MAT2, conf.level = 0.975)
 
AS_MED_MAT2 <- MAT2_KOL_redovni %>% group_by(aktivnost) %>% 
   summarise(mean_value = mean(bodovi,na.rm=TRUE), median_value = median(bodovi,na.rm=TRUE))
 
MAT2_text <- data.frame(
  label_mean = rep("mean", 6),
  label_median = rep("median", 6),
  aktivnost = factor(c("KOL1", "KOL2", "KOL3", "KVIZ", "DZ", "ESEJ")),
  x_pos = c(18, 18, 18, 18, 9.25, 9.25),
  bullet_pos = c(17.5, 17.5, 17.5, 17.5, 9, 9)
)

MAT2_blank <- data.frame(
  aktivnost = factor(rep(c("KOL1", "KOL2", "KOL3", "KVIZ", "DZ", "ESEJ"), each=2)),
  x = c(0,20,0,20,0,20,0,20,0,10,0,10),
  y = 0
)

MAT2_usmeni_pad <- podaci %>% filter(str_detect(USMENI, "^Nije")) %>%
  unite("student", Ime, Prezime, sep = " ") %>%
  select(c(student, KOL1:KOL3, DZ, KVIZ, ESEJ)) %>%
  pivot_longer(c(KOL1:KOL3, DZ, KVIZ, ESEJ), names_to = "aktivnost", values_to = "bodovi") %>%
  mutate(aktivnost = factor(aktivnost, levels=c('KOL1', 'KOL2', 'KOL3', 'KVIZ', 'DZ', 'ESEJ')))

MAT2_usmeni_prolaz <- podaci %>% filter(str_detect(USMENI, "^Zad")) %>%
  unite("student", Ime, Prezime, sep = " ") %>%
  select(c(student, KOL1:KOL3, DZ, KVIZ, ESEJ)) %>%
  pivot_longer(c(KOL1:KOL3, DZ, KVIZ, ESEJ), names_to = "aktivnost", values_to = "bodovi") %>%
  mutate(aktivnost = factor(aktivnost, levels=c('KOL1', 'KOL2', 'KOL3', 'KVIZ', 'DZ', 'ESEJ')))

# samo redovni studenti (ukupno 334)
podaci_redovni <- podaci %>% filter(Status == "RED", OCJENA != -1) %>%
  mutate_if(is.numeric, ~replace_na(., 0))
# redovni koji su pisali esej
podaci_redovni_esej <- podaci_redovni %>% filter(ESEJ != 0)

podaci_ESEJ <-podaci_redovni %>%
  mutate(Kategorija = case_when(
    UKUPNO < 25 ~ "0 \U2264 UKUPNO < 25",
    UKUPNO < 50 ~ "25 \U2264 UKUPNO < 50",
    UKUPNO < 75 ~ "50 \U2264 UKUPNO < 75",
    .default = "75 \U2264 UKUPNO \U2264 100"),
    Kategorija = factor(Kategorija, 
                        levels = c("0 \U2264 UKUPNO < 25", "25 \U2264 UKUPNO < 50",
                                   "50 \U2264 UKUPNO < 75", "75 \U2264 UKUPNO \U2264 100"))) %>% 
  select(Ime, Prezime, mail, ESEJ, Kategorija)

qvrt <- quantile(podaci_redovni$UKUPNO, probs = seq(0, 1, 0.25))
qvrt_esej <- quantile(podaci_redovni_esej$UKUPNO, probs = seq(0, 1, 0.25))

podaci_ESEJ_kvartili <- podaci_redovni %>%
  mutate(Kategorija = case_when(
    UKUPNO < qvrt['25%'] ~ paste(qvrt['0%'], "\U2264 UKUPNO <", qvrt['25%']),
    UKUPNO < qvrt['50%'] ~ paste(qvrt['25%'], "\U2264 UKUPNO <", qvrt['50%']),
    UKUPNO < qvrt['75%'] ~ paste(qvrt['50%'], "\U2264 UKUPNO <", qvrt['75%']),
    .default = paste(qvrt['75%'], "\U2264 UKUPNO \U2264", qvrt['100%'])),
    Kategorija = factor(Kategorija, 
                        levels = c(paste(qvrt['0%'], "\U2264 UKUPNO <", qvrt['25%']), 
                                   paste(qvrt['25%'], "\U2264 UKUPNO <", qvrt['50%']),
                                   paste(qvrt['50%'], "\U2264 UKUPNO <", qvrt['75%']), 
                                   paste(qvrt['75%'], "\U2264 UKUPNO \U2264", qvrt['100%'])))) %>% 
  select(Ime, Prezime, mail, ESEJ, Kategorija)

podaci_pisaliESEJ_kvartili <- podaci_redovni_esej %>%
  mutate(Kategorija = case_when(
    UKUPNO < qvrt_esej['25%'] ~ paste(qvrt_esej['0%'], "\U2264 UKUPNO <", qvrt_esej['25%']),
    UKUPNO < qvrt_esej['50%'] ~ paste(qvrt_esej['25%'], "\U2264 UKUPNO <", qvrt_esej['50%']),
    UKUPNO < qvrt_esej['75%'] ~ paste(qvrt_esej['50%'], "\U2264 UKUPNO <", qvrt_esej['75%']),
    .default = paste(qvrt_esej['75%'], "\U2264 UKUPNO \U2264", qvrt_esej['100%'])),
    Kategorija = factor(Kategorija, 
                        levels = c(paste(qvrt_esej['0%'], "\U2264 UKUPNO <", qvrt_esej['25%']), 
                                   paste(qvrt_esej['25%'], "\U2264 UKUPNO <", qvrt_esej['50%']),
                                   paste(qvrt_esej['50%'], "\U2264 UKUPNO <", qvrt_esej['75%']), 
                                   paste(qvrt_esej['75%'], "\U2264 UKUPNO \U2264", qvrt_esej['100%'])))) %>% 
  select(Ime, Prezime, mail, ESEJ, Kategorija)

kviz <- read_csv("MAT2_2022_2023_kvizovi.csv") %>%
  right_join(podaci_ESEJ %>% select(mail, Kategorija), by = "mail")

esej_kategorije <- podaci_ESEJ %>% group_by(Kategorija) %>%
  summarize(`broj studenata` = n(), `pisalo esej` = sum(ESEJ != 0))

nije_pisalo_esej <- podaci_ESEJ %>% count(ESEJ) %>% 
  filter(ESEJ == 0) %>% pull(n)
pisalo_esej <- sum(esej_kategorije$`pisalo esej`)

esej_kategorije_kvartili <- podaci_ESEJ_kvartili %>% group_by(Kategorija) %>%
  summarize(`broj studenata` = n(), `pisalo esej` = sum(ESEJ != 0))

pisali_esej_kategorije_kvartili <- podaci_pisaliESEJ_kvartili %>% group_by(Kategorija) %>%
  summarize(`broj studenata` = n())

kviz_kategorije <- kviz %>% pivot_longer(DER:K13, names_to = "KVIZ", values_to = "value") %>%
  select(Kategorija, KVIZ, value) %>%
  mutate(KVIZ = fct_relevel(factor(KVIZ), c("K10", "K11", "K12", "K13"), after = Inf))

# KVIZ1 - max 7 bodova, KVIZ2 - max 8 bodova, KVIZ3 - max 5 bodova
bayes_podaci <- podaci_redovni %>% left_join(kviz, by = "mail") %>%
  mutate(KVIZ1 = rowSums(across(K1:K4), na.rm = TRUE), 
         KVIZ2 = rowSums(across(K5:K9), na.rm = TRUE),
         KVIZ3 = rowSums(across(K10:K13), na.rm = TRUE)) %>%
  select(KOL1, KOL2, KOL3, ESEJ, KVIZ1, KVIZ2, KVIZ3) %>%
  replace(is.na(.), 0)

bayes_klase <- bayes_podaci %>%
  mutate(KOL1 = case_when(KOL1 <= 5 ~ "1", 
                          KOL1 <= 10 ~ "2",
                          KOL1 <= 15 ~ "3",
                          .default = "4"),
         KOL2 = case_when(KOL2 <= 5 ~ "1", 
                          KOL2 <= 10 ~ "2",
                          KOL2 <= 15 ~ "3",
                          .default = "4"),
         KOL3 = case_when(KOL3 <= 5 ~ "1",
                          KOL3 <= 10 ~ "2",
                          KOL3 <= 15 ~ "3",
                          .default = "4"),
         ESEJ = case_when(ESEJ <= 2.5 ~ "1", 
                          ESEJ <= 5 ~ "2",
                          ESEJ <= 7.5 ~ "3",
                          .default = "4"),
         KVIZ1 = case_when(KVIZ1 <= 1.75 ~ "1", 
                           KVIZ1 <= 3.5 ~ "2",
                           KVIZ1 <= 5.25 ~ "3",
                           .default = "4"),
         KVIZ2 = case_when(KVIZ2 <= 2 ~ "1", 
                           KVIZ2 <= 4 ~ "2",
                           KVIZ2 <= 6 ~ "3",
                           .default = "4"),
         KVIZ3 = case_when(KVIZ3 <= 1.25 ~ "1", 
                           KVIZ3 <= 2.5 ~ "2",
                           KVIZ3 <= 3.75 ~ "3",
                           .default = "4")) %>%
  mutate_all(~fct_relevel(., c("1","2","3","4")))

bayes_klase <- as.data.frame(bayes_klase)

learn1 <- readRDS("learn1.rds")
learn2 <- readRDS("learn2.rds")
learn3 <- readRDS("learn3.rds")
dag3 <- readRDS("dag3.rds")

bn1 <- readRDS("bn1.rds")
bn2 <- readRDS("bn2.rds")
bn3 <- readRDS("bn3.rds")

bayes_klase_long <- bayes_klase %>% 
  make_long(KVIZ1, KOL1, KVIZ2, KOL2, ESEJ, KVIZ3, KOL3)

postoci <- bayes_klase_long %>% group_by(x, node) %>% summarize(n = n()) %>% 
  ungroup(node) %>% mutate(pct2 = n / sum(n) * 100, pct = round(pct2))
postoci[9,"pct"] <- 50
postoci[20,"pct"] <- 15

bayes_klase_long2 <- bayes_klase_long %>% left_join(postoci, by = c("x","node"))

mat1 <- readRDS("mat1.rds")
mat1_tr <- readRDS("mat1_tr.rds")
mat2 <- readRDS("mat2.rds")
mat2_tr <- readRDS("mat2_tr.rds")
mat3 <- readRDS("mat3.rds")
mat3_tr <- readRDS("mat3_tr.rds")

rf_metrike <- metric_set(roc_auc, sens, precision, spec, accuracy, f_meas, mcc, kap, mn_log_loss)
update_geom_defaults(geom = "tile", new = list(color = "black"))

RF_fit <- readRDS("RF_fit.rds")
RF_tuning <- readRDS("RF_tuning.rds")
RF_work <- readRDS("RF_work.rds")
RF_fit_perm <- readRDS("RF_fit_perm.rds")
RF_work_perm <- readRDS("RF_work_perm.rds")
RF_Boruta <- readRDS("RF_Boruta.rds")
```

Popisi {data-navmenu="Sumarne analize"}
=======================================================================

Column {.tabset .tabset-fade}
-----------------------------------------------------------------------

### Svi studenti

```{r}
podaci %>% arrange(desc(Status), desc(UKUPNO), desc(KOL)) %>%
  mutate(id=row_number()) %>%
  relocate(id) %>%
  kbl(caption = "Svi studenti") %>%
  kable_classic("hover",full_width = F, html_font = "Cambria")
```

### Kolokvirali

```{r}
podaci %>% filter(OCJENA > 1) %>% 
  arrange(desc(Status), desc(UKUPNO), desc(KOL)) %>%
  mutate(id=row_number()) %>%
  relocate(id) %>%
  kbl(caption = "Studenti koji su kolokvirali") %>%
  kable_classic("hover",full_width = F, html_font = "Cambria")
```

### Pad na usmenom

```{r}
podaci %>% filter(str_detect(USMENI, "^Nije")) %>% 
  arrange(desc(Status), desc(UKUPNO), desc(KOL)) %>%
  mutate(id=row_number()) %>%
  relocate(id) %>%
  kbl(caption = "Studenti koji su pali na usmenom ispitu") %>%
  kable_classic("hover",full_width = F, html_font = "Cambria")
```

Gustoće {data-navmenu="Sumarne analize"}
=======================================================================

Column {data-width=500}
-----------------------------------------------------------------------

### Funkcije gustoća po aktivnostima (redovni studenti)

```{r warning=FALSE, fig.width=17, fig.height=9}
ggplot(MAT2_KOL_redovni, aes(x=bodovi)) + 
  geom_histogram(aes(y=..density..), binwidth = 1, boundary=1, 
                 color="#ec8ae5", fill="#48d09b", alpha=0.7) +
  geom_density(alpha=.2, fill="yellow") + geom_blank(data=MAT2_blank, aes(x=x,y=y)) +
  scale_x_continuous(name = "bodovi") + 
  scale_y_continuous(limits = c(0, 0.25)) + guides(color = "none", fill = "none") +
  facet_wrap(vars(aktivnost), scales = "free_x") +
  geom_vline(data=AS_MED_MAT2, aes(xintercept=mean_value), color="blue", 
             linetype="dashed", size=0.5, alpha=0.6) +
  geom_vline(data=AS_MED_MAT2, aes(xintercept=median_value), color="red", 
             linetype="dashed", size=0.5, alpha=0.6) +
  geom_text(data = MAT2_text, mapping = aes(label = "\u2022", x = bullet_pos), 
            y = 0.24, color = "blue", size = 9) + 
  geom_text(data = MAT2_text, mapping = aes(label = label_mean, x = x_pos), 
            y = 0.24, hjust = 0) +
  geom_text(data = MAT2_text, mapping = aes(label = "\u2022", x = bullet_pos), 
            y = 0.22, color = "red", size = 9) +
  geom_text(data = MAT2_text, mapping = aes(label = label_median, x = x_pos), 
            y = 0.22, hjust = 0) +
  geom_rug(alpha=0.3)
```

Column {data-width=150}
-----------------------------------------------------------------------

### Broj studenata po statusu {data-height=100}

```{r warning=FALSE}
podaci %>% filter(OCJENA != -1) %>% 
  count(Status) %>% kbl() %>% kable_styling()
```

### Brojčane vrijednosti (redovni studenti) {data-height=200}

```{r warning=FALSE}
MAT2_KOL_redovni %>% group_by(aktivnost) %>%
  summarize(BROJ = sum(!is.na(bodovi)),
            MEAN = round(mean(bodovi, na.rm = TRUE), 2),
            MEDIAN = median(bodovi, na.rm = TRUE), 
            MIN = min(bodovi, na.rm = TRUE),
            MAX = max(bodovi, na.rm = TRUE)) %>%
  kbl() %>% kable_styling()
```


Violine {data-navmenu="Sumarne analize"}
=======================================================================

```{r warning=FALSE, fig.width=17, fig.height=9}
ggplot(MAT2_KOL_redovni, aes(x=aktivnost, y=bodovi, fill=aktivnost)) +
  geom_dotplot(binaxis='y', stackdir='center', fill='black', alpha=0.3, dostsize = 0.2) +
  geom_violin(trim=F, alpha=0.3) + geom_boxplot(width=0.05, alpha=0.8) + xlab('') +
  theme(axis.text.x=element_text(size=11), axis.text.y=element_text(size=11), legend.position='none') +
  facet_wrap(vars(aktivnost), scale = "free") +
  theme(axis.text.x=element_blank(), axis.ticks.x=element_blank())
```

Ukupni bodovi {data-navmenu="Sumarne analize"}
=======================================================================

Column {data-width=400}
-----------------------------------------------------------------------

### Frekvencije ukupnih bodova (redovni studenti)

```{r warning=FALSE, fig.width=10, fig.height=5}
ggplot(podaci %>% filter(Status == "RED", OCJENA != -1), aes(x=UKUPNO)) +
  geom_histogram(binwidth = 1, boundary=1, color="#ec8ae5", fill="#48d09b", alpha=0.7) +
  scale_x_continuous(name = "ukupni bodovi", breaks = seq(0,100,5), limits = c(0,100)) +
  scale_y_continuous(name = "broj studenata", breaks = seq(0,30,2)) +
  theme(panel.grid.minor = element_blank())
```

### Ocjene (redovni)

```{r warning=FALSE, fig.width=10, fig.height=5}
ggplot(podaci %>% filter(Status == "RED", OCJENA != -1), aes(x=factor(OCJENA))) +
  geom_bar(width=0.7, fill="steelblue") +
  geom_text(stat="count", aes(label=..count..), vjust=-0.5, nudge_x = -0.2, size = 5) +
  geom_text(aes( label = sprintf('(%s)', scales::percent(..prop..)), group = 1), stat= "count",
            vjust = -.5, nudge_x = 0.15, size = 5) +
  scale_x_discrete(name = "Ocjena") +
  scale_y_continuous(name = "broj studenata", breaks = seq(0,250,25), limits = c(0,250)) +
  theme(panel.grid.major.x = element_blank())
```

Column {data-width=400}
-----------------------------------------------------------------------

### Distribucija bodova

```{r warning=FALSE, fig.width=10, fig.height=7}
ggplot(podaci %>% filter(Status == "RED", OCJENA != -1), aes(x=UKUPNO)) +
  geom_histogram(aes(y=..density..), color="#ec8ae5", fill="#48d09b", alpha=0.5,
                 breaks = c(0,20,50,61,75,91,100)) +
  geom_vline(aes(xintercept=mean(UKUPNO)),color="blue", linetype="dashed", size=0.5, alpha=0.6) +
  geom_vline(aes(xintercept=median(UKUPNO)),color="red", linetype="dashed", size=0.5, alpha=0.6) +
  annotate(geom="point", x=90, y=0.035, size=2, shape=21, fill="red",color="red") +
  annotate(geom="text", x=91, y=0.035, label="median",size=3.5,hjust=0) +
  annotate(geom="point", x=90, y=0.033, size=2, shape=21, fill="blue",color="blue") +
  annotate(geom="text", x=91, y=0.033, label="mean",size=3.5,hjust=0) +
  geom_density(alpha=.2, fill="yellow") +
  geom_rug(alpha=0.3) +
  scale_x_continuous(name = "ukupni bodovi", breaks = seq(0,100,5), limits = c(0,100)) +
  theme(panel.grid.minor.x = element_blank())
```

Korelacije {data-navmenu="Sumarne analize"}
=======================================================================

Column {data-width=400}
-----------------------------------------------------------------------

### Korelacije

```{r warning=FALSE, fig.width=10, fig.height=7}
corrplot(round(cor(korelacije_MAT2, use = "pairwise.complete.obs"), 2), type = "lower",
         diag=FALSE, addCoef.col = 'black', tl.srt = 45)
```

Column {data-width=400}
-----------------------------------------------------------------------

### p-vrijednosti korelacija

```{r warning=FALSE, fig.width=10, fig.height=7}
corrplot(round(cor(korelacije_MAT2, use = "pairwise.complete.obs"), 2), type = "lower",
         diag=FALSE, tl.srt = 45, p.mat = testRes_MAT2$p, insig = 'p-value', sig.level = -1)
```

Usmeni - grafički prikaz  {data-navmenu="Analiza usmenog"}
=======================================================================

### Usmeni (grafički prikaz)

```{r fig.height = 6}
ggplot(podaci %>% filter(!is.na(USMENI)), aes(x = factor(USMENI))) +
  geom_bar(fill="steelblue") +
  geom_text(stat="count", aes(label=..count..), vjust=-0.5, nudge_x = -0.1, size = 5) +
  geom_text(aes( label = sprintf('(%s)', scales::percent(..prop..)), group = 1), stat= "count",
            vjust = -.5, nudge_x = 0.1, size = 5) +
  xlab("") + ylab("") +
  scale_y_continuous(breaks = seq(0,100,25), limits = c(0,105)) 
```

Pad i prolaz na usmenom {data-navmenu="Analiza usmenog"}
=======================================================================

## Column 1

### Frekvencije bodova po aktivnostima studenata koji su pali na usmenom

```{r warning=FALSE}
ggplot(MAT2_usmeni_pad, aes(x=bodovi)) + 
  geom_histogram(binwidth = 1, boundary=1, color="#ec8ae5", fill="#48d09b", alpha=0.7) +
  geom_blank(data=MAT2_blank, aes(x=x,y=y)) +
  facet_wrap(vars(aktivnost), scale = "free") + xlab("") + ylab("")
```

## Column 2

### Frekvencije bodova po aktivnostima studenata koji su prošli na usmenom

```{r warning=FALSE}
ggplot(MAT2_usmeni_prolaz, aes(x=bodovi)) + 
  geom_histogram(binwidth = 1, boundary=1, color="#ec8ae5", fill="#48d09b", alpha=0.7) +
  geom_blank(data=MAT2_blank, aes(x=x,y=y)) +
  facet_wrap(vars(aktivnost), scale = "free") + xlab("") + ylab("")
```

Esej po kategorijama {data-navmenu="Dodatne analize"}
=======================================================================

## Column 1 {.tabset .tabset-fade data-width=200}

### četvrtine

```{r warning=FALSE, fig.width=8}
ggplot(podaci_ESEJ, aes(x=ESEJ)) + 
  geom_histogram(binwidth = 1, boundary=1, color="#ec8ae5", fill="#48d09b", alpha=0.7) +
  scale_x_continuous(breaks = seq(0,10,1), limits = c(0,10)) +
  facet_wrap(vars(Kategorija)) +
  labs(caption = "kategorije su napravljene prema ukupnim bodovima redovnih studenata")
```

### kvartili 1

```{r warning=FALSE, fig.width=8}
ggplot(podaci_ESEJ_kvartili, aes(x=ESEJ)) + 
  geom_histogram(binwidth = 1, boundary=1, color="#ec8ae5", fill="#48d09b", alpha=0.7) +
  scale_x_continuous(breaks = seq(0,10,1), limits = c(0,10)) +
  facet_wrap(vars(Kategorija)) +
  labs(caption = "kategorije su napravljene prema kvartilima ukupnih bodova redovnih studenata")
```

### kvartili 2

```{r warning=FALSE, fig.width=8}
ggplot(podaci_pisaliESEJ_kvartili, aes(x=ESEJ)) + 
  geom_histogram(binwidth = 1, boundary=1, color="#ec8ae5", fill="#48d09b", alpha=0.7) +
  scale_x_continuous(breaks = seq(0,10,1), limits = c(0,10)) +
  facet_wrap(vars(Kategorija)) +
  labs(caption = "kategorije su napravljene prema kvartilima ukupnih bodova redovnih studenata koji su pisali esej")
```

## Column 2 {.tabset .tabset-fade data-width=70}

### Kategorije

```{r warning=FALSE}
esej_kategorije %>% 
  kbl(caption = "Broj redovnih studenata koji su pisali esej (četvrtine)") %>% 
  kable_styling()
```

```{r warning=FALSE}
esej_kategorije_kvartili %>% 
  kbl(caption = "Broj redovnih studenata koji su pisali esej (kvartili 1)") %>% 
  kable_styling()
```

```{r warning=FALSE}
pisali_esej_kategorije_kvartili %>% 
  kbl(caption = "Broj redovnih studenata koji su pisali esej (kvartili 2)") %>% 
  kable_styling()
```

### Ukupno

```{r warning=FALSE}
tibble(`pisalo esej` = pisalo_esej, 
       `nije pisalo esej` = nije_pisalo_esej) %>% 
  kbl(caption = "Esej (ukupno u sumi za redovne studente)") %>% kable_styling()
```

```{r warning=FALSE}
tibble(`pisalo esej` = scales::percent(round(pisalo_esej / (pisalo_esej + nije_pisalo_esej),2)), 
       `nije pisalo esej` = scales::percent(round(nije_pisalo_esej / (pisalo_esej + nije_pisalo_esej),2))) %>% 
  kbl(caption = "Esej (ukupno u sumi za redovne studente u postocima)") %>% 
  kable_styling()
```

#### Kvartili ukupnih bodova redovnih studenata

```{r warning = FALSE}
qvrt
```

#### Kvartili ukupnih bodova redovnih studenata koji su pisali esej

```{r warning = FALSE}
qvrt_esej
```

Pojedinačni kvizovi {data-navmenu="Dodatne analize"}
=======================================================================

### Frekvencije bodova po kvizovima

```{r warning=FALSE, fig.width=10}
ggplot(kviz_kategorije, aes(x = value)) +
  geom_histogram(fill="steelblue") + 
  facet_wrap(vars(KVIZ), scales = "free", nrow = 2) +
  theme(strip.text = element_text(size = 5),
        axis.text.x = element_text(size = 5),
        axis.text.y = element_text(size = 6)) + xlab("") + ylab("")
```

Pojedinačni kvizovi po kategorijama {data-navmenu="Dodatne analize"}
=======================================================================

### Frekvencije bodova po kvizovima i kategorijama

```{r warning=FALSE, fig.width=10}
ggplot(kviz_kategorije, aes(x = value)) +
  geom_histogram(fill="steelblue") + 
  facet_grid(rows = vars(Kategorija), cols = vars(KVIZ), scales = "free") +
  theme(strip.text = element_text(size = 5),
        axis.text.x = element_text(size = 5, angle = 90),
        axis.text.y = element_text(size = 6)) + xlab("") + ylab("")
```

Pristupanje kvizovima {data-navmenu="Dodatne analize"}
=======================================================================

## Column 1 {.tabset .tabset-fade}

### Općenito

```{r warning=FALSE, fig.height=8, fig.width=8}
vis_miss(kviz %>% select(DER:K13))
```

### Varijable

```{r warning=FALSE, fig.height=8, fig.width=8}
gg_miss_var(kviz %>% select(DER:K13))
```

### Studenti

```{r warning=FALSE, fig.width=8, fig.height=8}
gg_miss_case(kviz %>% select(DER:K13))
```

### Varijable (kategorije u %)

```{r warning=FALSE, fig.width=8, fig.height=8}
gg_miss_fct(kviz %>% select(DER:Kategorija), fct = Kategorija)
```

## Column 2 {.tabset .tabset-fade}

### Općenito (klasterirano)

```{r warning=FALSE, fig.height=8, fig.width=8}
vis_miss(kviz %>% select(DER:K13), cluster = TRUE)
```

### Varijable (kategorije)

```{r warning=FALSE, fig.width=8, fig.height=8}
gg_miss_var(kviz %>% select(DER:Kategorija), facet = Kategorija)
```

### Studenti (kategorije)

```{r warning=FALSE, fig.width=8, fig.height=8}
gg_miss_case(kviz %>% select(DER:Kategorija), facet = Kategorija)
```

Pristupanje kvizovima - presječni pogled {data-navmenu="Dodatne analize"}
=======================================================================

### Pristupanje kvizovima - presječni pogled

```{r warning=FALSE, fig.height=8, fig.width=16}
gg_miss_upset(kviz %>% select(DER:K13), nset = 14, nintersect = 50)
```

Pletenica {data-navmenu="Bayes NET"}
=======================================================================

### Pletenica

```{r warning=FALSE, fig.width=12}
ggplot(bayes_klase_long2, aes(x = x, next_x = next_x, node = node, 
                              next_node = next_node, fill = factor(node),
                              label = paste0(node, ' (', pct, '%)'))) +
  geom_sankey(flow.alpha = 0.5, node.color = "black", show.legend = FALSE) +
  geom_sankey_label(size = 3, color = "black", fill= "white", hjust = -0.3) +
  theme_bw() + theme_sankey(base_size = 16) +
  theme(axis.title = element_blank(), axis.text.y = element_blank(), 
        axis.ticks = element_blank(), panel.grid = element_blank())
```

Učenje {data-navmenu="Bayes NET"}
=======================================================================

## Column 1 {.tabset .tabset-fade}

### struktura 1

```{r warning=FALSE}
graphviz.plot(learn1)
```

### struktura 2

```{r warning=FALSE}
graphviz.plot(learn2)
```

### struktura 3

```{r warning=FALSE}
graphviz.plot(learn3)
```

### struktura 4

```{r warning=FALSE}
graphviz.plot(dag3)
```

## Column 2

### Info

#### Opisi varijabli

* KOL1 - faktorska varijabla s 4 klase napravljene prema četvrtinama 
ukupnih bodova na prvom kolokviju
* KOL2 - faktorska varijabla s 4 klase napravljene prema četvrtinama 
ukupnih bodova na drugom kolokviju
* KOL3 - faktorska varijabla s 4 klase napravljene prema četvrtinama 
ukupnih bodova na trećem kolokviju
* KVIZ1 - faktorska varijabla s 4 klase napravljene prema četvrtinama 
ukupnih bodova na kvizovima prije prvog kolokvija
* KVIZ2 - faktorska varijabla s 4 klase napravljene prema četvrtinama 
ukupnih bodova na kvizovima između prvog i drugog kolokvija
* KVIZ3 - faktorska varijabla s 4 klase napravljene prema četvrtinama 
ukupnih bodova na kvizovima nakon drugog kolokvija
* ESEJ - faktorska varijabla s 4 klase napravljene prema četvrtinama 
ukupnih bodova na eseju

#### Opisi struktura

* **struktura 1** - učenje pomoću *hc* algoritma na praznom digrafu
* **struktura 2** - učenje pomoću *hc* algoritma na praznom digrafu uz zabranjene lukove
(KOL1, KVIZ1), (KOL2, KVIZ1), (KOL3, KVIZ1), (ESEJ, KVIZ1), (KOL2, KVIZ2), (KOL3, KVIZ2),
(KVIZ3, KVIZ2), (ESEJ, KVIZ2)
* **struktura 3** - učenje pomoću *gs* algoritma na praznom digrafu, neki bridovi nemaju orijentaciju
pa moramo sami odlučiti koju ćemo uzeti
* **struktura 4** - odabrane orijentacije za bridove iz **strukture 3**

### BIC score

#### struktura 1

```{r warning=FALSE}
score(learn1, data = bayes_klase, type = "bic")
```

#### struktura 2

```{r warning=FALSE}
score(learn2, data = bayes_klase, type = "bic")
```

#### struktura 4

```{r warning=FALSE}
score(dag3, data = bayes_klase, type = "bic")
```

Distribucije - struktura 1 {data-navmenu="Bayes NET"}
=======================================================================

## Column 1 {.tabset .tabset-fade}

### KOL1

```{r warning=FALSE}
bn.fit.barchart(bn1$KOL1, main = "KOL1")
```

### KOL2 | KOL1

```{r warning=FALSE}
bn.fit.barchart(bn1$KOL2, main = "KOL2 | KOL1")
```

### KOL3 | KOL2

```{r warning=FALSE}
bn.fit.barchart(bn1$KOL3, main = "KOL3 | KOL2")
```

### KVIZ1 | KOL2

```{r warning=FALSE}
bn.fit.barchart(bn1$KVIZ1, main = "KVIZ1 | KOL2")
```

### KVIZ2 | KOL2

```{r warning=FALSE}
bn.fit.barchart(bn1$KVIZ2, main = "KVIZ2 | KOL2")
```

### KVIZ3 | ESEJ

```{r warning=FALSE}
bn.fit.barchart(bn1$KVIZ3, main = "KVIZ3 | ESEJ")
```

### ESEJ | KOL2

```{r warning=FALSE}
bn.fit.barchart(bn1$ESEJ, main = "ESEJ | KOL2")
```

## Column 2 {.tabset .tabset-fade}

### struktura 1

```{r warning=FALSE}
graphviz.plot(learn1)
```

### marginalne distribucije

```{r warning=FALSE}
graphviz.chart(bn1, type = "barprob", bg = "azure", bar.col = "darkblue")
```

Distribucije - struktura 2 {data-navmenu="Bayes NET"}
=======================================================================

## Column 1 {.tabset .tabset-fade}

### KOL1 | KVIZ1

```{r warning=FALSE}
bn.fit.barchart(bn2$KOL1, main = "KOL1 | KVIZ1")
```

### KOL2 | KOL1

```{r warning=FALSE}
bn.fit.barchart(bn2$KOL2, main = "KOL2 | KOL1")
```

### KOL3 | KOL2

```{r warning=FALSE}
bn.fit.barchart(bn2$KOL3, main = "KOL3 | KOL2")
```

### KVIZ1

```{r warning=FALSE}
bn.fit.barchart(bn2$KVIZ1, main = "KVIZ1")
```

### KVIZ2 | KOL1

```{r warning=FALSE}
bn.fit.barchart(bn2$KVIZ2, main = "KVIZ2 | KOL1")
```

### KVIZ3 | ESEJ

```{r warning=FALSE}
bn.fit.barchart(bn2$KVIZ3, main = "KVIZ3 | ESEJ")
```

### ESEJ | KOL2

```{r warning=FALSE}
bn.fit.barchart(bn2$ESEJ, main = "ESEJ | KOL2")
```

## Column 2 {.tabset .tabset-fade}

### struktura 2

```{r warning=FALSE}
graphviz.plot(learn2)
```

### marginalne distribucije

```{r warning=FALSE}
graphviz.chart(bn2, type = "barprob", bg = "azure", bar.col = "darkblue")
```

Distribucije - struktura 4 {data-navmenu="Bayes NET"}
=======================================================================

## Column 1 {.tabset .tabset-fade}

### KOL1

```{r warning=FALSE}
bn.fit.barchart(bn3$KOL1, main = "KOL1")
```

### KOL2 | KOL1,KVIZ1

```{r warning=FALSE, fig.height=8, fig.width = 8}
bn.fit.barchart(bn3$KOL2, main = "KOL2 | KOL1,KVIZ1")
```

### KOL3 | KOL2,KVIZ2,KVIZ3

```{r warning=FALSE, fig.height=10}
bn.fit.barchart(bn3$KOL3, main = "KOL3 | KOL2,KVIZ2,KVIZ3")
```

### KVIZ1

```{r warning=FALSE}
bn.fit.barchart(bn3$KVIZ1, main = "KVIZ1")
```

### KVIZ2

```{r warning=FALSE}
bn.fit.barchart(bn3$KVIZ2, main = "KVIZ2")
```

### KVIZ3 | ESEJ

```{r warning=FALSE}
bn.fit.barchart(bn3$KVIZ3, main = "KVIZ3 | ESEJ")
```

### ESEJ

```{r warning=FALSE}
bn.fit.barchart(bn3$ESEJ, main = "ESEJ")
```

## Column 2 {.tabset .tabset-fade}

### struktura 4

```{r warning=FALSE}
graphviz.plot(dag3)
```

### marginalne distribucije

```{r warning=FALSE}
graphviz.chart(bn3, type = "barprob", bg = "azure", bar.col = "darkblue")
```

Postavljanje upita - struktura 2 {data-navmenu="Bayes NET"}
=======================================================================

## Column 1

### P(ESEJ | KOL1, KOL2)

```{r warning=FALSE}
junc2 <- compile(as.grain(bn2))
querygrain(junc2, nodes = c("ESEJ", "KOL1", "KOL2"), type = "conditional")
```

## Column 2

### P(ESEJ, KOL1, KOL2)

```{r warning=FALSE}
querygrain(junc2, nodes = c("ESEJ", "KOL1", "KOL2"), type = "joint")
```

Predikcije eseja - struktura 1 {data-navmenu="Bayes NET"}
=======================================================================

## Column 1

###  Metrike na testnom i trening skupu {data-height=200}

```{r}
tab1 <- rf_metrike(mat1, truth = truth, estimate = pred, `1`:`4`)
tab2 <- rf_metrike(mat1_tr, truth = truth, estimate = pred, `1`:`4`)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
conf_mat(mat1, truth = truth, estimate = pred) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
mat1 %>% roc_curve(truth, `1`:`4`) %>% autoplot()
```

### Gain curve

```{r}
mat1 %>% gain_curve(truth, `1`:`4`) %>% autoplot()
```

Predikcije eseja - struktura 2 {data-navmenu="Bayes NET"}
=======================================================================

## Column 1

###  Metrike na testnom i trening skupu {data-height=200}

```{r}
tab1 <- rf_metrike(mat2, truth = truth, estimate = pred, `1`:`4`)
tab2 <- rf_metrike(mat2_tr, truth = truth, estimate = pred, `1`:`4`)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
conf_mat(mat2, truth = truth, estimate = pred) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
mat2 %>% roc_curve(truth, `1`:`4`) %>% autoplot()
```

### Gain curve

```{r}
mat2 %>% gain_curve(truth, `1`:`4`) %>% autoplot()
```

Predikcije eseja - struktura 4 {data-navmenu="Bayes NET"}
=======================================================================

## Column 1

###  Metrike na testnom i trening skupu {data-height=200}

```{r}
tab1 <- rf_metrike(mat3, truth = truth, estimate = pred, `1`:`4`)
tab2 <- rf_metrike(mat3_tr, truth = truth, estimate = pred, `1`:`4`)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
conf_mat(mat3, truth = truth, estimate = pred) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
mat3 %>% roc_curve(truth, `1`:`4`) %>% autoplot()
```

### Gain curve

```{r}
mat3 %>% gain_curve(truth, `1`:`4`) %>% autoplot()
```

Opis modela {data-navmenu="Forest"}
=======================================================================

### Opis modela

**Prediktori**

- KVIZ - suma bodova na kvizovima
- DZ - suma bodova na domaćim zadaćama
- KOL1 - broj bodova na prvom kolokviju 
- KOL2 - broj bodova na drugom kolokviju 
- KOL3 - broj bodova na trećem kolokviju 

**Response** - Klasifikacija studenata na temelju broja bodova eseju.

- **1** - ako je na eseju ukupni broj bodova unutar intervala [0, 2.5]
- **2** - ako je na eseju ukupni broj bodova unutar intervala (2.5, 5]
- **3** - ako je na eseju ukupni broj bodova unutar intervala (5, 7.5]
- **4** - ako je na eseju ukupni broj bodova unutar intervala (7.5, 10]

**Hiperparametri** - za odabir optimalne kombinacije hiperparametara napravljen je 
cross-validation s 10 *kutija* pri čemu je na slučajni način isprobano 1000 kombinacija 
hiperparametara *mtry*, *min_n* i *trees*. Najbolji model je odabran s obzirom na *roc_auc*
metriku.

- *mtry* - uzimane su vrijednosti iz skupa {2, 3, 4}
- *trees* - uzimani su prirodni brojevi između 400 i 1500
- *min_n* - uzimani su prirodni brojevi između 2 i 40.

Hiperparametri {data-navmenu="Forest"}
=======================================================================

## Column 1

### Testirani hiperparametri

```{r}
RF_tuning %>%
  collect_metrics() %>%
  filter(.metric == "roc_auc", trees > 0) %>%
  pivot_longer(cols = mtry:min_n) %>%
  mutate(best_mod = mean == max(mean)) %>% 
  ggplot(aes(x = value, y = mean)) +
  #geom_line(alpha = 0.5, size = 1.5) +
  geom_point(aes(color = best_mod), size = 0.3,) +
  facet_wrap(~name, scales = "free_x") +
  scale_x_continuous() +
  labs(y = "roc auc", x = "", color = "Best Model")
```

## Column 2

### 200 najboljih modela za roc_auc metriku

```{r}
print(RF_tuning %>% show_best(metric = 'roc_auc', n = 200), n = 200)
```

### 200 najboljih modela za mcc metriku

```{r}
print(RF_tuning %>% show_best(metric = 'mcc', n = 200), n = 200)
```

Efikasnost {data-navmenu="Forest"}
=======================================================================

## Column 1

###  Metrike na testnom i trening skupu {data-height=200}

```{r}
tab1 <- RF_fit %>% collect_predictions() %>% 
  rf_metrike(truth = ESEJ, estimate = .pred_class, .pred_1:.pred_4)
tab2 <- RF_work %>%
  rf_metrike(truth = ESEJ, estimate = .pred_class, .pred_1:.pred_4)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
RF_fit %>% collect_predictions() %>%
  conf_mat(truth = ESEJ, estimate = .pred_class) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
RF_fit %>% collect_predictions() %>% roc_curve(ESEJ, .pred_1:.pred_4) %>% autoplot()
```

### Gain curve

```{r}
RF_fit %>% collect_predictions() %>% gain_curve(ESEJ, .pred_1:.pred_4) %>% autoplot()
```

Važnost prediktora {data-navmenu="Forest"}
=======================================================================

## Columnn 1

### Gini

```{r}
RF_fit %>% extract_fit_parsnip() %>% vip()
```

### permutacija

```{r}
RF_fit_perm %>% extract_fit_parsnip() %>% vip()
```

## Column 2

### Boruta

```{r}
plot(RF_Boruta, cex.axis=.7, las=2, xlab="",
     colCode = c("green", "orange", "#f6546a", "#2acaea"))
```

### Boruta (history)

```{r}
plotImpHistory(RF_Boruta, colCode = c("green", "orange", "#f6546a", "#2acaea"))
```

