Capitolo 1 Analisi numeriche
Per mostrare gli esempi, useremo innanzitutto il data frame wea
del package pdataita
(si veda la sezione Introduzione per ulteriori informazioni). Cominciamo col caricarlo:
Ora, il riepilogo testuale più semplice di un dataset è fornito dal metodo summary()
. Proviamo ad applicarlo al dataset wea
(le sole colonne dalla 7 alla 9: Sunshine
, WindGustDir
e WindGustSpeed
).
## Sunshine WindGustDir WindGustSpeed
## Min. : 0.000 NW : 73 Min. :13.00
## 1st Qu.: 5.950 NNW : 44 1st Qu.:31.00
## Median : 8.600 E : 37 Median :39.00
## Mean : 7.909 WNW : 35 Mean :39.84
## 3rd Qu.:10.500 ENE : 30 3rd Qu.:46.00
## Max. :13.600 (Other):144 Max. :98.00
## NA's :3 NA's : 3 NA's :2
Come si vede, la funzione summary()
riconosce automaticamente le caratteristiche delle singole colonne e produce un riepilogo diverso a seconda del tipo (numerico, fattore, ecc.) delle colonne stesse.
Un riepilogo più dettagliato possiamo ottenerlo usando la funzione describe()
, del package Hmisc
. Il package Hmisc
contiene molte funzioni utili per l’analisi dei dati, grafica di alto livello, utilità, e molto altro.
Per illustrare la funzione describe()
bisogna ovviamente prima caricare il package Hmisc
:
Per variabili numeriche, describe()
ritorna anche due decili (10% e 90%) e due percentili
(5% e 95%). L’output continua con un elenco delle osservazioni più basse e più alte della
variabile. Questa informazione aggiuntiva è molto utile nel descrivere i dati.
## wea$Sunshine
## n missing distinct Info Mean Gmd .05 .10 .25
## 363 3 114 1 7.909 3.875 0.60 2.04 5.95
## .50 .75 .90 .95
## 8.60 10.50 11.80 12.60
##
## lowest : 0.0 0.1 0.2 0.3 0.4, highest: 13.1 13.2 13.3 13.5 13.6
Pe variabili categoriali, describe()
produce anche la frequenza assoluta e percentuale per ciascun livello della stessa.
## wea$WindDir9am
## n missing distinct
## 335 31 16
##
## lowest : N NNE NE ENE E , highest: WSW W WNW NW NNW
##
## Value N NNE NE ENE E ESE SE SSE S SSW SW
## Frequency 31 8 4 8 22 29 47 40 27 17 7
## Proportion 0.093 0.024 0.012 0.024 0.066 0.087 0.140 0.119 0.081 0.051 0.021
##
## Value WSW W WNW NW NNW
## Frequency 5 8 16 30 36
## Proportion 0.015 0.024 0.048 0.090 0.107
La funzione describe()
può essere usata anche su data frame, come nell’esempio che segue, in cui si descrive il sottoinsieme di colonne dalla 7 alla 9 del data frame wea
:
## wea[, 7:9]
##
## 3 Variables 366 Observations
## ----------------------------------------------------------------------------------
## Sunshine
## n missing distinct Info Mean Gmd .05 .10 .25
## 363 3 114 1 7.909 3.875 0.60 2.04 5.95
## .50 .75 .90 .95
## 8.60 10.50 11.80 12.60
##
## lowest : 0.0 0.1 0.2 0.3 0.4, highest: 13.1 13.2 13.3 13.5 13.6
## ----------------------------------------------------------------------------------
## WindGustDir
## n missing distinct
## 363 3 16
##
## lowest : N NNE NE ENE E , highest: WSW W WNW NW NNW
##
## Value N NNE NE ENE E ESE SE SSE S SSW SW
## Frequency 21 8 16 30 37 23 12 12 22 5 3
## Proportion 0.058 0.022 0.044 0.083 0.102 0.063 0.033 0.033 0.061 0.014 0.008
##
## Value WSW W WNW NW NNW
## Frequency 2 20 35 73 44
## Proportion 0.006 0.055 0.096 0.201 0.121
## ----------------------------------------------------------------------------------
## WindGustSpeed
## n missing distinct Info Mean Gmd .05 .10 .25
## 364 2 35 0.997 39.84 14.24 20.0 24.6 31.0
## .50 .75 .90 .95
## 39.0 46.0 57.0 65.0
##
## lowest : 13 15 17 20 22, highest: 78 80 83 85 98
## ----------------------------------------------------------------------------------
Un riepilogo anche più dettagliato di dati numerici è fornito dalla funzione basicStats()
del package fBasics
(Wuertz et al., 2010).
Anche se la funzione è pensata principalmente per dati di serie storiche, fornisce comunque statistiche utili in generale, come si più vedere dal codice che segue.
## X..wea.Sunshine
## nobs 366.000000
## NAs 3.000000
## Minimum 0.000000
## Maximum 13.600000
## 1. Quartile 5.950000
## 3. Quartile 10.500000
## Mean 7.909366
## Median 8.600000
## Sum 2871.100000
## SE Mean 0.182732
## LCL Mean 7.550016
## UCL Mean 8.268716
## Variance 12.120962
## Stdev 3.481517
## Skewness -0.723454
## Kurtosis -0.270625
Un altro problema frequente nell’analisi dei dati è la presenza di NA
. Ci possono essere molte ragioni sottostanti alla presenza di dati mancanti, incluso il fatto che i dati possono essere difficilli da raccogliere e quindi non sempre disponibili.
Sapere perché o quando i dati mancano è importante per decidere come gestire i dati mancanti stessi.
La natura dei dati mancanti può essere esplorata usando md.pattern()
del package mice
:
## WindGustSpeed Sunshine WindGustDir WindDir9am
## 329 1 1 1 1 0
## 31 1 1 1 0 1
## 1 1 1 0 1 1
## 3 1 0 1 1 1
## 2 0 1 0 1 2
## 2 3 3 31 39
md.pattern()
ritorna una matrice con ncol(x)+1
colonne (dove x
è il data frame analizzato), in cui ogni riga corrisponde ad un pattern di dato mancante (1
=osservato, 0
=mancante). Le righe e le colonne sono ordinate in ordine crescente di informazione mancante. L’ultima colonna mostra la “complessità” del pattern di dati mancanti (= il numero di variabili con dato mancante nel pattern), mentre l’ultima riga contiene il conteggio dei dati mancanti per ciascuna colonna del data frame, ed il totale.
Nell’esempio qui sopra, si vede che ci sono 320 casi con dati completi (e quindi 0 valori mancanti: ultima colonna), 3 casi in cui mancano valori solo per la variabile Sunshine
(1 solo valore mancante: ultima colonna), …, 31 casi in cui mancano valori solo per WindDir9am
, e 2 casi in cui mancano valori nelle colonne WindGustSpeed
e anche WindGustDir
(2 valori: ultima colonna).
Questa funzione non esegue analisi univariate, ma è utile per indagare la struttura delle informazioni sottese ai dati mancanti.
Per eseguire una cosiddetta analisi complete-case, con soli dati completi, si può usare la funzione complete.cases()
, che ritorna un vettore logico indicante quali casi sono completi:
## Sunshine WindGustDir WindGustSpeed WindDir9am
## Min. : 0.000 NW : 73 Min. :13.00 SE : 47
## 1st Qu.: 5.950 NNW : 44 1st Qu.:31.00 SSE : 40
## Median : 8.600 E : 37 Median :39.00 NNW : 36
## Mean : 7.909 WNW : 35 Mean :39.84 N : 31
## 3rd Qu.:10.500 ENE : 30 3rd Qu.:46.00 NW : 30
## Max. :13.600 (Other):144 Max. :98.00 (Other):151
## NA's :3 NA's : 3 NA's :2 NA's : 31
## Sunshine WindGustDir WindGustSpeed WindDir9am
## Min. : 0.000 NW : 65 Min. :13.00 SE : 47
## 1st Qu.: 6.000 NNW : 35 1st Qu.:31.00 SSE : 38
## Median : 8.700 E : 34 Median :39.00 NNW : 36
## Mean : 7.991 WNW : 32 Mean :40.37 N : 30
## 3rd Qu.:10.700 ENE : 29 3rd Qu.:46.00 NW : 30
## Max. :13.600 ESE : 23 Max. :98.00 ESE : 29
## (Other):111 (Other):119
Per calcolare misure aggregate quali medie, summary, etc., per livelli di una variabile categoriale, una delle prime funzioni utilizzate è tapply()
:
## N NNE NE ENE E ESE SE SSE
## 9.209524 7.971429 8.981250 7.910000 8.600000 5.978261 5.808333 7.100000
## S SSW SW WSW W WNW NW NNW
## 7.759091 6.950000 7.500000 11.450000 7.090000 8.088571 8.108333 8.018182
## N NNE NE ENE E ESE SE SSE S SSW SW WSW W WNW NW NNW
## 21 8 16 30 37 23 12 12 22 5 3 2 20 35 73 44
##
## N NNE NE ENE E ESE SE SSE S SSW SW WSW W WNW NW NNW
## 21 8 16 30 37 23 12 12 22 5 3 2 20 35 73 44
## <NA>
## 3
## $N
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.90 8.10 9.70 9.21 11.10 12.70
##
## $NNE
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.600 6.650 8.100 7.971 10.500 12.800 1
##
## $NE
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 8.575 10.550 8.981 11.475 13.600
##
## $ENE
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 6.225 9.300 7.910 10.200 12.600
##
## $E
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0 7.3 9.2 8.6 11.5 13.0
##
## $ESE
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 3.750 7.100 5.978 8.400 12.500
##
## $SE
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 2.800 7.350 5.808 8.525 11.200
##
## $SSE
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.200 2.425 7.850 7.100 10.825 13.300
##
## $S
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.900 4.900 8.650 7.759 9.950 12.100
##
## $SSW
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 5.90 5.90 6.70 6.95 7.75 8.50 1
##
## $SW
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 6.80 6.85 6.90 7.50 7.85 8.80
##
## $WSW
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 11.30 11.38 11.45 11.45 11.53 11.60
##
## $W
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 5.875 8.050 7.090 9.125 11.300
##
## $WNW
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 6.400 8.400 8.089 10.100 13.500
##
## $NW
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.000 6.500 8.550 8.108 10.225 13.100 1
##
## $NNW
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 5.500 8.900 8.018 10.525 13.600
Negli esempi sopra si vede come il primo parametro (X
) della funzione tapply()
contenga il vettore di valori per cui si vuola calcolare la funzione (di aggregazione) indicata dal parametro FUN
; il parametro INDEX
, invece, contiene il vettore di valori che indicano il gruppo di appartenenza di ciascuna osservazione del vettore passato tramite X
. Ovviamente il vettore passatp tramite X
dovrà avere la stessa lunghezza del vettpre passato tramite INDEX
.
Si noti come nell’esempio sopra la combinazione tra tapply()
e la funzione length()
ritorni praticamente gli stessi risultati della funzione table()
, che produce una tabella di frequenze.
Anche con la funzione aggregate()
si possono ottenere gli stessi risultati della funzione tapply()
in maniera più semplice.
## wgd x.Min. x.1st Qu. x.Median x.Mean x.3rd Qu. x.Max.
## 1 N 1008.500 1019.100 1021.200 1021.476 1024.300 1032.200
## 2 NNE 1013.900 1016.325 1019.450 1021.925 1029.025 1031.400
## 3 NE 1008.700 1017.225 1018.850 1019.900 1023.850 1032.300
## 4 ENE 1006.600 1014.550 1020.750 1019.367 1022.775 1035.700
## 5 E 1010.700 1017.500 1021.600 1021.535 1025.200 1034.300
## 6 ESE 1010.000 1015.400 1021.100 1022.217 1028.350 1033.600
## 7 SE 1017.400 1021.575 1024.200 1023.967 1026.850 1029.500
## 8 SSE 1007.700 1013.300 1018.600 1019.042 1026.000 1028.200
## 9 S 1010.100 1018.275 1020.800 1021.200 1025.700 1029.000
## 10 SSW 999.400 1020.900 1022.800 1019.720 1027.700 1027.800
## 11 SW 1007.600 1011.050 1014.500 1015.933 1020.100 1025.700
## 12 WSW 1013.100 1015.800 1018.500 1018.500 1021.200 1023.900
## 13 W 1002.100 1009.200 1017.300 1015.805 1020.975 1032.900
## 14 WNW 1004.000 1013.600 1019.200 1018.263 1021.950 1030.200
## 15 NW 1003.200 1012.800 1018.000 1017.975 1023.200 1032.100
## 16 NNW 996.500 1017.025 1020.800 1019.732 1024.025 1031.000
(res <- aggregate(x = wea$Pressure9am,
by = list(wgd=wea$WindGustDir, rt=wea$RainToday), FUN = summary))
## wgd rt x.Min. x.1st Qu. x.Median x.Mean x.3rd Qu. x.Max.
## 1 N No 1008.500 1019.450 1022.800 1022.016 1024.350 1032.200
## 2 NNE No 1015.800 1017.350 1020.700 1023.071 1029.450 1031.400
## 3 NE No 1011.800 1017.850 1020.400 1021.064 1024.150 1032.300
## 4 ENE No 1006.600 1018.000 1021.100 1021.084 1023.200 1035.700
## 5 E No 1010.700 1017.600 1022.350 1021.632 1025.350 1034.300
## 6 ESE No 1012.200 1016.975 1025.650 1023.789 1029.925 1033.600
## 7 SE No 1017.400 1021.575 1024.200 1023.967 1026.850 1029.500
## 8 SSE No 1007.700 1011.350 1019.500 1018.513 1026.000 1027.200
## 9 S No 1018.500 1020.800 1025.700 1023.967 1025.900 1029.000
## 10 SSW No 999.400 1020.900 1022.800 1019.720 1027.700 1027.800
## 11 SW No 1007.600 1011.050 1014.500 1015.933 1020.100 1025.700
## 12 WSW No 1013.100 1015.800 1018.500 1018.500 1021.200 1023.900
## 13 W No 1002.100 1013.750 1017.600 1017.371 1022.175 1032.900
## 14 WNW No 1010.500 1014.475 1020.000 1019.570 1022.750 1030.200
## 15 NW No 1003.200 1014.600 1018.750 1018.809 1023.750 1032.100
## 16 NNW No 1011.700 1017.800 1022.500 1021.074 1024.150 1031.000
## 17 N Yes 1012.900 1014.625 1016.350 1016.350 1018.075 1019.800
## 18 NNE Yes 1013.900 1013.900 1013.900 1013.900 1013.900 1013.900
## 19 NE Yes 1008.700 1010.225 1011.750 1011.750 1013.275 1014.800
## 20 ENE Yes 1007.600 1009.500 1010.000 1010.780 1012.400 1014.400
## 21 E Yes 1016.800 1018.600 1020.400 1020.433 1022.250 1024.100
## 22 ESE Yes 1010.000 1014.000 1014.600 1016.560 1017.600 1026.600
## 23 SSE Yes 1015.000 1017.475 1018.600 1020.100 1021.225 1028.200
## 24 S Yes 1010.100 1012.950 1015.500 1015.271 1017.300 1020.800
## 25 W Yes 1006.300 1008.000 1009.550 1012.150 1016.500 1021.200
## 26 WNW Yes 1004.000 1006.900 1010.300 1010.420 1013.900 1017.000
## 27 NW Yes 1004.900 1009.500 1016.700 1015.229 1019.200 1027.800
## 28 NNW Yes 996.500 1010.200 1015.800 1014.511 1018.100 1025.700
## 'data.frame': 28 obs. of 3 variables:
## $ wgd: Ord.factor w/ 16 levels "N"<"NNE"<"NE"<..: 1 2 3 4 5 6 7 8 9 10 ...
## $ rt : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
## $ x : num [1:28, 1:6] 1008 1016 1012 1007 1011 ...
Come si vede qui sopra, la funzione aggregate()
ritorna un data frame con 1 colonna per ogni variabile di gruppo, e una colonna-matrice (chiamata x
) con i risultati dei calcoli delle statisiche descrittive.
Per ottenere un dataframe “normale” si deve intervenire in maniera appropriata:
## wgd rt Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1 N No 1008.5 1019.450 1022.80 1022.016 1024.350 1032.2
## 2 NNE No 1015.8 1017.350 1020.70 1023.071 1029.450 1031.4
## 3 NE No 1011.8 1017.850 1020.40 1021.064 1024.150 1032.3
## 4 ENE No 1006.6 1018.000 1021.10 1021.084 1023.200 1035.7
## 5 E No 1010.7 1017.600 1022.35 1021.632 1025.350 1034.3
## 6 ESE No 1012.2 1016.975 1025.65 1023.789 1029.925 1033.6
## 7 SE No 1017.4 1021.575 1024.20 1023.967 1026.850 1029.5
## 8 SSE No 1007.7 1011.350 1019.50 1018.513 1026.000 1027.2
## 9 S No 1018.5 1020.800 1025.70 1023.967 1025.900 1029.0
## 10 SSW No 999.4 1020.900 1022.80 1019.720 1027.700 1027.8
## 11 SW No 1007.6 1011.050 1014.50 1015.933 1020.100 1025.7
## 12 WSW No 1013.1 1015.800 1018.50 1018.500 1021.200 1023.9
## 13 W No 1002.1 1013.750 1017.60 1017.371 1022.175 1032.9
## 14 WNW No 1010.5 1014.475 1020.00 1019.570 1022.750 1030.2
## 15 NW No 1003.2 1014.600 1018.75 1018.809 1023.750 1032.1
## 16 NNW No 1011.7 1017.800 1022.50 1021.074 1024.150 1031.0
## 17 N Yes 1012.9 1014.625 1016.35 1016.350 1018.075 1019.8
## 18 NNE Yes 1013.9 1013.900 1013.90 1013.900 1013.900 1013.9
## 19 NE Yes 1008.7 1010.225 1011.75 1011.750 1013.275 1014.8
## 20 ENE Yes 1007.6 1009.500 1010.00 1010.780 1012.400 1014.4
## 21 E Yes 1016.8 1018.600 1020.40 1020.433 1022.250 1024.1
## 22 ESE Yes 1010.0 1014.000 1014.60 1016.560 1017.600 1026.6
## 23 SSE Yes 1015.0 1017.475 1018.60 1020.100 1021.225 1028.2
## 24 S Yes 1010.1 1012.950 1015.50 1015.271 1017.300 1020.8
## 25 W Yes 1006.3 1008.000 1009.55 1012.150 1016.500 1021.2
## 26 WNW Yes 1004.0 1006.900 1010.30 1010.420 1013.900 1017.0
## 27 NW Yes 1004.9 1009.500 1016.70 1015.229 1019.200 1027.8
## 28 NNW Yes 996.5 1010.200 1015.80 1014.511 1018.100 1025.7
## 'data.frame': 28 obs. of 8 variables:
## $ wgd : Ord.factor w/ 16 levels "N"<"NNE"<"NE"<..: 1 2 3 4 5 6 7 8 9 10 ...
## $ rt : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
## $ Min. : num 1008 1016 1012 1007 1011 ...
## $ 1st Qu.: num 1019 1017 1018 1018 1018 ...
## $ Median : num 1023 1021 1020 1021 1022 ...
## $ Mean : num 1022 1023 1021 1021 1022 ...
## $ 3rd Qu.: num 1024 1029 1024 1023 1025 ...
## $ Max. : num 1032 1031 1032 1036 1034 ...
In ogni modo, con aggregate()
si possono ottenere misure aggregate su combinazioni di livelli di più variabili categoriali:
(res <- aggregate(x = wea[,c("Pressure9am","Pressure3pm")],
by = list(wgd=wea$WindGustDir, rt=wea$RainToday), FUN = summary))
## wgd rt Pressure9am.Min. Pressure9am.1st Qu. Pressure9am.Median
## 1 N No 1008.500 1019.450 1022.800
## 2 NNE No 1015.800 1017.350 1020.700
## 3 NE No 1011.800 1017.850 1020.400
## 4 ENE No 1006.600 1018.000 1021.100
## 5 E No 1010.700 1017.600 1022.350
## 6 ESE No 1012.200 1016.975 1025.650
## 7 SE No 1017.400 1021.575 1024.200
## 8 SSE No 1007.700 1011.350 1019.500
## 9 S No 1018.500 1020.800 1025.700
## 10 SSW No 999.400 1020.900 1022.800
## 11 SW No 1007.600 1011.050 1014.500
## 12 WSW No 1013.100 1015.800 1018.500
## 13 W No 1002.100 1013.750 1017.600
## 14 WNW No 1010.500 1014.475 1020.000
## 15 NW No 1003.200 1014.600 1018.750
## 16 NNW No 1011.700 1017.800 1022.500
## 17 N Yes 1012.900 1014.625 1016.350
## 18 NNE Yes 1013.900 1013.900 1013.900
## 19 NE Yes 1008.700 1010.225 1011.750
## 20 ENE Yes 1007.600 1009.500 1010.000
## 21 E Yes 1016.800 1018.600 1020.400
## 22 ESE Yes 1010.000 1014.000 1014.600
## 23 SSE Yes 1015.000 1017.475 1018.600
## 24 S Yes 1010.100 1012.950 1015.500
## 25 W Yes 1006.300 1008.000 1009.550
## 26 WNW Yes 1004.000 1006.900 1010.300
## 27 NW Yes 1004.900 1009.500 1016.700
## 28 NNW Yes 996.500 1010.200 1015.800
## Pressure9am.Mean Pressure9am.3rd Qu. Pressure9am.Max. Pressure3pm.Min.
## 1 1022.016 1024.350 1032.200 1006.100
## 2 1023.071 1029.450 1031.400 1011.600
## 3 1021.064 1024.150 1032.300 1007.400
## 4 1021.084 1023.200 1035.700 1003.300
## 5 1021.632 1025.350 1034.300 1008.900
## 6 1023.789 1029.925 1033.600 1008.700
## 7 1023.967 1026.850 1029.500 1017.100
## 8 1018.513 1026.000 1027.200 1006.500
## 9 1023.967 1025.900 1029.000 1014.800
## 10 1019.720 1027.700 1027.800 998.900
## 11 1015.933 1020.100 1025.700 1003.000
## 12 1018.500 1021.200 1023.900 1009.500
## 13 1017.371 1022.175 1032.900 997.500
## 14 1019.570 1022.750 1030.200 1006.500
## 15 1018.809 1023.750 1032.100 997.700
## 16 1021.074 1024.150 1031.000 1010.400
## 17 1016.350 1018.075 1019.800 1008.300
## 18 1013.900 1013.900 1013.900 1009.500
## 19 1011.750 1013.275 1014.800 1006.000
## 20 1010.780 1012.400 1014.400 1005.000
## 21 1020.433 1022.250 1024.100 1015.000
## 22 1016.560 1017.600 1026.600 1007.800
## 23 1020.100 1021.225 1028.200 1014.100
## 24 1015.271 1017.300 1020.800 1008.400
## 25 1012.150 1016.500 1021.200 1002.300
## 26 1010.420 1013.900 1017.000 1001.800
## 27 1015.229 1019.200 1027.800 1001.500
## 28 1014.511 1018.100 1025.700 996.800
## Pressure3pm.1st Qu. Pressure3pm.Median Pressure3pm.Mean Pressure3pm.3rd Qu.
## 1 1016.750 1019.100 1018.842 1021.950
## 2 1013.450 1019.200 1019.743 1026.300
## 3 1013.400 1017.150 1017.500 1020.400
## 4 1016.100 1018.600 1018.184 1020.000
## 5 1013.800 1018.450 1018.679 1022.750
## 6 1015.925 1023.450 1021.067 1026.900
## 7 1019.300 1021.950 1021.650 1023.500
## 8 1009.125 1015.450 1015.325 1022.050
## 9 1019.250 1022.700 1021.740 1024.950
## 10 1016.000 1019.300 1016.900 1024.800
## 11 1007.250 1011.500 1012.100 1016.650
## 12 1011.950 1014.400 1014.400 1016.850
## 13 1009.025 1014.650 1013.443 1018.900
## 14 1013.125 1016.950 1016.767 1020.400
## 15 1010.800 1014.700 1015.386 1019.850
## 16 1014.200 1018.000 1017.451 1020.650
## 17 1011.000 1013.700 1013.700 1016.400
## 18 1009.500 1009.500 1009.500 1009.500
## 19 1007.350 1008.700 1008.700 1010.050
## 20 1008.400 1009.100 1009.000 1011.000
## 21 1017.050 1019.100 1018.267 1019.900
## 22 1012.800 1014.900 1015.080 1016.800
## 23 1016.350 1017.800 1018.850 1020.300
## 24 1010.800 1014.500 1013.800 1016.250
## 25 1007.125 1008.250 1009.767 1012.450
## 26 1010.300 1012.700 1011.460 1014.900
## 27 1007.200 1013.700 1013.588 1018.200
## 28 1006.500 1013.400 1011.844 1014.100
## Pressure3pm.Max.
## 1 1026.900
## 2 1027.900
## 3 1028.900
## 4 1031.900
## 5 1031.700
## 6 1033.200
## 7 1027.400
## 8 1023.900
## 9 1026.300
## 10 1025.500
## 11 1021.800
## 12 1019.300
## 13 1028.900
## 14 1024.800
## 15 1029.600
## 16 1028.000
## 17 1019.100
## 18 1009.500
## 19 1011.400
## 20 1011.500
## 21 1020.700
## 22 1023.100
## 23 1025.700
## 24 1019.600
## 25 1019.200
## 26 1017.600
## 27 1024.300
## 28 1022.300
Con la funzione by()
si possono ottenere risultati simili a quelli ottenuti con aggregate()
:
by(data = wea[,c("Sunshine","Pressure9am","Pressure3pm")],
INDICES = list(wgd=wea$WindGustDir, rt=wea$RainToday),
FUN = summary)
## wgd: N
## rt: No
## Sunshine Pressure9am Pressure3pm
## Min. : 1.900 Min. :1008 Min. :1006
## 1st Qu.: 8.650 1st Qu.:1019 1st Qu.:1017
## Median : 9.900 Median :1023 Median :1019
## Mean : 9.374 Mean :1022 Mean :1019
## 3rd Qu.:11.100 3rd Qu.:1024 3rd Qu.:1022
## Max. :12.700 Max. :1032 Max. :1027
## -------------------------------------------------------------
## wgd: NNE
## rt: No
## Sunshine Pressure9am Pressure3pm
## Min. : 0.600 Min. :1016 Min. :1012
## 1st Qu.: 6.225 1st Qu.:1017 1st Qu.:1013
## Median : 7.800 Median :1021 Median :1019
## Mean : 7.300 Mean :1023 Mean :1020
## 3rd Qu.: 8.775 3rd Qu.:1029 3rd Qu.:1026
## Max. :12.800 Max. :1031 Max. :1028
## NA's :1
## -------------------------------------------------------------
## wgd: NE
## rt: No
## Sunshine Pressure9am Pressure3pm
## Min. : 0.800 Min. :1012 Min. :1007
## 1st Qu.: 9.200 1st Qu.:1018 1st Qu.:1013
## Median :10.750 Median :1020 Median :1017
## Mean : 9.636 Mean :1021 Mean :1018
## 3rd Qu.:11.625 3rd Qu.:1024 3rd Qu.:1020
## Max. :13.600 Max. :1032 Max. :1029
## -------------------------------------------------------------
## wgd: ENE
## rt: No
## Sunshine Pressure9am Pressure3pm
## Min. : 0.600 Min. :1007 Min. :1003
## 1st Qu.: 6.800 1st Qu.:1018 1st Qu.:1016
## Median : 9.600 Median :1021 Median :1019
## Mean : 8.456 Mean :1021 Mean :1018
## 3rd Qu.:10.200 3rd Qu.:1023 3rd Qu.:1020
## Max. :12.600 Max. :1036 Max. :1032
## -------------------------------------------------------------
## wgd: E
## rt: No
## Sunshine Pressure9am Pressure3pm
## Min. : 0.000 Min. :1011 Min. :1009
## 1st Qu.: 7.350 1st Qu.:1018 1st Qu.:1014
## Median : 9.250 Median :1022 Median :1018
## Mean : 8.626 Mean :1022 Mean :1019
## 3rd Qu.:11.450 3rd Qu.:1025 3rd Qu.:1023
## Max. :13.000 Max. :1034 Max. :1032
## -------------------------------------------------------------
## wgd: ESE
## rt: No
## Sunshine Pressure9am Pressure3pm
## Min. : 0.000 Min. :1012 Min. :1009
## 1st Qu.: 3.950 1st Qu.:1017 1st Qu.:1016
## Median : 7.500 Median :1026 Median :1023
## Mean : 6.517 Mean :1024 Mean :1021
## 3rd Qu.: 8.400 3rd Qu.:1030 3rd Qu.:1027
## Max. :12.500 Max. :1034 Max. :1033
## -------------------------------------------------------------
## wgd: SE
## rt: No
## Sunshine Pressure9am Pressure3pm
## Min. : 0.000 Min. :1017 Min. :1017
## 1st Qu.: 2.800 1st Qu.:1022 1st Qu.:1019
## Median : 7.350 Median :1024 Median :1022
## Mean : 5.808 Mean :1024 Mean :1022
## 3rd Qu.: 8.525 3rd Qu.:1027 3rd Qu.:1024
## Max. :11.200 Max. :1030 Max. :1027
## -------------------------------------------------------------
## wgd: SSE
## rt: No
## Sunshine Pressure9am Pressure3pm
## Min. : 0.800 Min. :1008 Min. :1006
## 1st Qu.: 5.575 1st Qu.:1011 1st Qu.:1009
## Median : 9.850 Median :1020 Median :1015
## Mean : 8.200 Mean :1019 Mean :1015
## 3rd Qu.:11.225 3rd Qu.:1026 3rd Qu.:1022
## Max. :13.300 Max. :1027 Max. :1024
## -------------------------------------------------------------
## wgd: S
## rt: No
## Sunshine Pressure9am Pressure3pm
## Min. : 2.700 Min. :1018 Min. :1015
## 1st Qu.: 5.600 1st Qu.:1021 1st Qu.:1019
## Median : 8.200 Median :1026 Median :1023
## Mean : 7.813 Mean :1024 Mean :1022
## 3rd Qu.:10.050 3rd Qu.:1026 3rd Qu.:1025
## Max. :12.100 Max. :1029 Max. :1026
## -------------------------------------------------------------
## wgd: SSW
## rt: No
## Sunshine Pressure9am Pressure3pm
## Min. :5.90 Min. : 999.4 Min. : 998.9
## 1st Qu.:5.90 1st Qu.:1020.9 1st Qu.:1016.0
## Median :6.70 Median :1022.8 Median :1019.3
## Mean :6.95 Mean :1019.7 Mean :1016.9
## 3rd Qu.:7.75 3rd Qu.:1027.7 3rd Qu.:1024.8
## Max. :8.50 Max. :1027.8 Max. :1025.5
## NA's :1
## -------------------------------------------------------------
## wgd: SW
## rt: No
## Sunshine Pressure9am Pressure3pm
## Min. :6.80 Min. :1008 Min. :1003
## 1st Qu.:6.85 1st Qu.:1011 1st Qu.:1007
## Median :6.90 Median :1014 Median :1012
## Mean :7.50 Mean :1016 Mean :1012
## 3rd Qu.:7.85 3rd Qu.:1020 3rd Qu.:1017
## Max. :8.80 Max. :1026 Max. :1022
## -------------------------------------------------------------
## wgd: WSW
## rt: No
## Sunshine Pressure9am Pressure3pm
## Min. :11.30 Min. :1013 Min. :1010
## 1st Qu.:11.38 1st Qu.:1016 1st Qu.:1012
## Median :11.45 Median :1018 Median :1014
## Mean :11.45 Mean :1018 Mean :1014
## 3rd Qu.:11.53 3rd Qu.:1021 3rd Qu.:1017
## Max. :11.60 Max. :1024 Max. :1019
## -------------------------------------------------------------
## wgd: W
## rt: No
## Sunshine Pressure9am Pressure3pm
## Min. : 0.200 Min. :1002 Min. : 997.5
## 1st Qu.: 6.550 1st Qu.:1014 1st Qu.:1009.0
## Median : 8.250 Median :1018 Median :1014.6
## Mean : 7.493 Mean :1017 Mean :1013.4
## 3rd Qu.: 9.275 3rd Qu.:1022 3rd Qu.:1018.9
## Max. :11.300 Max. :1033 Max. :1028.9
## -------------------------------------------------------------
## wgd: WNW
## rt: No
## Sunshine Pressure9am Pressure3pm
## Min. : 0.000 Min. :1010 Min. :1006
## 1st Qu.: 6.150 1st Qu.:1014 1st Qu.:1013
## Median : 8.050 Median :1020 Median :1017
## Mean : 7.737 Mean :1020 Mean :1017
## 3rd Qu.: 9.950 3rd Qu.:1023 3rd Qu.:1020
## Max. :13.000 Max. :1030 Max. :1025
## -------------------------------------------------------------
## wgd: NW
## rt: No
## Sunshine Pressure9am Pressure3pm
## Min. : 1.200 Min. :1003 Min. : 997.7
## 1st Qu.: 7.100 1st Qu.:1015 1st Qu.:1010.8
## Median : 8.900 Median :1019 Median :1014.7
## Mean : 8.534 Mean :1019 Mean :1015.4
## 3rd Qu.:10.400 3rd Qu.:1024 3rd Qu.:1019.9
## Max. :13.100 Max. :1032 Max. :1029.6
## -------------------------------------------------------------
## wgd: NNW
## rt: No
## Sunshine Pressure9am Pressure3pm
## Min. : 0.500 Min. :1012 Min. :1010
## 1st Qu.: 5.850 1st Qu.:1018 1st Qu.:1014
## Median : 9.200 Median :1022 Median :1018
## Mean : 8.394 Mean :1021 Mean :1017
## 3rd Qu.:10.550 3rd Qu.:1024 3rd Qu.:1021
## Max. :13.600 Max. :1031 Max. :1028
## -------------------------------------------------------------
## wgd: N
## rt: Yes
## Sunshine Pressure9am Pressure3pm
## Min. :7.200 Min. :1013 Min. :1008
## 1st Qu.:7.425 1st Qu.:1015 1st Qu.:1011
## Median :7.650 Median :1016 Median :1014
## Mean :7.650 Mean :1016 Mean :1014
## 3rd Qu.:7.875 3rd Qu.:1018 3rd Qu.:1016
## Max. :8.100 Max. :1020 Max. :1019
## -------------------------------------------------------------
## wgd: NNE
## rt: Yes
## Sunshine Pressure9am Pressure3pm
## Min. :12 Min. :1014 Min. :1010
## 1st Qu.:12 1st Qu.:1014 1st Qu.:1010
## Median :12 Median :1014 Median :1010
## Mean :12 Mean :1014 Mean :1010
## 3rd Qu.:12 3rd Qu.:1014 3rd Qu.:1010
## Max. :12 Max. :1014 Max. :1010
## -------------------------------------------------------------
## wgd: NE
## rt: Yes
## Sunshine Pressure9am Pressure3pm
## Min. :0.0 Min. :1009 Min. :1006
## 1st Qu.:2.2 1st Qu.:1010 1st Qu.:1007
## Median :4.4 Median :1012 Median :1009
## Mean :4.4 Mean :1012 Mean :1009
## 3rd Qu.:6.6 3rd Qu.:1013 3rd Qu.:1010
## Max. :8.8 Max. :1015 Max. :1011
## -------------------------------------------------------------
## wgd: ENE
## rt: Yes
## Sunshine Pressure9am Pressure3pm
## Min. : 0.00 Min. :1008 Min. :1005
## 1st Qu.: 0.40 1st Qu.:1010 1st Qu.:1008
## Median : 5.60 Median :1010 Median :1009
## Mean : 5.18 Mean :1011 Mean :1009
## 3rd Qu.: 9.70 3rd Qu.:1012 3rd Qu.:1011
## Max. :10.20 Max. :1014 Max. :1012
## -------------------------------------------------------------
## wgd: E
## rt: Yes
## Sunshine Pressure9am Pressure3pm
## Min. : 5.60 Min. :1017 Min. :1015
## 1st Qu.: 6.65 1st Qu.:1019 1st Qu.:1017
## Median : 7.70 Median :1020 Median :1019
## Mean : 8.30 Mean :1020 Mean :1018
## 3rd Qu.: 9.65 3rd Qu.:1022 3rd Qu.:1020
## Max. :11.60 Max. :1024 Max. :1021
## -------------------------------------------------------------
## wgd: ESE
## rt: Yes
## Sunshine Pressure9am Pressure3pm
## Min. : 0.30 Min. :1010 Min. :1008
## 1st Qu.: 0.60 1st Qu.:1014 1st Qu.:1013
## Median : 3.60 Median :1015 Median :1015
## Mean : 4.04 Mean :1017 Mean :1015
## 3rd Qu.: 5.10 3rd Qu.:1018 3rd Qu.:1017
## Max. :10.60 Max. :1027 Max. :1023
## -------------------------------------------------------------
## wgd: SE
## rt: Yes
## NULL
## -------------------------------------------------------------
## wgd: SSE
## rt: Yes
## Sunshine Pressure9am Pressure3pm
## Min. : 0.2 Min. :1015 Min. :1014
## 1st Qu.: 2.0 1st Qu.:1017 1st Qu.:1016
## Median : 4.4 Median :1019 Median :1018
## Mean : 4.9 Mean :1020 Mean :1019
## 3rd Qu.: 7.3 3rd Qu.:1021 3rd Qu.:1020
## Max. :10.6 Max. :1028 Max. :1026
## -------------------------------------------------------------
## wgd: S
## rt: Yes
## Sunshine Pressure9am Pressure3pm
## Min. : 0.900 Min. :1010 Min. :1008
## 1st Qu.: 6.050 1st Qu.:1013 1st Qu.:1011
## Median : 9.100 Median :1016 Median :1014
## Mean : 7.643 Mean :1015 Mean :1014
## 3rd Qu.: 9.700 3rd Qu.:1017 3rd Qu.:1016
## Max. :12.000 Max. :1021 Max. :1020
## -------------------------------------------------------------
## wgd: SSW
## rt: Yes
## NULL
## -------------------------------------------------------------
## wgd: SW
## rt: Yes
## NULL
## -------------------------------------------------------------
## wgd: WSW
## rt: Yes
## NULL
## -------------------------------------------------------------
## wgd: W
## rt: Yes
## Sunshine Pressure9am Pressure3pm
## Min. :0.000 Min. :1006 Min. :1002
## 1st Qu.:5.675 1st Qu.:1008 1st Qu.:1007
## Median :6.800 Median :1010 Median :1008
## Mean :6.150 Mean :1012 Mean :1010
## 3rd Qu.:8.375 3rd Qu.:1016 3rd Qu.:1012
## Max. :9.100 Max. :1021 Max. :1019
## -------------------------------------------------------------
## wgd: WNW
## rt: Yes
## Sunshine Pressure9am Pressure3pm
## Min. : 7.5 Min. :1004 Min. :1002
## 1st Qu.: 9.3 1st Qu.:1007 1st Qu.:1010
## Median : 9.7 Median :1010 Median :1013
## Mean :10.2 Mean :1010 Mean :1011
## 3rd Qu.:11.0 3rd Qu.:1014 3rd Qu.:1015
## Max. :13.5 Max. :1017 Max. :1018
## -------------------------------------------------------------
## wgd: NW
## rt: Yes
## Sunshine Pressure9am Pressure3pm
## Min. : 0.000 Min. :1005 Min. :1002
## 1st Qu.: 4.050 1st Qu.:1010 1st Qu.:1007
## Median : 7.800 Median :1017 Median :1014
## Mean : 6.619 Mean :1015 Mean :1014
## 3rd Qu.: 8.350 3rd Qu.:1019 3rd Qu.:1018
## Max. :11.800 Max. :1028 Max. :1024
## NA's :1
## -------------------------------------------------------------
## wgd: NNW
## rt: Yes
## Sunshine Pressure9am Pressure3pm
## Min. : 0.000 Min. : 996.5 Min. : 996.8
## 1st Qu.: 4.900 1st Qu.:1010.2 1st Qu.:1006.5
## Median : 6.000 Median :1015.8 Median :1013.4
## Mean : 6.556 Mean :1014.5 Mean :1011.8
## 3rd Qu.: 8.500 3rd Qu.:1018.1 3rd Qu.:1014.1
## Max. :13.200 Max. :1025.7 Max. :1022.3
Package più recenti (per es., dplyr
) permettono di sviluppare analisi per gruppo in maniera molto semplice e chiara:
require(dplyr)
(res1 <- wea %>%
group_by(WindGustDir, RainToday) %>%
summarise(count = n(),
mean_pressure9am = mean(Pressure9am),
mean_pressure3pm = mean(Pressure3pm)))
## # A tibble: 29 x 5
## # Groups: WindGustDir [17]
## WindGustDir RainToday count mean_pressure9am mean_pressure3pm
## <ord> <fct> <int> <dbl> <dbl>
## 1 N No 19 1022. 1019.
## 2 N Yes 2 1016. 1014.
## 3 NNE No 7 1023. 1020.
## 4 NNE Yes 1 1014. 1010.
## 5 NE No 14 1021. 1018.
## 6 NE Yes 2 1012. 1009.
## 7 ENE No 25 1021. 1018.
## 8 ENE Yes 5 1011. 1009
## 9 E No 34 1022. 1019.
## 10 E Yes 3 1020. 1018.
## # … with 19 more rows
Nell’esempio qui sopra, l’operatore di “pipe” %>%
serve per “passare al primo argomento della funzione alla sua destra” i valori che si trovano alla sua sinistra.
Pertanto, nell’esempio, il codice può essere così “tradotto”:
- prendi il data frame
wea
- passalo come primo argomento alla funzione
group_by()
, con cui dichiari che le successive operazioni dovranno essere eseguire per gruppi, definiti incrociando i valori delle colonneWindGustDir
eRainToday
- passa il risultato della precedente operazione come primo argomento alla funzione
summarise()
, che calcola il numero di osservazioni, il valore medio diPressure9am
e il valore medio diPressure3pm
- assegna tutto il risultato di questa catena di operazioni all’oggetto che chiamerai
res1
.
Infine, volendo calcolare frequenze, table()
ritorna la tabella delle frequenze per una o più variabili categoriali (incrociate). Se si desidera calcolare la tabella delle frequenze relative, si può applicare la funzione prop.table()
all’output di table()
. Col parametro margin
si può scegliere se calcolare frequenze relative di riga o di colonna:
##
## No Yes
## N 19 2
## NNE 7 1
## NE 14 2
## ENE 25 5
## E 34 3
## ESE 18 5
## SE 12 0
## SSE 8 4
## S 15 7
## SSW 5 0
## SW 3 0
## WSW 2 0
## W 14 6
## WNW 30 5
## NW 56 17
## NNW 35 9
##
## No Yes
## N 0.052341598 0.005509642
## NNE 0.019283747 0.002754821
## NE 0.038567493 0.005509642
## ENE 0.068870523 0.013774105
## E 0.093663912 0.008264463
## ESE 0.049586777 0.013774105
## SE 0.033057851 0.000000000
## SSE 0.022038567 0.011019284
## S 0.041322314 0.019283747
## SSW 0.013774105 0.000000000
## SW 0.008264463 0.000000000
## WSW 0.005509642 0.000000000
## W 0.038567493 0.016528926
## WNW 0.082644628 0.013774105
## NW 0.154269972 0.046831956
## NNW 0.096418733 0.024793388
##
## No Yes
## N 0.063973064 0.030303030
## NNE 0.023569024 0.015151515
## NE 0.047138047 0.030303030
## ENE 0.084175084 0.075757576
## E 0.114478114 0.045454545
## ESE 0.060606061 0.075757576
## SE 0.040404040 0.000000000
## SSE 0.026936027 0.060606061
## S 0.050505051 0.106060606
## SSW 0.016835017 0.000000000
## SW 0.010101010 0.000000000
## WSW 0.006734007 0.000000000
## W 0.047138047 0.090909091
## WNW 0.101010101 0.075757576
## NW 0.188552189 0.257575758
## NNW 0.117845118 0.136363636
##
## No Yes
## N 0.90476190 0.09523810
## NNE 0.87500000 0.12500000
## NE 0.87500000 0.12500000
## ENE 0.83333333 0.16666667
## E 0.91891892 0.08108108
## ESE 0.78260870 0.21739130
## SE 1.00000000 0.00000000
## SSE 0.66666667 0.33333333
## S 0.68181818 0.31818182
## SSW 1.00000000 0.00000000
## SW 1.00000000 0.00000000
## WSW 1.00000000 0.00000000
## W 0.70000000 0.30000000
## WNW 0.85714286 0.14285714
## NW 0.76712329 0.23287671
## NNW 0.79545455 0.20454545