Uvoz podatkov

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.

Ocenjevanje parametrov

#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.

Normalna porazdelitev

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)

Intervalna ocena

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

Graf kvantilov

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])

Čiščenje podatkov

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