auti_gradska <- ggplot(mpg, aes(displ, 235.2/cty, color=class))+
geom_point(size=1.6)+
labs(x="obujam motora",
y="potrošnja u l/100km")
ggplotly(auti_gradska)12.1 Izvještaji
U ovom poglavlju obradit ćemo nekoliko oblika komuniciranja rezultata analize. Poglavlje obuhvaća široki spektar izvještaja i formata koji predstavljaju zavšni rezultat naše analize koji želimo prezentirati krajnjim korisnicima: studentima, akademskoj zajednici, poduzećima ili široj javnosti. Fokus ovog poglavlja je na dinamičkim izvještajima odnosno formatima u kojima postoji nekakva vrsta interaktivnosti.
12.2 Interaktivne vizualizacije
U poglavlju vizualizacija podataka obradili smo razne vrste statičnih vizualizacija podataka. U ovom dijelu dotaknut ćemo se interaktivnih vizualizacija. To su vizualizacije kod kojih krajnji korisnik može mijenjati određene elemente vizualizacije (osi, skupovi podataka koji će se prikazati, mjerilo i slično). Postoji veliki broj različitih paketa u R okruženju koji su namijenjeni kreiranju interaktivnih vizualizacija, ali za potrebe ove knjige obradit ćemo dva paketa: plotly i highcharter te pozovimo potrebne library-e. Za početak, potrebno je instalirati navedene pakete naredbom install.packages("plotly", "highcharter").
Započnimo na primjeru nama poznatog skupa mpg i poznatog grafikona koji prikazuje odnos između radnog obujma motora (displ) i gradske potrošnje automobila (cty). Postoje samo dvije novosti u odnosu na dosadašnji način kreiranja statičnih vizualizacija. Prvo, spremit ćemo vizualizaciju kao zaseban R objekt. U slučaju našeg grafikona, on će biti u obliku liste. Drugo, pozvat ćemo ggplotly() funkciju na taj objekt. Funkcija ggplotly() pretvorit će naš statičan grafikon u interaktivan grafikon. Pogledajmo na primjeru.
Rezultat prethodnog koda je interaktivna varijanta vizualizacije nama poznatog grafikona. Funkcija ggplotly() omogućila je dodatni pop-up okvir sa vrijednostima kada pređemo mišem preko svake točke na grafikonu, prikaz samo određenih klasa automobila (klikom na klasu automobila u legendi mičemo tu klasu s grafikona), zumiranje dijela grafikona, ručni odabir dijela grafikona (box select i lasso select) i ostale elemente interaktivnosti.
Paket plotly omogućuje dodatnu modifikaciju po pitanju interaktivnosti, poput dodatnih slidera, promjene mjerila grafikona kada se mijenja podskup i ostalog. Ne ulazeći u dodatne detalje, prikazat ćemo jednu korisnu opciju za odabir manjeg podskupa podataka - rangeslider, odnosno slider ispod grafikona kojim odabiremo raspon skupa kojeg želimo prikazati. Ova funkcija odnosi se samo na x-os.
auti_gradska <- ggplot(mpg, aes(displ, 235.2/cty, color=class))+
geom_point(size=1.6)+
labs(x="obujam motora",
y="potrošnja u l/100km")
ggplotly(auti_gradska) %>% rangeslider(start = 1.4, end = 7.5)Sada smo ispod grafikona dobili dodatan interaktivni vizualni element na kojem možemo odabrati raspon na x osi koji želimo da se prikaže na glavnom, gornjem, grafikonu. Funkcija rangeslider() može se napisati i bez start= i end= argumenata, ali je bez zadavanja prikazala dosta širi raspon od željenog pa je ponekad bolje ručno upisati raspon x osi. Uvijek je bolje zadati širi raspon od stvarnog raspona podataka tako da krajnje vrijednosti ne budu na samom rubu vizualizacije! Ovo vrijedi ne samo za ovaj slučaj već i inače kada ručno unosimo limite za x i y osi.
Drugi popularan paket za interaktivne vizualizacije je highcharter. Slično plotly paketu, on će sam odraditi interaktivnost, a nama preostaje modificirati one argumente i elemente interaktivnosti koje nam paket dopušta da mijenjamo. Kako bi uočili razliku između ova dva paketa, kreirajmo isti grafikon iz skupa mpg između potrošnje i radnog obujma motora.
mpg %>% hchart(type = "scatter", hcaes(x = displ, y = 235.2/cty, group = class)) %>%
hc_xAxis(
title = list(text = "obujam motora")) %>%
hc_yAxis(
title = list(text = "potrošnja u l/100km")
) Korištenje highcharter paketa je nešto izazovnije od plotly paketa jer zahtijeva potpuno novu sintaksu odnosno funkcije u odnosu na ggplot2 paket u kojem smo standardno radili statične vizualizacije. Paket plotly je intuitivniji jer nastavlja ggplot2 odnosno tidyverse način kodiranja, no highcharter paket omogućuje bitno više modifikacija i slobode u kreiranju interaktivnih vizualizacija od plotly paketa. Donekle, highcharter prati ggplot2 i tidyverse ideju i posuđuje osnovnu aes() funkciju u obliku hcaes() funkcije. Glavna funkcija je hchart i jedina dva argumenta koja su potrebna je vrstu vizualizacije kroz type= argument i već spomenuta hcaes() funkcija u kojoj definiramo x i y osi, a u našem slučaju i dodatnu varijablu koja će obojati točke ovisno o klasi automobila. Dodatno, hc_xAxis() i hc_yAxis() funkcijama promijenili smo nazive x i y osi. Ovaj korak je složeniji nego kod plotly odnosno ggplot2 sintakse.
Interaktivne vizualizacije koje smo kreirali putem plotly ili highcharter paketa prikazivale su nam se u Viewer okviru RStudio sučelja. Kao takve, sačuvane su samo u kratkotrajnoj memoriji i pri gašenju aktualne R sesije bit će izbrisane. Naravno, možemo ih sačuvati, ali ne u statičnom JPG ili PDF obliku kao kod kreiranja statičnih vizualizacija već u HTML formatu. Klikom na Export ikonicu u Viewer okviru otvara se opcija Save as Web Page čime jednostavno spremamo našu interaktivnu vizualizaciju u HTML formatu. Više o publiciranju interaktivnih vizualizacija u nastavku ovog poglavlja.
12.3 Dashboard
Dashboard (u slobodnom prijevodu, kojeg nećemo koristiti, “nadzorna ploča”) je vrsta vizualizacije podataka koja stavlja naglasak na preglednosti ključnih informacija. U praksi, dashboard sadrži nekoliko vizualizacija podataka (grafikoni, karte i ostalo) i minimalnu količinu teksta, a sve povezano u smislenu i zaokruženu cjelinu. Dashboard je popularan oblik izvještaja u html formatu odnosno na web-stranicama.
Već smo upoznati s činjenicom da je R okruženje u odnosu na usporedive jezike/programe (SAS, Stata, SPSS, C++, Python), s izuzetkom alata iz javascript okruženja, iznimno snažno u dijelu vizualizacije podataka To vrijedi i za dashboard izvještaje. Iako postoje specijalizirani alati za izradu dashboarda (Tableau, Power BI, Sisense), ovdje ćemo obraditi kreiranje dashboarda iz R okružja jer ono sadrži sve potrebne alate kako bi cijeli proces analize od učitavanja podataka, manipulacije i transformacije podataka, vizualizacije, modeliranja i konačno komunikacije podataka obavili u R okruženju.
Također, većina alata za kreiranje dashboarda nije otvorenog koda i besplatna, a otvorenost koda i reproducibilnost analize su vrijednosti koje naglašavamo u ovoj knjizi od početka.
Kod kreiranja dashboard-a u R okruženju posebno se izdvaja paket flexdashboard koji je vrlo brzo postao i standard za kreiranje dashboard-a u R. Za početak, instalirajmo paket flexdashboard naredbom install.packages("flexdashboard") i pozovimo library paketa kojeg ćemo dalje koristiti u ovom dijelu.
Dobar dashboard bi trebao biti:
- pregledan
- informativan
- sažet
- balansiran
- prilagođen ciljanoj publici
Dobar dashboard nije pretpran vizualizacijama, a pogotovo ne tekstom! Dashboard je uglavnom namijenjen za publiciranje u html formatu pa su time i interaktivne vizualizacije poželjne. Dashboard treba sadržavati ključne vizualizacije o nekoj temi, ali isto tako mora biti vizualno balansiran. To znači da jedna vizualizacija ne smije dominirati nad ostalima (bojama, veličinom i slično). Naravno, postoje izuzetci i zato je važno svaki dashboard kreirati tako da bude prilagođen ciljanoj publici, odnosno kreirati ga iz perspektive krajnjeg korisnika.
Kako u praksi izgleda kreiranje dashboadra u R okruženju? Flexdashboard paket je samo okvir u kojem “slažemo” vizualizacije koje kreiramo uobičajenim načinom bilo kroz ggplot() paket, osnovne R naredbe ili nekog drugog paketa. Dakle, flexdashboard nam služi da vizualizacije posložimo u stupce i retke i dodamo neke druge elemente (naslove, komentare i slično).
flexdashboard paket je zapravo temeljen na Rmarkdown sintaksi i načinu kodiranja (stoga je i rmarkdown paket, među ostalima, i nužan za instaliranje flexdashboard paketa pa će R pri instalaciji flexdashboard paketa automatski instalirati i rmarkdown koji zauzima poseban dio ove knjige).
Novi flexdashboard možemo najlakše kreirati kroz RStudio prečace. Klikom na File -> New File -> R Markdown otvara se izbornik za kreiranje nove R Markdown datoteke. U tom izborniku odaberimo kategoriju From Template i unutar njega Flex Dashboard kako je prikazano na sljedećoj slici.

Prema dokumentaciji Aden-Buie et al. (2023) na Flex Dashboard možemo ugraditi sljedeće elemente:
- vizualizacije iz R okruženja
- tablične podatke
- vrijednosne okvire
- razna mjerila za usporedbu prikazanih vrijednosti
- tekst
- interaktivne vizualizacije iz JavaScript okruženja kroz
htmlwidgetspaket (obrađeniplotlyihighcharterpaketi su također zasnovani na JavaScript okružju)
12.4 Raspored i osnovne postavke
Flex Dashboard možemo promatrati kao sadržaj složen u matricu stupaca i redaka. U tom smislu, raspored (layout) Flex Dashboard-a podrazumijeva broj i vizualni odnos stupaca i redaka. U praktičnom smislu, stupci i redci su označeni i odvojeni 2. razinom markdown zaglavlja koji se označava sa ------------ , a sami sadržaj (vizualizacije) su označeni sa 3. razinom markdown zaglavlja koju obilježavamo sa ###.
Isto kao i kod ostalih R Markdown dokumenata, osnovne postavke Flex Dashboarda zadane su u prvim linijama koda, odvojenima ---, te predstavljaju metadata dio datoteke i zadane su u YAML sintaksi.
Kreirajmo novi Flex Dashboard i pogledajmo njegove zadane YAML postavke.
---
title: "Untitled"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
---Argument orientation mijenja temeljni oblik dashboard-a. Dostupni su modaliteti “columns” i “rows” koji će postaviti naš dashboard u okomiti (elementi u stupcima) ili vertikalni (elementi u redcima) raspored. Navedeno ne znači da ne možemo imati stupce i retke, već njihov odnos na dashboardu. Na primjeru ćemo dodatno pojasniti ovaj argument. Argument vertical_layout razlikuje modalitete “fill” i “scroll”. Opcija “fill” će postaviti veličinu elemenata i dashboard-a tako da popuni cijelu dostupnu stranicu (ekran), a opcija “scroll” će postaviti veličinu elemenata na njihovu zadanu vrijednost, a korisnik će pomicati stranicu ako je potrebno. Na sljedećoj slici prikazan je kod zadanog Flex Dashboard-a.

Promijenimo naslove grafikona iz Chart u Grafikon te kreirajmo naš prvi dashboard. Naslovi grafikona nalaze se pod oznakom ###. Kod Flex Dashboard-a ne pokrećemo s Ctrl + Enter kao običan kod već za njega vrijedi isto što i za ostale R Markdown datoteke pa ćemo ga pokrenuti klikom na ikonu Knit i potom Knit to flex_dashboard. RStudio nas potom u traži naziv pa ga spremimo pod nazivom “prazni_dashboard”. RStudio potom otvara svoj browser u kojem nam prikazuje naš prvi dashboard. Primjetimo da se dashboard otvorio u browser-u što znači da je format u kojem je sačuvan naš dashboard HTML format. Odgovarajući zadani i prazni dashboard izgleda kao na sljedećoj slici.

Ovdje vidimo što znače opcije {data-width=650} i {data-width=350} pored prvog i drugog stupca: oni zadaju da prvi stupac zauzima 65% stranice, a drugi stupac 35% stranice.
Kako bi primjerom pokazali razliku između rasporeda “columns” i “rows”, kreirajmo novi dashboard tako da u prethodnom dashboard-u promijenimo raspored u orientation: rows. Pokrenimo kod sa Knit i dobit ćemo rezultat prikazan na sljedećoj slici.

Sada možemo uočiti razliku između “columns” i “rows” rasporeda. Dokumentacija navodi da u slučaju “rows” rasporeda navodimo Row umjesto Column u samom kodu gdje ih odvajamo sa drugom razinom zaglavlja -------------. Mi to u ovom primjeru nismo uradili iako smo dobili isti rezultat. Radi konzistentnosti i eventualnih kasnijih problema u ažuriranju koda, funkcija ili cijelog paketa, preporučamo u slučaju “rows” rasporeda koristiti i Row naziv umjesto Column.
Ako želimo imati elemente samo u stupcima ili u redcima onda ćemo odabrati odgovarajući raspored “columns” ili “rows” i svaki element zasebno staviti u stupac ili redak. Na sljedećoj slici pogledajmo kako kodirati dashboard s 3 elementa u 3 stupca.

Flex Dashboard se automatski prilagođava prikazu na mobilnim uređajima. Na tabletima je prikaz jednak kao i na većim ekranima (laptop, desktop računala). Na pametnim telefonima Flex Dashboard će optimizirati prikaz za manje ekrane. Takva optimizacija će rezultirati prikazom dashboarda u jednom stupcu.
12.5 Primjer dashboard-a
Koristeći osnovne elemente dashboard-a (statične i interaktivne vizualizacije, tekst i ostalo), kreirajmo jedan dashboard na osnovu skupa podataka starwars.
Skup starwars sadrži likove iz serijala Ratovi zvijezda. Likovi iz filmova su prikazani u redcima, a njihova obilježja u stupcima. U ovom primjeru, koristit ćemo se tidyverse pristupom te koristiti osnovne naredbe za transformaciju podacima i kreiranje novih varijabli. Kao i inače, prvo pogledajmo što skup starwars sadrži odnosno njegovu strukturu.
head(starwars)# A tibble: 6 × 14
name height mass hair_color skin_color eye_color birth_year sex gender
<chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr>
1 Luke Sky… 172 77 blond fair blue 19 male mascu…
2 C-3PO 167 75 <NA> gold yellow 112 none mascu…
3 R2-D2 96 32 <NA> white, bl… red 33 none mascu…
4 Darth Va… 202 136 none white yellow 41.9 male mascu…
5 Leia Org… 150 49 brown light brown 19 fema… femin…
6 Owen Lars 178 120 brown, gr… light blue 52 male mascu…
# ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
# vehicles <list>, starships <list>
Za naš dashboard, fokusirajmo se na varijable height, mass, hair_color, gender i species. Napravit ćemo i novu varijablu BMI odnosno Body Mass Index (indeks tjelesne težine) te isključiti prazna opažanja (NA). Kreirajmo 4 vizualizacije, dvije statične sa ggplot2 i dvije dinamične kroz plotly paket. Također, koristimo i facet opciju te funkciju fct_infreq() kojom poredamo opažanja kategorijalnih varijabli po njihovoj frekvenciji. Slijedi cjelokupni kod dashboarda:
---
title: "Ratovi zvijezda dashboard"
output:
flexdashboard::flex_dashboard:
orientation: rows
---
library(flexdashboard)
library(tidyverse)
library(plotly)
library(highcharter)
starwars <- na.omit(starwars)
starwars <- starwars %>%
mutate(BMI = mass / (height / 100) ^ 2)
## Column {data-width="650"}
### Visina i težina po spolu
ggplot(starwars, aes(x = height, y = mass, color = gender)) +
geom_point() +
labs(x = "Visina (cm)", y = "Težina (kg)", color="Spol: ")
### BMI vs vrsta
ggplot(starwars, aes(x = BMI, y = gender)) +
geom_violin() +
labs(x = "BMI", y = "Vrsta")
## Column {data-width="350"}
### Frekvencija boje kose
starwars %>%
count(hair_color, sort = TRUE) %>%
mutate(hair_color = fct_infreq(hair_color)) %>%
ggplot(aes(x = hair_color, y = n, fill = hair_color)) +
geom_col(show.legend = FALSE) +
labs(x = "Boja kose", y = "Frekvencija", fill="Boja kose: ") -> p
ggplotly(p)
### Visina po vrstama
plot_ly(starwars, x = ~height, y = ~species, color = ~gender, type = 'scatter', mode = 'markers') %>%
layout(xaxis = list(title = "Visina (cm)"), yaxis = list(title = "Vrsta"))12.6 Stargazer paket
R sustav omogućava veliki broj različitih izvještaja za potrebe prezentacija, znanstvenih radova ili drugih potreba gdje je naglasak na pravilnom prikazivanju rezultata istraživanja.
Jedan od načina pisanja prihvaćen u znanstvenim istraživanjima je i Latex. U tom slučaju, za R je napravljen paket stargazer (Hlavac, 2022) koji omogućava jednostavno generiranje Latex koda koji u okviru Latex okruženja (npr. TexStudio, Sweave ili neki drugi editor za Latex) omogućava izradu prilagođenih tablica i slikovnih prikaza koji se mogu korisiti za znanstvene časopise ili druge publikacije.
Do sada smo vidjeli da R okruženje nudi rješenja za sve korake u nekoj analizi, uključujući i komunikaciju rezultata. U tom kontekstu, paket stargazer možemo koristiti i unutar samog R okruženja u samoj publikaciji rezultata kroz RMarkdown sučelje. Paket stargazer zasniva se na jednoj funkciji, istog imena, stargazer(), unutar koje argumentima mijenjamo output željene tablice ili slikovnog prikaza. Zadani output format je Latex te pokretanjem zadane stargazer() funkcije nećemo dobiti upotrebljiv rezultat ukoliko ga koristimo u “običnoj” R skripti. Pogledajmo na primjeru skupa podataka attitude.
library(stargazer)
library(tidyverse)stargazer(attitude) # gdje je output? što vidimo u konzoli?
% Table created by stargazer v.5.2.3 by Marek Hlavac, Social Policy Institute. E-mail: marek.hlavac at gmail.com
% Date and time: Thu, Dec 26, 2024 - 12:12:05
\begin{table}[!htbp] \centering
\caption{}
\label{}
\begin{tabular}{@{\extracolsep{5pt}}lccccc}
\\[-1.8ex]\hline
\hline \\[-1.8ex]
Statistic & \multicolumn{1}{c}{N} & \multicolumn{1}{c}{Mean} & \multicolumn{1}{c}{St. Dev.} & \multicolumn{1}{c}{Min} & \multicolumn{1}{c}{Max} \\
\hline \\[-1.8ex]
rating & 30 & 64.633 & 12.173 & 40 & 85 \\
complaints & 30 & 66.600 & 13.315 & 37 & 90 \\
privileges & 30 & 53.133 & 12.235 & 30 & 83 \\
learning & 30 & 56.367 & 11.737 & 34 & 75 \\
raises & 30 & 64.633 & 10.397 & 43 & 88 \\
critical & 30 & 74.767 & 9.895 & 49 & 92 \\
advance & 30 & 42.933 & 10.289 & 25 & 72 \\
\hline \\[-1.8ex]
\end{tabular}
\end{table}
stargazer(attitude, type = "text") # output imamo u konzoli
=====================================
Statistic N Mean St. Dev. Min Max
-------------------------------------
rating 30 64.633 12.173 40 85
complaints 30 66.600 13.315 37 90
privileges 30 53.133 12.235 30 83
learning 30 56.367 11.737 34 75
raises 30 64.633 10.397 43 88
critical 30 74.767 9.895 49 92
advance 30 42.933 10.289 25 72
-------------------------------------
Ponovimo, funkcija stargazer namijenjena je finalnoj publikaciji i kao takva je najprikladnija za korištenje u RMarkdown dokumentima koji će biti izvezeni u PDF ili HTML formatima. Moguće je izvesti i Word dokument iz RMarkdowna, a u tom slučaju moramo koristiti zadanu opciju type= argumenta odnosno Latex. Ukoliko želimo vidjeti sistematičan prikaz naše analize (najčešće modela ili deskriptivne statistike) unutar aktualne R skripte, potrebno je promijeniti type= argument u “text”. Osim deskriptivne statistike, stargazer se najviše koristi za prikaz rezultata statističkog modeliranja. Pogledajmo na primjeru jednostavne linearne regresije iz skupa podataka diamonds.
model_dijamanti <- lm(price ~ carat, data = diamonds)
stargazer(model_dijamanti, type = "text") # tablica prikazana u konzoli
==================================================
Dependent variable:
------------------------------
price
--------------------------------------------------
carat 7,756.426***
(14.067)
Constant -2,256.361***
(13.055)
--------------------------------------------------
Observations 53,940
R2 0.849
Adjusted R2 0.849
Residual Std. Error 1,548.562 (df = 53938)
F Statistic 304,050.900*** (df = 1; 53938)
==================================================
Note: *p<0.1; **p<0.05; ***p<0.01
Za publiciranje u HTML formatu, type= argument mijenjamo u “html”. Ovaj output nam je koristan u RMarkdown dokumentima. Paket stargazer sarži veliki broj dodatnih opcija prikaza poput odabira elemenata koji se prikazuju u tablici (p vrijednosti, standardna devijacija i ostalo), ali i samog oblika tablice. Neki predefinirani stilovi iz odabranih znanstvenih časopisa mogu se mijenjati kroz opciju style=, a popis stilova dostupan je u help izborniku paketa stargazer kroz naredbu ?stargazer.