Manuale dei comandi R
Autore
18 giugno 2025
2
Indice
1 Nozioni di base 7
1.1 Assegnazione di variabili . . . . . . . . . . . . . . . . . . . . . 7
1.2 Nomi degli oggetti . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3 Funzioni sugli oggetti . . . . . . . . . . . . . . . . . . . . . . . 7
1.4 Comandi di base . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.5 Operatori aritmetici e esempi di funzioni . . . . . . . . . . . . 8
1.6 Operatori relazionali . . . . . . . . . . . . . . . . . . . . . . . 8
2 Tipi di dati e prime strutture 11
2.1 Visualizzare il tipo di dato - str() . . . . . . . . . . . . . . . . 11
2.2 Tipo: character . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3 Tipo: numeric . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.4 Tipo: integer . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.5 Tipo: logical . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.6 Verificare o convertire il tipo di oggetto . . . . . . . . . . . . . 12
2.7 Vettori - c() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.8 Creare una sequenza - seq() . . . . . . . . . . . . . . . . . . . 13
2.9 Copiare valori - rep() - paste() . . . . . . . . . . . . . . . . . . 14
2.10 Selezione di elementi ed operazioni . . . . . . . . . . . . . . . 14
2.11 Operazioni tra scalare e vettore . . . . . . . . . . . . . . . . . 15
2.12 Operatori logici: OR |, AND . . . . . . . . . . . . . . . . . . 15
2.13 Operatori logici: OR |, AND . . . . . . . . . . . . . . . . . . 15
2.14 Nomi - names() . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3 Strutture Principali 17
3.1 Matrici e array . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.1.1 Operazioni di algebra lineare . . . . . . . . . . . . . . 19
3.2 Liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.2.1 Valori Speciali in R . . . . . . . . . . . . . . . . . . . . 21
3.3 Fattori (Factors) . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.4 Data Frame in R . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.5 Importazione dati . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.5.1 Gestione della working directory . . . . . . . . . . . . 25
3
4 INDICE
3.5.2 Lettura file CSV e TXT . . . . . . . . . . . . . . . . . 25
3.5.3 Lettura file Excel (xlsx) . . . . . . . . . . . . . . . . . 26
3.6 Esplorazione e selezione dati . . . . . . . . . . . . . . . . . . . 26
3.7 Gestione valori mancanti . . . . . . . . . . . . . . . . . . . . . 28
3.8 Esportazione file . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.9 Funzioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.10 Strutture di controllo in R . . . . . . . . . . . . . . . . . . . . 30
3.10.1 If / Ifelse . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.10.2 While e Repeat . . . . . . . . . . . . . . . . . . . . . . 31
3.10.3 Cicli for . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.10.4 Modificatori: break e next . . . . . . . . . . . . . . . 33
3.10.5 Funzioni della famiglia apply . . . . . . . . . . . . . . 33
4 Distribuzioni di probabilità 37
4.1 Distribuzioni di probabilità discrete . . . . . . . . . . . . . . . 37
4.1.1 Distribuzione Binomiale . . . . . . . . . . . . . . . . . 37
4.2 Distribuzioni di probabilità continue . . . . . . . . . . . . . . 38
4.2.1 Distribuzione Normale . . . . . . . . . . . . . . . . . . 38
4.3 Generazione di numeri (pseudo) casuali . . . . . . . . . . . . . 38
4.3.1 Distribuzione Uniforme . . . . . . . . . . . . . . . . . 38
4.3.2 Distribuzione di Poisson . . . . . . . . . . . . . . . . . 38
4.3.3 Distribuzione Normale . . . . . . . . . . . . . . . . . . 39
5 Data Analysis - Grafici 41
5.1 Caricamento dati . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.2 Variabili Qualitative . . . . . . . . . . . . . . . . . . . . . . . 41
5.3 Variabili Quantitative . . . . . . . . . . . . . . . . . . . . . . 43
6 Medie, Quantili e Misure di Dispersione 45
6.1 Medie Analitiche . . . . . . . . . . . . . . . . . . . . . . . . . 45
6.2 Quantili e Indici di Posizione . . . . . . . . . . . . . . . . . . 47
6.3 Misure di Dispersione . . . . . . . . . . . . . . . . . . . . . . 48
6.4 Altre Misure di Dispersione . . . . . . . . . . . . . . . . . . . 49
6.5 Asimmetria . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.6 Curtosi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.7 Boxplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
7 I Dati 51
7.1 Concetti Fondamentali . . . . . . . . . . . . . . . . . . . . . . 51
7.1.1 Popolazione e Unità Statistiche . . . . . . . . . . . . . 51
7.1.2 Tipologie di Dati . . . . . . . . . . . . . . . . . . . . . 51
7.2 Analisi Esplorativa dei Dati (EDA) . . . . . . . . . . . . . . . 52
7.2.1 Caratteristiche Principali . . . . . . . . . . . . . . . . 52
7.2.2 Matrice dei Dati in R . . . . . . . . . . . . . . . . . . 52
INDICE 5
7.3 Tipologie di Variabili . . . . . . . . . . . . . . . . . . . . . . . 52
7.3.1 Variabili Qualitative . . . . . . . . . . . . . . . . . . . 52
7.3.2 Variabili Quantitative . . . . . . . . . . . . . . . . . . 52
8 Indici 55
8.1 Visualizzazione dei Dati . . . . . . . . . . . . . . . . . . . . . 55
8.1.1 Tabelle di Frequenza . . . . . . . . . . . . . . . . . . . 55
8.1.2 Grafici per Variabili Qualitative . . . . . . . . . . . . . 55
8.1.3 Grafici per Variabili Quantitative . . . . . . . . . . . . 56
8.2 Indici Statistici . . . . . . . . . . . . . . . . . . . . . . . . . . 56
8.2.1 Misure di Tendenza Centrale . . . . . . . . . . . . . . 56
8.2.2 Misure di Dispersione . . . . . . . . . . . . . . . . . . 56
8.2.3 Asimmetria e Curtosi . . . . . . . . . . . . . . . . . . 57
8.3 Rappresentazioni Avanzate . . . . . . . . . . . . . . . . . . . . 57
8.3.1 Funzione di Ripartizione Empirica . . . . . . . . . . . 57
8.3.2 Istogrammi e Densità . . . . . . . . . . . . . . . . . . 57
8.3.3 Confronto tra Distribuzioni . . . . . . . . . . . . . . . 58
8.4 Considerazioni Finali . . . . . . . . . . . . . . . . . . . . . . . 58
9 Trattamento Preliminare dei Dati 59
9.1 Dati Mancanti . . . . . . . . . . . . . . . . . . . . . . . . . . 59
9.1.1 Tipi di Dati Mancanti . . . . . . . . . . . . . . . . . . 59
9.1.2 Imputazione dei Dati Mancanti . . . . . . . . . . . . . 60
9.2 Valori Anomali (Outliers) . . . . . . . . . . . . . . . . . . . . 61
9.2.1 Identificazione Outliers . . . . . . . . . . . . . . . . . . 61
9.2.2 Gestione Outliers . . . . . . . . . . . . . . . . . . . . . 61
9.3 Trasformazione di Variabili . . . . . . . . . . . . . . . . . . . 62
9.3.1 Ricodifica Variabili Categoriali . . . . . . . . . . . . . 62
9.3.2 Trasformazione Variabili Quantitative . . . . . . . . . 62
9.4 Considerazioni Finali . . . . . . . . . . . . . . . . . . . . . . . 62
10 Analisi Statistica di Due Variabili (Bivariata) 63
10.1 Confrontare Distribuzioni . . . . . . . . . . . . . . . . . . . . 63
10.1.1 Confronto fra distribuzioni empiriche e teoriche . . . . 63
10.1.2 Confronto delle funzioni di densità . . . . . . . . . . . 63
10.1.3 Grafico Quantile-Quantile (QQ-Plot) . . . . . . . . . . 64
10.2 Strumenti Grafici per il Confronto tra Gruppi . . . . . . . . . 64
10.2.1 Boxplot affiancati . . . . . . . . . . . . . . . . . . . . . 64
10.2.2 Funzioni di ripartizione empiriche . . . . . . . . . . . . 64
10.2.3 Grafico Quantile-Quantile tra gruppi . . . . . . . . . . 65
10.3 Analisi di Due Variabili Categoriali . . . . . . . . . . . . . . . 65
10.3.1 Tabelle di contingenza . . . . . . . . . . . . . . . . . . 65
10.3.2 Odds Ratio . . . . . . . . . . . . . . . . . . . . . . . . 65
10.4 Analisi di Due Variabili Quantitative . . . . . . . . . . . . . . 66
6 INDICE
10.4.1 Diagramma di dispersione . . . . . . . . . . . . . . . . 66
10.4.2 Misure di relazione lineare . . . . . . . . . . . . . . . . 66
10.4.3 Regressione lineare semplice . . . . . . . . . . . . . . . 66
10.4.4 Lisciamento non parametrico . . . . . . . . . . . . . . 66
10.5 Considerazioni Finali . . . . . . . . . . . . . . . . . . . . . . . 67
11 Analisi Statistica Multivariata 69
11.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
11.2 Analisi di Variabili Categoriali . . . . . . . . . . . . . . . . . . 69
11.2.1 Tabule a più entrate . . . . . . . . . . . . . . . . . . . 69
11.2.2 Paradosso di Simpson . . . . . . . . . . . . . . . . . . 70
11.3 Analisi di Variabili Quantitative . . . . . . . . . . . . . . . . . 70
11.3.1 Matrici di correlazione . . . . . . . . . . . . . . . . . . 70
11.3.2 Correlazione parziale . . . . . . . . . . . . . . . . . . . 71
11.4 Regressione Lineare Multipla . . . . . . . . . . . . . . . . . . 71
11.4.1 Modello di base . . . . . . . . . . . . . . . . . . . . . . 71
11.4.2 Interazioni . . . . . . . . . . . . . . . . . . . . . . . . . 72
11.4.3 Selezione del modello . . . . . . . . . . . . . . . . . . . 72
11.5 Cluster Analysis . . . . . . . . . . . . . . . . . . . . . . . . . 73
11.5.1 Misure di dissomiglianza . . . . . . . . . . . . . . . . . 73
11.5.2 K-means . . . . . . . . . . . . . . . . . . . . . . . . . . 73
11.5.3 PAM (Partitioning Around Medoids) . . . . . . . . . . 74
11.5.4 Clustering Gerarchico . . . . . . . . . . . . . . . . . . 74
11.5.5 DBSCAN . . . . . . . . . . . . . . . . . . . . . . . . . 74
11.6 Considerazioni Finali . . . . . . . . . . . . . . . . . . . . . . . 75
Capitolo 1
Nozioni di base
R è orientato agli oggetti: possiamo creare entità denominate oggetti. Que-
sti possono essere di diverso tipo, come numeri, vettori, matrici, funzioni, o
strutture più complesse, come data frame o liste.
1.1 Assegnazione di variabili
Esempio:
1 # Assegnazione di un vettore usando <- o =
2 a <- 1
3 b = 1
1.2 Nomi degli oggetti
Ricorda: R fa distinzione tra maiuscole e minuscole
Esempio:
1 a .1 <- 1
Possono essere usati solo lettere e numeri. No spazi e simboli di punteg-
giatura, eccetto (’.’, ’_’). Ogni nome deve iniziare con una lettera alfabetica.
1.3 Funzioni sugli oggetti
Esempio:
1 ls () # stampa il nome degli oggetti presenti
nell ’ environment
2 rm ( a ) # rimuove l ’ oggetto a
7
8 CAPITOLO 1. NOZIONI DI BASE
3 rm ( list = ls () ) # rimuove tutti gli oggetti nell ’
environment
1.4 Comandi di base
Esempio:
1 # valutare un ’ espressione e assegnare il risultato in un
oggetto denominato
2 x <- 1+1
3 x # Stampare l ’ oggetto
4 # stampare oggetti di grandi dimensioni
5 p <- 1:2000
1.5 Operatori aritmetici e esempi di funzioni
Esempio:
1 1+2+3
2
3 2+3*4
4 2+(3*4)
5
6 3/2+1
7 1+3/2
8
9 2+3*4
10 (2 + 3) * 4
11
12 4*3^3
13
14 x <- sqrt (2) # radice quadrata
15
16 z <- exp ( x ) # funzione esponenziale
17 z
18
19 w <- log ( z ) + x # funzione logaritmica
20 w
1.6 Operatori relazionali
Esempio:
1.6. OPERATORI RELAZIONALI 9
1 # restituiscono un valore logico
2 TRUE
3 FALSE
4 x
5 x > 10
6 x <= 10
7 y <- x > 10 # assenga a y un valore logico
8 y
9 5!=5
10 CAPITOLO 1. NOZIONI DI BASE
Capitolo 2
Tipi di dati e prime strutture
Tipi di dati: character, numeric, integer, logical, complex.
Strutture: vector, factor, matrix, array, list, data frame
2.1 Visualizzare il tipo di dato - str()
Esempio:
1 b <- 1
2 str ( b )
3 # la funzione str mi permette di visualizzare che tipo di
dato b
2.2 Tipo: character
Esempio:
1 d <- " 1 "
2 e <- " 2 "
3 s <- " hello " str ( s )
4 str ( s ) # mi restituisce sempre un character
2.3 Tipo: numeric
Esempio:
1 # Qualsiasi numero reale ( floating point )
2 a <- 10
3 b <- 3 / 10
4 c <- ( a + b ) / b
11
12 CAPITOLO 2. TIPI DI DATI E PRIME STRUTTURE
5 c
6 str ( b ) # restituisce num
2.4 Tipo: integer
Esempio:
1 # Numero intero puro ( senza parte decimale e con suffisso
L)
2 var <- 2
3 var . int <- 2 L
4 str ( var ) # restituisce num
5 str ( var . int ) # restituisce integer
2.5 Tipo: logical
Esempio:
1 x <- TRUE
2 y <- FALSE
3
4 x+y
5 2* x
6 str ( x ) # restituisce logi
7
8 # fare operazioni aritmetiche su valori logici li rende
interi dove TRUE =1 e FALSE =0
9 str ( x + y ) # ritorna un intero di valore 1
2.6 Verificare o convertire il tipo di oggetto
Esempio:
1 # is . numeric / character / integer / logical ... restituisce un
valore Booleano
2 is . integer ( var )
3 is . integer ( var . int )
4 is . numeric ()
5
6
7 # as . numeric / character / integer / logical ... converte una
variabile nel tipo indicato
8 as . numeric ( s )
2.7. VETTORI - C() 13
9 as . integer ( b )
10 as . numeric ( FALSE )
11 as . character ( a )
12
13 b < - FALSE
14 str ( b ) # restituisce log
15 as . integer ( b ) # trasforma il valore in 0
2.7 Vettori - c()
Un vettore ammette solo elementi dello stesso tipo
Esempio:
1 db_v <- c (10 , 15 , 6.4 , 3 , 18) # definiamo il vettore
numeric db_v
2 db_v # stampiamo db_v
3 str ( db_v ) # verifichiamo la struttura
di db_v
4
5 int_v <- c (1 L , 6L , 10 L ) # definiamo il vettore integer
int_v
6 int_v
7 str ( int_v )
8
9 log_v <- c ( TRUE , FALSE , T , F ) # definiamo il vettore
logico log_v
10 log_v
11 str ( log_v )
12
13 ch_v <- c ( " A " , " B " , " C " ) # definiamo il vettore character
ch_v
14 ch_v
15 str ( ch_v )
16
17 is . logical ( log_v ) # restituisce TRUE
18 is . numeric ( log_v ) # restituisce FALSE
2.8 Creare una sequenza - seq()
Esempio:
1 v <- 1:10 # creo una sequenza da 1 a 10
2 v
3 # per creare sequenze piu specifiche si puo usare il
comando seq ()
14 CAPITOLO 2. TIPI DI DATI E PRIME STRUTTURE
4 seq ( from =1 , to =10) # creo una sequenza da 1 a 10
5 seq ( from =1 , to =10 , by =3) # by serve a specificare il passo
tra un elemento e il successivo
6 seq ( from =1 , to =10 , length =5) # lenght serve a specificare
quanti elementi voglio nella sequenza
2.9 Copiare valori - rep() - paste()
Esempio:
1 # la funzione rep serve per ripetere piu volte un elemento
2 rep (1 ,15) # un vettore di lunghezza 15 con tutti gli
elementi uguali a 1
3
4 a <- c ( rep (2 ,3) ,4 ,5 , rep (1 ,5) ,11:15) # (2 2 2 4 5 1 1 1 1
1 11 12 13 14 15)
5
6 rep ( c ( " a " ," b " ) , 5) # ( a b a b a b a b a b )
7 rep ( c ( " a " ," b " ) , each = 5) # con il comando each indico
quante volte voglio ripetere separatamente i singoli
valori ( a a a a a b b b b b )
8 rep ( c (a , " b " ) , 2) # il vettore e convertito in
character
9 rep ( c (a , " b " ) , each =2)
10
11 # La funzione paste () serve per concatenare stringhe di
testo
12 paste ( " file " , 1:5 , " . txt " , sep = " " )
13 paste ( " file " , 1 , " . txt " , sep = " " )
2.10 Selezione di elementi ed operazioni
Esempio:
1 # selezione di elementi ( la prima posizione ha indice 1)
2 y <- a [6]
3 y
4 z <- a [2:4]
5 z
6 w <- a [ c (2 , 5) ] # estrarre l ’ elemento 2 e 5
7 w
8
9 x <- c (1 , 2 , 4 , 8 , 16 , 32)
10 x
11 x [ -4] # !! non assegnato ad un oggetto
2.11. OPERAZIONI TRA SCALARE E VETTORE 15
12 x
2.11 Operazioni tra scalare e vettore
Esempio:
1 x <- 1:10
2 x *2
3 x > 5 # confronta ogni elemento del vettore con 5 e
restituisce tanti valori logici quanti gli elementi
del vettore
2.12 Operatori logici: OR |, AND
Esempio:
1 # selezioniamo gli elementi maggiori o
2 # uguali a 7 o minori di 5
3 x
4 x >= 7
5 x < 5
6 x >= 7 | x < 5
7 x [ c ( x >= 7 | x < 5) ]
2.13 Operatori logici: OR |, AND
Esempio:
1 x <- c ( FALSE , FALSE , TRUE )
2
3 sum ( x ) # somma i valori logici ( TRUE =1 , FALSE =0)
4 mean ( x ) # calcola la media dei valori logici (
proporzione di TRUE )
5 length ( x ) # restituisce la lunghezza del vettore ( numero
di elementi )
6 sort ( x ) # ordina il vettore in ordine crescente
7 order ( x ) # restituisce gli indici di ordinamento per
mettere il vettore in ordine crescente
8 max ( x ) # restituisce il valore massimo ( TRUE se
presente )
9 min ( x ) # restituisce il valore minimo ( FALSE se
presente )
10 range ( x ) # restituisce un vettore con minimo e massimo
16 CAPITOLO 2. TIPI DI DATI E PRIME STRUTTURE
11 prod ( x ) # restituisce il prodotto dei valori logici (
TRUE =1 , FALSE =0 se c almeno un FALSE ,
restituisce 0)
2.14 Nomi - names()
Esempio:
1 # primo modo
2 x <- c ( a = 1 , b = 2 , c = 3) # Crea un vettore con tre
elementi numerici e assegna i nomi ’a ’ , ’b ’ , ’c ’
3 x # Visualizza il contenuto
del vettore ( mostra sia valori che nomi )
4
5 # secondo modo
6 x <- 1:3
7 names ( x ) # Visualizza i nomi
associati al vettore x ( s a r NULL in questo momento )
8
9 names ( x ) <- c ( " a1 " ," b1 " ," c1 " ) # Assegna i nomi " a1 " , " b1
" , " c1 " ai tre elementi di x
10 x # Visualizza il contenuto
del vettore aggiornato con i nuovi nomi
11
12 x
Capitolo 3
Strutture Principali
3.1 Matrici e array
1 # Creazione di una matrice specificando il numero di
righe
2 x <- matrix ( c (2 ,3 ,5 ,7 ,11 ,13) , nrow =3)
3 x
4
5 # Creazione di una matrice specificando il numero di
colonne
6 x <- matrix ( c (2 ,3 ,5 ,7 ,11 ,13) , ncol =3)
7 x
8
9 # Specifica che i dati siano inseriti riga per riga (
byrow = TRUE )
10 mx <- matrix (x , ncol =3 , byrow = TRUE )
11 mx
12
13 # Numero di righe della matrice
14 nrow ( mx )
15
16 # Numero di colonne della matrice
17 ncol ( mx )
18
19 # Dimensione della matrice ( vettore : n righe , n
colonne )
20 dim ( mx )
21 dim ( mx ) [1] # Estrae solo il numero di righe
22
23 # Assegnazione di nomi a righe e colonne
24 rownames ( mx ) <- c ( " A " , " B " )
25 colnames ( mx ) <- c ( " a " , " b " , " c " )
26
27 # Selezione di una riga intera
17
18 CAPITOLO 3. STRUTTURE PRINCIPALI
28 x [1 ,]
29
30 # Selezione di una colonna intera
31 x [ ,2]
32
33 # Rimozione di una colonna ( es . la seconda )
34 x [ , -2]
35
36 # Selezione di piu colonne specifiche
37 x [ , c (1 ,3) ]
38 x [ ,1:2]
39
40 # Selezione elemento : [ riga , colonna ]
41 mx [2 ,1]
42 mx [2 ,2]
43
44 # Selezione di un ’ intera riga
45 mx [2 , ]
46 mx [ " B " , ]
47
48 # Selezione di un ’ intera colonna usando il nome
49 mx [ ,3] # uguale a :
50 mx [ ," c " ]
51
52 # Selezione di piu colonne usando i nomi
53 mx [ , c ( " a " , " b " ) ]
54
55 # Creazione di una matrice piu grande
56 x <- matrix (1:16 , ncol =4)
57 x
58
59 # Selezione di due righe e tre colonne usando sequenze e
vettori per indicare la dimensione
60 y <- x [ c (1 ,4) ,2:4]
61 y
62 # Array : le matrici sono array con due dimensioni ,
63 # # ma possono avere anche p i di due dimensioni
64
65 # Creazione di un array tridimensionale (5 righe , 2
colonne , 2 strati )
66 x <- 1:20
67 a . x <- array (x , dim = c (5 ,2 ,2) )
68 a.x
69
70 # Dimensioni dell ’ array
71 dim ( a . x )
72
73 # Selezione di elemento su piu dimensioni
74 a . x [3 ,2 ,1] # Riga 3 , colonna 2 , strato 1
3.1. MATRICI E ARRAY 19
75 a . x [ ,2 , ] # Tutte le righe , colonna 2 , tutti gli strati
76 a . x [ -1 , ,1] # Tutte tranne la riga 1 , tutte colonne ,
strato 1
77
78
79 # # Una matrice un array ( array una struttura p i
generale che p u avere p i dimensioni )
80 a <- matrix (1:6 , ncol = 3 , nrow = 2) # Creo una matrice
2 x3 con valori da 1 a 6
81
82 is . matrix ( a ) # Controlla se ’a ’ una matrice ; ritorna
TRUE
83 is . array ( a ) # Controlla se ’a ’ un array ; ritorna
TRUE p e r c h una matrice un array 2 D
84
85 # # ’b ’ un vettore , estratto da una colonna di ’a ’ ,
quindi NON pi una matrice
86 b <- a [ ,2] # Prendo la seconda colonna di ’a ’ (
vettore di lunghezza 2)
87
88 str ( b ) # Mostra la struttura di ’b ’ ( si vede che
un vettore di interi )
89 is . vector ( b ) # Controlla se ’b ’ un vettore ; ritorna
TRUE
90 is . matrix ( b ) # Controlla se ’b ’ una matrice ; ritorna
FALSE
91 dim ( b ) # Dimensioni di ’b ’; NULL p e r c h un
vettore , non una matrice
92
93 # Converte il vettore ’b ’ in una matrice ( colonna )
94 as . matrix ( b ) # Trasforma ’b ’ in matrice 2 x1 , quindi ora
’dim ’ s a r (2 ,1)
3.1.1 Operazioni di algebra lineare
1 # Moltiplicazione scalare di un vettore
2 y <- c (1.2 , 3 , 0.4 , 10)
3 2* y
4
5 # Prodotto scalare ( somma dei prodotti degli elementi
corrispondenti )
6 crossprod ( c (1 ,2 ,3) , c (0 ,12 ,13) )
7
8 # Prodotto riga per colonna ( risultato matrice 1 x1 )
9 m <- c (1 ,2 ,3) %*% c (0 ,12 ,13)
10 m
11 is . matrix ( m ) # Verifica che sia una matrice
20 CAPITOLO 3. STRUTTURE PRINCIPALI
12
13 # Creazione di due matrici 2 x2
14 a <- matrix ( c (1 ,2 ,3 ,4) , ncol = 2 , byrow = TRUE )
15 b <- matrix ( c (1 , -1 ,0 ,1) , ncol = 2 , byrow = TRUE )
16 a; b
17
18 # Prodotto elemento per elemento
19 a*b
20
21 # Prodotto matriciale
22 a %*% b
23
24 # Prodotto t ( a ) %*% b
25 crossprod (a , b )
26
27 # Prodotto a %*% t ( b )
28 tcrossprod (a , b )
29
30 # Inversa di una matrice
31 a <- matrix ( c (1 ,1 , -1 ,1) , nrow =2 , ncol =2)
32 solve ( a ) # calcola essattamente l ’ inversa di una matrice
quadrata
33
34 # Soluzione del sistema lineare Ax = b
35 b <- c (2 ,4)
36 solve (a , b )
37
38 # Estrazione della diagonale di una matrice
39 diag ( a )
40
41 # Creazione di una matrice diagonale a partire da un
vettore
42 diag ( b )
43
44 # Creazione di una matrice i d e n t i t 3 x3
45 diag (3) # matrice i d e n t i t di una matrice 3 x3
3.2 Liste
Sono collezioni di oggetti anche di tipo differente
1 # Creazione di una lista vuota di lunghezza 3
2 x <- vector ( " list " , length = 3)
3 # Oppure
4 x <- list ()
5 x
6
3.2. LISTE 21
7 # Creazione di oggetti diversi
8 x1 <- 1:3
9 x2 <- c ( " A " , " B " , " C " , " D " , " E " )
10 x3 <- matrix (1:12 , nrow =3)
11 # Creazione di una lista con 3 elementi di tipo diverso
12 mylist <- list ( x1 , x2 , x3 )
13 str ( mylist ) # Mostra la struttura della lista
14
15 # Accesso al primo elemento della lista
16 mylist [[1]]
17
18 # Accesso al terzo elemento del secondo elemento della
lista
19 mylist [[2]][3]
20
21 # Accesso alla matrice nel terzo elemento della lista
22 mylist [[3]]
23
24 # Accesso al valore in riga 1 , colonna 1 della matrice
25 mylist [[3]][1 ,1]
26
27 # Assegnare il primo elemento di mylist a l1
28 l1 <- mylist [[1]]
29 l1
30 l1 [2] # Secondo valore di l1
31
32 # Aggiungere un elemento alla lista x
33 x [[1]] <- x1
34 x [[4]] <- " questo il quarto elemento della lista x "
35
36 # Creazione di una lista nominata
37 mylist2 <- list ( comp1 = x1 , comp2 = x2 , comp3 = x3 )
38 mylist2$comp1 # Accesso tramite nome
39 mylist2$comp2 [3]
40
41 # Unione di due liste
42 newlist <- c ( mylist , mylist2 )
43 is . list ( newlist ) # Verifica che sia una lista
44 str ( newlist ) # Mostra struttura
45
46 # Assegnazione dei nomi agli elementi della lista
47 names ( mylist ) <- c ( " A " , " B " , " C " )
48 names ( mylist2 ) # Mostra i nomi
3.2.1 Valori Speciali in R
In R esistono valori speciali come NULL, TRUE (abbreviato T), FALSE (abbre-
viato F), NaN (Not a Number), NA (Not Available), e Inf (infinito).
22 CAPITOLO 3. STRUTTURE PRINCIPALI
1 0/0 # Calcolo indefinito : divisione zero per zero
-> NaN
2 a <- -1/0 # divisione di un numero negativo per zero ->
- Inf
3 a # mostra - Inf
4 a - a # operazione non definita tra Inf e Inf ->
NaN
5 as . numeric ( " a " ) # conversione fallita : restituisce NA
con warning
3.3 Fattori (Factors)
I factors sono vettori usati per rappresentare variabili categoriali, cioè dati
suddivisi in gruppi chiamati livelli.
1 country <- c ( " Italy " ," Germany " ," France " ," Germany " ,"
Germany " ," Germany " ,
2 " France " ," Italy " ," Italy " ," France " ) #
vettore di paesi
3
4 str ( country ) # struttura : vettore di caratteri
5
6 countryf <- factor ( country ) # conversione in factor (
variabile categoriale )
7 str ( countryf ) # factor con 3 livelli :
France , Germany , Italy
8 is . factor ( countryf ) # TRUE , conferma che un
factor
9
10 as . factor ( country ) # altro modo per creare un
factor
11
12 levels ( countryf ) # mostra i livelli del factor
13
14 cbind ( country , countryf ) # confronto tra vettore
originale e factor
15
16 # Cambiare il livello di riferimento con relevel
17 ? relevel
18 a <- relevel ( countryf , " Italy " ) # imposta " Italy " come
livello base
19 a # mostra il nuovo factor
20
21 # Definire l ordine dei livelli
22 factor ( country , levels = c ( " Italy " , " Germany " , " France " ) )
23
3.4. DATA FRAME IN R 23
24 # Modificare manualmente i nomi dei livelli
25 countryf2 <- countryf
26 levels ( countryf ) # livelli originali
27 levels ( countryf2 ) <- c ( " Italy " , " Germany " , " France " ) #
rinomina livelli
28 cbind ( countryf , countryf2 ) # confronto
29 cbind . data . frame ( countryf , countryf2 ) # tabella dati
30
31 # ordered () crea factor ordinati ( con ordine logico )
32
33 # Calcolare medie per gruppi con tapply
34 age <- c (47 ,44 ,44 ,40 ,38 ,36 ,42 ,34 ,34 ,44)
35 tapply ( age , countryf , mean ) # media e t per paese
36
37 # tapply usato per applicare una determinata funzione
ai valori che poi raggruppo per i livelli del factor
38
39 cbind ( age , countryf ) # combinazione eta e paese
40
41 # Factor per il genere
42 gender <- c (1 ,1 ,2 ,1 ,1 ,2 ,1 ,2 ,2 ,2)
43 genderf <- factor ( gender )
44 genderf # factor con livelli 1 e 2
45 levels ( genderf ) # mostra livelli
46
47 levels ( genderf ) <- c ( " F " ," M " ) # rinomina livelli (1= F , 2=
M)
48 str ( genderf ) # struttura con nuovi
livelli
3.4 Data Frame in R
I data frame in R sono strutture dati molto utilizzate: sono liste, ma
possono essere viste come matrici in cui le colonne possono contenere dati
di tipo diverso (numerico, carattere, logico, factor, ecc.). Le variabili sono
organizzate in colonne e le osservazioni in righe.
1 # Creazione di una variabile logica : TRUE se e t sotto i
40
2 under40 <- age < 40
3
4 # Creazione di un data frame con country , age , sex e
under40
5 dat <- data . frame ( Country = countryf , Age = age , Sex = genderf ,
6 Under40 = under40 )
7
8 dat$Country # seleziona la colonna ’ Country ’
24 CAPITOLO 3. STRUTTURE PRINCIPALI
9 dat [ ,1] # stessa cosa : prima colonna
10
11 str ( dat ) # struttura del data frame
12 is . data . frame ( dat ) # verifica se e un data frame
13 head ( dat ) # prime 6 righe del data frame
14
15 view ( dat ) # apre il data frame in una finestra viewer (
interattiva )
16
17 # Subsetting : estrazione di dati specifici
18
19 dat [3 ,2] # elemento alla riga 3 , colonna 2
20 dat [1:3 , 2:4] # righe 1 -3 , colonne 2 -4
21 dat [3 , ] # tutta la riga 3
22
23 x <- dat [ , 2] # estrae la colonna 2 come vettore
24 str ( x )
25
26 dat [ , c ( " Age " , " Sex " ) ] # estrae colonne specifiche per
nome
27 dat [ , c (2 ,3) ] # stessa cosa ma per posizione
28 dat [ , 2:3] # stessa cosa ma per intervallo
29
30 str ( dat [ , c ( " Age " , " Sex " ) ]) # struttura delle colonne
selezionate
31
32 dat [ " Age " ] # estrae la colonna ’Age ’ come data
frame
33 str ( dat [ " Age " ]) # struttura : data frame
34 str ( dat [ , " Age " ]) # struttura : vettore
35
36 dat$Sex # estrae la colonna ’Sex ’ come
vettore
37
38 # Eliminare una colonna dal data frame
39 dat$Under40 <- NULL
40
41 head ( dat )
42
43 # Aggiungere di nuovo la colonna ’ Under40 ’
44 cbind . data . frame ( dat , under40 )
45 X <- cbind . data . frame ( dat , under40 )
46 cbind . data . frame ( dat , Under40 = under40 *1) # come
variabile numerica 0/1
47
48 # Creare una variabile logica TRUE se Country == " IT "
49 dat$CountryTF <- dat$Country == " IT "
50
51 # Convertire i character in factor automaticamente
3.5. IMPORTAZIONE DATI 25
52 df <- data . frame ( x = 1:5 ,
53 y = c("A", "B", "C", "D", "E"))
54
55 df <- data . frame ( x = 1:5 ,
56 y = c("A", "B", "C", "D", "E"),
57 stringsAsFactors = T )
58
59 # Le singole variabili del data frame non sono
direttamente accessibili
60 Age # errore se non definita nel global environment
61
62 # attach rende accessibili le variabili del data frame
come oggetti globali
63 attach ( dat )
64 Age # ora ’Age ’ accessibile
direttamente
65 dat$Age <- Age + 1 # aggiorna ’Age ’ nel data frame
66 Age <- Age + 1 # questo NON aggiorna ’ dat$Age ’
67 dat$Age # conferma valore aggiornato nel
data frame
68 Age # rimane il valore di ’Age ’ creato
con attach
69
70 # buona norma poi scollegare il data frame
71 detach ( dat )
72 Age # di nuovo , errore se non definita
globalmente
73 dat$Age # ancora accessibile come colonna
del data frame
3.5 Importazione dati
3.5.1 Gestione della working directory
1 # Visualizza la directory di lavoro corrente
2 getwd ()
3
4 # Imposta la directory di lavoro ( modificare il percorso
tra virgolette )
5 setwd ( " C :/ Users / NomeUtente / Documenti / progetto " )
3.5.2 Lettura file CSV e TXT
1 # Lettura di file CSV con separatore predefinito ( virgola
)
26 CAPITOLO 3. STRUTTURE PRINCIPALI
2 Food <- read . csv ( " data / food_coded1 . csv " )
3
4 # Lettura di file CSV specificando il separatore
5 Food <- read . csv ( " data / food_coded1 . csv " , header = TRUE , sep
=";")
6 # E ’ possibile leggere i dati anche direttamente dal file
xlsx
7 # install . packages (" openxlsx ") # or from Packages tab ->
Install
8 # library ( openxlsx ) # load the package to use
its functions
9 # a <- read . xlsx (" data / food_coded1 . xlsx ")
10 # Lettura di file TXT con o senza intestazioni
11 cigarette <- read . table ( " importazione dataset / cigarette .
txt " , header = FALSE )
12 cipolle <- read . table ( " importazione dataset / cipolle . dat " ,
header = TRUE , stringsAsFactors = TRUE )
13 macchine <- read . csv ( " importazione dataset / macchine /
macchine . data " , header = FALSE , na . strings = " ? " )
14 nazioni <- read . csv ( " importazione dataset / nazioni . csv " )
15 windmill <- read . table ( " importazione dataset / windmill . txt
" , dec = " ," , header = TRUE )
3.5.3 Lettura file Excel (xlsx)
1 # install . packages (" openxlsx ")
2 # library ( openxlsx )
3 # a <- read . xlsx (" data / food_coded1 . xlsx ")
3.6 Esplorazione e selezione dati
1 # Dimensione e struttura del dataset
2 dim ( Food )
3 str ( Food )
4 head ( Food )
5 length ( Food )
6
7 # Accesso ai dati : singola colonna o elemento
8 Food$GPA
9 Food [ , " GPA " ]
10 Food [ , 1]
11
12 str ( Food [[1]])
13
3.6. ESPLORAZIONE E SELEZIONE DATI 27
14 # Selezione elementi
15 Food$Gender [2:7]
16 is . numeric ( Food$Gender )
17 is . factor ( Food$Gender )
18
19 # Conversione a fattore e rinomina livelli
20 Food$Gender <- factor ( Food$Gender )
21 levels ( Food$Gender ) <- c ( " Female " , " Male " )
22 str ( Food$Gender )
23
24 # Conteggio dei valori
25 sum ( Food$Gender == " Female " )
26 length ( Food$Gender [ Food$Gender == " Female " ])
27 table ( Food$Gender ) [1]
28
29 # Selezione condizionata
30 Food$weight [ Food$Gender == " Male " ]
31 Food [ Food$Gender == " Male " , " weight " ]
32 Food [ Food$Gender == " Male " , c ( " GPA " , " weight " ) ]
33 # selezioniamo le colonne sport e lavoro solo per le donne
34 # le condizioni sono specificate nel campo dedicato alle
righe
35 Food [ Food$Gender == " Female " , c ( " sports " , " employment " ) ]
36 Food$Gender [ Food$sports == 1 & Food$vitamins == 1]
37
38 # Creazione sottoinsiemi
39 # selezioniamo le colonne sport e lavoro solo per le donne
40 # le condizioni sono specificate nel campo dedicato alle
righe
41 Food2 <- Food [ Food$Gender == " Male " & Food$sports == 1 , c
( " fruit_day " , " veggies_day " ) ]
42
43 Food . subset <- subset ( Food , subset = ( Gender == " Male " &
sports == 1) ,
44 select = c ( fruit_day , veggies_day ) )
45
46 # Eliminazione variabili : togli colonna peso ( colonna 48)
per alcuni casi
47 Food [ Food$employment < 3 , -48]
48
49 subset ( Food , subset = ( employment == 1 | employment == 2)
,
50 select = -c ( weight ) )
51
52 # Nuovo dataframe con variabili selezionate
53 newdata <- subset ( Food , Gender == " Male " & income > 3 ,
54 select = c ( income : nut ritional _check ) )
55 str ( newdata )
28 CAPITOLO 3. STRUTTURE PRINCIPALI
3.7 Gestione valori mancanti
1 which ( is . na ( Food $calorie s_day ) ) # ritorna il numero di
righe di valori mancanti
2 is . na ( Food$c alories_ day ) # mi dice se una variabile ha
valori mancanti
3 mean ( Food$ calories _day )
4 mean ( Food$calories_day , na . rm = TRUE )
5
6 # Eliminazione righe con NA su calories_day
7 Food <- Food [! is . na ( Food $calorie s_day ) , ]
8
9 # Eliminare tutte le righe con valori mancanti
10 Food_noNA <- na . omit ( Food )
11
12 # Verifica casi completi
13 complete . cases ( Food )
3.8 Esportazione file
1 # Scrivere il dataframe su file di testo o CSV
2 write . table ( Food , file = " Food . dat " )
3 write . table ( Food , file = " Food . csv " , sep = " ," , row . names
= FALSE )
4
5 # Salvare e caricare oggetti R
6 save ( Food , file = " Food . RData " )
7 load ( " Food . RData " )
3.9 Funzioni
In R è possibile creare proprie funzioni ed organizzarle in pacchetti. I
pacchetti possono essere pubblicati sul CRAN per renderli disponibili.
Le funzioni vengono salvate all’interno di oggetti nel workspace. La
sintassi per scrivere una funzione è la seguente:
1 # nome . funzione <- function ( arg1 , arg2 , ...) {
2 # istruzioni
3 # return ( valore )
4 # }
Esempio di funzione per calcolare il cubo di un numero:
3.9. FUNZIONI 29
1 cube <- function ( x ) {
2 y <- x ^3
3 return ( y )
4 }
5 b <- cube (3)
Oppure in forma più compatta:
1 cube <- function ( x ) {
2 return ( x ^3)
3 }
4 cube (2)
Se non si utilizza return, la funzione restituisce in output l’ultima istru-
zione eseguita:
1 power <- function (x , exp ) {
2 x ^ exp
3 }
4 power (2 ,2)
5 a <- power (2 ,2)
È possibile definire valori di default per gli argomenti:
1 power <- function (x , exp =1) {
2 y <- x ^ exp
3 return ( y )
4 }
5 a <- power (2 ,2)
6 b <- power (2) # usa il valore di default exp =1
Se si vogliono restituire più oggetti, è necessario organizzarli in un unico
oggetto (ad esempio un vettore o una lista):
1 power <- function (x , exp =1) {
2 y <- x ^ exp
3 return ( c ( result = y , input = x , exp = exp ) )
4 }
5 power (2 ,2)
6 a <- power (2 ,2)
Esempio di funzione per calcolare la media di un vettore:
1 media <- function ( x ) {
2 somma <- sum ( x )
3 n <- length ( x )
4 media <- somma / n
30 CAPITOLO 3. STRUTTURE PRINCIPALI
5 return ( media )
6 }
7 vettore <- c (4 ,5 ,6 ,7)
8 media ( vettore )
3.10 Strutture di controllo in R
• if/else
• while e repeat
• cicli for
• break e next
• apply e famiglia
3.10.1 If / Ifelse
Se la condizione è vera, il codice viene eseguito. La sintassi è:
1 if ( condizione ) istruzione
Esempi:
1 x <- 2
2 if ( x < 3) print ( " x is less than 3 " )
1 x <- 4
2 if ( x < 3) print ( " x is less than 3 " )
Possiamo specificare anche un’istruzione da eseguire se la condizione è
falsa:
1 if ( x < 3) print ( " x is less than 3 " ) else print ( " x is no
less than 3 " )
if restituisce in output l’ultima istruzione eseguita:
1 x <- 4
2 a <- if (x <3) " x less than 3 " else " x no less than 3 "
3 a
Se la condizione non è verificata e non c’è else, restituisce NULL.
3.10. STRUTTURE DI CONTROLLO IN R 31
1 b <- if (x <3) " x less than 3 "
2 b
Blocco di codice con più istruzioni:
1 x <- 2
2 c <- if (x <3) {
3 print ( x )
4 " x less than 3 "
5 } else {
6 " x no less than 3 "
7 }
8 c
Versione compatta:
1 if (x <3) a <- " x is less than 3 " else a <- " x no less
than 3 "
Funzione ifelse
ifelse valuta vettori restituendo un vettore di output:
1 b <- ifelse (x <3 , " x is less than 3 " , " x no less than 3 " )
2 b
If-else annidati
1 x <- 6
2 if (x <3) {
3 print ( " x is less than 3 " )
4 } else if ( x ==3) {
5 print ( " x is equal to 3 " )
6 } else {
7 print ( " x is greater than 3 " )
8 }
3.10.2 While e Repeat
while ripete finché la condizione è vera:
1 i <- 0
2 while (i <6) {
32 CAPITOLO 3. STRUTTURE PRINCIPALI
3 i <- i +1
4 print ( i )
5 }
repeat esegue fino a break:
1 i <- 0
2 repeat {
3 i <- i +1
4 print ( i )
5 if (i >5) break
6 }
3.10.3 Cicli for
Itera su ogni elemento di un vettore:
1 for ( i in 1:5) {
2 print ( i )
3 }
<vector> può essere di qualsiasi tipo:
1 xval <- c ( " a " ," b " ," c " ," d " ," e " )
2 for ( i in xval ) print ( i )
Con get() possiamo richiamare funzioni tramite stringhe:
1 square <- function ( x ) x ^2
2 cube <- function ( x ) x ^3
3 doublesquare <- function ( x ) x ^4
4
5 for ( name in c ( " square " ," cube " ," doublesquare " ," mean " ) ) {
6 f <- get ( name )
7 print ( f (2) )
8 }
Cicli for annidati
1 xval <- c ( " a " ," b " ," c " ," d " ," e " )
2 for ( i in 1:5)
3 for ( j in xval ) print ( paste (i , j ) )
3.10. STRUTTURE DI CONTROLLO IN R 33
3.10.4 Modificatori: break e next
break interrompe il ciclo corrente:
1 i <- 0
2 while ( TRUE ) {
3 i <- i +1
4 print ( i )
5 if (i >5) break
6 }
next salta alla prossima iterazione:
1 i <- 0
2 repeat {
3 i <- i +1
4 if ( i ==3) next
5 print ( i )
6 if (i >5) break
7 }
3.10.5 Funzioni della famiglia apply
Alternative ai cicli for.
apply
Applica una funzione su righe o colonne di una matrice:
1 z <- matrix (1:50 , nrow =10 , ncol =5)
2 v1 <- apply (z , 2 , mean ) # si unsa 1 per le righe e 2 per
le colonne
3 v1
Con valori mancanti:
1 z [1 ,1] <- NA
2 apply (z , 2 , mean , na . rm = TRUE )
Equivalente con for:
1 v2 <- c ()
2 for ( i in 1: ncol ( z ) ) v2 [ i ] <- mean ( z [ , i ] , na . rm = TRUE )
3 v2
Tempi di esecuzione:
34 CAPITOLO 3. STRUTTURE PRINCIPALI
1 system . time ({
2 for ( i in 1: ncol ( z ) ) v2 [ i ] <- mean ( z [ , i ])
3 })
4
5 system . time ({
6 v1 <- apply (z , 2 , mean )
7 })
Altri esempi:
1 apply (z , 1, sum , na . rm = TRUE )
2 apply (z , 2, function ( x ) x ^2)
3 apply (z , 2, function ( x ) (x - mean ( x ) ) / sd ( x ) )
4 apply (z , 2, scale )
lapply
Applica una funzione su ogni elemento di una lista, restituisce una lista:
1 # ‘ lapply ‘ utilizzato come un ciclo sugli elementi di
una lista e
2 # restuisce una lista con lo stesso numero di elementi
della lista originale
3 # in cui ogni elemento il risultato della funzione ( ‘
FUN ‘) valutata su ogni
4 # elemento della lista originale
5 x <- as . list (1:5)
6 v1 <- lapply (x , log )
7 v1
Equivalente con for:
1 v2 <- list ()
2 for ( i in seq_along ( x ) ) v2 [[ i ]] <- log ( x [[ i ]])
3 v2
sapply
Simile a lapply, ma restituisce un vettore o matrice se possibile:
1 sapply (x , log )
2 sapply (3:9 , seq )
3.10. STRUTTURE DI CONTROLLO IN R 35
mapply
Applica una funzione su più vettori contemporaneamente:
1 mapply ( rep , 1:4 , 4:1)
36 CAPITOLO 3. STRUTTURE PRINCIPALI
Capitolo 4
Distribuzioni di probabilità
4.1 Distribuzioni di probabilità discrete
4.1.1 Distribuzione Binomiale
Esempio:
1 # X ~ Binom (20 , 0.5)
2 choose (20 ,5) *0.5^5*(1 -0.5) ^15 # P ( X =5)
3
4 # definiamo una sequenza di interi da 0 a 20
5 x <- c (0:20)
6
7 # valutiamo ed assegnamo al vettore ’ pbin ’ la P ( X = x )
8 pbin <- choose (20 , x ) *.50^ x *(1 -.50) ^(20 - x )
9 pbin
10
11 # rappresentazione grafica della distribuzione
12 plot (0:20 , pbin , type = " h " )
Le funzioni in R associate alle variabili aleatorie hanno prefissi:
• d per la funzione di probabilità o densità
• p per la funzione di ripartizione
• q per i quantili
• r per la generazione di valori casuali
Esempio:
1 dbinom (5 , 20 , 0.5)
Generazione di valori casuali:
37
38 CAPITOLO 4. DISTRIBUZIONI DI PROBABILITÀ
1 # 100 lanci di una moneta ( Bernoulli con p =0.5)
2 prova <- rbinom (100 , 1 , 0.5)
3 prova
4.2 Distribuzioni di probabilità continue
4.2.1 Distribuzione Normale
Esempio:
1 xx <- seq ( -5 , 5 , .01)
2 plot ( xx , dnorm ( xx , -2 , 1) , type = " l " , xlim = c ( -6 ,6) )
3 points ( xx , dnorm ( xx , 0 , 1) , type = " l " , lty =2 , col =2 , lwd
=3)
4 points ( xx , dnorm ( xx , 2 , 1) , type = " l " , lty =3 , col =3 , lwd
=3)
5
6 # in alternativa
7 curve ( dnorm (x , -1 , 1.5) , col =4 , lwd =3 , lty =4 , add = TRUE )
Funzione di ripartizione:
1 curve ( pnorm (x , -1 , 1.5) , col =4 , lwd =3 , lty =4 , xlim = c
( -4 ,4) )
4.3 Generazione di numeri (pseudo) casuali
4.3.1 Distribuzione Uniforme
1 set . seed (14)
2 simu <- runif (500 , 0 , 1)
3 sum ( simu < 0.4) / length ( simu )
4.3.2 Distribuzione di Poisson
1 set . seed (3)
2 n <- 500
3 dati . pois <- rpois (n , 5)
4 tab <- table ( dati . pois )
5 tab
6
7 tabo <- as . data . frame ( tab )
4.3. GENERAZIONE DI NUMERI (PSEUDO) CASUALI 39
8 punti <- as . numeric ( levels ( tabo$dati . pois ) )
9 freq <- as . numeric ( tab / n )
10
11 plot ( punti , freq , type = " h " , ylab = " probability " , xlab = " x " ,
xlim = c (0 ,13) )
12 points ( punti + 0.1 , dpois ( punti , 5) , type = " h " , col =2 , lwd
=3)
4.3.3 Distribuzione Normale
1 set . seed (7)
2 valori . norm <- rnorm (800 , 10 , 5)
3 hist ( valori . norm , probability = TRUE , col = " lightgray " )
4 curve ( dnorm (x , 10 , 5) , add = TRUE , col = " blue " , lwd =2)
40 CAPITOLO 4. DISTRIBUZIONI DI PROBABILITÀ
Capitolo 5
Data Analysis - Grafici
5.1 Caricamento dati
1 # Carico il pacchetto insuranceData e il dataset AutoBi
2 library ( insuranceData )
3 data ( " AutoBi " )
4
5 # Visualizzo la distribuzione della variabile LOSS
6 table ( AutoBi$LOSS )
7
8 # Creo una variabile categoriale basata su intervalli di
LOSS
9 AutoBi$LOSSclass <- cut ( AutoBi$LOSS , breaks = c
(0 ,0.5 ,2 ,4 ,8 ,1100) )
10
11 # Tabella delle frequenze assolute e relative della nuova
variabile
12 rbind ( table ( AutoBi$LOSSclass ) , prop . table ( table (
AutoBi$LOSSclass ) ) )
1 # Carico il pacchetto MASS e il dataset Cars93
2 library ( MASS )
3 data ( " Cars93 " )
4
5 # Controllo la struttura del dataset
6 str ( Cars93 )
5.2 Variabili Qualitative
Diagramma a torta
41
42 CAPITOLO 5. DATA ANALYSIS - GRAFICI
1 # Creo una tabella di frequenze per la variabile Type
2 tabtipo <- table ( Cars93$Type )
3
4 # Creo un diagramma a torta per la variabile Type
5 pie ( tabtipo )
Diagramma a barre
1 # Tabella di frequenze per la variabile MARITAL
2 maritab <- table ( AutoBi$MARITAL )
3
4 # Diagramma a barre semplice
5 barplot ( maritab )
Personalizzazione con titoli, etichette e colori:
1 # Divido la finestra grafica in 1 riga e 2 colonne
2 par ( mfrow = c (1 ,2) )
3
4 # Diagramma a barre semplice
5 barplot ( maritab )
6
7 # Diagramma a barre con titolo , etichette personalizzate
e colore rosso
8 barplot ( maritab , main = " stato civile " ,
9 names . arg = c ( " sposato " , " single " , " vedovo " , "
divorziato " ) , col =2)
10
11 # Ripristino la finestra grafica a una sola grafico per
volta
12 par ( mfrow = c (1 ,1) )
Barplot di variabili quantitative discrete
1 # Diagramma a barre per la variabile Cylinders
2 barplot ( table ( Cars93$Cylinders ) )
Barplot con frequenze relative e legenda
1 # Divido la finestra grafica in 1 riga e 2 colonne
2 par ( mfrow = c (1 ,2) )
3
5.3. VARIABILI QUANTITATIVE 43
4 # Calcolo le frequenze relative per MARITAL e le
organizzo in matrice
5 freq <- matrix ( prop . table ( table ( AutoBi$MARITAL ) ) ,
6 nrow = length ( table ( AutoBi$MARITAL ) ) , ncol
=1)
7
8 # Diagramma a barre con frequenze relative e colori
diversi
9 barplot ( freq , xlim = c (0 ,4) , col =(2:5) )
10
11 # Numero di righe della tabella Type
12 nrig <- length ( table ( Cars93$Type ) )
13
14 # Creo una matrice con le frequenze assolute di Type
15 autof <- matrix ( table ( Cars93$Type ) , nrig , ncol =1)
16
17 # Definisco una sequenza di colori
18 colr <- (2:( nrig +1) )
19
20 # Diagramma a barre con legenda per il dataset Cars93
21 barplot ( autof , xlim = c (0 ,4) , col = colr )
22
23 # Aggiungo una legenda
24 legend ( x = " top " , legend = levels ( Cars93$Type ) , fill = colr )
25
26 # Ripristino la finestra grafica
27 par ( mfrow = c (1 ,1) )
5.3 Variabili Quantitative
Diagramma ramo e foglie (Stem-and-leaf )
1 # Diagramma ramo e foglie per la variabile Length di
Cars93
2 stem ( Cars93$Length )
3
4 # Diagramma ramo e foglie per la variabile CLMAGE di
AutoBi
5 stem ( AutoBi$CLMAGE )
Diagramma a punti
1 # Diagramma a punti tipo stripchart ( metodo stack )
2 stripchart ( Cars93$Length , pch =19 , method = " stack " , cex
=0.2 , ylim = c (0 ,2) )
44 CAPITOLO 5. DATA ANALYSIS - GRAFICI
3
4 # Dotchart per la variabile Length
5 dotchart ( Cars93$Length )
6
7 # Plot semplice equivalente al dotchart
8 plot ( Cars93$Length )
Istogrammi
1 # Divido la finestra grafica in 1 riga e 2 colonne
2 par ( mfrow = c (1 ,2) )
3
4 # Istogramma con frequenze assolute
5 hist ( Cars93$Length )
6
7 # Istogramma con d e n s i t ( frequenze relative )
8 hist ( Cars93$Length , freq = FALSE )
9
10 # Istogramma con intervalli personalizzati
11 hist ( Cars93$Length , breaks = c (139 ,160 ,170 ,180 ,190 ,220) )
Confronto tra istogrammi
1 # Divido la finestra grafica in 2 righe e 2 colonne
2 par ( mfrow = c (2 ,2) )
3
4 # Istogramma con parametri di default
5 hist ( Cars93$Length , main = " istogramma con parametri di
default " )
6
7 # Istogramma con d e n s i t ( prob = TRUE )
8 hist ( Cars93$Length , prob = TRUE , main = " istogramma con
d e n s i t ")
9
10 # Istogramma con 12 intervalli
11 hist ( Cars93$Length , prob = TRUE , breaks =12 , main = "
istogramma 12 intervalli " )
12
13 # Istogramma con classi di diversa ampiezza
14 hist ( Cars93$Length , prob = TRUE , breaks = c
(140 ,160 ,170 ,180 ,190 ,200 ,220) ,
15 main = " istogramma con classi di diversa ampiezza " )
16
17 # Ripristino la finestra grafica
18 par ( mfrow = c (1 ,1) )
Capitolo 6
Medie, Quantili e Misure di
Dispersione
6.1 Medie Analitiche
1 # Impostiamo il seme per la generazione casuale
riproducibile
2 set . seed (123)
3
4 # Numero di osservazioni
5 n <- 15
6
7 # Estrazione casuale di n numeri da 1 a n con ripetizione
8 x <- sample (n , replace = TRUE )
9
10 # Visualizziamo il campione estratto
11 x
1 # Calcoliamo la media aritmetica del campione
2 mean ( x )
3
4 # Verifichiamo che la media sia compresa tra minimo e
massimo del campione
5 mean ( x ) > min ( x ) & mean ( x ) < max ( x )
1 # Calcoliamo lo scarto di ogni osservazione dalla media
2 x - mean ( x )
3
4 # Somma degli scarti ( dovrebbe essere zero o molto vicino
)
5 sum ( x - mean ( x ) )
45
46 CAPITOLO 6. MEDIE, QUANTILI E MISURE DI DISPERSIONE
1 # Calcolo della varianza come media degli scarti
quadratici
2 mean (( x - mean ( x ) ) ^2)
1 # Creiamo un vettore di valori da testare per la media ,
includendo la media stessa
2 a <- sort ( c ( seq ( min ( x ) , max ( x ) , 0.5) , mean ( x ) ) )
3
4 # Per ogni valore calcoliamo la somma degli scarti
quadratici
5 varTest <- sapply (a , function ( a ) mean (( x - a ) ^2) )
6
7 # Troviamo il valore che minimizza la somma degli scarti
quadratici ( dovrebbe essere la media )
8 min . a <- which . min ( varTest )
9 a [ min . a ]
10
11 # Grafico della funzione di varianza in funzione del
valore testato
12 plot (a , varTest , type = " b " )
13
14 # Evidenziamo il minimo con un punto rosso
15 points ( a [ min . a ] , varTest [ min . a ] , pch = 20 , col = " red " )
1 # Altre medie analitiche e loro relazioni
2
3 # Somma delle osservazioni ( media aritmetica moltiplicata
per il numero di dati )
4 mean ( x ) * length ( x )
5
6 # Somma diretta degli elementi
7 sum ( x )
8
9 # Media geometrica elevata alla potenza n
10 exp ( mean ( log ( x ) ) ) ^ n
11
12 # Prodotto degli elementi
13 prod ( x )
14
15 # Media armonica ( normalizzata per n )
16 1 / mean (1 / x ) / n
17
18 # Media armonica ( non normalizzata )
19 1 / sum (1 / x )
6.2. QUANTILI E INDICI DI POSIZIONE 47
1 # Pacchetto DescTools per calcolare medie geometriche e
armoniche direttamente
2 library ( DescTools )
3
4 Gmean ( x ) # media geometrica
5 Hmean ( x ) # media armonica
6.2 Quantili e Indici di Posizione
1 # Ordinamento del vettore per calcolare i quantili
empirici
2 sort ( x )
3
4 # Calcolo dei quantili empirici : percentuale associata ad
ogni elemento ordinato ( i / n )
5 cbind ( sort ( x ) , 1: n / n )
6
7 # Alternativa : percentuale (i -1) / n
8 cbind ( sort ( x ) , (0:( n - 1) ) / n )
9
10 # Convenzione p = ( i - 0.5) / n per il calcolo dei quantili
11 cbind ( sort ( x ) , .5:( n - .5) / n )
1 # Calcolo della mediana se n dispari ( elemento
centrale )
2 sort ( x ) [( n + 1) / 2]
3
4 # Calcolo della mediana con funzione integrata
5 quantile (x , 0.5)
1 # Troviamo il valore che minimizza la somma degli scarti
assoluti
2 sapply (a , function ( a ) sum ( abs ( x - a ) ) )
3
4 # Valore corrispondente al minimo
5 a [ which . min ( sapply (a , function ( a ) sum ( abs ( x - a ) ) ) ) ]
1 # Carichiamo un dataset reale per esempi pratici
2 library ( insuranceData )
3 data ( AutoBi )
4
5 # Calcoliamo la mediana della variabile LOSS
6 median ( AutoBi$LOSS )
48 CAPITOLO 6. MEDIE, QUANTILI E MISURE DI DISPERSIONE
7
8 # Calcoliamo la media della variabile LOSS
9 mean ( AutoBi$LOSS )
10
11 # Visualizziamo alcuni quantili e riassunti della
variabile LOSS
12 fivenum ( AutoBi$LOSS )
13 summary ( AutoBi$LOSS )
14
15 # Calcoliamo la media sfrondata ( trimmed mean ) al 5%
16 mean ( AutoBi$LOSS , na . rm = TRUE , trim = 0.05)
17
18 # Media semplice con rimozione dei NA
19 mean ( AutoBi$LOSS , na . rm = TRUE )
6.3 Misure di Dispersione
1 # Calcolo della varianza e deviazione standard della
variabile LOSS
2 var ( AutoBi$LOSS )
3 sd ( AutoBi$LOSS )
1 # Calcolo della varianza per i maschi ( CLMSEX == 1)
2 var ( AutoBi$LOSS [ AutoBi$CLMSEX == 1] , na . rm = TRUE )
3
4 # Deviazione standard per i maschi
5 sd ( AutoBi$LOSS [ AutoBi$CLMSEX == 1] , na . rm = TRUE )
6
7 # Calcolo della varianza per le femmine ( CLMSEX == 2)
8 var ( AutoBi$LOSS [ AutoBi$CLMSEX == 2] , na . rm = TRUE )
9
10 # Deviazione standard per le femmine
11 sd ( AutoBi$LOSS [ AutoBi$CLMSEX == 2] , na . rm = TRUE )
1 # Confronto delle medie tra maschi e femmine ( utile per
contestualizzare la dispersione )
2 mean ( AutoBi$LOSS [ AutoBi$CLMSEX == 1] , na . rm = TRUE )
3 mean ( AutoBi$LOSS [ AutoBi$CLMSEX == 2] , na . rm = TRUE )
1 # Statistiche riassuntive per evidenziare valori estremi
e anomalie
2 summary ( AutoBi$LOSS [ AutoBi$CLMSEX == 1])
3 summary ( AutoBi$LOSS [ AutoBi$CLMSEX == 2])
6.4. ALTRE MISURE DI DISPERSIONE 49
6.4 Altre Misure di Dispersione
1 # Calcolo del MAD ( Median Absolute Deviation ) per maschi
e femmine
2 mad ( AutoBi$LOSS [ AutoBi$CLMSEX == 1] , na . rm = TRUE )
3 mad ( AutoBi$LOSS [ AutoBi$CLMSEX == 2] , na . rm = TRUE )
4
5 # Calcolo dell ’ IQR ( Interquartile Range ) per maschi e
femmine
6 quantile ( AutoBi$LOSS [ AutoBi$CLMSEX == 1] , 0.75 , na . rm =
TRUE ) - quantile ( AutoBi$LOSS [ AutoBi$CLMSEX == 1] ,
0.25 , na . rm = TRUE )
7 quantile ( AutoBi$LOSS [ AutoBi$CLMSEX == 2] , 0.75 , na . rm =
TRUE ) - quantile ( AutoBi$LOSS [ AutoBi$CLMSEX == 2] ,
0.25 , na . rm = TRUE )
6.5 Asimmetria
1 # Calcolo dei decili per le variabili LOSS e CLMAGE
2 quantile ( AutoBi$LOSS , probs = seq (0 , 1 , 0.1) , na . rm =
TRUE , digits = 2)
3 quantile ( AutoBi$CLMAGE , probs = seq (0 , 1 , 0.1) , na . rm =
TRUE )
1 # Calcolo dell ’ indice di Galton per la variabile LOSS
2 Qloss <- fivenum ( AutoBi$LOSS , na . rm = TRUE )
3 g <- ( Qloss [4] + Qloss [2] - 2 * Qloss [3]) / ( Qloss [4] -
Qloss [2])
4 g # Valore dell ’ indice di asimmetria di Galton
1 # Calcolo dell ’ asimmetria basata sul terzo momento (
skewness )
2 library ( moments )
3
4 skewness ( AutoBi$LOSS )
5 # > 0: coda a destra lunga ( asimmetria positiva )
6 # < 0: coda a sinistra lunga ( asimmetria negativa )
7 # = 0: distribuzione simmetrica
8
9 # La trasformazione logaritmica spesso " normalizza "
distribuzioni fortemente asimmetriche ,
10 # rendendo la distribuzione p i simmetrica e facilitando
l ’ interpretazione visiva .
50 CAPITOLO 6. MEDIE, QUANTILI E MISURE DI DISPERSIONE
6.6 Curtosi
1 # Curtosi : misura della concentrazione nelle code e centro
della distribuzione
2 # = mean ( xi - M ) ^4 / sd ^4
3 # < 3 distribuzione leptocurtica ( code sottili )
4 # > 3 distribuzione platicurtica ( code spesse )
5 kurtosis ( AutoBi$CLMAGE , na . rm = TRUE )
6.7 Boxplot
1 # Cinque numeri fondamentali della variabile CLMAGE
2 fivenum ( AutoBi$CLMAGE )
3 # Restituisce i cinque numeri caratteristici della
distribuzione , ovvero :
4 # 1) Minimo ( valore p i piccolo )
5 # 2) Primo quartile ( Q1 , 25 percentile )
6 # 3) Mediana ( Q2 , 50 percentile )
7 # 4) Terzo quartile ( Q3 , 75 percentile )
8 # 5) Massimo ( valore p i grande )
9
10 # Grafici : istogramma e boxplot per visualizzare la
distribuzione
11 par ( mfrow = c (2 , 1) )
12 hist ( AutoBi$CLMAGE )
13 boxplot ( AutoBi$CLMAGE , horizontal = TRUE )
1 # Interpretazione del boxplot :
2 # 1. La larghezza della scatola indica la dispersione
centrale
3 # 2. La posizione della scatola mostra dove si concentra
il 50% dei valori centrali
4 # 3. La posizione della mediana a l l interno della
scatola indica la simmetria
5 # 4. I baffi indicano la v a r i a b i l i t nelle code (
outliers potenziali )
6
7 boxplot ( AutoBi$LOSS , horizontal = TRUE )
8
9 # Boxplot della variabile LOSS dopo trasformazione
logaritmica
10 boxplot ( log ( AutoBi$LOSS ) , horizontal = TRUE )
Capitolo 7
I Dati
7.1 Concetti Fondamentali
7.1.1 Popolazione e Unità Statistiche
• Popolazione: Collettività di interesse (es: italiani maggiorenni, clienti
di un negozio)
• Unità statistiche: Elementi della popolazione
• Tipologie:
– Popolazioni finite (es: comuni del FVG)
– Popolazioni infinite (es: pazienti con una patologia)
7.1.2 Tipologie di Dati
Listing 7.1: Identificazione tipi variabili in R
1 # Creazione di variabili in R
2 v a r i a b i l e _ q u a l i t a t i v a <- factor ( c ( " Basso " , " Medio " , " Alto
"))
3 variabile_quant_discreta <- c (1 , 2 , 3 , 4 , 5)
4 variabile_quant_continua <- rnorm (100 , mean =50 , sd =10)
5
6 # Verifica tipologia variabile
7 class ( v a r i a b i l e _ q u a l i t a t i v a ) # " factor "
8 is . numeric ( v a r i a b i l e _ q u a n t _ d i s c r e t a ) # TRUE
51
52 CAPITOLO 7. I DATI
7.2 Analisi Esplorativa dei Dati (EDA)
7.2.1 Caratteristiche Principali
• Obiettivo: Sintetizzare e visualizzare i dati senza generalizzare
• Fasi chiave:
1. Pulizia dei dati (data cleaning)
2. Analisi univariata/bivariata/multivariata
3. Visualizzazione
7.2.2 Matrice dei Dati in R
Listing 7.2: Gestione matrice dei dati
1 # Creazione matrice dati
2 matrice_dati <- data . frame (
3 et = c (25 , 30 , 35 , 40) ,
4 reddito = c (30000 , 45000 , 38000 , 52000) ,
5 genere = factor ( c ( " M " , " F " , " M " , " F " ) )
6 )
7
8 # Dimensione matrice ( n righe , p colonne )
9 dim ( matrice_dati ) # 4 3
10
11 # Analisi univariata ( singola colonna )
12 summary ( m a t r i c e _ d a t i $ e t )
13
14 # Analisi bivariata ( due colonne )
15 plot ( m a t r i c e _ d a t i $ e t , m a t ri c e _ d a t i $ r e d d i t o )
7.3 Tipologie di Variabili
7.3.1 Variabili Qualitative
• Sconnesse: Modalità senza ordinamento (es: colori)
• Ordinali: Modalità graduabili (es: livelli di istruzione)
7.3.2 Variabili Quantitative
• Discrete: Valori numerabili (es: numero figli)
• Continue: Valori in intervallo reale (es: altezza)
7.3. TIPOLOGIE DI VARIABILI 53
Listing 7.3: Conversione tipi variabili
1 # Conversione a fattore ( variabile qualitativa )
2 dati$genere <- as . factor ( dati$genere )
3
4 # Conversione a numerico ( variabile quantitativa )
5 d a t i $ e t <- as . numeric ( d a t i $ e t )
6
7 # Controllo struttura dati
8 str ( dati ) # Mostra tipologia di tutte le variabili
54 CAPITOLO 7. I DATI
Capitolo 8
Indici
8.1 Visualizzazione dei Dati
8.1.1 Tabelle di Frequenza
Listing 8.1: Creazione tabelle di frequenza
1 # Caricamento dataset AutoBi dal pacchetto insuranceData
2 library ( insuranceData )
3 data ( " AutoBi " )
4
5 # Tabella di frequenza per variabile categoriale
6 table ( AutoBi$ATTORNEY )
7
8 # Tabella di frequenza per variabile quantitativa ( con
classi )
9 AutoBi$LOSSclass <- cut ( AutoBi$LOSS , breaks = c
(0 ,0.5 ,2 ,4 ,8 ,1100) )
10 table ( AutoBi$LOSSclass ) # Frequenze assolute
11 prop . table ( table ( AutoBi$LOSSclass ) ) # Frequenze relative
8.1.2 Grafici per Variabili Qualitative
Listing 8.2: Diagrammi a torta e a barre
1 # Diagramma a torta ( sconsigliato )
2 library ( MASS )
3 data ( " Cars93 " )
4 pie ( table ( Cars93$Type ) )
5
6 # Diagramma a barre migliorativo
7 barplot ( table ( Cars93$Type ) ,
8 main = " Tipi di Auto " ,
55
56 CAPITOLO 8. INDICI
9 col = rainbow (6) ,
10 xlab = " Tipo " ,
11 ylab = " Frequenza " )
8.1.3 Grafici per Variabili Quantitative
Listing 8.3: Visualizzazione variabili quantitative
1 # Diagramma ramo - foglie
2 stem ( Cars93$Length )
3
4 # Diagramma a punti
5 stripchart ( Cars93$Length , pch =19 , method = " stack " , cex
=1.2)
6
7 # Boxplot
8 boxplot ( Cars93$Length , horizontal = TRUE ,
9 main = " Lunghezza Auto " ,
10 col = " lightblue " )
8.2 Indici Statistici
8.2.1 Misure di Tendenza Centrale
Listing 8.4: Calcolo indici di posizione
1 # Media e mediana
2 mean ( Cars93$Length )
3 median ( Cars93$Length )
4
5 # Media trimmed (5%)
6 mean ( AutoBi$LOSS , trim =0.05 , na . rm = TRUE )
7
8 # Quantili
9 quantile ( AutoBi$LOSS , probs = seq (0 ,1 ,0.1) , na . rm = TRUE )
8.2.2 Misure di Dispersione
Listing 8.5: Calcolo indici di variabilità
1 # Varianza e deviazione standard
2 var ( AutoBi$LOSS , na . rm = TRUE )
3 sd ( AutoBi$LOSS , na . rm = TRUE )
4
8.3. RAPPRESENTAZIONI AVANZATE 57
5 # Scarto interquartile
6 IQR ( AutoBi$LOSS , na . rm = TRUE )
7
8 # MAD ( Median Absolute Deviation )
9 mad ( AutoBi$LOSS , constant =1 , na . rm = TRUE )
8.2.3 Asimmetria e Curtosi
Listing 8.6: Calcolo asimmetria e curtosi
1 # Indice di asimmetria ( richiede pacchetto moments )
2 library ( moments )
3 skewness ( AutoBi$LOSS )
4
5 # Indice di curtosi
6 kurtosis ( AutoBi$LOSS )
8.3 Rappresentazioni Avanzate
8.3.1 Funzione di Ripartizione Empirica
Listing 8.7: Funzione di ripartizione
1 plot ( ecdf ( Cars93$Length ) ,
2 main = " Funzione di Ripartizione Empirica " ,
3 xlab = " Lunghezza " ,
4 ylab = " Proporzione cumulata " )
8.3.2 Istogrammi e Densità
Listing 8.8: Istogrammi e stime di densità
1 # Istogramma base
2 hist ( Cars93$Length , main = " Istogramma di base " )
3
4 # Istogramma con d e n s i t
5 hist ( Cars93$Length , prob = TRUE , main = " Istogramma con
d e n s i t ")
6 lines ( density ( Cars93$Length ) , col = " red " , lwd =2)
7
8 # Stima di d e n s i t con kernel
9 plot ( density ( Cars93$Length ) ,
10 main = " Stima di d e n s i t kernel " )
58 CAPITOLO 8. INDICI
8.3.3 Confronto tra Distribuzioni
Listing 8.9: Confronto tra gruppi
1 # Boxplot multipli
2 boxplot ( LOSS ~ CLMSEX , data = AutoBi ,
3 main = " Danni per sesso " ,
4 xlab = " Sesso " ,
5 ylab = " Danno ( $ ) " ,
6 col = c ( " lightblue " ," pink " ) )
7
8 # D e n s i t sovrapposte
9 plot ( density ( AutoBi$LOSS [ AutoBi$CLMSEX ==1]) ,
10 main = " D e n s i t dei danni per sesso " )
11 lines ( density ( AutoBi$LOSS [ AutoBi$CLMSEX ==2]) , col =2)
12 legend ( " topright " , legend = c ( " Maschi " ," Femmine " ) , col =1:2 ,
lty =1)
8.4 Considerazioni Finali
• Scelta del grafico: Dipende dal tipo di variabile (qualitativa/quan-
titativa) e dall’obiettivo dell’analisi
• Perdita di informazione: Ogni sintesi (grafica o numerica) comporta
una perdita di dettaglio
• Outliers: Possono influenzare fortemente alcuni indici (media, varian-
za)
• Asimmetria: Può suggerire trasformazioni dei dati (es. logaritmica)
Capitolo 9
Trattamento Preliminare dei
Dati
9.1 Dati Mancanti
• NA in R: Valori mancanti rappresentati con NA
• Gestione:
– [Link]=TRUE in funzioni come mean(), var()
– [Link]() per rimuovere righe con NA
– [Link]() per identificare casi completi
Listing 9.1: Gestione dati mancanti
1 # Esempio con dataset AutoBi
2 library ( insuranceData )
3 data ( " AutoBi " )
4
5 # Conteggio NA
6 summary ( AutoBi ) [7 ,]
7
8 # Calcolo media con esclusione NA
9 mean ( AutoBi$CLMAGE , na . rm = TRUE )
10
11 # Rimozione righe con NA
12 auto_completo <- na . omit ( AutoBi )
13 dim ( auto_completo )
9.1.1 Tipi di Dati Mancanti
• MCAR (Missing Completely At Random): Mancanza casuale
59
60 CAPITOLO 9. TRATTAMENTO PRELIMINARE DEI DATI
• MAR (Missing At Random): Mancanza correlata ad altre variabili
osservate
• MNAR (Missing Not At Random): Mancanza correlata al valore
mancante stesso
Listing 9.2: Simulazione tipi di dati mancanti
1 # Caricamento dati esempio
2 load ( " pimammd . RData " )
3
4 # MCAR : 40% mancanti casuali
5 set . seed (1234)
6 n <- length ( glucose )
7 MCAR <- sample (1: n , 0.4* n )
8 glucoseMCAR <- glucose
9 glucoseMCAR [ MCAR ] <- NA
10
11 # MAR : Mancanza correlata a variabile osservata ( diabetes
)
12 MARneg <- sample ( which ( diabetes == " neg " ) , 0.25* sum (
diabetes == " neg " ) )
13 MARpos <- sample ( which ( diabetes == " pos " ) , 0.55* sum (
diabetes == " pos " ) )
14 glucoseMAR <- glucose
15 glucoseMAR [ c ( MARneg , MARpos ) ] <- NA
16
17 # MNAR : Mancanza correlata al valore stesso
18 probMD <- glucose / sum ( glucose )
19 MNAR <- sample (1: n , 0.4* n , prob = probMD )
20 glucoseMNAR <- glucose
21 glucoseMNAR [ MNAR ] <- NA
9.1.2 Imputazione dei Dati Mancanti
Listing 9.3: Tecniche di imputazione
1 # Imputazione con media globale
2 glucoseMCAR_imp <- glucoseMCAR
3 glucoseMCAR_imp [ is . na ( glucoseMCAR ) ] <- mean ( glucose , na .
rm = TRUE )
4
5 # Imputazione con media per gruppo ( MAR )
6 glucoseMAR_imp <- glucoseMAR
7 glucoseMAR_imp [ is . na ( glucoseMAR ) & diabetes == " neg " ] <-
8 mean ( glucose [ diabetes == " neg " ] , na . rm = TRUE )
9 glucoseMAR_imp [ is . na ( glucoseMAR ) & diabetes == " pos " ] <-
9.2. VALORI ANOMALI (OUTLIERS) 61
10 mean ( glucose [ diabetes == " pos " ] , na . rm = TRUE )
9.2 Valori Anomali (Outliers)
9.2.1 Identificazione Outliers
• Boxplot: Valori oltre 1.5*IQR dai quartili
• Criterio di Hampel: [mediana ± k ∗ M AD]
Listing 9.4: Identificazione outliers
1 # Identificazione con boxplot
2 boxplot ( AutoBi$CLMAGE , main = " Boxplot per identificare
outliers " )
3
4 # Calcolo MAD
5 mad ( AutoBi$LOSS , constant =1 , na . rm = TRUE )
6
7 # Identificazione con criterio di Hampel
8 mediana <- median ( AutoBi$LOSS , na . rm = TRUE )
9 mad_val <- mad ( AutoBi$LOSS , constant =1 , na . rm = TRUE )
10 soglia <- 3 * mad_val
11 outliers <- which ( abs ( AutoBi$LOSS - mediana ) > soglia )
9.2.2 Gestione Outliers
• Rimozione: Solo se errore accertato
• Trasformazione: Logaritmica, radice quadrata
• Analisi robusta: Uso di mediane e MAD
Listing 9.5: Gestione outliers
1 # Trasformazione logaritmica
2 AutoBi$LOSS_log <- log ( AutoBi$LOSS )
3
4 # Confronto boxplot prima / dopo trasformazione
5 par ( mfrow = c (1 ,2) )
6 boxplot ( AutoBi$LOSS , main = " Originale " )
7 boxplot ( AutoBi$LOSS_log , main = " Log - transform " )
8 par ( mfrow = c (1 ,1) )
62 CAPITOLO 9. TRATTAMENTO PRELIMINARE DEI DATI
9.3 Trasformazione di Variabili
9.3.1 Ricodifica Variabili Categoriali
Listing 9.6: One-hot encoding
1 # Creazione fattore
2 varcat <- factor ( c ( " A " ," B " ," A " ," C " ," B " ," A " ," A " ," C " ," B " ," C
"))
3
4 # One - hot encoding
5 library ( caret )
6 dummy <- dummyVars ( " ~ varcat " , data = data . frame ( varcat ) )
7 hotenc <- predict ( dummy , newdata = data . frame ( varcat ) )
8 hotenc
9.3.2 Trasformazione Variabili Quantitative
Listing 9.7: Standardizzazione e normalizzazione
1 # Standardi zzazione ( media =0 , sd =1)
2 AutoBi$LOSS_std <- scale ( AutoBi$LOSS )
3
4 # Normalizzazione min - max [0 ,1]
5 normalize <- function ( x ) {
6 ( x - min (x , na . rm = TRUE ) ) / ( max (x , na . rm = TRUE ) - min (x ,
na . rm = TRUE ) )
7 }
8 AutoBi$LOSS_norm <- normalize ( AutoBi$LOSS )
9
10 # Trasformazioni non lineari
11 AutoBi$LOSS_sqrt <- sqrt ( AutoBi$LOSS )
12 AutoBi$LOSS_log <- log ( AutoBi$LOSS + 0.01) # aggiunta
costante per evitare log (0)
9.4 Considerazioni Finali
• Dati mancanti: Documentare sempre la percentuale e il metodo di
gestione
• Outliers: Valutare sempre l’impatto sulle analisi
• Trasformazioni: Mantenere traccia di tutte le trasformazioni appli-
cate
• Reproducibilità: Salvare script con tutti i passaggi di pulizia
Capitolo 10
Analisi Statistica di Due
Variabili (Bivariata)
10.1 Confrontare Distribuzioni
10.1.1 Confronto fra distribuzioni empiriche e teoriche
• Funzione di ripartizione: Strumento per confrontare distribuzioni
empiriche con modelli teorici
• Statistica di Kolmogorov-Smirnov: D = sup |P (x) − F (x)| misura
la massima distanza verticale tra le curve
• Distribuzioni in R: Prefissi d (densità), p (ripartizione), q (quantili),
r (generazione casuale)
Listing 10.1: Confronto ripartizione empirica e teorica
1 # Generazione dati da Gaussiana standard
2 set . seed (1111)
3 dati <- rnorm (50)
4 plot ( ecdf ( dati ) , cex =.5 , main = " Confronto ripartizione
empirica e teorica " )
5 curve ( pnorm ( x ) , add = TRUE )
6
7 # Confronto con distribuzione t - Student
8 dat2 <- rt (50 , 2)
9 plot ( ecdf ( dat2 ) , cex =.5 , verticals = TRUE ,
10 main = " Confronto con distribuzione t - Student " )
11 curve ( pnorm ( x ) , add = TRUE )
10.1.2 Confronto delle funzioni di densità
63
64CAPITOLO 10. ANALISI STATISTICA DI DUE VARIABILI (BIVARIATA)
Listing 10.2: Confronto densità empirica e teorica
1 # Istogramma vs d e n s i t teorica
2 dat3 <- rnorm (100)
3 hist ( dat3 , prob =T , xlim = c ( -5 ,5) , ylim = c (0 ,0.6) )
4 curve ( dnorm (x ,0 ,1) , col =2 , lwd =2 , add = TRUE )
5
6 # D e n s i t kernel vs Gaussiana
7 dat4 <- rt (1000 , 1)
8 plot ( density ( dat4 ) , xlim = c ( -6 ,6) , ylim = c (0 ,0.6) )
9 curve ( dnorm (x ,0 ,1) , col =2 , lwd =2 , add = TRUE )
10.1.3 Grafico Quantile-Quantile (QQ-Plot)
• Confronta i quantili empirici con quelli teorici
• Se i punti giacciono sulla bisettrice → buon adattamento al modello
Listing 10.3: QQ-Plot in R
1 set . seed (2222)
2 dat5 <- rnorm (100)
3 qqnorm ( dat5 , main = " QQ - Plot vs Gaussiana " )
4 qqline ( dat5 )
5
6 # Confronto con distribuzione t - Student
7 dat6 <- rt (100 , 1)
8 qqnorm ( dat6 )
9 qqline ( dat6 )
10.2 Strumenti Grafici per il Confronto tra Gruppi
10.2.1 Boxplot affiancati
Listing 10.4: Boxplot multipli
1 data ( iris )
2 boxplot ( Sepal . Length ~ Species , data = iris )
10.2.2 Funzioni di ripartizione empiriche
Listing 10.5: Confronto funzioni di ripartizione
1 setosa <- iris$Sepal . Length [ iris$Species == " setosa " ]
10.3. ANALISI DI DUE VARIABILI CATEGORIALI 65
2 versicolor <- iris$Sepal . Length [ iris$Species == " versicolor
"]
3 plot ( ecdf ( setosa ) , verticals = TRUE , xlim = c (4 ,7.5) )
4 plot ( ecdf ( versicolor ) , verticals = TRUE , col =2 , add = TRUE )
10.2.3 Grafico Quantile-Quantile tra gruppi
Listing 10.6: QQ-Plot tra gruppi
1 virginica <- iris$Sepal . Length [ iris$Species == " virginica " ]
2 versicolor <- iris$Sepal . Length [ iris$Species == " versicolor
"]
3 qqplot ( virginica , versicolor , main = " QQ - Plot tra specie " )
4 abline (0 ,1)
10.3 Analisi di Due Variabili Categoriali
10.3.1 Tabelle di contingenza
Listing 10.7: Analisi tabelle di contingenza
1 library ( insuranceData )
2 data ( " AutoBi " )
3 tab1 <- table ( AutoBi$ATTORNEY , AutoBi$CLMSEX )
4 prop . table ( tab1 , 1) # Proporzioni per riga
5 prop . table ( tab1 , 2) # Proporzioni per colonna
6
7 # Test Chi - quadrato
8 chisq . test ( tab1 , correct = FALSE )
10.3.2 Odds Ratio
• Misura di associazione per tabelle 2x2
• OR = 1 → indipendenza
Listing 10.8: Calcolo Odds Ratio
1 OR <- ( tab1 [1 ,1]* tab1 [2 ,2]) /( tab1 [1 ,2]* tab1 [2 ,1])
2 LOR <- log ( OR )
66CAPITOLO 10. ANALISI STATISTICA DI DUE VARIABILI (BIVARIATA)
10.4 Analisi di Due Variabili Quantitative
10.4.1 Diagramma di dispersione
Listing 10.9: Scatterplot
1 library ( MASS )
2 data ( whiteside )
3 plot ( whiteside$Temp , whiteside$Gas , pch =19)
10.4.2 Misure di relazione lineare
P
(xi −x̄)(yi −ȳ)
• Covarianza: cov(X, Y ) = n−1
cov(X,Y )
• Correlazione: r(X, Y ) = sd(X)sd(Y )
Listing 10.10: Calcolo covarianza e correlazione
1 cov ( whiteside$Temp , whiteside$Gas )
2 cor ( whiteside$Temp , whiteside$Gas )
10.4.3 Regressione lineare semplice
• Modello: Y = β0 + β1 X + ϵ
cov(X,Y )
• β1 = var(X)
• R2 = r(X, Y )2 misura la bontà di adattamento
Listing 10.11: Regressione lineare in R
1 mod <- lm ( Gas ~ Temp , data = whiteside )
2 summary ( mod )
3
4 # Plot con retta di regressione
5 plot ( whiteside$Temp , whiteside$Gas , pch =19)
6 abline ( mod , col =2)
10.4.4 Lisciamento non parametrico
Listing 10.12: Regressione non parametrica
1 # Metodo lowess
2 plot ( case$SquareFeet , case$Price )
10.5. CONSIDERAZIONI FINALI 67
3 lines ( lowess ( case$SquareFeet , case$Price , f =0.8) , col =4)
4
5 # Con ggplot2
6 library ( ggplot2 )
7 ggplot ( iris , aes ( Sepal . Length , Petal . Length , color =
Species ) ) +
8 geom_point () +
9 geom_smooth ( method = " loess " , se = FALSE )
10.5 Considerazioni Finali
• Per confronti distributivi: QQ-plot e test di Kolmogorov-Smirnov
• Per variabili categoriali: tabelle di contingenza e test chi-quadrato
• Per variabili quantitative: scatterplot, correlazione e regressione
• Lisciamento non parametrico utile per esplorare relazioni complesse
68CAPITOLO 10. ANALISI STATISTICA DI DUE VARIABILI (BIVARIATA)
Capitolo 11
Analisi Statistica Multivariata
11.1 Introduzione
• Dati multivariati: Insieme di p ≥ 3 variabili misurate su n unità
• Tipologie:
– Variabili quantitative e categoriali (da codificare come factor in
R)
– Dati misti (combinazione di entrambi i tipi)
• Approcci principali:
– Regressione multipla (apprendimento supervisionato)
– Cluster analysis (apprendimento non supervisionato)
11.2 Analisi di Variabili Categoriali
11.2.1 Tabule a più entrate
Listing 11.1: Analisi tabelle multidimensionali
1 # Esempio dataset UCBAdmissions ( ammissioni Berkeley )
2 # Creazione tabella marginale per le variabili Admit e
Gender
3 marg <- margin . table ( UCBAdmissions , c (1 ,2) ) # c (1 ,2)
seleziona le prime due dimensioni ( Admit e Gender )
4 kable ( marg ) # Visualizza la tabella in formato leggibile
5
6 # Calcolo odds ratio marginale per valutare l ’
associazione tra ammissione e genere
7 OR <- marg [1 ,1]* marg [2 ,2]/( marg [1 ,2]* marg [2 ,1])
8 # Formula : ( Amessi M * Rifiutati F ) /( Amessi F * Rifiutati
M)
69
70 CAPITOLO 11. ANALISI STATISTICA MULTIVARIATA
11.2.2 Paradosso di Simpson
• Associazione marginale: Relazione tra due variabili ignorando altre
variabili
• Associazione condizionale: Relazione tra due variabili fissando altre
variabili
• Esempio:
– Marginalmente: uomini ammessi più spesso
– Condizionatamente: in 4 dipartimenti su 6 sono le donne ad essere
ammesse più spesso
Listing 11.2: Odds ratio condizionali
1 # Calcolo odds ratio per ogni dipartimento separatamente
2 nn <- dim ( UCBAdmissions ) [3] # Numero di dipartimenti (
terza dimensione dell ’ array )
3 ordip <- 1: nn # Vettore per memorizzare gli odds ratio
4
5 for ( i in 1: nn ) {
6 # Calcola l ’ odds ratio per il dipartimento i - esimo
7 ordip [ i ] <- UCBAdmissions [1 ,1 , i ]* UCBAdmissions [2 ,2 , i ] /
8 ( UCBAdmissions [1 ,2 , i ]* UCBAdmissions [2 ,1 , i ])
9 }
10 # ordip contiene ora gli odds ratio per ogni dipartimento
11.3 Analisi di Variabili Quantitative
11.3.1 Matrici di correlazione
Listing 11.3: Matrici di varianza-covarianza e correlazione
1 # Dataset iris ( rimuoviamo la variabile categoriale
Species )
2 irismum <- iris [ , -5] # Seleziona tutte le colonne tranne
la quinta
3
4 # Calcolo matrice di varianza - covarianza
5 round ( cov ( irismum ) , 2) # Arrotondata a 2 decimali per
leggibilit
6
7 # Calcolo matrice di correlazione
8 round ( cor ( irismum ) , 2) # Mostra le correlazioni tra tutte
le variabili
11.4. REGRESSIONE LINEARE MULTIPLA 71
9
10 # Visualizzazione grafica con ggplot2
11 library ( ggecorrplot ) # Carica il pacchetto per la
visualizzazione
12 ggcorrplot ( cor ( iris [ , -5]) , type = " lower " , method = " circle " ,
lab = TRUE )
13 # type =" lower ": mostra solo la m e t inferiore
14 # method =" circle ": rappresenta le correlazioni con cerchi
15 # lab = TRUE : mostra i valori delle correlazioni
11.3.2 Correlazione parziale
• Concetto: Misura l’associazione tra due variabili al netto di altre
variabili
• Esempio: Correlazione tra consumo carne e tumori al netto del PIL
Listing 11.4: Calcolo correlazione parziale
1 # Calcolo dei residui delle regressioni per controllare l
’ effetto del GDP
2 # Residui della regressione tasso di tumori ( arate ) su
GDP
3 resarate <- residuals ( lm ( arate ~ GDP , data = america ) )
4
5 # Residui della regressione consumo carne ( meat ) su GDP
6 resmeat <- residuals ( lm ( meat ~ GDP , data = america ) )
7
8 # La correlazione tra questi residui la correlazione
parziale
9 cor ( resarate , resmeat ) # Quasi zero dopo controllo per
GDP
10 # Indica che la correlazione originale era spuria , dovuta
al GDP
11.4 Regressione Lineare Multipla
11.4.1 Modello di base
M (Yi ) = β0 + β1 xi1 + β2 xi2 + ... + βp xip
Listing 11.5: Regressione multipla in R
1 # Esempio : consumo gas ( Gas ) in funzione di temperatura (
Temp ) e isolamento ( Insul )
72 CAPITOLO 11. ANALISI STATISTICA MULTIVARIATA
2 mlm <- lm ( Gas ~ Temp + Insul , data = whiteside ) # Stima il
modello
3 summary ( mlm ) # Mostra i risultati dettagliati
4
5 # Estrazione dei coefficienti stimati
6 beta0 <- coef ( mlm ) [1] # Intercetta ( consumo base )
7 beta1 <- coef ( mlm ) [2] # Coefficiente temperatura (
effetto di Temp su Gas )
8 beta2 <- coef ( mlm ) [3] # Coefficiente isolamento ( effetto
di Insul su Gas )
11.4.2 Interazioni
Listing 11.6: Modello con interazione
1 # Modello con termine di interazione tra temperatura e
isolamento
2 mlmint <- lm ( Gas ~ Temp + Insul + Temp * Insul , data =
whiteside )
3 # Temp * Insul aggiunge sia i singoli effetti che l ’
interazione
4
5 # Interpretazione dei coefficienti :
6 # Prima dell ’ isolamento : beta0 + beta1 * Temp ( solo
intercetta e effetto temperatura )
7 # Dopo l ’ isolamento : ( beta0 + beta2 ) + ( beta1 + beta3 ) * Temp
8 # ( intercetta e pendenza modificati )
11.4.3 Selezione del modello
• Criteri:
– R2 aggiustato
– AIC (Akaike Information Criterion)
• Metodi:
– Backward elimination
– Forward selection
– Stepwise regression
Listing 11.7: Esempio stepwise
1 # Dataset TL ( polizze vita ) - trasformazione logaritmica
di alcune variabili
11.5. CLUSTER ANALYSIS 73
2 TL$LFACE <- log ( TL$FACE ) # Valore della polizza ( log )
3 TL$LINCOME <- log ( TL$INCOME ) # Reddito ( log )
4
5 # Modello completo con tutte le variabili potenzialmente
rilevanti
6 m3 <- lm ( LFACE ~ LINCOME + MARSTAT + LINCOME * MARSTAT +
7 NUMHH + EDUCATION + AGE , data = TL )
8
9 # Rimozione della variabile AGE che risulta non
significativa
10 m4 <- lm ( LFACE ~ LINCOME + MARSTAT + LINCOME * MARSTAT +
11 NUMHH + EDUCATION , data = TL )
12 # Modello p i parsimonioso senza perdita di potere
esplicativo
11.5 Cluster Analysis
11.5.1 Misure di dissomiglianza
Listing 11.8: Calcolo distanze
1 # Distanza euclidea standard tra osservazioni nel dataset
FoodS
2 dist1 <- daisy ( FoodS ) # Calcola le distanze tra tutte le
coppie
3
4 # Distanza con standar dizzazion e delle variabili
5 dist2 <- daisy ( FoodS , stand = TRUE ) # Standardizza prima di
calcolare le distanze
6
7 # Distanza di Gower per dati misti ( quantitativi e
qualitativi )
8 diss <- daisy ( ClusterDat , metric = " gower " ) # Adatta a
diversi tipi di variabili
11.5.2 K-means
Listing 11.9: Algoritmo K-means
1 # S tandardi zzazione dei dati ( importante per K - means )
2 x . scalato <- scale ( x ) # Centra e scala le variabili
3
4 # Esecuzione K - means con K =2 cluster
5 set . seed (4) # Fissa il seed per r i p r o d u c i b i l i t
6 km . out <- kmeans ( x . scalato , centers =2 , nstart =20)
74 CAPITOLO 11. ANALISI STATISTICA MULTIVARIATA
7 # nstart =20: prova 20 configurazioni iniziali diverse
8
9 # Visualizzazione dei risultati
10 plot (x , col =( km . out$cluster +1) , pch =19) # Punti colorati
per cluster
11 points ( km . out$centers , pch =4 , cex =2 , lwd =2) # Aggiungi i
centroidi
11.5.3 PAM (Partitioning Around Medoids)
Listing 11.10: Algoritmo PAM
1 # Esecuzione PAM con K =2 cluster
2 pam . out <- pam (x , 2 , metric = " euclidean " , stand = TRUE )
3 # stand = TRUE : standardizza i dati automaticamente
4
5 # Grafico della silhouette per valutare la q u a l i t del
clustering
6 plot ( pam . out , which =2 , main = " " )
7 # Valori di silhouette vicini a 1 indicano buon
clustering
11.5.4 Clustering Gerarchico
Listing 11.11: Clustering agglomerativo
1 # Clustering gerarchico con metodo del legame singolo
2 agnes . single <- agnes ( eurodist , method = " single " )
3 # method =" single ": usa la distanza minima tra cluster (
legame singolo )
4
5 # Visualizzazione del dendrogramma
6 pltree ( agnes . single , cex =0.8 , hang = -1)
7 # cex : dimensione caratteri , hang : posizione delle
etichette
8
9 # Taglio del dendrogramma per ottenere 4 cluster
10 hc <- cutree ( agnes . ave , k =4) # hc contiene l ’ assegnazione
ai cluster
11.5.5 DBSCAN
Listing 11.12: Clustering basato sulla densità
11.6. CONSIDERAZIONI FINALI 75
1 # Determinazione del parametro eps ( distanza di vicinato )
2 kNNdistplot (d , k =3) # Plot delle distanze ai k =3 vicini
pi prossimi
3 abline ( h =0.05 , col = " red " ) # Linea guida per scegliere eps
4
5 # Esecuzione DBSCAN con eps =0.05 e minimo 3 punti per
cluster
6 db . out <- dbscan (d , eps =0.05 , minPts =3)
7
8 # Valutazione della corrispondenza con classi vere ( se
disponibili )
9 adj . rand . index ( true_cl , db . out$cluster )
10 # Indice di Rand aggiustato : 1 = perfetta corrispondenza
11.6 Considerazioni Finali
• Regressione multipla:
– Attenzione alla multicollinearità (usare VIF)
– Verificare ipotesi sui residui (normalità, omoschedasticità)
• Cluster analysis:
– Standardizzare le variabili quantitative (importante per misure di
distanza)
– Validare i risultati con misure come silhouette o indice di Rand
• Scelta metodo:
– Natura dei dati (quantitativi, categoriali, misti)
– Obiettivo dell’analisi (esplorativo vs predittivo)