Sagedus- ja jaotustabel


kiirabi
  0   1
408  73
Sagedustabelit saab koostada käsuga table(..). Tunnusele kiirabi (kas tudeng on vajanud kiirabi abi viimase 2 aasta jooksul: 0-ei; 1-jah) saab näiteks sagedustabeli koostada nii:

table(kiirabi)

kiirabi        
   0    1  <NA>
 408   73   180
Vaikimisi ei lisata puuduvaid väärtuseid sagedustabelisse. Puuduvate väärtuste esinemiskordade arvu saab loodavasse tabelisse lisada lisaparameetri exclude=NULL abil. Soovi korral saab exclude-parameetri abil ka sagedustabelist eemaldada antud hetkel mittevajalikke väärtuseid.

table(kiirabi, exclude=NULL)

kiirabi
  0   1 Sum
408  73 481
Sagedustabelile (ka mitmemõõtmelistele sagedustabelitele) saab lisada ääresummasid addmargins-käsu abil

addmargins(table(kiirabi))

kiirabi                     0         1 0.8482328 0.1517672 Jaotustabel. Osakaalud leitakse sagedustabeli põhjal prop.table-käsu abil:

prop.table(table(kiirabi))

kiirabi  
   0    1
84.8 15.2
Jaotustabel. Osakaalud protsentides, ümmardatud täpsuseni 1 koht peale koma:

round(prop.table(table(kiirabi))*100,1)

 kiirabi arv osakaal
       0 408   84.8%
       1  73   15.2%
Kaunimalt vormistatud sagedus- ja osakaalude tabel

Protsendimärgi lisamiseks protsentuaalsetele osakaaludele kasutame paste-käsku, soovi korral vaata paste-käsu näiteid siit.

abi=table(kiirabi)
tabel=data.frame(abi,
   paste(round(prop.table(abi)*100,1),"%", sep=""))
colnames(tabel)[2:3]=c("arv", "osakaal")
print(tabel, row.names=F)

        naine mees
arv     512   149 
osakaal  77%   23%
Sagedused ja osakaalud tabeli ridades

Kuna tunnus sugu on algandmestikus kodeeritud: 1-naine; 2-mees; siis loome esmalt dekodeeritud kujul esitatud tunnuse suguF. Vaata lähemalt factor-käsu näiteid siit.

Seejärel seome sagedustabeli ja protsentuaalsete osakaalude tabeli rbind-käsu abil, kusjuures ümbritseme osakaalud eest suluga "(" ja tagantpoolt protsendimärgi ja suluga "%)". Tekstide ja arvude kokkusulatamiseks saab kasutada paste käsku, vaata näiteid siit.

suguF=factor(sugu, levels=c(1,2),
    labels=c("naine","mees"))
 
abi=table(suguF)
tabel=rbind(paste(abi," ", sep=""),
    paste(round(prop.table(abi)*100), "%", sep=""))
rownames(tabel)=c("arv", "osakaal")
colnames(tabel)=names(abi)
print(format(tabel, justify="right"), quote=F)

Sagedustabeli lisamine graafikule

Loome esmalt soovitud kuju- ja sisuga sagedustabeli; seejärel teeme meelepärase graafiku ja lõpuks lisame graafikule meile meelepärasesse kohta varem valmistehtud sagedustabeli.

Graafiku joonistamise ajal peame vajadusel jätma tühja lisaruumi, kuhu hiljem saaksime paigutada sagedustabeli. Lisaruumi saab graafikule jätta näiteks kasutades xlim= ja ylim= parameetreid, vaata ka siit.

abi=table(kiirabi)
tabel=data.frame(abi,
    paste("(", round(prop.table(abi)*100,1),"%)",
    sep=""))
colnames(tabel)[2:3]=c("arv", "osakaal")
print(tabel, row.names=F)

# Märka, kuidas xlim= parameetri abil
# tekitatakse graafikule tühja ruumi juurde!

a=barplot(abi, col=c("steelblue","skyblue"),
    xlim=c(0,4))

# Loeme sisse abifunktsiooni lisa
source()

# Lisame graafikule loodud sagedustabeli tabel,
# kohast x=1.6 paremale ja ülespoole y=270-st.
lisa(1.6, 270, tabel, adjx=1)


Leiame tabeli, kus oleks kirjas mitu korda mingit väärtust esines, vastava väärtuse protsentuaalne osakaal, 95%-usaldusintervall protsentuaalsele osakaalule ja ka väärtuste kumulatiivne osakaal (mis antud näites kasutatava tunnuse puhul küll kuigivõrd mõtekas pole. Kumulatiivset osakaalu tasub ehk näidata järjestustunnuste või diskreetsete tunnuste korral, nominaalsete tunnuste puhul - ja perekonnaseis on pigem nominaalne tunnus - pole tegelikult kumulatiivse osakaalu näitamine soovitatav).

Alljärgnevalt on toodud kolm erinevat, järjest keerukamat programmi sama eesmärgi täitmiseks.

  •  Sisukas tabel 
  •  Sisukas tabel ilusamini 
  •  Sisukas tabel perfektselt 
Sisukas tabel

 perekonnaseisF arv    osakaal  UIalumine  UIylemine Kum.Osakaal
      vallaline 579 87.5945537 84.8369500 90.0107673    87.59455
        abielus  17  2.5718608  1.5051818  4.0859405    90.16641
    vabaabielus  61  9.2284418  7.1325424 11.6964731    99.39486
      lahutatud   4  0.6051437  0.1651201  1.5421061   100.00000
           lesk   0  0.0000000  0.0000000  0.5565212   100.00000

Ülaltoodud tabeli tekitas alltoodud programm:

# Tekitame dekodeeritud väärtustega tunnuse
# Eesmärgiks pole mitte ainult parandada tabeli loetavust,
# vaid ka soov saada tabelisse read kõigi vastusevariantide kohta.
# Ilma selle käsuta jääks sagedustabelist välja leskede rida,
# sest valimisse juhuslikult ei sattunud ühtegi leske.
perekonnaseisF=factor(perekonnaseis, levels=1:5,
    c("vallaline", "abielus", "vabaabielus",
      "lahutatud", "lesk"))

# Leiame sagedus- ja jaotustabeli
a=table(perekonnaseisF)
b=prop.table(a)*100

# Arvutame 95%-usaldusintervallid kõigi
# väärtuste esinemisprotsentidele
UIalumine=rep(NA, length(a))
UIylemine=rep(NA, length(a))
for (i in 1:length(a)){
   UI=binom.test(a[i], sum(a))$conf.int*100
   UIalumine[i]=UI[1]
   UIylemine[i]=UI[2]
}


# Paneme ühte tabelisse kokku sagedustabeli, 
# jaotustabeli, leitud 95% usaldusintervalli ja lisame
# nalja pärast veel lõppu kumulatiivsete osakaalude tabeli
tabel=data.frame(
   a,
   osakaal=as.vector(b),
   UIalumine, UIylemine,
   Kum.Osakaal=cumsum(b)
)

# Muudame tekkiva tabeli teise rea pealkirja meelepärasemaks
colnames(tabel)[2]="arv"

# Trükime saadud tabeli välja (ilma reanimedeta) 
print(tabel, row.names=F)
Ümmardamine

 perekonnaseisF arv osakaal UIalumine UIylemine Kum.Osakaal
      vallaline 579    87.6      84.8      90.0        87.6
        abielus  17     2.6       1.5       4.1        90.2
    vabaabielus  61     9.2       7.1      11.7        99.4
      lahutatud   4     0.6       0.2       1.5       100.0
           lesk   0     0.0       0.0       0.6       100.0

Ülaltoodud tabeli tekitas alltoodud programm:

# Tekitame dekodeeritud väärtustega tunnuse
# Eesmärgiks pole mitte ainult parandada tabeli loetavust,
# vaid ka soov saada tabelisse read kõigi vastusevariantide kohta.
# Ilma selle käsuta jääks sagedustabelist välja leskede rida,
# sest valimisse juhuslikult ei sattunud ühtegi leske.
perekonnaseisF=factor(perekonnaseis, levels=1:5,
    c("vallaline", "abielus", "vabaabielus",
      "lahutatud", "lesk"))

# Leiame sagedus- ja jaotustabeli
a=table(perekonnaseisF)
b=prop.table(a)*100

# Arvutame 95%-usaldusintervallid kõigi
# väärtuste esinemisprotsentidele
UIalumine=rep(NA, length(a))
UIylemine=rep(NA, length(a))
for (i in 1:length(a)){
   UI=binom.test(a[i], sum(a))$conf.int*100
   UIalumine[i]=UI[1]
   UIylemine[i]=UI[2]
}


# Paneme ühte tabelisse kokku sagedustabeli, 
# jaotustabeli, leitud 95% usaldusintervalli ja lisame
# nalja pärast veel lõppu kumulatiivsete osakaalude tabeli
tabel=data.frame(
   a,
   osakaal=round(as.vector(b), 1),
   UIalumine=round(UIalumine,1),UIylemine=round(UIylemine,1),
   Kum.Osakaal=round(cumsum(b),1)
)


# Muudame tekkiva tabeli teise rea pealkirja meelepärasemaks
colnames(tabel)[2]="arv"

# Trükime saadud tabeli välja (ilma reanimedeta) 
print(tabel, row.names=F)
Hoolikalt vormindatud tabeli näide


  perekonnaseisF arv osakaal            UI95 kum.osak.
       vallaline 579   87,6% (84,8%...90,0%)     87,6%
         abielus  17    2,6%  (1,5%....4,1%)     90,2%
     vabaabielus  61    9,2%  (7,1%...11,7%)     99,4%
       lahutatud   4    0,6%  (0,2%....1,5%)    100,0%
            lesk   0    0,0%  (0,0%....0,6%)    100,0%

Sunnime R'i vormistama sagedustabeli eesti tavadele vastavalt - nii et komad oleksid ikkagi komad (2,3) mitte R-i poolt tavaliselt kasutatavad punktid (2.3)!

Programm on pigem mõeldud tarvitamiseks olukorras, kus on regulaarselt (näiteks igapäevaselt, peale uute vaatluste lisandumist) tarvis tekitada kena väljanägemisega tabeleid.

# Tekitame dekodeeritud väärtustega tunnuse
# Eesmärgiks pole mitte ainult parandada tabeli loetavust,
# vaid ka soov saada tabelisse read kõigi vastusevariantide kohta.
# Ilma selle käsuta jääks sagedustabelist välja leskede rida,
# sest valimisse juhuslikult ei sattunud ühtegi leske.
perekonnaseisF=factor(perekonnaseis, levels=1:5,
    c("vallaline", "abielus", "vabaabielus",
      "lahutatud", "lesk"))

# Leiame sagedus- ja jaotustabeli
a=table(perekonnaseisF)
b=prop.table(a)*100

# Arvutame 95%-usaldusintervallid kõigi
# väärtuste esinemisprotsentidele
UIalumine=rep(NA, length(a))
UIylemine=rep(NA, length(a))
for (i in 1:length(a)){
   UI=binom.test(a[i], sum(a))$conf.int*100
   UIalumine[i]=UI[1]
   UIylemine[i]=UI[2]
}

# Vormistusa algus:
# Vormindame protsendid täpsusega 1 koht peale koma,
# kasutame komakohtade eraldajana eestipärast koma:
UIylemineTXT=formatC(UIylemine, digits=1,
   drop0trailing=FALSE, format="f",
   decimal.mark=",", width=5)

# Asendame arvu ees tühja ruumi punktidega "."
UIylemineTXT=gsub(" ", ".", UIylemineTXT)

# Vormistame usaldusintervalli väärtused kujule (10,2%...19,4%)
UItxt=paste(
   "(",
   formatC(UIalumine, digits=1, drop0trailing=FALSE,
     format="f", decimal.mark=","),
   "%..",
   UIylemineTXT,
   "%)",
sep="")

# Paneme ühte tabelisse kokku sagedustabeli, eestipäraselt
# vormindatud jaotustabeli, leitud 95% usaldusintervalli ja lisame
# nalja pärast veel lõppu kumulatiivsete osakaalude tabeli
tabel=data.frame(
   a,
   osakaal=paste(formatC(b,digits=1, format="f",
     decimal.mark=",", drop0trailing=FALSE), "%",
     sep=""),
   UI95=UItxt,
   kum.osak.=paste(formatC(cumsum(b),digits=1,
     format="f", decimal.mark=",",
     drop0trailing=FALSE), "%", sep="")
)

colnames(tabel)[2]="arv"
print(tabel, row.names=F)