Uvod u R
Deklaracija promenljive
Operator dodele u R-u je <- (ali može da se koristi i =)
Numeričke vrednosti su podrazumevano tipa double (na primer 5/2 nije celobrojno deljenje već je jednako 2.5)
Elementarne funkcije: exp(), cos(), sin(), log(), …
Aritmetički operatori:+,-,*,/
Logički operatori: <=,>=, ==, !=, <,>, & , |, !
Vektori
U R-u postoji mnoštvo funkcija za rad sa vektorima tako da je poželjno podatke čuvati u vidu vektora (ili matrica).
Neki od načina zadavanja vektora:
for petlja
## [1] 1 4 9 16 25 36 49 64 81 100
if/else
## [1] "x je neparan"
Može i u jednom redu:
## [1] "x je neparan"
## [1] "x je neparan"
Aritmetičke operacije
## [1] 5 10 15 20 25
## [1] 4 6 8 10 12
## [1] -2 -2 -2 -2 -2
## [1] 0.3333333 0.5000000 0.6000000 0.6666667 0.7142857
Logičke operacije
## [1] FALSE FALSE FALSE FALSE FALSE
## [1] FALSE FALSE FALSE FALSE FALSE
## [1] TRUE TRUE TRUE TRUE TRUE
Ako hoćemo da poredimo cela dva vektora:
## [1] FALSE
## [1] TRUE
Ako dva vektora nisu iste dužine, vrednosti kraćeg vektora se ponavljaju ciklično dok se ne pogode iste dimenzije sa dužim vektorom.
## [1] 11 22 33 14 25 36 17 28 39
I funkcije u R-u su vektorske (primenjuje se na svaki član vektora).
## [1] 0.5403023 -0.4161468 -0.9899925 -0.6536436 0.2836622
## [1] 0.0000000 0.6931472 1.0986123 1.3862944 1.6094379
Vektori
Indeksiranje vektora počinje od jedinice!
## [1] 3
Možemo da izdvojimo i neke cele vektore.
## [1] 1 2
## [1] 3 4 5
## [1] 2 3 4
## [1] 2 1 3
## [1] 1 2 3 4
## [1] 1 2 3 4 5 6 7 9
Ako stavimo negativan predznak indeksu rezultat je originalni vektor umanjen za član na poziciji koja odgovara apsolutnoj vrednosti broja u zagradi.
## [1] 1 2 3 5 6 7 8 9
## [1] 1 2 3 4 6 8 9
## [1] 4 5 6 7 8 9
Novi vektor može se izdvojiti iz datog vektora uz pomoć vektora sa logičkim vrednostima koji je iste dužine kao originalni. Njegovi elementi su TRUE (ili T) ako odgovarajući element u originalnom vektoru treba da bude izdvojen, odnosno FALSE(ili F) u suprotnom.
## [1] "a" "c"
Možemo da dodelimo imena članovima vektora.
## Ime Prezime
## "Ivo" "Andric"
Zatim možemo da pristupimo elementima po imenu.
## Ime
## "Ivo"
Neke funkcije nad vektorima…
## [1] 10
i važne statistike
## [1] 385
## [1] 1
## [1] 100
## [1] 38.5
## [1] 1167.833
## [1] 34.17358
Sortiranje
## [1] 1 4 9 16 25 36 49 64 81 100
## [1] 100 81 64 49 36 25 16 9 4 1
Matrice
M <- matrix(
c(2, 4, 3, 1, 5, 7),
nrow=2,
ncol=3,
byrow = TRUE) # popunjavamo matrice po redovima (po default-u je po kolonama)
M[2,3] ## [1] 7
## [1] 1 5 7
## [1] 3 7
## [,1] [,2]
## [1,] 2 4
## [2,] 1 5
## [1] 9 13
## [1] 3.000000 4.333333
## [1] 3 9 10
Funkcije
Reč function je rezervisana za deklaraciju funkcije.
Izrazi u okviru vitičastih zagrada čine telo funkcije (zagrade su opcione ako telo sadrži samo jedan izraz).
Ako želimo da funkcija vrati neki rezultat:
Pozivanje funkcije
## [1] "2 na stepen 3 je 8"
## [1] 8
Ili..
## [1] "2 na stepen 3 je 8"
## [1] "2 na stepen 3 je 8"
Faktori
## [1] 0 0 1 0 1
## Levels: 0 1
## [1] muski muski zenski muski zenski
## Levels: muski zenski
## [1] "muski" "zenski"
## [1] 1 1 2 1 2
Dataframe
Dataframe je najčešći način čuvanja podataka u R-u i vrlo je pogodan za rad i analizu. Služi za prikaz tabelarnih podataka, pa liči na matricu, s tim što je dataframe u osnovi lista koja sadrži vektore jednakih dužina (kolone), pri čemu ti vektori ne moraju biti istog tipa. Dakle možemo imati jednu kolonu koju čine brojevi, a drugu tekstualni podaci.
Dataframe se pravi na sledeći način:
## kolona1 kolona2
## 1 1 prvi
## 2 2 drugi
## 3 3 treci
Vrednostima kolona možemo pristupati pomoću operatora $.
## [1] 1 2 3
Pomoću operatora $ možemo i dodavati nove kolone u dataframe.
## kolona1 kolona2 kolona3
## 1 1 prvi 7
## 2 2 drugi 8
## 3 3 treci 9
Elegantniji način filtriranja i odabira podskupova dataframe-a je korišćenjem uglastih zagrada. Koristimo notaciju df[redovi, kolone], gde prvim argumentom određujemo koje redove želimo da uzmemo, a drugim koje kolone. Prazno mesto za neki od argumenata znači “uzmi sve”.
## kolona1 kolona2 kolona3
## 1 1 prvi 7
## [1] 1 2 3
Redovi mogu biti ili vektori brojeva koji označavaju indekse redova koje da uzmemo, ili vektori TRUE/FALSE vrednosti iste dužine kao broj vrsta u dataframe-u, pri čemu se tada biraju redovi na pozicijama gde je u vektoru vrednost TRUE.
## kolona1 kolona2 kolona3
## 1 1 prvi 7
## 3 3 treci 9
Kolone mogu biti ili vektori brojeva koji označavaju koje kolone da uzmemo prema indeksu, ili vektori stringova, koji označavaju imena kolona koje da uzmemo.
## kolona1 kolona3
## 1 1 7
## 2 2 8
## 3 3 9
## kolona1 kolona3
## 1 1 7
## 2 2 8
## 3 3 9
## kolona1 kolona3
## 1 1 7
## 3 3 9
Korisna stvar je da ako koristimo vektore brojeva za indeksiranje, ukoliko stavimo znak - ispred, to znači da izuzimamo te redove/kolone.
## kolona2 kolona3
## 1 prvi 7
## 2 drugi 8
## 3 treci 9
## kolona1 kolona2 kolona3
## 1 1 prvi 7
## 3 3 treci 9
## kolona2 kolona3
## 3 treci 9
Učitavanje eksternih podataka
## clientid income age loan default
## 1 1 66155.93 59.01702 8106.5321 0
## 2 2 34415.15 48.11715 6564.7450 0
## 3 3 57317.17 63.10805 8020.9533 0
## 4 4 42709.53 45.75197 6103.6423 0
## 5 5 66952.69 18.58434 8770.0992 1
## 6 6 24904.06 57.47161 15.4986 0
## 7 7 48430.36 26.80913 5722.5820 0
## 8 8 24500.14 32.89755 2971.0033 1
## 9 9 40654.89 55.49685 4755.8253 0
## 10 10 25075.87 39.77638 1409.2304 0
Paketi
U R-u se nalazi veliki broj paketa sa korisnim funkcijama koje olakšavaju različite statističke procedure, ali i sadrže neke baze podataka koje nam mogu služiti za izučavanje tih procedure.
## Warning: package 'ISLR' was built under R version 4.0.5
## Year Lag1 Lag2 Lag3 Lag4 Lag5 Volume Today Direction
## 1 2001 0.381 -0.192 -2.624 -1.055 5.010 1.1913 0.959 Up
## 2 2001 0.959 0.381 -0.192 -2.624 -1.055 1.2965 1.032 Up
## 3 2001 1.032 0.959 0.381 -0.192 -2.624 1.4112 -0.623 Down
## 4 2001 -0.623 1.032 0.959 0.381 -0.192 1.2760 0.614 Up
## 5 2001 0.614 -0.623 1.032 0.959 0.381 1.2057 0.213 Up
## 6 2001 0.213 0.614 -0.623 1.032 0.959 1.3491 1.392 Up
## 7 2001 1.392 0.213 0.614 -0.623 1.032 1.4450 -0.403 Down
## 8 2001 -0.403 1.392 0.213 0.614 -0.623 1.4078 0.027 Up
## 9 2001 0.027 -0.403 1.392 0.213 0.614 1.1640 1.303 Up
## 10 2001 1.303 0.027 -0.403 1.392 0.213 1.2326 0.287 Up
Grafički prikaz podataka
Grafičke mogućnosti su važna i izuzetno raznovrsna komponenta okruženja programskog jezika R. Obezbeđene su funkcije za generisanje različitih statističkih grafika podataka, kao i okruženje za modifikovanje detalja na graficima.
Funkcija plot()
Ako su x i y vektori, plot(x, y) za rezultat ima tačkasti grafik (scatterplot) y-а u zavisnosti od x-а.
Pie chart
share = c(.2090,.1980,.1210,.0930,.3780)
names(share)<-("brand"=c("Samsung","Apple","Huawei","Xiaomi","Other"))
share## Samsung Apple Huawei Xiaomi Other
## 0.209 0.198 0.121 0.093 0.378
#install.packages("plotrix") (instaliranje biblioteke)
library(plotrix)
pie3D(share, explode = 0.2, main = "3D pitica", labels= names(share), labelcex = 1)Bar chart
Bar plotovi nam služe za grafički prikaz kategoričkih promenljivih. Na njima se prikazuje koliko postoji podataka u bazi iz odgovarajuće kategorije.
## Warning: package 'ggplot2' was built under R version 4.0.5
## Warning: package 'gapminder' was built under R version 4.0.5
# napravimo kratak spisak drzava koj cemo gledati
countries <- c("Bosnia and Herzegovina", "Croatia", "Montenegro", "Serbia", "Slovenia")
gapminder2007 <- gapminder[gapminder$year == 2007, ]
gapminder_small <- gapminder2007[gapminder2007$country %in% countries, ]
ggplot(gapminder_small, aes(x = country, y = pop)) +
geom_col(fill = "coral", color = "pink")Tabelarni prikaz
#The data was extracted from the 1974 Motor Trend US magazine, and comprises fuel consumption and 10 aspects of automobile design and performance for 32 automobiles (1973–74 models).
#Usage
#mtcars
#Format
#A data frame with 32 observations on 11 (numeric) variables.
#[, 1] mpg Miles/(US) gallon
#[, 2] cyl Number of cylinders
#[, 3] disp Displacement (cu.in.)
#[, 4] hp Gross horsepower
#[, 5] drat Rear axle ratio
#[, 6] wt Weight (1000 lbs)
#[, 7] qsec 1/4 mile time
#[, 8] vs Engine (0 = V-shaped, 1 = straight)
#[, 9] am Transmission (0 = automatic, 1 = manual)
#[,10] gear Number of forward gears
#[,11] carb Number of carburetors
mtcars## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
## Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
## Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
## Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
## Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
## Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
## Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
## AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
## Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
mtcars$cyl <- as.factor(mtcars$cyl)
mtcars$vs <- as.factor(mtcars$vs)
mtcars$am <- as.factor(mtcars$am)
mtcars$gear <- as.factor(mtcars$gear)
mtcars$carb <- as.factor(mtcars$carb)
table(mtcars$carb)##
## 1 2 3 4 6 8
## 7 10 3 10 1 1
##
## 0 1
## 19 13
##
## 4 6 8
## 0 3 4 12
## 1 8 3 2
##
## 4 6 8
## 1 5 2 0
## 2 6 0 4
## 3 0 0 3
## 4 0 4 6
## 6 0 1 0
## 8 0 0 1
Deskriptivne statistike
Statistike poretka
\[X_{(1)} \leq X_{(2)} \dots \leq X_{(n)} \] \[ X_{(1)}=min(X_1,..., X_n)\] \[X_{(n)}=max(X_1,..., X_n).\] Uzorački raspon
\[ R=X_{(n)}-X_{(1)}\] Uzoračka sredina
\[ \overline{X}_n=\frac{1}{n}\sum\limits_{i=1}^{n}X_i \] Uzoračka disperzija
\[\overline{S}_n^2=\frac{1}{n}\sum\limits_{i=1}^{n}(X_i-\overline{X}_n)^2 \] Popravljena uzoračka disperzija
\[\widetilde{S}_n^2=\frac{1}{n-1}\sum\limits_{i=1}^{n}(X_i-\overline{X}_n)^2 \]
Medijana
\[ \widehat{m}_e=\begin{cases} X_{(k+1)}& n=2k+1, \\ \frac{X_{(k)}+X_{(k+1)}}{2} & n=2k. \end{cases} \]
Histogram
Histogram je grafička reprezentacija raspodele niza datih numeričkih podataka. Koristi se za ocenu funkcije gustine raspodele.
Histogram se može dobiti na sledeći način:
- Dobijeni podaci se sortiraju.
- Odabere se dužina podeoka d.
- Podeli se ceo interval (raspon podataka) na podintervale duzine \(d\).
- Na x-osi se označe ti dobijeni intervali, a odgovarajuća vrednost na y-osi je broj elemenata iz uzorka koji su upali u taj interval.
U R-u postoji ugradjena funkcija “hist()”. Dva važna argumenta funkcije su: -x- vektor čiji histogram želimo da prikažemo -breaks - tu predajemo vektor sa krajevima svakog podintervala.
Kad pravimo histogram prvo treba da odaberemo koliko ćemo kategorija (odnosno tih podintervala) da imamo. Taj broj dobijamo po formuli: \[ k=[\log_2(N)]+1 \]
- \(k\)-broj kategorija
- \(N\)-obim uzorka (veličina tog vektora)
Odavde možemo naći širinu svakog intervala po formuli \[ d=\frac{R}{k} \]
gdje je R- raspon uzorka (razlika najvećeg i najmanjeg elementa uzorka)
Zadaci
- Tvrdi se da je prosečna minimalna cena bezolovnog benzina u Americi bila 1.35$. U reklamne svrhe kompanija želi da pokaže kako je njihova cena niža. Da bi potkrepili svoju tvrdnju, statističari iz firme su sakupili sledeće podatke na osnovu slučajnog uzorka:
cene<-c(1.22, 1.37, 1.27, 1.20, 1.42, 1.41, 1.22, 1.24,
1.28, 1.42, 1.48, 1.32, 1.40, 1.26, 1.39, 1.45,
1.44, 1.49, 1.47, 1.47, 1.24, 1.34, 1.27, 1.35,
1.34, 1.45, 1.49, 1.45, 1.23, 1.20, 1.42, 1.34,
1.43, 1.21, 1.49, 1.36, 1.24, 1.20, 1.45,
1.23, 1.25, 1.24, 1.35, 1.23, 1.39, 1.38,
1.46, 1.48, 1.26, 1.36, 1.22, 1.46, 1.39,
1.22, 1.29, 1.47, 1.24, 1.35, 1.21, 1.21)Napisati program u R-u koji računa uzoračku sredinu i medijanu, i iscrtava histogram nad zadatim podacima.
## [1] 1.340167
## [1] 1.35
# Pravimo histogram:
n <- length(cene)
k <- floor(log(n, base = 2)) + 1
d <- (max(cene)-min(cene)) / k # ili diff(range(cene))
k## [1] 6
## [1] 0.04833333
# Sortiramo vektor:
cene <- sort(cene)
# Pravimo podelu na intervale:
podela <- cene[1] + 0:k * d
podela## [1] 1.200000 1.248333 1.296667 1.345000 1.393333 1.441667 1.490000
hist(cene, breaks = podela, main = "")
# Hoćemo da uporedimo histogram koji se dobija ako ne zadamo sami podele:
par(mfrow = c(1, 2))
hist(cene, breaks = podela, main = "")
hist(cene, main = "")- Prilikom proučavanja rasta dece, posmatra se obim glave deteta pri rođenju izraženo u cm. Dobijeni su sledeći podaci:
obim<-c(33.1, 33.7, 33.7, 33.8, 33.4,
33.9, 33.6, 33.4, 34.1, 34.2,
34.5, 34.2, 34.6, 34.9, 34.8,
34.0, 34.5, 34.2, 34.2, 34.7,
34.7, 34.6, 34.3, 34.3, 34.2,
35.1, 36.0, 35.8, 35.2, 35.6,
36.1, 35.1, 35.3, 35.2)Napisati program u R-u koji iscrtava histogram nad zadatim podacima.
n <- length(obim)
k <- floor(log(n, 2)) + 1
d <- diff(range(obim)) / k
podela <- sort(obim)[1] + 0:k * d
hist(obim, breaks = podela, main = "")- Dati su sledeći rezultati ispita. Nacrtati histogram datih podataka i izračunati vrednosti
rezultati<-c(28, 27, 26, 25, 24, 23, 21, 21, 20, 19, 19, 18, 18, 18, 17, 17, 17, 17,
16, 16, 16, 15.5, 15, 15, 15, 15, 14, 13, 13, 13, 13, 12, 12, 11, 11,
11, 11, 11, 10, 10, 10, 9, 9, 8, 7, 6, 5, 4, 0, 0, 25, 23, 21, 21, 21,
21, 20, 19.5, 19, 19, 18, 18, 17, 17, 17, 17, 16, 15, 15, 15, 14, 14,
14, 13.5, 13, 13, 12, 12, 10, 10, 9, 9, 9, 9, 8, 7, 7, 7, 7, 5, 5, 5,
5, 4, 3, 2)k <- floor(log(length(rezultati) , 2)) + 1
d <- diff(range(rezultati)) / k
podela <- sort(rezultati)[1] + 0:k * d
hist(rezultati, breaks = podela, main = "Rezultati")# Na osnovu oblika histograma mozemo pretpostaviti da ovi rezultati imaju normalnu raspodelu.
# Podsetimo se iz prvog semestra da mozemo skalirati podatke da dobijemo histogram gustine, koji ima zbir povrsina pravougaonika 1. Na taj histogram mozemo dodati krivu gustine normalne raspodele simetricnu u odnosu na srednju vrednost ovog uzorka. (U nastavku kursa detaljnije cemo se baviti ocenjivanjem nepoznatih parametara.)
hist(rezultati, breaks = podela, main = "Rezultati", probability = TRUE, ylim = c(0,0.07))
curve(dnorm(x,mean = mean(rezultati), sd= sd(rezultati)),lwd =2, col ='coral1', add = T)## [1] 13.77604
## [1] 38.12563
## [1] 6.174596
## [1] 14
## 0% 25% 50% 75% 100%
## 0 9 14 18 28
Zadaci za rad na času
- Učitati bazu
Defaultiz paketaISLR.
- Tabelarno prikazati faktorske promenljive
defaultistudent. - Izdvojiti promenljivu
balancekoja prikazuje prosečan iznos koji korisniku ostaje na kreditnoj kartici nakon uplate i izračunati vrednosti dekriptivnih statistika. - Izdvojiti promenljivu
incomei nacrtati njen histogram. Sta možemo zaključiti o raspodeli podataka? Izračunati uzoračku srednju vrednost ove promenljive i njenu medijanu. Interpretirati dobijene rezultate.