podatki <- read.table("./UE.csv",
header = TRUE,
sep = ";",
dec = ",")
head(podatki)
## ID Rezultat Pisanje
## 1 1 50 120
## 2 2 48 120
## 3 3 48 90
## 4 4 47 50
## 5 5 52 70
## 6 6 50 120
tail(podatki)
## ID Rezultat Pisanje
## 26 26 74 95
## 27 27 74 95
## 28 28 76 120
## 29 29 44 45
## 30 30 52 92
## 31 31 189 110
head(podatki, 10)
## ID Rezultat Pisanje
## 1 1 50 120
## 2 2 48 120
## 3 3 48 90
## 4 4 47 50
## 5 5 52 70
## 6 6 50 120
## 7 7 50 120
## 8 8 54 65
## 9 9 57 95
## 10 10 50 100
RAZLAGA: Z read.table ukazom preberemo csv datoteke. Zakaj je ./?
Z ukazom head omejimo število zapisaov, oziroma prikažemo samo prvih 6 vrstic. Če želimo prikazati samo zadnjih 6 vrstic uporabimo funkcijo tail (podatki). Če bi radi prikazali prvih 10 uporabimo funkcijo head in v oklepaj napisemo 10.
str(podatki[ , -1])
## 'data.frame': 31 obs. of 2 variables:
## $ Rezultat: int 50 48 48 47 52 50 50 54 57 50 ...
## $ Pisanje : int 120 120 90 50 70 120 120 65 95 100 ...
RAZLAGA: s funkcijo structure lahko preverimo kakšna je ta naša tabela s podatki. Gre za data.frame, kjer je 31 opazanovanj, 2 spremenljivki (rezultat in pisanje). Z minus ena odstranimo ID.
#install.packages("psych")
library(psych)
describe(podatki[ , -1])
## vars n mean sd median trimmed mad min max range skew kurtosis se
## Rezultat 1 31 66.23 28.84 60 63.24 17.79 20 189 169 2.32 8.00 5.18
## Pisanje 2 31 91.58 25.73 95 94.76 37.06 15 120 105 -0.92 0.61 4.62
RAZLAGA:Za ocenjevanje parametrov uporabimo funkcijo describe, ki se nahaja znotraj knjižnjice psych. Kaj je minimalno in maksimalno število doseženih točk? 20 in 189 (čudno ampak z namenom) Kaj nam podatki v tabeli povedo? Dosežen rezultat na UE in čas pisanja - kdaj je neka oseba oddala izpit.
#install.packages("pastecs")
library(pastecs)
round(stat.desc(podatki[ , -1]), 2)
## Rezultat Pisanje
## nbr.val 31.00 31.00
## nbr.null 0.00 0.00
## nbr.na 0.00 0.00
## min 20.00 15.00
## max 189.00 120.00
## range 169.00 105.00
## sum 2053.00 2839.00
## median 60.00 95.00
## mean 66.23 91.58
## SE.mean 5.18 4.62
## CI.mean.0.95 10.58 9.44
## var 831.91 662.05
## std.dev 28.84 25.73
## coef.var 0.44 0.28
RAZLAGA: Kakšna je mediana časa pisanja? Polovica študentov je pisalo do vključno 95 minut, preostala polovica pa dlje. Katera spremenljivka ima večjo variabilnost in zakaj? Rezultat. Gledamo coeficient variacije (večja kot je številka, večja je variabilnost) in ne standardnega odklona, ker je rezultat merjen v točkah, čas pisanja pa v minutah - zato rezutata standardnega odklona ne moremo primerjat.
summary(podatki[ , -1])
## Rezultat Pisanje
## Min. : 20.00 Min. : 15.00
## 1st Qu.: 50.00 1st Qu.: 77.50
## Median : 60.00 Median : 95.00
## Mean : 66.23 Mean : 91.58
## 3rd Qu.: 75.00 3rd Qu.:115.00
## Max. :189.00 Max. :120.00
sapply(podatki[ , -1], FUN = mean)
## Rezultat Pisanje
## 66.22581 91.58065
sapply(podatki[ , -1], FUN = sd)
## Rezultat Pisanje
## 28.84292 25.73036
RAZLAGA: S funkcijo sapply lahko za vse spremenljivke, ki jih imam v tabeli izračunam nek poljuben parameter, v tem primeru bomo za obe spremenljivki izračunali mean. Če bi radi izračunali sd namesto mean napisemo “sd”, -1 pa pomeni, da smo odstranili ID.
mean(podatki$Rezultat)
## [1] 66.22581
RAZLAGA: S tem ukazom ocenimo povprečje za konkretno spremenljivko, torej v tem primeru za rezultat.
#install.packages("modeest")
library(modeest)
## Registered S3 method overwritten by 'rmutil':
## method from
## plot.residuals psych
mlv(podatki$Rezultat)
## [1] 50
RAZLAGA: S pomočjo funkcije mlv lahko izračunamo modus, ampak moremo prvo to knjižnjico namestiti. Modus nam pove, da je najbolj pogosto število doseženih pik na izpitu 50 pik.
hist(podatki$Rezultat,
main = "Porazdelitev dosezenih tock na izpitu UE",
xlab = "Točke",
ylab = "Frekvenca",
col = "blue",
breaks = seq(from = 0, to = 200, by = 10))
RAZLAGA: S histogramom lahko naredmo neko začetno opisno/grafično
funkcijo.
Kako funkcija “hist” deluje? Prvo pomemo spremenljivko, ki jo rišemo, z ukazom main povemo naslov, z ukazoma xlab in ylab ime osi x in y in z “breaks” določimo širine teh stolpcev - ta ukaz preberemo tako:
seq (neka nova funkcija) = zaporedje od 0 do 200, z širino 10 (by 10)
Če želim preveriti še druge argumente s katerimi lahko dodajam ukaze v histogrem grem pod help in jih imam razložene - Na primer dodamo color.
pnorm(80, mean = 62.13, sd = 17.99,
lower.tail = FALSE)
## [1] 0.1602747
mean = 62.13; sd = 17.99
lb = 80; ub = Inf
x <- seq(-4,4,length=100)*sd + mean
hx <- dnorm(x,mean,sd)
plot(x, hx, type="n", xlab="Točke", ylab="",
main="", axes=FALSE)
i <- x >= lb & x <= ub
lines(x, hx)
polygon(c(lb,x[i],ub), c(0,hx[i],0), col="blue")
area <- pnorm(ub, mean, sd) - pnorm(lb, mean, sd)
result <- paste("P(",lb,"< Točke <",ub,") =",
signif(area, digits=3))
mtext(result,3)
axis(1, at=seq(0, 100, 20), pos=0)
ybar = mean(podatki$Rezultat); sd = sd(podatki$Rezultat); n = nrow(podatki)
se = sd/sqrt(n)
ybar_spodnja_z = ybar + qnorm(0.025)*se
ybar_zgornja_z = ybar + qnorm(0.975)*se
cat(c("95-odstotna intervalna ocena:", round(ybar_spodnja_z, 3), "< Mu <", round(ybar_zgornja_z, 3)))
## 95-odstotna intervalna ocena: 56.073 < Mu < 76.379
ybar = mean(podatki$Rezultat); sd = sd(podatki$Rezultat); n = nrow(podatki)
se=sd/sqrt(n)
ybar_spodnja_t = ybar + qt(0.025, df=n-1)*se
ybar_zgornja_t = ybar + qt(0.975, df=n-1)*se
cat(c("95-odstotna intervalna ocena:", round(ybar_spodnja_t, 3), "< Mu <", round(ybar_zgornja_t, 3)))
## 95-odstotna intervalna ocena: 55.646 < Mu < 76.805
boxplot(podatki[ , -1])
RAZLAGA: Prej smo videli, da je imel en študent dosegel 189 točk, kar je
nemogoče, saj toliko točk ni na razpolago. Torej gre za napako pri
vnosu. Kako to popravimo v tabeli?
Boxplot = grafikon kvantilov = škatla z brki iz katerega lahko razberemo, da je spodja meja minimum, zgornja črta je maksimum, spodnji del te škatle (kjer je 50 pik) je spodnji kvartil, kjer je približno 70 pik je zgornji kvantil, odebeljena črta pa je mediana (drugi kvartil). Razberemo lahko, da je mediana prisanja približno 100 minut. Krogci nam pa predstavljajo osamelce - torej ta oseba s 189 točkami. Kako zapišemo kodo s katero bomo to spremenili v tabeli - spreminjamo neko specifično vrednost. Ta vrednost se nahaja v 31 vrstici in 2 stolpcu.
podatki[31, 2] <- 89
boxplot(podatki[ , -1])
podatki <- read.table("./UE.csv",
header = TRUE,
sep = ";",
dec = ",")
head(podatki)
## ID Rezultat Pisanje
## 1 1 50 120
## 2 2 48 120
## 3 3 48 90
## 4 4 47 50
## 5 5 52 70
## 6 6 50 120
tail(podatki)
## ID Rezultat Pisanje
## 26 26 74 95
## 27 27 74 95
## 28 28 76 120
## 29 29 44 45
## 30 30 52 92
## 31 31 189 110
boxplot(podatki[ , -1])
library(psych)
describe(podatki[ , -1])
## vars n mean sd median trimmed mad min max range skew kurtosis se
## Rezultat 1 31 66.23 28.84 60 63.24 17.79 20 189 169 2.32 8.00 5.18
## Pisanje 2 31 91.58 25.73 95 94.76 37.06 15 120 105 -0.92 0.61 4.62
head(podatki[order(-podatki$Rezultat), ])
## ID Rezultat Pisanje
## 31 31 189 110
## 24 24 95 120
## 16 16 92 120
## 23 23 92 120
## 22 22 85 90
## 15 15 80 95
podatki_novi <- podatki[-31, ]
RAZLAGA ZGORNJEGA UKAZA: Odstranili smo zadnjega študenta v tabeli.
podatki[31, 2] <- 89
head(podatki[order(-podatki$Rezultat), ])
## ID Rezultat Pisanje
## 24 24 95 120
## 16 16 92 120
## 23 23 92 120
## 31 31 89 110
## 22 22 85 90
## 15 15 80 95
boxplot(podatki[ , -1])
library(psych)
describe(podatki[ , -1])
## vars n mean sd median trimmed mad min max range skew kurtosis se
## Rezultat 1 31 63.00 18.33 60 63.12 17.79 20 95 75 -0.07 -0.66 3.29
## Pisanje 2 31 91.58 25.73 95 94.76 37.06 15 120 105 -0.92 0.61 4.62
print(podatki)
## ID Rezultat Pisanje
## 1 1 50 120
## 2 2 48 120
## 3 3 48 90
## 4 4 47 50
## 5 5 52 70
## 6 6 50 120
## 7 7 50 120
## 8 8 54 65
## 9 9 57 95
## 10 10 50 100
## 11 11 60 70
## 12 12 68 85
## 13 13 72 95
## 14 14 72 89
## 15 15 80 95
## 16 16 92 120
## 17 17 55 68
## 18 18 32 100
## 19 19 20 15
## 20 20 65 70
## 21 21 80 110
## 22 22 85 90
## 23 23 92 120
## 24 24 95 120
## 25 25 70 85
## 26 26 74 95
## 27 27 74 95
## 28 28 76 120
## 29 29 44 45
## 30 30 52 92
## 31 31 89 110
Zgornje rezultate bi radi razvrstili od najboljšega do najslabšega študenta. Kako tabelo uredimo o padajočem ali naraščajočem vrstnem redu? Ker jih hočem razvrščat po vrsticah ukaz napišem pred vejico.
Prvo uredimo po padajočem vrestnem redu, tako:
print(podatki[order(podatki$Rezultat), ])
## ID Rezultat Pisanje
## 19 19 20 15
## 18 18 32 100
## 29 29 44 45
## 4 4 47 50
## 2 2 48 120
## 3 3 48 90
## 1 1 50 120
## 6 6 50 120
## 7 7 50 120
## 10 10 50 100
## 5 5 52 70
## 30 30 52 92
## 8 8 54 65
## 17 17 55 68
## 9 9 57 95
## 11 11 60 70
## 20 20 65 70
## 12 12 68 85
## 25 25 70 85
## 13 13 72 95
## 14 14 72 89
## 26 26 74 95
## 27 27 74 95
## 28 28 76 120
## 15 15 80 95
## 21 21 80 110
## 22 22 85 90
## 31 31 89 110
## 16 16 92 120
## 23 23 92 120
## 24 24 95 120
Kaj je potrebno, da imamo na vrhu študenta z največ točkami in potem dol - padajoče zaporednje? Spredaj dopišem minus.
print(podatki[order(-podatki$Rezultat), ])
## ID Rezultat Pisanje
## 24 24 95 120
## 16 16 92 120
## 23 23 92 120
## 31 31 89 110
## 22 22 85 90
## 15 15 80 95
## 21 21 80 110
## 28 28 76 120
## 26 26 74 95
## 27 27 74 95
## 13 13 72 95
## 14 14 72 89
## 25 25 70 85
## 12 12 68 85
## 20 20 65 70
## 11 11 60 70
## 9 9 57 95
## 17 17 55 68
## 8 8 54 65
## 5 5 52 70
## 30 30 52 92
## 1 1 50 120
## 6 6 50 120
## 7 7 50 120
## 10 10 50 100
## 2 2 48 120
## 3 3 48 90
## 4 4 47 50
## 29 29 44 45
## 18 18 32 100
## 19 19 20 15
Razvrsti je potrebno še po času pisanja. Od tistega, ki je najdlje pisal do tistega, ki je najmanj. Dodamo & in dodam še en ukaz.
print(podatki[order(-podatki$Rezultat, -podatki$Pisanje), ])
## ID Rezultat Pisanje
## 24 24 95 120
## 16 16 92 120
## 23 23 92 120
## 31 31 89 110
## 22 22 85 90
## 21 21 80 110
## 15 15 80 95
## 28 28 76 120
## 26 26 74 95
## 27 27 74 95
## 13 13 72 95
## 14 14 72 89
## 25 25 70 85
## 12 12 68 85
## 20 20 65 70
## 11 11 60 70
## 9 9 57 95
## 17 17 55 68
## 8 8 54 65
## 30 30 52 92
## 5 5 52 70
## 1 1 50 120
## 6 6 50 120
## 7 7 50 120
## 10 10 50 100
## 2 2 48 120
## 3 3 48 90
## 4 4 47 50
## 29 29 44 45
## 18 18 32 100
## 19 19 20 15