---
title: "Analisi Descrittiva: un caso"
author: "Stefano Bussolon"
date: "12 ottobre 2018"
output:
  html_document: default
  md_document:
    variant: markdown_github
  pdf_document: default
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```


## Esercizio

In questo esercizio caricheremo un file di dati, in formato tsv (valori separati da tab), puliremo il data.frame, e faremo alcune analisi descrittive sui dati.


```{r desc_partecipanti_01}
partecipanti <- read.delim("https://s3.eu-central-1.amazonaws.com/bussolon/dati/parole_nonparole.tsv")

```

Controllo

* la dimensione della tabella (righe e colonne)
* i nomi delle righe

Ci si aspetta che le righe corrispondano alle osservazioni (in questo caso, i partecipanti), mentre le colonne sono le variabili.

```{r desc_partecipanti_02}
dim(partecipanti)
names(partecipanti)
str(partecipanti)
```

Se non altrimenti specificato, le funzioni `read.[table|csv|delim]` tendono a considerare le colonne stringa come fattori (`stringsAsFactors = TRUE`). Nel caso della variabile `sex` questo è corretto. Nel caso di `professione` è formalmente corretto, ma in pratica i dati sono talmente sporchi (perché raccolti via internet con una domanda a risposta aperta) che ci ritroviamo con `r length(levels(partecipanti$professione))` `livelli`.
Nel caso della variabile `Data` la trasformazione in fattore è del tutto sbagliata.



```{r desc_summary_partecipanti}
summary(partecipanti)
```

I dati erano stati raccolti su internet, attraverso una servlet java. Nel caso della variabile `sex`, i dati mancanti erano stati contrassegnati con la stringa `null`. Pertanto, è necessario trasformare i `sex == null` in `NA`.

```{r desc_partecipanti_sex}
partecipanti$sex[partecipanti$sex=='null'] <- NA
levels(partecipanti$sex)
## per togliere il livello "null", che ora è vuoto
## [r - Drop factor levels in a subsetted data frame - Stack Overflow](https://stackoverflow.com/questions/1195826/drop-factor-levels-in-a-subsetted-data-frame)

partecipanti$sex <- factor(partecipanti$sex)
levels(partecipanti$sex)
# in alternativa https://stackoverflow.com/a/17218028/1042167
# y <- droplevels(y)
```

Nonostante la trasformazione dei `null` in `NA`, il fattore mantiene il livello `null`, anche se con 0 elementi.
Per pulire i livelli, è necessario ri-applicare la funzione `factor()` alla colonna da pulire.


## Scolarità

La scolarità dei partecipanti era stata codificata con un numero che corrispondeva agli anni:

* 5: elementari
* 8: scuole dell'obbligo
* 13: diploma
* 16: laurea triennale
* 18: laurea magistrale

Questa variabile, però, non è propriamente numerica, e può costituire un fattore su cui fare alcune analisi.
Più in particolare può essere interessante capire se vi è un rapporto fra scolarità e numero di risposte corrette.

### Trasformare in fattore

Per poter fare questo tipo di analisi, è opportuno trasformare questa variabile da numerica (int) ad un fattore. La funzione per operare questa trasformazione è `as.factor()`.

```{r desc_partecipanti_scol}
partecipanti$scol <- as.factor(partecipanti$scol)
levels(partecipanti$scol)
levels(partecipanti$scol) <- c("elementari", "medie","diploma","triennale","magistrale")

as.integer(partecipanti$scol)[1:20] # i primi 20 elementi

summary(partecipanti$scol)
(quant_scol <- quantile(as.integer(partecipanti$scol), na.rm = TRUE))
levels(partecipanti$scol)[quant_scol]

```


## Le date

Attraverso la funzione `strptime(stringa, formato)` possiamo fare il parsing della colonna data, rendendo esplicito il formato da utilizzare, ed otterremo un vettore di date.

```{r desc_as_date}

partecipanti$Data <- strptime(partecipanti$Data, format = "%Y/%m/%d %H:%M:%S")
summary(partecipanti$Data)

```

```{r desc_professione}

partecipanti$professione[partecipanti$professione=="XX"] <- NA
str(partecipanti$professione)
partecipanti$professione <- as.character(tolower(partecipanti$professione))

```

Nella colonna `professione`, i dati mancanti erano contrassegnati con i caratteri `XX`. Attraverso il filtro, abbiamo trasformato `XX` in `NA`.

Essendo questo un campo a testo libero, alcune persone scrivevano tutto minuscolo, altre maiuscolo. Per semplificare le cose, abbiao trasformato i valori in minuscolo, con la funzione `tolower()`.

### Boxplot

Una modalità efficace per valutare visivamente se ci sono delle differenze fra diversi gruppi è utilizzando i grafici [Box plot](https://en.wikipedia.org/wiki/Box_plot).

Ad esempio, potremmo chiederci se vi è una relazione fra scolarità e numero di risposte corrette.

```{r desc_caso_boxplot1}
boxplot(partecipanti$corrette ~ partecipanti$scol)

```


Il grafico boxplot permette di visualizzare la mediana e la distanza interquartilica (ovvero fra il primo ed il terzo quartile). Permette inoltre di stimare la varianza (attraverso i *baffi*) e gli eventuali *outlier*, ovvero delle osservazioni che si discostano in maniera evidente dalla distribuzione.
Dal grafico si può osservare che vi sono numerosi dati anomali. Nel test i partecipanti dovevano fare un numero di scelte vero o falso su 50 item. Chi rispondeva a caso aveva il 50% di probabilità di rispondere correttamente. Tutti i punteggi inferiori a 20 risultano dunque *sospetti*.
L'ipotesi più plausibile è che quei punteggi rappresentino dei soggetti che avevano fatto molte omissioni (ovvero risposto soltanto ad alcuni dei 50 item).

Per valutare questa ipotesi, possiamo verificare la colonna *risposte*.

```{r desc_caso_hist_risposte}
hist(partecipanti$risposte)
```
L'istogramma della variabile `risposte` lascia intendere che sebbene la maggior parte dei partecipanti abbia risposto ad almeno 40 delle 50 domande, alcuni hanno fatto un numero di omissioni più alto. Per avere una misura dei partecipanti che hanno risposto a meno di 40 domande, possiamo usare un filtro (`partecipanti$risposte>40`) e la funzione `table()`

```{r desc_caso_table_risposte}
table(partecipanti$risposte>=40)
```

Su `r dim(partecipanti)[1]` partecipanti, `r table(partecipanti$risposte>40)[1]` hanno risposto a meno di 40 domande.


```{r desc_caso_risposte_corrette1}
plot(partecipanti$risposte, partecipanti$corrette, col = as.factor(partecipanti$risposte<40))
```

Il grafico conferma la nostra ipotesi: i punteggi più bassi corrispondono a quei partecipanti che hanno risposto a meno domande.

Attraverso il parametro `col = as.factor(partecipanti$risposte<40)` abbiamo colorato i punti del plot in base alla soglia delle 40 risposte.


## Filtrare i partecipanti

A questo punto, possiamo decidere di considerare validi solo i partecipanti che hanno risposto ad almeno 40 domande.

```{r desc_caso_validi}
partecipanti_validi <- partecipanti[partecipanti$risposte>=40,]
dim(partecipanti_validi)
```

Il nuovo data frame ha ancora `r dim(partecipanti_validi)[2]` colonne, e `r dim(partecipanti_validi)[1]` righe.

Per verificare la distribuzione di risposte date e risposte corrette, possiamo fare il plot sul nuovo data frame.

```{r desc_caso_plot_validi}
plot(partecipanti_validi$risposte, partecipanti_validi$corrette)
```

Come prevedibile, nel nuovo data frame il numero minimo di risposte corrette è `r min(partecipanti_validi$corrette)`.

Creiamo il boxplot corrette ~ scol sul nuovo data frame.

```{r desc_caso_boxplot_validi}
boxplot(partecipanti_validi$corrette ~ partecipanti_validi$scol)
```

## Attach

Per evitare di ripetere ogni volta il nome del data frame, possiamo utilizzare la funzione `attach ()`, che ci permette di richiamare direttamente i nomi delle variabili del data frame. 

```{r desc_caso_summary_scol}
## summary(scol) ---> Error in summary(scol) : oggetto "scol" non trovato
attach(partecipanti_validi)
summary(scol)
```

## Analisi delle variabili nominali

Possiamo calcolare la frequenza attraverso la funzione table().

```{r desc_caso_tabella_sex}
(freq_sex <- table (sex))
freq_sex / sum(freq_sex) # frequenza
prop.table(freq_sex)     # = freq_sex / sum(freq_sex)
```

### Grafici su variabili nominali


La funzione barplot mi permette di fare un grafico a barre.

```{r desc_caso_barplot_sex}
barplot (freq_sex)
```


pie è una funzione che permette di generare dei grafici a torta. I grafici a torta vanno usati con una certa parsimonia. 
Nel caso di un fattore con due livelli, come in questo caso, il grafico a torta può dare un'idea visiva della frequenza nei due generi.

```{r desc_caso_pie_sex}
pie(freq_sex)
```


### Calcolo della moda

```{r desc_caso_moda_sex}
t_sex<-table(sex)
(mode_sex<-which(t_sex == max(t_sex)))
sex[mode_sex]
t_sex[mode_sex]
```

### Scolarità

```{r desc_caso_barplot_scol}
freq_scol <- table (scol)
freq_scol
prop.table(freq_scol)
barplot (freq_scol)
barplot (freq_scol, beside = TRUE)

```

### Calcolo della moda

```{r desc_caso_moda_scol}
t_scol<-tabulate(scol)
mode_scol<-which(t_scol == max(t_scol))
mode_scol
scol[mode_scol]
t_scol[mode_scol]
```


## Distribuzione delle risposte corrette

attraverso `hist()` possiamo visualizzare la distribuzione di variabili a intervalli o a rapporti.
Usiamola per visualizzare la distribuzione di risposte corrette.

```{r desc_caso_hist_corrette}
hist(partecipanti_validi$corrette)
```

Una alternativa, per le variabili numeriche, è utilizzare la funzione `plot(density())`.

```{r desc_caso_density_corrette}
plot(density(partecipanti_validi$corrette))
```

`fivenum()` è la versione sintetica di `summary()`.

```{r desc_caso_fivenum}
fivenum(partecipanti_validi$corrette)
summary(partecipanti_validi$corrette)
```

# Esercizio

1. Visualizzare graficamente la relazione fra sesso e risposte corrette
2. Creare la tabella di contingenza sesso * scolarità
3. Visualizzare graficamente la relazione fra sesso e scolarità
4. Visualizzare graficamente la relazione fra età e risposte corrette
   4.1 Valutare la possibilità che ci siano dei dati *sporchi* in riferimento all'età riferita
5. Creare un grafico a torta della variabile scolarità

```{r desc_caso_esercizi, echo=FALSE, eval=FALSE}

boxplot(partecipanti_validi$corrette ~ partecipanti_validi$sex)
sex_scol <- table(partecipanti_validi$sex, partecipanti_validi$scol)
mosaicplot(sex_scol)
plot(partecipanti_validi$age,partecipanti_validi$corrette)
pie(table(partecipanti_validi$scol))
barplot(sex_scol, beside=TRUE, legend = rownames(sex_scol), col=c("blue","cyan"))

```




