Il 0% ha trovato utile questo documento (0 voti)
6 visualizzazioni75 pagine

Data Analytics 3

Il manuale dei comandi R fornisce una guida completa sull'utilizzo del linguaggio di programmazione R, coprendo nozioni di base, tipi di dati, strutture principali e analisi dei dati. Include sezioni dettagliate su variabili, funzioni, distribuzioni di probabilità e grafici, oltre a tecniche di analisi statistica. È un riferimento utile per chi desidera apprendere o migliorare le proprie competenze in R.

Caricato da

lorenzo.pic2310
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
6 visualizzazioni75 pagine

Data Analytics 3

Il manuale dei comandi R fornisce una guida completa sull'utilizzo del linguaggio di programmazione R, coprendo nozioni di base, tipi di dati, strutture principali e analisi dei dati. Include sezioni dettagliate su variabili, funzioni, distribuzioni di probabilità e grafici, oltre a tecniche di analisi statistica. È un riferimento utile per chi desidera apprendere o migliorare le proprie competenze in R.

Caricato da

lorenzo.pic2310
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd

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)

Potrebbero piacerti anche