☺ Osnovni grafovi iz basic paketa
☺ Osnovne tabele
☺ Sumarni pregledi varijabli

Ovaj dio je vec malo interesnatniji. Prije nego sto pocnemo da uradimo bilo kakvu analizu potrebno je da razumjemo bazu koju dobijemo, sve njene varijable i naravno pitanje na koje zelimo da odgovorimo. Tako npr. zelimo da znamo nazive varijabli, vrstu odnosno klasu, da li imamo nedostajucih podataka, outlayera…itd. U tom smislu sluzimo se cesto odredjenim funkcijama kao sto su str (), summary (), head (), tail (), dim ()..itd.
Pored toga koristimo da spoznamo varijable i odnose izmedju varijabli sluzimo se i tabelarnim pregledima ali i grafickim prikazima, radi cega u ovoj sedmic cemo da radimo i osnovnu vizualizaciju. Prije nego sto pristupimo analizi odredjene baze podataka uradimo bezbroj puno grafikona, koji nam sluze da shvatimo podatke i odnsoe izmedju podataka. Na kraju kada pisemo izvjestaj upotrijebimo samo mali dio grafikona. Ti finalni grafici (usminkani) ce biti obradjeni u sedmici 4 zahvaljujuci paketu ggplot2.

☺Analiza baze (stvarni primjer)

Kod analize podataka znacajnu ulogu igraju grafovi. Da bismo znali koji graf izabrati da nam pokaze podatke, moramo znati sta zelimo. Slika dole sluzi kao vodic kad ne mozemo da se odlucimo koji graf izabrati.

Baza podataka je preuzeta od Agencije za zastitu licnih podataka, koji imaju podatke o prvim put registovanim kolima. Importujemo bazu u onakvom obliku u kakvom ju je Agencija objavila.

registracija <- read.csv("~/private/Academy/Week3/prvi_put_registrovana_vozila_12_2015.csv", sep=";")
dim (registracija) 
## [1] 6325   22
names (registracija)
##  [1] "MJESTO.REGISTRACIJE.dec.2015" "MARKA.VOZILA"                
##  [3] "TIP.VOZILA"                   "VRSTA"                       
##  [5] "GODINA.PROIZVODNJE"           "X"                           
##  [7] "OBLIK.KAROSERIJE"             "ZAPREMINA.MOTORA"            
##  [9] "MAKSIMALNA.SNAGA.MOTORA"      "VRSTA.GORIVA"                
## [11] "EKO.KARAKTERISTIKE"           "KATALIZATOR"                 
## [13] "NAJVEÆA.DOP..UKUPNA.MASA"     "MASA.PRAZNOG.VOZILA"         
## [15] "DOPUŠTENA.NOSIVOST"           "BOJA.VOZILA"                 
## [17] "BROJ.OSOVINA"                 "BROJ.POGONSKIH.OSOVINA"      
## [19] "MJESTA.ZA.SJEDENJE"           "MJESTA.ZA.STAJANJE"          
## [21] "MJESTA.ZA.LEŽANJE"            "VLASNIŠTVO"

Recimo da zelimo da odgovorimo na nekoliko pitanja:

  1. Da li je u 2015 godini vise prvi put registrovano dizela ili benzinaca?
  2. Prosjecna starost automobila?
  3. Da li su generalno dizeli stariji ili benzinci?
  4. Koji broj sjedala imaju automobili, mean, median, minimum i maximum?
  5. Koliko ima privatnih a koliko fizickih registracija? 4. Prosjecna starost vozila koji su registrovali fizicka lica i prosjecna starost vozila koji su registrovali privatna lica?
  6. Koja je boja vozila najzastupljenija kod privatnih a koja kod fizickih lica?
  7. Koja marka automobila je najzastupljenija?

Prvo cemo da je prilagodimo nasim potrebama. tj. jezicki, formatiranje..itd.

names (registracija) <- c("mjesto", "marka", "tip", "vrsta", "god.proizv", "X", "karoserija", "motor.zapremina", "motor.snaga", "gorivo", "eko", "katalizator", "masa.ukupna", "masa.prazan", "nosivost", "boja", "osovina", "pogonska.osovina", "sjedenje", "stajanje", "lezanje", "vlasnistvo")
names (registracija)
##  [1] "mjesto"           "marka"            "tip"             
##  [4] "vrsta"            "god.proizv"       "X"               
##  [7] "karoserija"       "motor.zapremina"  "motor.snaga"     
## [10] "gorivo"           "eko"              "katalizator"     
## [13] "masa.ukupna"      "masa.prazan"      "nosivost"        
## [16] "boja"             "osovina"          "pogonska.osovina"
## [19] "sjedenje"         "stajanje"         "lezanje"         
## [22] "vlasnistvo"

Nakon sto smo promjenili nazive varijable uz pomoc tail (registracija) vidimo da imamo donje redove koji su prazni. Prisjetimo se lekcije kod biranja sa kojim redovima zelimo da raspolazemo…
Prvo uz pomoc funkcije View ()(Note: V je veliko slovo), pogledajmo koji su to redovi prazni. Vidmo da je 6168 zadnja obzervacija a uz pomoc dim() vidimo da imamo 6325 obzervacija.

reg <- registracija[1:6168,] #Uzimamo redove od 1 do 6168, i sve kolone. Zelimo da dobijemo novu bazu, prisjetite se da je to bitno radi eventualne greske da nebismo morali ponovo importovati bazu i mijenjati naziva. Mada u R i to nije problem radi kodova koje cuvamo.  

Pregledajmo nasa pitanja i odgovorimo na prvo pitanje.

1. Da li je u 2015 godini vise prvi put registrovano dizela ili benzinaca?

Za odgovor koristimo obicnu tabelu:

table (reg$gorivo) 
## 
##                                -            BENZIN       BENZIN/LPG 
##                7              146              848               46 
##              CNG            DIZEL ELEKTRIÈNI POGON 
##                3             5117                1

Varijabla $gorivo u trenutnom stanju i nije bas upotrebljiva. To je faktor varijabla sa sedam nivoa. Nas interesuju samo dizel i benzin. Radi toga formiramo Novu varijablu u postojecem data.frame-u nazvacemo je diz.benz.

reg$diz.benz [reg$gorivo == "DIZEL"] <- "dizel"
reg$diz.benz [reg$gorivo == "BENZIN"] <- "benzin"

Uradimo ponovo tabelu za tek formiranu varijablu: table (reg$diz.benz). Vidimo da je u 2015 godini ukupno registrovano po prvi put 848 benzinaca a 5117 dizela. Tj najobicnijom matematickom operaciom dobijemo da je oko 14% bilo benzinaca a 86% dizel automobila. Buduci da znamo da je dizel za okolis nepovoljniji, mozemo postaviti pitanje, da li je vrijeme da prilikom registracije dizel automobili budu skuplji.

2. Prosjecna starost automobila?

Prilikom racunanja prosjeka moramo da uzmemo u obzir kakva nam je distribucija varjable. Mozemo da koristimo najobicniji histogram.

hist(reg$god.proizv) #

Vidimo veliku zakrivljenost podataka, sto znaci da imamo i dosta outlayera koji vrijede za starije pogone. To mozemo mozemo provjeriti sa: boxplot(reg$god.proizv)$out.

Probajte sami…

Vidimo da imamo dosta outlayera, njih 110.

plot (density(reg$god.proizv), xlim=c(1992,2015)) # density bez outlayera.

Sada idemo na summary ()

summary (reg$god.proizv) #koristimo medijanu za prosjek a ne mean. 
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1958    2002    2004    2005    2009    2015

Iz svega prilozenog zakljucujemo: da je prosjecna starost automobila registrovanih po prvi put u 2015 godini bila: 2015-2004=11 godina.

3. Da li su generalno dizeli stariji ili benzinci?

boxplot(reg$god.proizv~reg$diz.benz)

Po boxplot-u vidimo da je raspon godista dizela veci od benzinaca. a uz pomoc tapply() ali nema velike razlike medju njima.

tapply (reg$god.proizv, reg$diz.benz, median) #o funkciji tapply () detaljnije u cetvrtoj sedmici
## benzin  dizel 
##   2004   2004

Iako na prvi pogled izgleda da su benzinci noviji u odnosu na dizele, ipak to nije tacno.

4. Koji broj sjedala imaju automobili, mean, median, minimum i maximum?

summary(reg$sjedenje)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    0.00    5.00    5.00    4.85    5.00   54.00      94

Vidimo da ima 0 sjedista minimalno ali i 54maximalno. Ipak nase pitanje je koji je broj sjedala za automobile. Onda cemo formirati novu varijablu koja ce sadrzavati samo motorna vozila koja imaju broj sjedenja od 2 do 7.

Da bismo izdvojili samo do 2 do sedam koristicemo dplyr paket. Prisjetimo se dplyr paket smo radili u sedmici 2.

library (dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
sjedista <- filter (reg,sjedenje >=2) %>% filter(sjedenje <=7) #formiramo data.frame sjedista od 2 do 7
summary (unlist (sjedista$sjedenje))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   2.000   5.000   5.000   4.849   5.000   7.000

Odgovor je da u BiH u 2015 godini po prvi put registrovani automobili u prosjeku su imali 5 mjesta za sjedenje.

5. Koliko ima privatnih a koliko fizickih registracija?

x <- table (reg$vlasnistvo)
x
## 
##                          FIZIÈKO LICE - BIH FIZIÈKO LICE - STRANO 
##                     0                  5122                    13 
##     PRAVNO LICE - BIH  PRAVNO LICE - STRANO 
##                  1019                    14

BiH drzavljani su imali 6131 registraciju a 27 registracija stranci. Svako peto auto registrovalo je privatno lice.

6. Prosjecna starost vozila koji su registrovali fizicka lica i prosjecna starost vozila koji su registrovali privatna lica?

tapply (reg$god.proizv,reg$vlasnistvo,  mean)
##                          FIZIÈKO LICE - BIH FIZIÈKO LICE - STRANO 
##                    NA              2004.343              2010.692 
##     PRAVNO LICE - BIH  PRAVNO LICE - STRANO 
##              2010.664              2013.071

Odgovor: U BiH BiH lica koja po privi put regustruju kola registruju starija kola od stranaca. Pravna lica- BiH u prosjeku su uvezli novija kola za sest godina od fizickih lica BiH, a pravna lica strano su uvoesliu prosjeku 2.5 godine mladja kola od fizickih lica stranaca.

7. Koja boja vozila je najzastupljenija kod privatnih a koja kod fizickih lica?

x <- table (reg$vlasnistvo, reg$boja)
prop.table(x,1)
##                        
##                                          BIJELA        CRNA      CRVENA
##                                                                        
##   FIZIÈKO LICE - BIH    0.000000000 0.077118313 0.200702850 0.059156579
##   FIZIÈKO LICE - STRANO 0.000000000 0.000000000 0.384615385 0.000000000
##   PRAVNO LICE - BIH     0.000000000 0.385672228 0.129538763 0.078508342
##   PRAVNO LICE - STRANO  0.000000000 0.285714286 0.071428571 0.000000000
##                        
##                         LILA/LJUBIÈASTA NARANDŽASTA       PLAVA
##                                                                
##   FIZIÈKO LICE - BIH        0.003123780 0.004685670 0.171417415
##   FIZIÈKO LICE - STRANO     0.000000000 0.000000000 0.076923077
##   PRAVNO LICE - BIH         0.001962709 0.026496565 0.065750736
##   PRAVNO LICE - STRANO      0.000000000 0.000000000 0.071428571
##                        
##                                SIVA       SMEÐA      ZELENA        ŽUTA
##                                                                        
##   FIZIÈKO LICE - BIH    0.428348301 0.010542757 0.032213979 0.012690355
##   FIZIÈKO LICE - STRANO 0.384615385 0.076923077 0.076923077 0.000000000
##   PRAVNO LICE - BIH     0.222767419 0.022571148 0.021589794 0.045142296
##   PRAVNO LICE - STRANO  0.500000000 0.071428571 0.000000000 0.000000000

Odgovor: I pravna i fizicka lica Uzimaju sivu. boju. Ipak posmatrano po tome da li su strana ili bih lica postoji razlike. Fizicka BIH uzimaju sivu (43%) od svih boja. fizicka strana uzimaju jednako i crnu i sivu (po 38%), pravna BiH najvise uzimaju bijelu (38.6%), a pravna strana uzimaju sivu (50%).

8. Koja marka automobila je najzastupljenija?

sort(table(reg$marka))  #pronaci po kolicini

odgovor: Volkswagen, a slijedeci je Mercedes benz. Posto imamo 6168 registracija a 1740 VF, mozemo reci da je svako 4 vozilo u 2015 prvi put registrovano VF.

Funkcije koje smo obradili:

  1. plot ()
  2. boxplot ()
  3. hist ()
  4. density ()
  5. table ()
  6. prop.table ()
  7. jitter ()
  8. sort ()
  9. tapply ()
    10.abline ()
    11.lm () 12.unlist ()
    13.filter ()

Napredni dio: ako stignemo:

Scatterplot

plot (jitter (reg$motor.zapremina,20), jitter (reg$motor.snaga,5), xlab="Zapremina motora", ylab= "Snaga motora", main = "Odnos snage i zapremine motora") 
abline(lm(reg$motor.snaga~reg$motor.zapremina)) #dodavanje linije linearnog modela

Basic Scatterplot Matrix

pairs(~god.proizv+motor.zapremina+motor.snaga,data=reg, main="Osnovna scatterplot matrica")

Dotchart

Ova vrsta grafika nam moze pomoci prilikom analiza jer nam prikazuje vise stvari istovremeno. Npr. u slucaju registrovanih kola u BiH zelimo da vimo kolika je prosjecna snaga motora kod odredjene vrste automobila. U tu svrhu koristimo dotchart.

Ako otovorimo bazu pod marka vidimo da nam je to faktor varijabla sa jednim nivoem. To nam ne zadovoljava analizu nama treba x osa da je numericka (snaga motora), a y tj. labels da su faktori sa vise nivoa.

Prvo cemo da dodamo novu varijablu gdje cemo ukljuciti top 15 marki, slicno kao sto smo uradili sa dizel i benzin. reg$marka1 [reg$MARKA.VOZILA=="VOLKSWAGEN"] <- "VW" i ovako za svih top 15 marki.

reg$marka1 [reg$marka=="VOLKSWAGEN"] <- "VW"
reg$marka1 [reg$marka=="BMW"] <- "BMW"
reg$marka1 [reg$marka=="ŠKODA"] <- "Skoda"
reg$marka1 [reg$marka=="FORD"] <- "Ford"
reg$marka1 [reg$marka=="FIAT"] <- "Fiat"
reg$marka1 [reg$marka=="MERCEDES-BENZ"] <- "Mercedes"
reg$marka1 [reg$marka=="PEUGEOT"] <- "Peugeot"
reg$marka1 [reg$marka=="AUDI"] <- "Audi"
reg$marka1 [reg$marka=="RENAULT"] <- "Renault"
reg$marka1 [reg$marka=="OPEL"] <- "Opel"
reg$marka1 [reg$marka=="CITROEN"] <- "Citroen"
reg$marka1 [reg$marka=="SEAT"] <- "Seat"
reg$marka1 [reg$marka=="TOYOTA"] <- "Toyota"
reg$marka1 [reg$marka=="LAND ROVER"] <- "Land Rover"
reg$marka1 [reg$marka=="NISSAN"] <- "Nissan"

Nakon ovoga posto zelimo da vidimo srednju vrijednost zapremine za svaku vrstu automobila onda koristimo funkciju tapply i sacuvamo rezultat pod dot. Ne zaboravimo da ukucamo na.rm=TRUE.

dot <- tapply(reg$motor.snaga, reg$marka1, mean, na.rm=TRUE) 
dot
##       Audi        BMW    Citroen       Fiat       Ford Land Rover 
##  108.51429  119.43498   72.58182   66.60563   72.87279   93.18519 
##   Mercedes     Nissan       Opel    Peugeot    Renault       Seat 
##  105.49220   93.08163   73.90435   72.86047   75.24033   71.07586 
##     Toyota         VW 
##   94.43860   78.92984

I onda pozovemo dotchart ().

dotchart(dot, cex = 0.7)
## Warning in dotchart(dot, cex = 0.7): 'x' is neither a vector nor a matrix:
## using as.numeric(x)
p=mean (reg$motor.snaga, na.rm = T) 
abline (v=as.numeric(p), col="red", lty=3)#v stoji za vertical

note R ne prepoznaje interpukcijske znake. Mozemo primjetiti da Skoda nije na dotcartu. Radi toga bitno je pri kreiranju baze ili prije importivanja izbjegavati interpunkcijske znake.

Barplot

broj <- sort (table(reg$marka1)) #da graf pravi slijed ukucamo sort. Ako nema sort onda nam je graf kao donji
barplot(broj)

counts <- table(reg$diz.benz, reg$marka1) 
barplot(counts, legend = rownames(counts),col = c( "darkgreen", "red"),cex.axis = 0.7, cex.names = 0.7, las=3) #las=3 znaci da zarotiramo nazive na x osi za 90 stepeni. las=0 je default, sto znaci da su verticalni. cex.names odnsoi se na font x ose. 

##stupci jedan uz drugi
counts <- table(reg$diz.benz, reg$marka1) 
barplot(counts, legend = rownames(counts),col = c( "darkgreen", "red"),cex.axis = 0.7, cex.names = 0.4, beside = T)

Grupisani boxplot

import kardio baze

kardio <- read.csv2("~/alma master/amra0705.csv")

library (rafalib)

mypar (1,2) #ovo ide uz library rafalib

group = floor (kardio$starost/10)*10 #odredimo donju granicu i napravimo grupu od deset godina

boxplot(kardio$trajanje~group, xlab="Starost bolesnika", ylab="Trajanje bolesti") 

group1 = floor (kardio$starost/5)*5  

boxplot(kardio$trajanje~group1) 

Stem:

stem(reg$motor.zapremina)
## 
##   The decimal point is 3 digit(s) to the right of the |
## 
##    0 | 00000000000000000000000000000000000000000000000000000000000000000000+51
##    1 | 00000000000000000000000000000000000000000000000000000000000000111111+3583
##    2 | 00000000000000000000000000000000000000000000000000000000000000000000+1827
##    3 | 00000000000000000000000000000000000000000000000000000000000000000000+137
##    4 | 00000000011122222222222222222224444445566666666788999
##    5 | 5889999
##    6 | 000444478899999999
##    7 | 11235
##    8 | 0
##    9 | 46
##   10 | 35555555555555555555
##   11 | 177799999999999999
##   12 | 00000000000000011444478888888999999999

Dodatno analize:

Ako zelimo da saznamo koji tip vozila je naprodavaniji, to cemo uraditi tako sto cemo izdvojiti golfove pa unutar golfove tip vozila.

najcesce <- filter(reg, marka=="VW")%>%select(tip) 

Dobijemo data.frame sa jednom varijablom. Sjetimo se da smo spomenuli da data.frame nije tidy ako imamo obzervacije za koje ne mozemo napraviti tabele. To se desava upravo sada. Varijabla $tip je factor sa jednim nivoem. Da bismo napravili od nje factor sa vise nivoa, tj. onoliko nivoa koliko ima VF tipa prvo cemo da je pretvorimo u character varijablu pa onda opet u factor.

najcesce$tip <- as.character(najcesce$tip)
najcesce$tip <- as.factor(najcesce$tip)

Kada ukucamo str (najcesce), vidmo da se radi o varijabli sa 57 factora. To je vec smislenije i sada mozemo i da dobijemo tabelu i da je sortiramo, kako bismo vidjeli najcesci tip.

sort(table(najcesce$tip))
## integer(0)

Ispalo je da je to 1J. Posto ja nisma strucnjak za automobile, na google search sam nasla da je to kolokvijalno kod nas golf cetvorka, tj. golf cetvrte generacije. Sad me intresuje koji su tipovi kola najcesce prvi put registrovani u 2015. Prvo cu da napravim tabelu

count<-table(reg$tip,reg$marka)

Ovo sada ima formu tabele a ja zelim da trasformiram u dataframe.

tip_marka <- as.data.frame(count)

Sortirajmo bazu:

sort_tip <-  tip_marka[order(-tip_marka$Freq, tip_marka$Var2), ]
dim(sort_tip)
## [1] 156927      3

Predstaviti u barplot

barplot(sort_tip$Freq[1:11], names.arg = c("VW_1J", "VW_1K", "VW_3BG", "VW3C", "Peugeot3", "Audi_8E", "VW_9N", "Mercedes203", "BMW_346L", "Ford_DNW", "Mercedes168"), las=3, cex.axis = 0.7,cex.names = 0.7,col = "darkred") #names.arg znaci da dodajemo imena u x osi, las=3 znaci da su imena uspravna, cex.axis i cex.names znace velicinu fonta. [1:11] znaci da uzimamo top 11 varijabli 

Napredni dio: upotreba dplyr paketa

library (dplyr)
d <- table (reg$marka, reg$tip)
d <- as.data.frame(d)
d<-d[2:156746,]
d <- filter (d, Freq>1) %>% arrange (desc(Freq))
marka3 <- group_by(d, Var1)
df<-summarise(marka3, freq = max(Freq)) %>% arrange(desc(freq))
head (df)
## # A tibble: 6 × 2
##            Var1  freq
##          <fctr> <int>
## 1    VOLKSWAGEN   491
## 2         ŠKODA   141
## 3       PEUGEOT   134
## 4          AUDI   118
## 5 MERCEDES-BENZ    91
## 6           BMW    77

Na kraju tabela pokazuje ne koliko je registrovane kola odredjene marke vec, unutar odredjene marke koji tip. Npr za volkswagen to znaci da je 491 bilo registrovano jednog tipa u ovom slucaju (jer smo prije provjerili) to je golf 4.