Esempio (con codice R) di come svolgere un'analisi esplorativa sulle variabili qualitative e quantitative di un dataset. Utilizzo del test chi quadrato.
2. Chi sopravvisse al naufragio del Titanic?
Il 14 aprile 1912, alle 23:40, il transatlantico Titanic, in viaggio da
Southampton a New York, colpì un iceberg
e iniziò a imbarcare acqua. Alle 2:20 del mattino affondò: dei
2228 passeggeri e membri dell'equipaggio a bordo, solo 705
sopravvissero. I dati sui passeggeri del Titanic sono disponibili
all’indirizzo www.encyclopedia-titanica.org.
Per 1309 passeggeri, è stato riportato il dato sulla sopravvivenza
o meno al naufragio, insieme alle informazioni su
età, sesso, classe di biglietto, e il numero di familiari che
accompagnavano ogni passeggero.
3. Elenco delle variabili
pclass (1= prima classe; 2= seconda classe; 3= terza classe)
survived (0=morto; 1=sopravvissuto)
name
sex (maschi; femmine)
age (in anni)
sibsp ( numero di fratelli/coniugi a bordo)
parch (numero di genitori e figli a bordo)
ticket ( numero del biglietto)
fare (Tariffa del biglietto, in sterline inglesi)
cabin
embarked (C=Cherbourg; Q=Queenstown;S=Southampton)
boat
body (Body Identification Number)
home.dest (Home/Destination)
4. Importare il file in R
Copia il file titanic.txt sulla cartella di lavoro in cui la console di R
lavora. Come si fa a verificare il percorso esatto a cui punta la
directory di lavoro?
Carica quindi il file nella workspace e assegnagli nome “dati”. La
prima riga del file contiene le etichette delle variabili.
E se invece avessi voluto scrivere su un file (es. “titanic.bis.txt”)
l’oggetto “dati” appena creato nel workspace?
getwd()
dati=read.table("titanic.txt",header=TRUE)
write.table(dati,"titanic.bis.txt")
5. Check dati
Come puoi procedere per avere alcune informazioni sui dati (es.
dimensione e struttura dei dati)?
Cosa succede se applichi il comando summary all’età, alla classe
e al sesso?
dim(dati) # restituisce il numero di righe e di colonne
is.data.frame(dati) # restituisce vero se dati è un data.frame
class(dati) # indica il tipo di oggetto
dati[1:10,] # visualizza le informazioni sulle prime 10 persone
summary(dati$age) ## calcola alcune statistiche descrittive
summary(dati$pclass)
summary(dati$sex)
6. Definire le variabili qualitative
Non ha senso calcolare la media e le altre statistiche per la classe
di viaggio! Si può fare solamente un semplice conteggio del
numero dei casi: come potresti riconvertire la variabile pclass per
far si che R la riconosca come variabile qualitativa?
Che comando puoi utilizzare per controllare come sono state
importate le classi di ciascuna colonna del dataset?
dati$pclass=as.factor(dati$pclass)
str(dati) #elenca il nome e il tipo di colonne
7. Ricodifica variabili
Procediamo ad una opportuna sistemazione dei dati in modo
che:
pclass deve essere un fattore;
name deve essere un carattere;
ticket deve essere un carattere;
cabin deve essere un carattere;
body deve essere un carattere;
home deve essere un carattere;
dati$pclass=as.factor(dati$pclass)
dati$name=as.character(dati$name)
dati$ticket=as.character(dati$ticket)
dati$cabin=as.character(dati$cabin)
dati$body=as.character(dati$body)
dati$home=as.character(dati$home)
8. Statistiche descrittive
Il comando summary può essere ora applicato a tutto il dataset.
Da un punto di vista grafico, il commando plot funziona anche
per fattori: prova ad utilizzarlo per la variabile pclass.
Prova adesso a calcolare l’età media con il comando mean()
Perché la funzione non restituisce la media?
summary(dati)
plot(dati$pclass)
mean(dati$age)
Ci sono 263 valori mancanti codificati in R con NA
9. Analisi variabili quantitative
In caso di valori mancanti occorre aggiungere al comando un
argomento opzionale. Quale?
E se volessi avere anche un’idea grafica della distribuzione
dell’età?
Calcola ora alcune statistiche di base sulla variabile età (varianza,
scarto quadratico medio, min, max, mediana)
mean(dati$age,na.rm=TRUE)
hist(dati$age)
var(dati$age,na.rm=TRUE) # restituisce la varianza
sd(dati$age,na.rm=TRUE) # restituisce scarto quadratico medio
min(dati$age,na.rm=TRUE) # restituisce il minimo
max(dati$age,na.rm=TRUE) # restituisce il massimo
median(dati$age,na.rm=TRUE)# restituisce la mediana
10. Boxplot per gruppi
E se volessi calcolare la media dell’età separatamente per classe?
Visualizza ora tutte le statistiche di riepilogo per l’età
separatamente per classe.
Crea inoltre il boxplot per l’età suddivisa per classe.
by(dati$age,dati$pclass,mean,na.rm=TRUE)
by(dati$age,dati$pclass,summary)
plot(dati$age~dati$pclass) # boxplot
11. Aggregare le modalità di una variabile (1/2)
Considera ora le variabili sibsp e parch. Cosa noti? Sarebbe
sensato pensare di raggruppare alcuni valori in un’unica classe di
valori?
Crea 2 nuovi variabili (sibsp2 e parch2) che contengano le classi:
1,2,3, e “più di 3”. Come saranno queste nuove variabili? Va
ancora bene considerare queste variabili quantitative? Come
potresti ricodificarle?
sibsp2=dati$sibsp
parch2=dati$parch
sibsp2[dati$sibsp>3]=4
parch2[dati$parch>3]=4
dati$sibsp2=as.factor(sibsp2)
dati$parch2=as.factor(parch2)
12. Aggregare le modalità di una variabile (1/2)
Crea adesso una nuova variabile qualitativa (age2) per l’età
suddivisa nelle classi: [0-21), [21-28), [28-39), [39,80].
age2=dati$age
age2[dati$age<21]=1
age2[dati$age>=21 & dati$age < 28]=2
age2[dati$age>=28 & dati$age < 39]=3
age2[dati$age>=39]=4
dati$age2=as.factor(age2)
13. Ragguppare i dati
Quale è stata la proporzione di sopravvissuti per intervallo di età,
classe e sesso?
Che test statistico puoi utilizzare per capire se la probabilità di
sopravvivenza è influenzata da ciascuna delle seguenti
caratteristiche: classe, età, sesso?
by(dati$survived,dati$age2,mean)
by(dati$survived,dati$pclass,mean)
by(dati$survived,dati$sex,mean)
Il test del Chi quadrato, che verifica l’ipotesi nulla che i due
caratteri via via considerati siano fra loro indipendenti.
14. Test chi quadrato
Calcola quindi il test del Chi quadrato per le 3 variabili.
Cosa emerge dai risultati?
chisq.test(table(dati$survived,dati$pclass))
chisq.test(with(dati, table(survived,pclass))) # come il precedente
chisq.test(with(dati, table(survived,age2)))
chisq.test(with(dati, table(survived,sex)))
I risultati mettono in luce che il sesso e la classe hanno avuto una
influenza significativa sulla probabilità di sopravvivenza.