Laboratorio di Statistica e Analisi Dati: Lezione 1

Tommaso C. & Marco G.

26 - 28 Ottobre 2016

Laboratorio di Statistica

Mercoledì Venerdì
Orario 15:30 -17:30 15:30 -17:30
Aula 309 307

Le lezioni del venerdì sono una replica di quelle del mercoledì.

Argomenti del corso

  1. PRIMA PARTE:
    • Introduzione al linguaggio R
      • Strutture dati R: vettori, matrici, liste, data frame
      • Istruzioni di controllo del flusso
      • Funzioni e script
      • Operazioni di I/O
      • Grafica
  2. SECONDA PARTE:
    • esercitazioni di statistica e calcolo delle probabilità

Lo scopo è fornire un’introduzione a R e sfruttarlo come strumento per l’analisi dati.

Ambiente R

Ambiente R

Linguaggio interpretato:

Ottimo per l’elaborazione di dati statistici:

Ambiente R

Installare R:

Per avviare R:

Ambiente R

Uscire da R:

q()

Chiedere aiuto ad R

 help() # chiede l'help generale
 help(nomecomando) # chiede l'help del comando
 ?nomecomando # chiede l'help del comando
 help.start() # lancia l'help in un browser

Ambiente R

Ulteriori comandi base

 ls() # mostra il contenuto del workspace
 rm(i) # rimuove dal workspace la variabile i
 rm(list=ls()) # rimuove tutto (dati, funzioni) dal workspace
 save(a, b ,file="prova.rda") # salva le variabili a e b nel file  'prova.rda'
 load("prova.rda") # ricarica nel workspace i dati salvati in precedenza
 setwd(nome_directory) # sposta il controllo di R nella directory specificata
 getwd() # visualizza la directory corrente

Vettori

y <- c(5,7,8,NA,1,5,8)
y
## [1]  5  7  8 NA  1  5  8
y[3]
## [1] 8

Creazione vettori

c(1,4,5) # crea un vettore di interi
c("A","B","C") # crea un vettore di caratteri
c("gatto", "topo", "12") # crea un vettore di stringhe

La funzione c(arg1, arg2, arg3, …) concatena i suoi argomenti.

NB:

c("gatto", "topo",12) 
## [1] "gatto" "topo"  "12"

Cosa è successo al 12?

Assegnamenti

X <- c(1, 4, 5)
X
## [1] 1 4 5

La variabile X rappresenta ora il vettore <1 4 5>: si può pensare come un “contenitore” del vettore stesso. Un nuovo assegnamento cancella il contenuto precedente

X <- c(5,8,5)
X
## [1] 5 8 5
Y <- 100 # vettore formato da 1 solo elemento
Y
## [1] 100

Operazioni con vettori aritmetici

x <- c(1,5,8,3)
y <- c(4,5,6,3)
z <- x + y
z
## [1]  5 10 14  6
d<- x - y
d
## [1] -3  0  2  0
p <- x * y
p
## [1]  4 25 48  9
q <- y / x
q
## [1] 4.00 1.00 0.75 1.00

Esempi di funzioni applicate a vettori numerici

x
## [1] 1 5 8 3
max(x)
## [1] 8
min(x)
## [1] 1
range(x)
## [1] 1 8
sum(x)
## [1] 17
prod(x)
## [1] 120
sort(x) #ordina il vettore 
## [1] 1 3 5 8
order(x) # indici corrispondenti agli elementi ordinati
## [1] 1 4 2 3

NB sulla funzione sort:

x
## [1] 1 5 8 3
sort(x) #restituisce l'ordine ma x rimane invariato
## [1] 1 3 5 8
x<-sort(x) # restituisce l'ordine e lo assegna a x
x
## [1] 1 3 5 8

Generazione di sequenze regolari

c(1:10)
##  [1]  1  2  3  4  5  6  7  8  9 10
c (5:1)
## [1] 5 4 3 2 1
seq (1,10)
##  [1]  1  2  3  4  5  6  7  8  9 10
seq (from=1, to=4, by=0.5)
## [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0

La funzione seq() può avere 5 argomenti (si veda l’ help).

Generazione di sequenze regolari (cont.)

rep( c(1,2), times=4)
## [1] 1 2 1 2 1 2 1 2

Vettori ed operatori logici

Sono vettori i cui elementi possono assumere valore TRUE o FALSE

as.numeric(TRUE)
## [1] 1
as.numeric(FALSE)
## [1] 0

Vettori ed operatori logici (esempi)

x
## [1] 1 5 8 3
x > 5
## [1] FALSE FALSE  TRUE FALSE
x <= 5
## [1]  TRUE  TRUE FALSE  TRUE
x == 5
## [1] FALSE  TRUE FALSE FALSE
x != 5
## [1]  TRUE FALSE  TRUE  TRUE
x == c(5,6)  # vale la "regola del riciclo"!
## [1] FALSE FALSE FALSE FALSE

NB regola del riciclo

x
## [1] 1 5 8 3
length(x)
## [1] 4
length(c(5,6))
## [1] 2
x == c(5,6) # == (x == c(5,6,5,6))
## [1] FALSE FALSE FALSE FALSE
x == c(3,6,8) # == (x == c(3,6,8,3))
## Warning in x == c(3, 6, 8): longer object length is not a multiple of
## shorter object length
## [1] FALSE FALSE  TRUE  TRUE

Dati mancanti

x <- c(1:4, NA)
x + 2
## [1]  3  4  5  6 NA

Dati mancanti

Si noti che NA non è un valore ma un marcatore di una quantità non disponibile:

x
## [1]  1  2  3  4 NA
x == NA
## [1] NA NA NA NA NA
is.na(x)
## [1] FALSE FALSE FALSE FALSE  TRUE

Vettori: selezione e accesso a sottoinsiemi di elementi

Esistono diverse modalità di accesso a singoli elementi o a sottoinsiemi di elementi di un vettore. In generale la selezione e l’accesso avviene tramite l’operatore [] (parentesi quadre):

Esistono 4 diverse modalità di selezione/accesso:

  1. Vettori di indici interi positivi
  2. Vettore di indici interi negativi
  3. Vettore di indici logici
  4. Vettori di indici a caratteri

Selezione ed accesso tramite vettori di indici interi positivi

x <- 5:10
x[1] # selezione di un singolo elemento
## [1] 5
x[5]
## [1] 9
length(x) # numero elementi nel vettore
## [1] 6
x[7] # accesso fuori range
## [1] NA
x[2:4]
## [1] 6 7 8
x[c(1,3,5)]
## [1] 5 7 9

Selezione ed accesso tramite vettori di indici interi negativi

Sono selezionati gli elementi di un vettore x che devono essere esclusi tramite un vettore y di indici negativi racchiuso fra parentesi quadre: x[y]

y <- rep(c("G","A","T","T"), times=3)
y
##  [1] "G" "A" "T" "T" "G" "A" "T" "T" "G" "A" "T" "T"
z <- y[-(1:5)] # selezionati tutti gli elementi di y eccetto primi 5
z
## [1] "A" "T" "T" "G" "A" "T" "T"
z <- z[-length(z)] # cancellazione dell'ultimo elemento di z
z
## [1] "A" "T" "T" "G" "A" "T"

Selezione ed accesso tramite vettori indice logici (filtro)

x <- c(1:5,NA,NA)
x
## [1]  1  2  3  4  5 NA NA
i <- c(rep(TRUE,times=3),rep(FALSE,times=4))
i
## [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE
x[i]
## [1] 1 2 3
x[!is.na(x)] # selezione elementiche non sono NA
## [1] 1 2 3 4 5
x[!is.na(x) & x > 2]
## [1] 3 4 5

Selezione ed accesso tramite vettori indice logici (cont.)

x<- 0:10
x
##  [1]  0  1  2  3  4  5  6  7  8  9 10
x[ x < 2 | x > 6 ]
## [1]  0  1  7  8  9 10

“Scoppattiamo” questo esempio

minori<- x < 2 
minori
##  [1]  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
maggiori<- x > 6
maggiori
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE
x[ minori | maggiori]
## [1]  0  1  7  8  9 10

Selezione ed accesso tramite vettori di indici a caratteri

Applicabile quando è stato impostato l’attributo names del vettore

campione <- c(45, 180, 70, 2007, 3)
names(campione) <-c("Eta","Altezza","Peso","AnnoIns","Ricoveri")
campione
##      Eta  Altezza     Peso  AnnoIns Ricoveri 
##       45      180       70     2007        3
Eta.Anno <- campione[c("Eta","AnnoIns")]
Eta.Anno
##     Eta AnnoIns 
##      45    2007

Selezione ed accesso tramite vettori di indici a caratteri

Casi particolari delle funzione names

names(campione) <-c("Eta","Altezza","Peso","AnnoIns")
campione
##     Eta Altezza    Peso AnnoIns    <NA> 
##      45     180      70    2007       3
#il comando seguente non funziona
# names(campione) <-c("Eta","Altezza","Peso","AnnoIns", "Ricoveri", "Parite") 

Altri comandi utili

sample(1:6, 3)
## [1] 5 1 4
# sample(1:6, 7) errore!!!
# cerco di prendere un sample di 7 elementi partendo da un
# vettore di 6 elementi senza ripetizioni
sample(1:6, 7, replace=TRUE)
## [1] 2 6 1 3 2 6 5

Altri comandi utili (cont.)

x<- c (1.4,2.9, 6.453463,9.58761)
floor(x)
## [1] 1 2 6 9
ceiling(x)
## [1]  2  3  7 10
trunc(x)
## [1] 1 2 6 9
round(x, digits=3)
## [1] 1.400 2.900 6.453 9.588

N.B. floor vs trunc

x <- c(-3.2, -1.8, 2.3, 2.9)
floor(x)
## [1] -4 -2  2  2
trunc(x)
## [1] -3 -1  2  2

Altri comandi utili (cont.)

paste ("Gianni", "Pinotto", sep= " e ")
## [1] "Gianni e Pinotto"
y <- c ("Marco", " e ", "Pinotto")
z <- c ("Gianni", " e ","Pinotto")
setdiff(y,z)
## [1] "Marco"

E ora?

…. esercizi

Esercizio (1)

Inserire i seguenti valori numerici in tre distinti vettori:

Quindi:

  1. Calcolare minimo e massimo di ogni vettore
  2. Calcolare la somma degli elementi di ciascun vettore
  3. Calcolare la somma dei primi due vettori
  4. Calcolare la differenza dei il secondo e il terzo vettore
  5. Calcolare il prodotto degli elementi del secondo vettore
  6. Concatenare i tre vettori ed estrarre un campione casuale pari al 30% di tutti gli elementi

Esercizio (2)

I seguenti dati rappresentano il numero di giorni in cui ciascuno di 20 lavoratori si è assentato per malattia nelle ultime sei settimane:

2, 2, 0, 0, 5, 8, 3, 4, 1, 0, 0, 7, 1, 7, 1, 5, 4, 0, 4, 0

  1. Creare un vettore contenente i giorni di malattia e nel campo names i corrispondenti codici
  2. Selezionare il numero di giorni di malattia del lavoratore “Lav6”"
  3. Determinare quanti lavoratori hanno fatto 0 giorni di malattia e stamparne i codici
  4. Estrarre il sottovettore contenente i giorni di malattia di tutti i lavoratori eccetto “Lav2”" e “Lav11”
  5. Estrarre uno dei lavoratori con il minor numero di giorni di malattia
  6. Estrarre il lavoratore con il maggior numero di giorni di malattia