1 Πίνακες συχνοτήτων από πρωτογενή δεδομένα

Από την σελίδα του Τομέα Μαθηματικών ΣΕΜΦΕ ΕΜΠ αντλήσαμε τις βαθμολογίες κάποιων φοιτητών του ΕΜΠ στο μάθημα Θεωρία Πιθανοτήτων και Στατιστική κατά την εξεταστική του Φεβρουαρίου του 2013. Τις περάσαμε σε ένα αρχείο Excel κι έχουμε διαθέσιμο το αρχείο bathmoi.xlsx. Αυτό το εισάγουμε στην R σύμφωνα με τις οδηγίες που έχουμε δει στην υποενότητα Αρχεία Excel (.xls, .xlsx) της Εισαγωγή αρχείων από άλλα προγράμματα, αφού πρώτα διαγράψαμε ό,τι είχαμε εισάγει μέχρι τώρα στην R:

rm(list = ls())
AM…1 BATHMOS…2 AM…3 BATHMOS…4 AM…5 BATHMOS…6 AM…7 BATHMOS…8 AM…9 BATHMOS…10 AM…11 BATHMOS…12
3094673 1 3108086 7 3110073 1 3110812 5 3111088 6 3111192 5
3098622 1 3108098 1 3110075 5 3111002 4 3111089 5 3111193 5
3100689 1 3108120 5 3110087 2 3111003 8 3111090 9 3111194 1
3102688 5 3108144 6 3110088 8 3111004 9 3111091 8 3111196 2
3103156 2 3108184 1 3110089 6 3111005 10 3111092 8 3111198 6
3103626 1 3108191 1 3110089 6 3111006 9 3111095 6 3111202 7
3103683 2 3108203 6 3110093 3 3111007 6 3111096 3 3111204 1
3103784 2 3108217 1 3110095 7 3111008 2 3111098 2 3111205 1
3104616 5 3108608 3 3110101 5 3111010 6 3111099 6 3111207 7
3104654 4 3108636 3 3110112 5 3111011 7 3111101 6 3111403 5
3104660 5 3108644 4 3110115 5 3111012 9 3111103 3 3111409 2
3104673 5 3108659 5 3110129 3 3111013 8 3111104 8 3111416 7
3104694 1 3108719 5 3110130 7 3111014 5 3111107 6 3111417 6
3104732 6 3108720 3 3110136 6 3111015 6 3111109 7 3111418 2
3104740 3 3108726 6 3110137 3 3111016 8 3111112 6 3111420 1
3104775 6 3108727 1 3110147 4 3111017 5 3111113 9 3111423 2
3105055 6 3108771 3 3110158 3 3111018 6 3111114 8 3111424 5
3105071 4 3108784 1 3110164 6 3111019 6 3111115 5 3111428 1
3105149 5 3108798 8 3110188 6 3111020 3 3111116 5 3111501 5
3105182 2 3109028 5 3110197 1 3111021 6 3111117 2 3111506 3
3105184 8 3109043 3 3110201 2 3111023 10 3111119 1 3111507 3
3105218 6 3109054 4 3110209 3 3111024 2 3111121 4 3111508 1
3105637 5 3109072 2 3110401 7 3111025 8 3111122 6 3111509 2
3105645 6 3109079 2 3110417 5 3111026 8 3111123 6 3111511 1
3105647 3 3109127 5 3110623 2 3111027 7 3111125 7 3111517 4
3105654 3 3109130 1 3110630 2 3111028 2 3111126 4 3111526 1
3105671 2 3109147 1 3110657 4 3111029 9 3111128 8 3111551 6
3105710 5 3109173 1 3110659 3 3111031 2 3111129 5 3111555 5
3105730 5 3109189 5 3110661 5 3111032 8 3111131 10 3111556 7
3105737 7 3109196 5 3110671 6 3111033 4 3111132 1 3111559 4
3105742 4 3109218 1 3110678 6 3111034 5 3111134 7 3111560 3
3105774 5 3109603 2 3110680 4 3111035 1 3111135 5 3111561 4
3105786 3 3109617 4 3110688 3 3111036 9 3111138 1 3111566 1
3106091 2 3109630 1 3110689 1 3111038 4 3111141 1 3111569 5
3106092 5 3109631 5 3110692 5 3111040 1 3111142 1 3111572 2
3106126 5 3109648 5 3110693 1 3111042 2 3111143 7 3111573 5
3106130 6 3109650 6 3110697 1 3111045 8 3111147 4 3111574 1
3106160 5 3109664 6 3110698 4 3111046 7 3111148 4 3111575 1
3106175 9 3109665 1 3110704 2 3111047 6 3111149 4 3111576 5
3106227 3 3109671 6 3110707 4 3111049 3 3111151 7 3111602 3
3106628 6 3109683 1 3110708 4 3111050 5 3111152 8 3111610 5
3106649 1 3109698 2 3110709 6 3111051 5 3111153 10 3111614 3
3106686 1 3109701 5 3110712 4 3111053 3 3111154 3 3111620 4
3106702 4 3109715 6 3110716 1 3111054 4 3111155 4 3111701 7
3106708 5 3109724 3 3110719 4 3111055 5 3111156 6 3111712 5
3106736 3 3109735 2 3110725 2 3111056 1 3111157 1 3111714 6
3106762 2 3109737 5 3110726 6 3111059 3 3111159 1 3111717 2
3106780 5 3109746 2 3110741 5 3111060 3 3111161 1 3111718 8
3106800 1 3109751 6 3110742 1 3111064 9 3111162 1 3111720 8
3106802 4 3109761 1 3110743 4 3111065 8 3111163 5 3111722 8
3107058 1 3109775 3 3110744 6 3111068 7 3111165 3 3111724 6
3107111 5 3109789 1 3110747 5 3111069 6 3111169 2 3111727 9
3107182 5 3109801 5 3110750 3 3111072 4 3111171 4 3111731 5
3107196 2 3110003 6 3110753 5 3111073 2 3111172 1 3111739 2
3107219 5 3110006 5 3110757 3 3111074 7 3111173 4 3111743 1
3107229 1 3110021 3 3110764 1 3111076 8 3111174 4 3111901 7
3107632 5 3110024 5 3110775 4 3111077 3 3111178 2 3111904 5
3107639 5 3110033 6 3110777 5 3111078 6 3111181 6 3111907 4
3107650 1 3110045 5 3110781 6 3111080 6 3111185 3 3112602 7
3107730 1 3110049 1 3110783 6 3111081 6 3111186 4 NA NA
3107754 5 3110057 5 3110787 4 3111082 3 3111187 3 NA NA
3107762 7 3110063 4 3110788 4 3111083 4 3111189 7 NA NA
3107779 5 3110069 1 3110795 6 3111084 5 3111190 2 NA NA
3107790 5 3110072 4 3110807 3 3111087 5 3111191 3 NA NA

Φυσικά, οι Αριθμοί Μητρώου (στήλες ΑΜ) δεν έχουν κανένα στατιστικό ενδιαφέρον, οπότε θα κρατήσουμε μόνο τους βαθμούς (στήλες BATHMOS) γράφοντας:

bathmoi_synolo <- c(bathmoi$BATHMOS...2,
                    bathmoi$BATHMOS...4,
                    bathmoi$BATHMOS...6,
                    bathmoi$BATHMOS...8,
                    bathmoi$BATHMOS...10,
                    bathmoi$BATHMOS...12)

Έτσι έχουμε μια λίστα με τις βαθμολογίες μας, ονόματι bathmoi_synolo. Το πλήθος τους μπορούμε να το βρούμε μέσω της συνάρτησης length(). Έτσι, εκτελώντας την εντολή:

length(bathmoi_synolo)
## [1] 384

διαπιστώνουμε ότι έχουμε 384 βαθμολογίες.

Βέβαια, αν το δούμε προσεκτικά τον πίνακα bathmoi, διαπιστώνουμε υπάρχουν κάποιες τιμές που δεν είναι βαθμολογίες. Είναι τα NA (Not Avaliable) που προέκυψαν επειδή οι δύο τελευταίες στήλες του αρχικού πίνακα είναι κοντύτερες από τις υπόλοιπες. Τα NA τα απορρίπτουμε από τη λίστα γράφοντας:

bathmoi_synolo <- na.omit(bathmoi_synolo)

Έτσι έχουμε τον πίνακα bathmoi_synolo χωρίς τα NA. Πάμε τώρα να υπολογίσουμε πάλι το πλήθος των καταγραφών μας:

length(bathmoi_synolo)
## [1] 379

Εδώ η απάντηση είναι 379 βαθμολογίες, όπερ σημαίνει πως απορρίφθηκαν από την αρχική λίστα bathmoi_synolo 5 NA.

Με μια πρόχειρη ανάγνωση του πίνακα βλέπουμε ότι κάποιοι βαθμοί (πχ το 1) είναι αρκετά συχνοί και κάποιοι άλλοι (πχ το 9) αρκετά σπάνιοι. Οδηγούμεστε, λοιπόν, στους κάτωθι ορισμούς.

απόλυτη συχνότητα σχετική συχνότητα
Η απόλυτη συχνότητα μιας τιμής μιας μεταβλητής είναι το πλήθος των εμφανίσεών της. Η σχετική συχνότητα μιας τιμής μιας μεταβλητής είναι το ποσοστό των εμφανίσεών της.

Πώς όμως μπορούν αυτές οι συχνότητες να υπολογιστούν μέσω της; Η δουλειά θα γίνει μέσω των συναρτήσεων table() και prop.table(). Γράφοντας:

ApolSyxnBathm <- table(bathmoi_synolo)
ApolSyxnBathm
## bathmoi_synolo
##  1  2  3  4  5  6  7  8  9 10 
## 62 39 43 43 77 56 24 21 10  4

έχουμε τον πίνακα απόλυτων συχνοτήτων των βαθμολογιών που καταγράψαμε. Παρατηρούμε ότι όντως ο βαθμός 1 έχει πολύ μεγάλη συχνότητα (62 φοιτητές έγραψαν μονάδα), ενώ ο 9 είναι αρκετά πιο σπάνιος (10 μόνο φοιτητές έγραψαν 9).

Για τον πίνακα σχετικών συχνοτήτων γράφουμε:

SxetSyxnBathm <- prop.table(ApolSyxnBathm)
SxetSyxnBathm
## bathmoi_synolo
##          1          2          3          4          5          6          7          8 
## 0.16358839 0.10290237 0.11345646 0.11345646 0.20316623 0.14775726 0.06332454 0.05540897 
##          9         10 
## 0.02638522 0.01055409

Παρατηρούμε ότι τα ποσοστά δίνονται με τη μορφή δεκαδικού αριθμού (η υποδιαστολή γράφεται ως τελεία). Έτσι διαπιστώνουμε ότι η σχετική συχνότητα του βαθμού 1 είναι περίπου 0.1636, άρα το 16,36% των φοιτητών έγραψε μονάδα. Από την άλλη, το άριστα (10) έχει σχετική συχνότητα περίπου 0.0106. Επομένως μόνο το 1,06% των εξεταζομένων έγραψαν άριστα.

Οι δυνατότητες της συνάρτησης table() δεν σταματάνε εδώ. Γράφοντας:

arista <- table(bathmoi_synolo>=8.5)
arista
## 
## FALSE  TRUE 
##   365    14

προκύπτει ένας πίνακας όπου μας λέει πόσοι έγραψαν άριστα (TRUE=14) και πόσοι όχι (FALSE=365).

Ενώ αν θέλουμε αυτούς που έγραψαν λίαν καλώς δεν έχουμε παρά να γράψουμε:

LianKalos <- table(bathmoi_synolo>=6.5 & bathmoi_synolo<8.5)
LianKalos
## 
## FALSE  TRUE 
##   334    45

οπότε βλέπουμε ότι 45 έγραψαν λίαν καλώς και 334 κάτι άλλο (ανώτερο ή κατώτερο).

Στην περίπτωση που θέλουμε να μεταχειριστούμε τον έναν ή τον άλλον πίνακα με όσα μάθαμε στις ενότητες Επιλογή στοιχείων πίνακα, Προσθήκη στοιχείων σε πίνακα και Αναδιαμόρφωση πίνακα, τότε χρησιμοποιούμε τη συνάρτηση as.data.frame.table(). Για παράδειγμα, αν θέλουμε ν’ ασχοληθούμε με τον πίνακα απόλυτων συχνοτήτων ApolSyxnBathm, τότε γράφουμε:

ASBdataframe <- as.data.frame.table(ApolSyxnBathm)
bathmoi_synolo Freq
1 62
2 39
3 43
4 43
5 77
6 56
7 24
8 21
9 10
10 4

κι έτσι έχουμε τον πίνακα στη μορφή που να μας βολεύει. Δεν είναι το ζήτημα εμφανισιακο. Απλώς έχουμε περισσότερες δυνατότητες πάνω του από προγραμματιστικής απόψεως στην R.

2 Από πίνακα απόλυτων συχνοτήτων σε σχετικών

Σε πολλές περιπτώσεις μπορεί να μην έχουμε πρόσβαση στα πρωτογενή δεδομένα, στις άμεσες μετρήσεις πάνω στο δείγμα μας. Μπορεί να έχουμε απλά έναν πίνακα συχνοτήτων, όπως τον ASBdataframe, χωρίς όμως να έχουμε πρόσβαση στα προηγούμενα στοιχεία που τον κατασκεύασαν. Πώς μπορούμε να έχουμε τότε τον πίνακα σχετικών συχνοτήτων;

Γράφοντας:

SxetSyxnBathm2 <- prop.table(ASBdataframe)

καταλήγουμε στο κάτωθι σφάλμα:

Error in FUN(X[[i]], ...) : 
  only defined on a data frame with all numeric-alike variables

διότι, πολύ απλά, η R δεν καταλαβαίνει ότι η στήλη Freq του ASBdataframe αναπαριστά συχνότητες. Απόλυτα λογικό εκ μέρους της. Θα μπορούσε η στήλη αυτή να είναι τα ύψη από κάποιους ανθρώπους ή οτιδήποτε άσχετο με συχνότητες.

Ως εκ τούτου το βάρος της δημιουργίας του πίνακα σχετικών συχνοτήτων πέφτει πάνω μας. Αλλά δεν πρόκειται για δύσκολο εγχείρημα. Η σχετική συχνότητα είναι η απόλυτη συχνότητα δια το συνολικό πλήθος των μετρήσεων. Έτσι υπολογίζουμε αρχικά το συνολικό πλήθος των μετρήσεων προσθέτοντας απλά όλες τις συχνότητες (βλ. Νέα λίστα και Κατασκευή λίστας ή πίνακα τιμών στην R):

athrisma <- sum(ASBdataframe$Freq)

και ακολούθως διαιρούμε κάθε στοιχείο της στήλης Freq με το athrisma και συγχρόνως επισυνάπτοντας την κατασκευασθείσα λίστα ως νέα στήλη ονόματι SxetSyxn σύμφωνα με αυτά που μάθαμε στην υποενότητα Προσθήκη στήλης της Προσθήκη στοιχείων σε πίνακα:

ASBdataframe$SxetSyxn <- (ASBdataframe$Freq)/athrisma

Οπότε γράφοντας:

View(ASBdataframe)

έχουμε έναν πίνακα απόλυτων και σχετικών συχνοτήτων.

bathmoi_synolo Freq SxetSyxn
1 62 0.1635884
2 39 0.1029024
3 43 0.1134565
4 43 0.1134565
5 77 0.2031662
6 56 0.1477573
7 24 0.0633245
8 21 0.0554090
9 10 0.0263852
10 4 0.0105541

Συνολικά ο κώδικά μας είναι ο κάτωθι:

rm(list = ls())
bathmoi_synolo <- c(bathmoi$BATHMOS...2,
                    bathmoi$BATHMOS...4,
                    bathmoi$BATHMOS...6,
                    bathmoi$BATHMOS...8,
                    bathmoi$BATHMOS...10,
                    bathmoi$BATHMOS...12)
length(bathmoi_synolo)
bathmoi_synolo <- na.omit(bathmoi_synolo)
length(bathmoi_synolo)
ApolSyxnBathm <- table(bathmoi_synolo)
ApolSyxnBathm
SxetSyxnBathm <- prop.table(ApolSyxnBathm)
SxetSyxnBathm
arista <- table(bathmoi_synolo>=8.5)
arista
LianKalos <- table(bathmoi_synolo>=6.5 & bathmoi_synolo<8.5)
LianKalos
ASBdataframe <- as.data.frame.table(ApolSyxnBathm)
athrisma <- sum(ASBdataframe$Freq)
ASBdataframe$SxetSyxn <- (ASBdataframe$Freq)/athrisma
View(ASBdataframe)