3  Lab 2 - 08/03/2024

In questa lezione vedremo:

3.1 Importazione dei dati

Il file DatiRegioni.csv (disponibile in Moodle nella cartella Dati) contiene i dati già discussi durante la Lezione 2, ovvero 7 variabili per le 20 regioni italiane.

Si noti che un file di tipo .csv (che normalmente viene aperto con Excel) è di fatto un file di testo che può essere aperto con un editor di testo come TextNote, TextEdit o BloccoNote. In particolare, in Figura @fig:csv vengono mostrati i dati come se aperti con un editor di testo. in questo caso la virgola risulta essere il separatore di campo. Ciò può essere diverso in altri computer poichè dipende dal sistema operativo e dalla versione (inglese/italiana) di Excel.

File csv aperto con editor di testo

Ci sono 3 elementi che caratterizzano un file csv:

  • header (intestazione): la prima riga del file che contiene solitamente i nomi delle variabili;
  • il separatore di campo: il carattere utilizzato per separare le informazioni disponibili nel file (solitamente si utilizza il punto e virgola, la virgola, lo spazio o il tab);
  • il separatore decimale: il carattere utilizzato per i decimali (solitamente si usa la virgola o il punto, dipende anche dalla versione di Excel e del sistema operativo).

Dall’anteprima del file riportata in Figura @ref(fig:csv) si nota che:

  • le stringhe di testo riportate nella prima riga rappresentano i nomi delle variabili;
  • “,” è il separatore di campo;
  • “.” è il separatore decimale;
  • ci sono due variabili categoriali (regione e rip_geo).

Queste informazioni devono necessariamente essere specificate in R quando si importano dei dati da un file csv. La funzione che si utilizza è read.csv(...) (si veda eventualmente ?read.csv). Per facilitare l’import dei dati, in RStudio è disponibile una funzionalità user-friendly, si veda qui per maggiori informazioni. La funzionalità “Import Dataset” è disponibile nel pannello in alto a destra (Environment) (si veda la Figura Figure 3.1). Dopo aver scelto “From text (base)” è possibile specificare tutti i settaggi del file csv nella finestra “Import Dataset”, come riportato in Figura Figure 3.2.

Figure 3.1: La funzione Import Dataset di RStudio

Figure 3.2: Finestra per la definizione delle caratteristiche del file csv

Si noti che viene anche spuntata l’opzione “Strings as factors”. Questo permette di interpretare tutte le variabili categoriali in maniera corretta (ovvero come “fattori” secondo le regole di R). Dopo aver cliccato su Import si verificano tre cose:

  1. un oggetto di nome dati viene creato nell’ambiente di lavoro (si veda il pannello in alto a destra). E’ un nuovo oggetto di tipo dataframe,
  2. viene aperta nel pannello in alto a sinistra una nuova tab che riporta la preview dei dati,
  3. nella Console (pannello in basso a sinistra) viene riportato il codice utilizzato, tramite la funzionalità user-friendly, per importare i dati. Esso è riportato qui di seguito:
dati <- read.csv("./data/DatiRegioni.csv", stringsAsFactors = T)

dove ovviamente il percorso riportato tra virgolette dipende dalla posizione del file nel proprio PC. Si consiglia di copiare questa linea di codice nello script in uso. Ciò permetterà successivamente di importare i dati usando direttamente il codice (in modo più veloce) e non la funzionalità Import Dataset di RStudio.

L’oggetto dati è un oggetto di tipo data.frame:

class(dati)
[1] "data.frame"

I data frame sono matrici di dati le cui righe si riferiscono ai soggetti (in questo caso alle regioni) e le colonne alle variabili.

Utilizzando la funzione str si ottengono informazioni circa la tipologia delle variabili incluse nel data frame:

str(dati)
'data.frame':   20 obs. of  7 variables:
 $ regione      : Factor w/ 20 levels "ABRUZZO","BASILICATA",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ rip_geo      : Factor w/ 5 levels "Centro","Isole",..: 5 5 5 5 4 4 1 3 3 1 ...
 $ n_allevamenti: int  9442 711 10749 17774 2947 1818 11459 247 6625 4776 ...
 $ n_capi       : int  61549 66830 52765 83602 1007333 244449 40649 443 4070097 103527 ...
 $ pop          : int  1272627 537577 1846610 5609536 4437578 1194248 5720536 1507636 9976509 1484298 ...
 $ superf       : num  10832 10073 15222 13671 22501 ...
 $ zona_alt     : int  1 1 4 3 5 5 3 1 5 4 ...

Si noti che regione e rip_geo sono interpretate come factor, ovvero variabili categoriali, mentre tutte le altre variabili come caratteri quantitativi. Attenzione a zona_alt: viene interpretato come variabile numerica ma noi in realtà sappiamo che 1=Montagna interna; 2=Montagna litoranea; 3=Collina interna; 4=Collina litoranea; 5=Pianura. Sarà in questo caso necessario fare una ricodifica.

Utilizzando le funzioni head e tail è possibile ottenere visualizzare la parte superiore e inferiore del data frame:

head(dati) #prime 6 righe in alto
                regione      rip_geo n_allevamenti  n_capi     pop   superf
1               ABRUZZO          Sud          9442   61549 1272627 10831.50
2            BASILICATA          Sud           711   66830  537577 10073.11
3              CALABRIA          Sud         10749   52765 1846610 15221.61
4              CAMPANIA          Sud         17774   83602 5609536 13670.60
5        EMILIA ROMAGNA Nord-Orient.          2947 1007333 4437578 22501.43
6 FRIULI VENEZIA GIULIA Nord-Orient.          1818  244449 1194248  7932.48
  zona_alt
1        1
2        1
3        4
4        3
5        5
6        5
tail(dati) #ultime 6 righe in basso 
               regione      rip_geo n_allevamenti n_capi     pop   superf
15             SICILIA        Isole          1867  62517 4814016 25832.55
16             TOSCANA       Centro          4611 125463 3661981 22987.44
17 TRENTINO-ALTO ADIGE Nord-Orient.          3076  10181 1077143 13604.72
18              UMBRIA       Centro          4648 187487  856407  8464.22
19       VALLE D'AOSTA    Nord-Occ.            96    118  123130  3260.85
20              VENETO Nord-Orient.          8092 730501 4849553 18345.37
   zona_alt
15        3
16        3
17        1
18        3
19        1
20        5

Per ottenere informazioni circa le dimensioni del data frame (numero di righe e colonne) si possono utilizzare le seguenti funzioni alternative:

nrow(dati) #n. di righe
[1] 20
ncol(dati) #n. di colonne
[1] 7

3.2 Analisi esplorative su singole variabili

Nel dataframe ogni colonna contiene una variabile, ovvero un vettore i cui valori possono essere estratti usando l’operatore $. Ad esempio,

dati$regione
 [1] ABRUZZO               BASILICATA            CALABRIA             
 [4] CAMPANIA              EMILIA ROMAGNA        FRIULI VENEZIA GIULIA
 [7] LAZIO                 LIGURIA               LOMBARDIA            
[10] MARCHE                MOLISE                PIEMONTE             
[13] PUGLIA                SARDEGNA              SICILIA              
[16] TOSCANA               TRENTINO-ALTO ADIGE   UMBRIA               
[19] VALLE D'AOSTA         VENETO               
20 Levels: ABRUZZO BASILICATA CALABRIA CAMPANIA ... VENETO

restuisce il vettore con tutti i nomi di regione.

Per calcolare la distribuzione di frequenza della variabile rip_geo si utilzza la funzione table:

table(dati$rip_geo) 

      Centro        Isole    Nord-Occ. Nord-Orient.          Sud 
           4            2            4            4            6 

Si ottiene un output che riporta le 5 categorie della variabile e le corrispondente frequenze assoluta \(n_i\). La moda (si veda la teoria in MAD2324_Lez3.pdf) è la categoria che si presenta maggiormente (con la frequenza maggiore): in questo caso la modalità SUD rappresenta la moda avendo essa il maggior numero di regioni (6). E’ anche possibile calcolare le frequenze relative \(f_i=\frac{n_i}{n}\) andando a dividere le frequenze assolute per il numero totale di unità statistiche (\(n=20\)). Quest’ultime corrispondono al numero di righe del dataframe e si possono ricavare con la funzione nrow:

nrow(dati)
[1] 20
# distr. di frequenza con frequenze relative
table(dati$rip_geo)/nrow(dati)

      Centro        Isole    Nord-Occ. Nord-Orient.          Sud 
         0.2          0.1          0.2          0.2          0.3 
# distr. di frequenza con frequenze percentuali
table(dati$rip_geo)/nrow(dati)*100

      Centro        Isole    Nord-Occ. Nord-Orient.          Sud 
          20           10           20           20           30 

Il 30% delle regioni italiane si trova al Sud.

Si noti che ha senso calcolare la distribuzione di frequenza quando il numero di modalità univoche è ridotte (5 nel caso precedente). Provando a calcolare la distribuzione di frequenza per la variabile n_allevamenti si otterrebbe quanto segue:

table(dati$n_allevamenti)

   96   247   711   785  1635  1818  1867  2947  3076  3533  4611  4648  4776 
    1     1     1     1     1     1     1     1     1     1     1     1     1 
 6625  8092  9442 10749 11459 11889 17774 
    1     1     1     1     1     1     1 

E’ evidente che ogni modalità (numerica) si presenta solamente una volta (tutte le \(n_i\) sono pari a 1) e quindi la distribuzione di frequenza non ha effettuato la sintesi sperata. In tal caso è necessario creare delle classi di valori prima di calcolare la distribuzione di frequenza.

Si consideri ora la variabile n_allevamenti. Per il calcolo del numero totale di allevamenti in Italia si utilizza la funzione somma:

sum(dati$n_allevamenti)
[1] 106780

Volendo equidistribuzione (in maniera del tutto ipotetica) il numero di allevamenti tra le 20 regioni si otterrebbe il seguente valore:

sum(dati$n_allevamenti) / nrow(dati) 
[1] 5339

che di fatto corrisponde con la media aritmetica del carattere:

mean(dati$n_allevamenti)
[1] 5339

La media aritmetica è infatti quell’indice che mantiene inalterato il totale del fenomeno (106780 allevamenti) qualora il valore di ogni regione venisse sostituito con la media.

Un altro indice di interesse è la mediana (si veda la teoria in MAD2324_Lez3.pdf) che può essere calcolata con la funzione median:

median(dati$n_allevamenti)
[1] 4072

Ciò ci dice che almeno il 50% delle regioni (in particolare 10 regioni su 20) ha un numero di allevamenti minore o uguale a 4072. Analogamente almeno il 50% delle regioni (in particolare 10 regioni su 20) ha un numero di allevamenti maggiore o uguale a 4072.

3.3 Esercizi Lab 2

3.3.1 Esercizio 1

Si considerino nuovamente i dati disponibili nel file DatiRegioni.csv. Calcolare quanto segue:

  1. il totale della popolazione residente in Italia.
  2. la superficie totale dell’Italia.
  3. Il numero medio e mediano di abitanti per regione. Interpretare i valori.
  4. La superficie media e mediana per regione. Interpretare i valori.

3.3.2 Esercizio 2

Si consideri il file Excel Classificazioni statistiche-e-dimensione-dei-comuni_31_12_2023.xlsx fornito da Istat. Si noti che è composta da tre fogli di lavoro (il primo contiene i dati, il secondo la loro descrizione).

Effettuare le seguenti operazioni:

  1. aprire il file con Excel.
  2. Nel primo foglio di lavoro (Comuni 31-12-2023) cambiare il nome delle colonne usando i seguenti nomi: codreg, codcom, nomecom, sup, pop, zona_alt, alt, lito, isol, cost, urban.
  3. Togliere il separatore delle migliaia utilizzato per alcune delle variabili numeriche.
  4. Eliminare gli altri due fogli di lavoro e salvare il file in formato csv. Chiamare il file DatiCom.csv .
  5. Importare il file in RStudio creando un oggetto di nome daticom (ignorare gli eventuali messaggi di warning dovuti ai comuni con nome accentato). Quante righe e quante colonne ha il dataframe?
  6. Controllare la natura delle variabili nel dataframe daticom (in base alla loro conoscenza preliminare).
  7. Ricavare la distribuzione di frequenza della variabile codreg (eventualmente vedere qui per i nomi e codici delle regioni). Calcolare, se possibile, la moda, la media e la mediana.
  8. Ricavare la distribuzione di frequenza della variabile zona_alt (anche includendo le frequenze percentuali). Calcolare, se possibile, la moda, la media e la mediana.
  9. Ricavare la distribuzione di frequenza della variabile alt. Calcolare, se possibile, la moda, la media e la mediana.