Prije nego počnemo sa radom, potrebno je da učitamo prethnodno instalirane R pakete koji će nam biti potrebni za rad sa datotekama i ispitivanje varijabli:

rm(list = ls()) # funkcija kojom čistimo radnu površinu

library('foreign') # Paket "foreign" čemo koristit za učitavanje baza kreiranih u drugim statističkim programima
library('car') # Paket "car" ćemo koristiti za rekodiranje varijabli
library('psych') # Pake "psych" ćemo koristiti za prikazivanje mjera deskriptivne statistike

Učitavanje dio datoteke Crnogorske izborne studije 2016. Baza podataka sadrži informacije o ispitanicima i njihovim političkim preferencijama:

mnes <- read.csv("mnes.csv")
head(mnes)
  X god nac eko sud kontk    pol              inf
1 1  57  CG   1   1     1  Muski               TV
2 2  66  CG   1   2     1  Muski               TV
3 3  50  CG  NA  NA     0 Zenski               TV
4 4  70  CG   1   2     0  Muski               TV
5 5  66  CG   1   1     0 Zenski               TV
6 6  68  CG  NA  NA     0  Muski Ne informisem se
mnes$X <- NULL # uklonimo kolonu sa rednim brojevima
dim(mnes)
[1] 1213    7
head(mnes)
  god nac eko sud kontk    pol              inf
1  57  CG   1   1     1  Muski               TV
2  66  CG   1   2     1  Muski               TV
3  50  CG  NA  NA     0 Zenski               TV
4  70  CG   1   2     0  Muski               TV
5  66  CG   1   1     0 Zenski               TV
6  68  CG  NA  NA     0  Muski Ne informisem se

Deskriptivna statistika

Datoteka sadrži 1213 obzervacija i 7 varijabli, koji predstavljaju 1213 pojedinaca koji su u anketi dali odgvore na 7 pitanja. Za početak počećemo sa deskripcijom jedne varijable koristeći mjere centralne tendecije i mjere varijacije.

Mjere centralne tendencije

Aritmetička sredina

Aritmetička sredina može se izračunati koristeći funkciju mean(). Recimo da nas zanima da opišemo u kojoj mjeri su ispitanici zadovoljni stanjem ekonomije u Crnoj Gori u toku 2016. godine. Varijabla je mjerena na skali od 1 do 5, pri čemi 1 znači da se stanje veoma pogoršalo a 5 da se stanje u ekonomiji veoma poboljšalo.

Napomena:ukoilko postoji makar i jedna nedostajuća vrijednost, iskoristiti mean(mnes$eko, na.rm = TRUE) kako bi izračunali prośek bez nedostajuće vrijednosti.

mean(mnes$eko, na.rm = TRUE)
[1] 2.911987

Možemo viđeti da je prośečna stav prema tome kako je stanje u crnogorskoj ekonomiji u toj godini 2.91, najbliže odgovoru “ostalo je isto”.

Medijana

U situacijama u kojima sumnjamo ili znamo da je distribucija podataka “iskrivljena” istraživači često preferiraju koristiti medijanu kao mjeru centralne tendencije. Zbog toga što je suštinski “položajna” mjera, nije ośetljiva na ekstremne vrijednosti. Slično kao i sa artimetičkom sredinom, medijana se može izračunati koristeći funkciju median().

median(mnes$eko, na.rm = TRUE)
[1] 3

Shodno rezultatu možemo zaklučiti da je vrijednost 3 središnja vrijednost od koje 50% uzorka ima manju ocjenu a 50% veću. S obzirom na to da razlika u vrijednost aritmetičke sredine i medijane nije velika, možemo zaključiti da je distribucija ove varijable uglavnom normalna.

Modus

Kad je u pitanju modus, ne postoji funkcija koju koristimo isključivo za ovu mjeru centralne tendencije. Ipak, koristeći druge funkcije sa kojima smo se već upoznali možemo veoma lako dobiti i tu informaciju. Najednostavniji način je tabeliranje podataka po kategorijama varijable koristeći table() funkciju:

table(mnes$eko)

  1   2   3   4   5 
148 216 500 251  78 

Iz tabele možemo viđeti da je odgovor koji je najčešće ponavlja u uzorku “3” (500 puta). Iako je ovaj metod samoevidentan, u slučaju velikog broja kategorija, može lako doći do grešaka. Iz tog razloga, korisno je u ovu naredbu dodati zahtjev da R kategorije poređa po učestalosti, kako bi najfrekventnija kategorija bila prikazana prva.

sort(table(mnes$eko), decreasing = TRUE)

  3   4   2   1   5 
500 251 216 148  78 

Mjere varijacije

Nakon što uspješno odredimo mjere centralne tendencije, istraživači najčešće žele znati u kojoj mjeri je taj broj adekvatan opis pojedinačnih vrijednosti u uzorku. Drugim riječima, u kojoj mjeri pojedinačne verijednosti variraju (razlikuju se) u odnosu na npr. artimetičku sredinu.

Raspon

Raspon (range) definišemo kao distancu između najmanje i najveće vrijednosti. Stoga, raspone je veoma lako izračunati tako što ćemo kombinovati funkcije max() i min().

max(mnes$eko, na.rm = TRUE) - min(mnes$eko, na.rm = TRUE) # Raspon dobijeamo oduzimanjem minimuma od maksimuma.
[1] 4

Standardna devijacija i varijansa

Standardna devijacija i varijansa, koja je najčešće korićene mjere varijacije, mogu se u R izračunati koristeći sd() i var() funkcije:

sd(mnes$eko, na.rm = TRUE)
[1] 1.068838
var(mnes$eko, na.rm = TRUE) 
[1] 1.142415

Jedna funkcija za sve?

Gore navedeni primjeri predstavljaju korišćenje osnovih R funkcionalnosti za računanje desriptivne statistike. Međutim, postoje i dodatni paketi koji korisnicima omogućavaju da koristeći jednu funkciju dobiju skoro sve od navedenih informacija odjednom (i još koju više). Jedan od takvih je paket psych koji nudi veoma korisnu funkciju describe():

describe(mnes$eko) 
   vars    n mean   sd median trimmed  mad min max range  skew kurtosis   se
X1    1 1193 2.91 1.07      3    2.93 1.48   1   5     4 -0.11    -0.46 0.03

Možemo viđeti da rezultat ove naredbe istovremeno nudi 12 zasebnih informacija o varijabli: veličinu uzorka, aritmetičku sredinu, standardnu devijaciju, medijanu, aritmetičku sredinu bez extremnih 5% obzervacija, minimalnu vrijednost, maksimalnu vrijednost, raspon, ocjene normalnosti (skew i kurtosis), kao i standardnu grešku.

Više o ovim mjerama ćemo naučiti prilikom upotrebe konkretnih statističkih metoda.

Grafičko prikazivanje

Grafičko prikazivanje nije samo bitno za efikasnu komunikaciju vaših podataka, već je sastavni dio tehnika za upoznavanje vaših podataka. Aritmetička sredina i medijana često su vrlo loša reprezentacija ključnih informacija, pa ako želimo stvarno razumjeti što se u podacima nalazi, moramo vizuelno provjeriti karakter naših podataka - kako su distribuirane varijable, odvojeno ili zajedno, kroz vrijeme ili različite podskupove slučajeva. Grafik (plot) može sadržati ogromnu količinu informacija koje komuniciraju kao cjelina. Ako pogledamo hiljadu brojeva, tada definitivno ništa nijesmo u stanju razumjeti, jer jednostavno nijesmo sposobni rukovati ovom vrstom informacija. Ako se hiljade brojeva inteligentno vizuelizuju, tada ih možemo brzo i intuitivno shvatiti. Dobar grafik vrijedi mnogo više od hiljadu brojeva.

R ima nekoliko paketa za grafičko prikazivanje Najosnovnije grafike mogu se izvesti s funkcijama koje dolaze sa zadanim paketima R. Napredno grafičko prikazivanje može se izvesti s lattice i ggplot2 paketima. Pored toga, postoje funkcije unutar drugih paketa koje koriste ove mogućnosti grafičkog prikazivanja. Sve u svemu, R ima izvrsne kapacitete za vizuelizaciju, a ggplot2 pruža daleko najsloženije i najmoćnije opcije grafičkog prikazivanja. Uz ggplot2 je moguća gotovo svaka vrsta radnje koje se možete śetiti. Budući da je ovo tema sama za sebe, nećemo imati priliku sada ulaziti detaljnije u vizuelizaciju koristeći napredne funkcije ggplot2. Kapaciteti lattice paketa prilično su neestetski u odnosu na ggplot2, pa ćemo ga rjeđe spominjati.

Distribucija podataka

Pogled na distribuciju naših podataka zavisi o vrsti podataka koje imamo - za intervalne podatke bi nas zanimao histogram, dok bi za kategorijalne podatke trebao bar grafikon. Izgledaju prilično slično - oba imaju stupke jedne do drugih, pa se postavlja pitanje u čemu je razlika? Zapravo je prilično fundamentalno - činjenica da su stupci na histogramu odmah jedan uz drugi sugeriše da su podaci kontinuirani (intervalni), dok činjenica da između njih postoji praznina na bar grafikonima govori nam da podaci nisu kontinuirani, već kategorički.

Vratimo se podacima o crnogorskim biračima. Pretpostavimo da bi nas zanimala starost ispitanika u uzorku. Ovo možemo tumačiti kao intervalnu varijablu i zato bismo željeli vidjeti histogram podataka. To možemo učiniti vrlo jednostavno pomoću funkcije hist().

hist(mnes$god)

Šta imamo ovđe? Imamo dva stupca, jedan na početku X ose i drugi na samom kraju. Grafik pokazuje da postoji osoba u uzorku koje su navodno stare skoro 10.000 godina. To je očigledno greška jer nijesmo iz baze podataka isključili nedostajuće vrijednosti koje su u ovoj datoteci obilježene brojem “9999”. Kako bi riješili ovaj problem i dobili pravu sliku, moramo rekodirati varijablu god.

mnes$god <- recode(mnes$god, "90:hi=NA") # svaka osoba koja ima godine vece od 100 bice obiljezena kao nedostajuca vrijednost. Najstarija osoba u nasem u zorku je 88.
hist(mnes$god)

Sada sve izgleda kako treba, iako grafik nije estetski na zadovoljavajućem nivou, pa možemo napraviti bolji od ovog. Na primjer, možemo reći R-u da zamijeni naslov grafika i osa, da promijeni boju stubaca, da podijeli te podatke na veći broj stubaca nego što je ovđe prikazano.

Online izvori?

hist(mnes$god,
     col = "steelblue3", # argument "col" za specifikovanje boje
     breaks = 30, # argument "bearks" za specifikovanje broja stubaca
     main = "Histogram godina (MNES 2016)", # argument "main" za specifikovanje naslova grafika
     xlab = "Godine", # argument "xlab" za specifikovanje imena X ose
     ylab = "Frenkvencija", # argument "ylab" za specifikovanje imena Y ose
     border = "gray90")  # argument "border" za specifikovanje boje graničnih linija stubaca

Ukoliko, na primjer, želimo pogledati isti grafik ali samo za poduzorak starijih od 60 godina.

hist(mnes$god[mnes$god > 60], 
     col = "steelblue3", # argument "col" za specifikovanje boje
     breaks = 5, # argument "bearks" za specifikovanje broja stubaca
     main = "Histogram godina > 60 (MNES 2016)", # argument "main" za specifikovanje naslova grafika
     xlab = "Godine", # argument "xlab" za specifikovanje imena X ose
     ylab = "Frenkvencija", # argument "ylab" za specifikovanje imena Y ose
     border = "gray90")

Za kategoričke varijable, pitanje distribucije malo je drugačije. Sada, umjesto da pitamo kako su vrijednosti varijable raspoređene po opsegu varijable, moramo pitati kako su slučajevi raspoređeni po kategorijama varijable. U ovom slučaju mogao bi nas zanimati broj slučajeva za svaku kategoriju pola Možemo reći R-u da nam da osnovni stubasti (bar) grafikon pomoću naredbe barplot(). Ali za grafički prikaz zahtijeva brojeve, a mi imamo nazive polova u našim podacima. Kako to možemo riješiti? Zapamtite naredbu table() od ranije.

pol <- table(mnes$pol)
barplot(pol,
        col = c("dodgerblue3","firebrick3"), # argument "col" za specifikovanje boje
     breaks = 5, # argument "bearks" za specifikovanje broja stubaca
     main = "Bar grafikon za pol (MNES 2016)", # argument "main" za specifikovanje naslova grafika
     xlab = "Pol", # argument "xlab" za specifikovanje imena X ose
     ylab = "Frenkvencija", # argument "ylab" za specifikovanje imena Y ose
     border = "black")

Ovo je vrlo jednostavan grafik, što je apsolutno u redu. Grafik ne bi trebao sadržati nepotrebne informacije i elemente, jer to samo odvlači pažnju.

pol.nac <- table(mnes$pol, mnes$inf)
pol.nac
        
         Internet Ne informisem se Novine Radio  TV
  Muski        14               38     50     5 489
  Zenski       13               48     22     4 348
barplot(pol.nac, 
        main="Izvor informisanja shodno polu",
        xlab="Izvor informisanja",
        ylab="Frekvencija",
        beside=TRUE,
        col=c("firebrick3", "dodgerblue3"))
legend(x="topleft", 
       legend=c("Muski", "Zenski"), 
       fill=c("firebrick3", "dodgerblue3"))