11 Jednostavne vizualizacije

U ovom poglavlju obrađuju se osnovne metode vizualizacije podataka u R-u, koristeći funkcije poput plot(), barplot(), hist(), i pie() te paket ggplot2 za napredniju vizualizaciju. Različiti tipovi grafova prikazani su kroz primjere, uključujući dijagrame rasipanja, linijske dijagrame, histogram, torta dijagram, i mozaik grafikon, pri čemu je naglasak stavljen na prilagodbu parametara kao što su boje, nazivi osi i stilovi linija. Na kraju poglavlja, izlažu se se prednosti i nedostaci vizualizacija u R-u, uobičajene pogreške koje treba izbjegavati te preporuke za najbolje prakse, uključujući jednostavnost i upotrebu kontrasta za bolju preglednost.

11.1 Primjeri najčešće korištenih vizualizacija

Osnovna naredba za crtanje grafova u R-u je plot(). Naredba će rezultirati različitim prikazom ovisno o tome što se crta. Na primjer, ako želimo nacrtati ranije kreirani vektor a, onda će to izgledati ovako:

> plot(a)

Na x-osi naći će se redni broj opažanja, a na y-osi bit će vrijednosti opažanja. Bez dodatnih parametara, ovo je vrlo neinformativan graf.

No, ako bismo grafički prikazali broj dolazaka i odlazaka turista iz promatranih EU zemalja (podatkovni okvir Tur_eu), onda dobivamo dijagram rasipanja. Dodatno, specificiran je naslov koristeći parametar main te nazivi apscise (koristeći xlab) i ordinate (koristeći ylab).

> plot(Tur_eu[ , 2:3],
+      main = "Dolasci i odlasci turista iz promatranih EU zemalja",
+      xlab = "Broj dolazaka turista",
+      ylab = "Broj odlazaka turista")

Ovaj tip grafa prikladini je za veći broj opažanja, kao u sljedećem primjeru, u kojem se simulira povezanost dviju varijabli:

> x <- rnorm(250, 55, 15)
> z <- rnorm(250, 10, 10)
> y <- 15 + z + 2 * x
> 
> plot(x, y)

Osim toga, plot() se može koristiti za kreiranje linijskog dijagrama:

> y <- cumsum(a)
> 
> plot(a, y, type = "l", main = "Linijski dijagram", 
+      xlab = "vektor a", ylab = "Kumulativni niz")

Nadalje, moguće je kreiranje stupčastog dijagrama koristeći barplot() naredbu. U ranijim primjerima nisu korištene izmjene u bojama, ali se mogu provesti na isti način i to podešavanjem parametra col.

> counts <- table(Tur_ord$EU)
> 
> # Kreiranje stupčastog dijagrama
> barplot(counts, 
+         main = "Stupcasti dijagram: promatrane drzave prema clanstvu u EU", 
+         xlab = "Drzave clanice EU", ylab = "Frekvencije", 
+         col = "lightgreen")

Na sličan način moguće je kreirati i strukturni krug, poznatiji kao torta dijagram.

> pie(counts, labels = c("not EU", "EU"), 
+     main = "Strukturni krug: promatrane drzave prema clanstvu u EU", 
+     col = c("lightblue", "yellow"))

Jedan od najčešće korištenih grafičkih prikaza svakako je histogram. Prikazat ćemo histogram ranije kreiranog vektora norm. Hist ima više različitih parametara koji se mogu definirati, a između ostalih i pravilo prema kojem se definiraju razredi.

> hist(norm)

Uz histogram, izuzetno se često koristi i box-plot dijagram (ili kutijasti dijagram). Ovaj je dijagram vrlo koristan za dobivanje uvida u raspršenost podataka.

> boxplot(x, main = "Box-plot", ylab = "x")

11.2 Prilagodba grafikona

Osnovna postavka je korištenje Sturgesovog pravila pri kreiranju razreda, no granice razreda se mogu zadati u obliku vektora.

> razredi <- seq(round(min(norm)-2), round(max(norm)+2), 5)
> 
> hist(norm, 
+      breaks = razredi,                #granice razreda
+      main = "Histogram vektora norm", #promjena naziva grafa
+      xlim = c(round(min(norm)-10), round(max(norm)+10)),  # promjena raspona apscise
+      xlab = "Vektor norm",            #promjena naziva apscise
+      ylim = c(0, 500),                  #promjena raspona ordinate
+      ylab = "Frekvencije",            #promjena naziva ordinate
+      col = "purple"                   #promjena boje površine histograma
+      )

Evo jednog primjera s jako puno podešenih parametara pri crtanju histograma.

> data <- rnorm(1000, mean = 50, sd = 5)
> 
> # Stvaranje prilagođenog histograma
> hist(data, 
+      breaks = 30,                    # Broj stupaca
+      col = "steelblue",              # Boja stupaca
+      border = "white",               # Boja ruba stupaca
+      main = "Histogram s prilagodbama", # Naslov histograma
+      xlab = "Vrijednosti",           # Oznaka za x-os
+      ylab = "Frekvencija",           # Oznaka za y-os
+      xlim = c(30, 70),               # Granica za x-os
+      ylim = c(0, 100),               # Granica za y-os
+      las = 1,                        # Orjentacija oznaka osi
+      cex.axis = 0.8,                 # Veličina oznaka osi
+      cex.lab = 1.1,                  # Veličina naslova osi
+      cex.main = 1.3,                 # Veličina glavnog naslova
+      cex.sub = 0.8,                  # Veličina podnaslova
+      sub = "Normalna Distribucija",  # Podnaslov
+      xaxt = "n")                     # Sakriti oznake x-osi
> 
> # Dodavanje prilagođenih oznaka x-osi
> axis(1, at = seq(20, 80, by = 10), labels = seq(20, 80, by = 10))
> 
> # Dodavanje prilagođene mreže
> grid(nx = NULL, ny = NULL, col = "gray", lty = "dotted")

Nadalje, za vizualno preispitivanje i stvaranje procjene funkcije gustoće vjerojatnosti za kontinuirani skup podataka koristi se density() u kombinaciji s naredbom plot().

> dens <-density(norm)
> plot(dens, col = "red", lwd = 2)

Nešto opsežnije mogućnosti grafičkih prikaza s više prilagođenih postavki mogu se ostvariti koristeći paket ggplot2 (Wickham and Wickham 2016). Ovdje je prikazan primjer u kojem se pomoću ggplot2 kreiraju slojevi grafičkog prikaza, uključujući histogram s prilagođenom bojom, širinom stupa i prozirnosti te krivulju gustoće s prilagođenom bojom i debljinom linije.

> library(ggplot2)
> norm<-as.data.frame(norm)
> ggplot(norm, aes(x = norm)) + 
+   geom_histogram(aes(y = after_stat(density)), 
+                  binwidth = 1, fill = "blue", alpha = 0.5) + 
+   geom_density(color = "red", linewidth = 1)

Nakon toga, prelazimo na grafički prikaz histograma i krivulje gustoće s većom količinom podešenih parametara. Objašnjenja za podešene parametre unesena su u kodu.

> # postavljanje broja znamenki u ispisu (u ovom slučaju, u ispisu brojeva na osima)
> options(digits = 2)          
> 
> # Kreiranje histograma s linijom gustoće koristeći ggplot2 s prilagodbama
> ggplot(norm, aes(x = norm)) +
+   # dodavanje histograma
+   geom_histogram(aes(y = after_stat(density)), 
+                  # crtanje histograma sa širinom stupca podešenom na 1
+                  binwidth = 1,          
+                  # ispuna histograma
+                  fill = "green",  
+                  # parametar koji kontrolira prozirnost elemenata na grafikonu
+                  alpha = 0.5,    
+                  # boja obruba
+                  color = "black") +           
+   # Dodavanje linije gustoće
+   # dodavanje linije gustoće, boja i debljina linije
+   geom_density(color = "purple", size = 1.5) +   
+   # Prilagodba naslova i oznaka osi
+   # naslov
+   # U pravilu, paketi u R-u nisu prilagođeni za ispis naziva koji sadrže
+   # dijakritičke znakove
+   labs(title = "Histogram i linija gustoce",
+        # podnaslov
+        subtitle = "Normalna distribucija - Joker style",  
+        # naziv apscise
+        x = "Vrijednosti",        
+        # naziv ordinate
+        y = "Gustoca") +         
+   # prilagodba oznaka na osima
+   scale_x_continuous(breaks = seq(min(norm), max(norm), by = 2)) +  
+   # Prilagodba tema
+   theme_minimal() +
+   # Prilagodba elemenata tema
+   theme(
+     plot.title = element_text(size = 20, face = "bold", hjust = 0.5),
+     plot.subtitle = element_text(size = 15),
+     axis.title.x = element_text(size = 14),
+     axis.title.y = element_text(size = 14),
+     axis.text = element_text(size = 12)
+   )

Na sličan način, možemo unaprijediti prikaz dijagrama raspipanja, koji je ranije kreiran koristeći naredbu plot().

> x <- rnorm(250, 55, 15)
> z <- rnorm(250, 10, 10)
> y <- 15 + z + 2 * x
> data <- data.frame(x = x, y = y)
> ggplot(data, aes(x = x, y = y)) +
+   geom_point(aes(color = y), size = 2, alpha = 0.7) +  
+   scale_color_gradient(low = "blue", high = "red") +   
+   geom_smooth(method = "loess", se = TRUE, color = "darkgreen") +
+   labs(
+     title = "Dijagram rasipanja",
+     subtitle = "Prikaz varijabli x i y s prilagodbama za dodatne uvide",
+     x = "x",
+     y = "y"
+   ) +
+   theme_minimal() +
+   theme(
+     plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
+     plot.subtitle = element_text(hjust = 0.5, size = 12),
+     legend.position = "right"
+   )

Recimo da je ovom skupu podataka pridružena još jedna, kategorijska varijabla, koja se odnosi na treću promatranu karakteristiku ovog skupa. Promotrimo kako možemo prikazati varijablu y s obzirom na podjelu koju stvara dodana varijabla.

> category <- factor(sample(c("A", "B"), 250, replace = TRUE)) 
> data <- data.frame(x = x, y = y, category = category)
> 
> ggplot(data, aes(x = category, y = y, fill = category)) +
+   geom_boxplot(alpha = 0.7) +  
+   scale_fill_manual(values = c("skyblue", "salmon")) +  
+   labs(
+     title = "Box-plotovi varijable y podijeljenu prema kategorijama",
+     x = "Kategorija",
+     y = "Vrijednosti y"
+   ) +
+   theme_minimal() +
+   theme(
+     plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
+     legend.position = "none"  
+   )

Ovakav prikaz omogućuje usporedbu raspršenosti podskupina podataka.

Osim navedenih, mozaik grafikon (engl. mosaic plot) je vizualni prikaz koji se koristi za prikazivanje podataka iz kombiniranih tablica (tablica kontingence). Za prikaz opisnih podataka ciljano je kreiran paket vcd (Meyer et al. 2023).

> library(vcd)
> 
> # Primjer tablice kontingence
> 
> # učitavanje postojećih podataka iz paketa vcd
> data(HairEyeColor)                
> tablica <- margin.table(HairEyeColor, margin = c(1, 2))
> 
> # Kreiranje mozaik grafikona
> mosaicplot(tablica, main = "Mozaik grafikon boja kose i ociju", 
+            xlab = "Boja kose", ylab = "Boja ociju")

I u ovom se grafikonu mogu dodatno prilagođavati boje.

> boje <- c("brown", "lightblue", "orange", "darkgreen")
> 
> mosaicplot(tablica, main = "Mozaik grafikon boja kose i ociju", 
+            xlab = "Boja kose", ylab = "Boja ociju",
+            color = boje)

11.3 Prednosti i nedostaci vizualizacija u R-u te najčešće pogreške

Prednosti vizualizacije podataka u R-u

  • Raznolikost tipova grafova: R podržava širok spektar tipova grafova i vizualizacija, omogućavajući prilagodbu prikaza podacima i analitičkim ciljevima,

  • fleksibilnost i prilagodba: napredne opcije za prilagodbu omogućuju precizno podešavanje izgleda grafova, od boja i tipova linija do složenih rasporeda i integracija s drugim elementima kao što su tekst i elementi oblikovanja,

  • integracija s analitičkim radnim tokovima: vizualizacije se lako integriraju s ostatkom analitičkog procesa u R-u, omogućavajući brzu iteraciju između analize i vizualizacije.

Uobičajene greške pri kreiranju vizualizacija

  • Previše detalja ili složenih elemenata može dovesti do konfuznih grafova koji otežavaju razumijevanje podataka,

  • Zanemarivanje ciljne publike: vizualizacije koje nisu prilagođene razumijevanju i potrebama ciljne publike mogu rezultirati neučinkovitom komunikacijom,

  • Neadekvatna priprema podataka, odnosno greške u pripremi podataka, kao što su neobrađene iznimke ili nepravilno skaliranje, mogu dovesti do netočnih vizualizacija ili vizualizacija koje mogu biti pogrešno protumačene.

Najbolje prakse za kreiranje vizualizacija

  • Jednostavnost (usmjerenost na ključne elemente koji komuniciraju podatke),

  • Kontrast i boja (poboljšanje čitljivosti),

  • Preglednost i pristupačnost (grafovi razumljivi širokom rasponu korisnika).

Isprobajte različite tipove grafova

Različiti skupovi podataka i analitički ciljevi zahtijevaju različite pristupe vizualizaciji. Eksperimentiranje s različitim tipovima grafova može otkriti učinkovitije načine prikaza podataka.

Upotreba paketa za vizualizaciju poput ggplot2

Paket ggplot2 nudi moćan i fleksibilan sustav za kreiranje kompleksnih vizualizacija podataka s gramatikom grafičkog dizajna. Iskoristite njegove napredne mogućnosti za stvaranje visokokvalitetnih grafova.

Pitanja za ponavljanje

  1. Kako funkcija plot() određuje što će se prikazati na grafu ako se ne dodaju dodatni parametri? Prikazati primjer korištenja plot() za dijagram rasipanja.

  2. Koje parametre možete prilagoditi pomoću plot() kako biste dodali naslov, oznake osi, i prilagodili boje u grafu?

  3. Koja je razlika između dijagrama rasipanja i linijskog dijagrama? Kako promijeniti plot() funkciju tako da prikazuje linijski dijagram?

  4. Objasnite primjenu barplot() funkcije i navedite primjer kako kreirati stupčasti dijagram s prilagođenom bojom.

  5. Kako funkcija hist() automatski postavlja granice razreda, i koje su dodatne prilagodbe koje možete izvršiti na histogramu (npr. promjena boje, dodavanje naziva osi)?

  6. Kada biste koristili pie() funkciju za vizualizaciju podataka, i koji su osnovni parametri za prilagodbu torta dijagrama?

  7. Što omogućava density() funkcija, i kako koristiti plot() za prikaz krivulje gustoće?

  8. Objasnite razliku između klasičnog histograma i histogram prikaza pomoću ggplot2 paketa, te kako dodati liniju gustoće na histogram koristeći geom_density().

  9. Kada se koristi mozaik grafikon, i kako se prilagođava boja prikaza pomoću mosaicplot()?

  10. Koje su najbolje prakse za odabir boja i nivoa složenosti u vizualizacijama, posebno kada je ciljna publika šira i manje tehnički orijentirana?