☺ 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
.
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] "DOPUTENA.NOSIVOST" "BOJA.VOZILA"
## [17] "BROJ.OSOVINA" "BROJ.POGONSKIH.OSOVINA"
## [19] "MJESTA.ZA.SJEDENJE" "MJESTA.ZA.STAJANJE"
## [21] "MJESTA.ZA.LEANJE" "VLASNITVO"
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.
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.
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
.
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.
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.
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.
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.
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 NARANDASTA 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%).
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.
plot ()
boxplot ()
hist ()
density ()
table ()
prop.table ()
jitter ()
sort ()
tapply ()
abline ()
lm ()
12.unlist ()
filter ()
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
pairs(~god.proizv+motor.zapremina+motor.snaga,data=reg, main="Osnovna scatterplot matrica")
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.
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)
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(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
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
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.