knitr::opts_chunk$set(echo = TRUE)
#Operazioni preliminari
#Imposto la directory di lavoro e importo le librerie necessarie
setwd("C:/Users/Laura/Drive/PROGRAMMAZIONE/MASTER DATA SCIENCE/codice/modulo 02 - statistica-descrittiva-per-datascience/progetto finale")

library(rmarkdown)
library(ggplot2)
library(dplyr)
## 
## Caricamento pacchetto: 'dplyr'
## I seguenti oggetti sono mascherati da 'package:stats':
## 
##     filter, lag
## I seguenti oggetti sono mascherati da 'package:base':
## 
##     intersect, setdiff, setequal, union
library(labstatR)
## labstatR 1.0.13
## Insieme di funzioni di supporto al volume
## 'Laboratorio di Statistica con R'
## Iacus-Masarotto, MacGraw-Hill Italia, 2006.
## Si veda 'library(help="labstatR")' per i comandi disponibili.
## Nota: 'mean.a', 'mean.g' e 'hist.pf' sono state sostituite rispettivamente da 'meana', 'meang' e 'histpf'
library(moments)
library(tidyr)
library(gghalves)
library(kableExtra)
## 
## Caricamento pacchetto: 'kableExtra'
## Il seguente oggetto è mascherato da 'package:dplyr':
## 
##     group_rows
library(extrafont)
## Registering fonts with R
library(flextable)
## 
## Caricamento pacchetto: 'flextable'
## I seguenti oggetti sono mascherati da 'package:kableExtra':
## 
##     as_image, footnote
library(lubridate)
## 
## Caricamento pacchetto: 'lubridate'
## I seguenti oggetti sono mascherati da 'package:base':
## 
##     date, intersect, setdiff, union
library(knitr)

Task

Importa il dataset “Real Estate Texas.csv”, contenente dei dati riguardanti le vendite di immobili in Texas.

vendite <- read.csv("realestate_texas.csv", sep = ",")

Le variabili year e month sono espresse in numeri. Se non facciamo alcuna operazione su di esse le funzioni di R le considererebbero come variabili quantitative ma nella nostra analisi le utilizzeremo come le corrispondenti variabili qualitative. Per renderlo possibile applichiamo la funzione factor alle rispettive colonne e sovrascriviamo i risultati.

vendite$year <- factor(vendite$year)
vendite$month <- factor(vendite$month)

Estraggo le colonne dal dataframe vendite in modo da non dover richiamare tutte le volte il riferimento e usare il simbolo dollaro

attach(vendite)

Le variabili del dataset sono:

- city: città
- year: anno di riferimento
- month: mese di riferimento
- sales: numero totale di vendite
- volume: valore totale delle vendite in milioni di dollari
- median_price: prezzo mediano di vendita in dollari
- listings: numero totale di annunci attivi
- months_inventory: quantità di tempo necessaria per vendere tutte le inserzioni correnti al ritmo attuale delle vendite, espresso in mesi.

Ecco cosa contiene il dataset

head(vendite,5)

1. Indica il tipo di variabili contenute nel dataset. (Attenzione alle variabili che sottintendono il tempo e a come vengono trattate!)

Il dataframe contiene 8 colonne, ognuna corrispondente a una variabile:

  • city: città (variabile qualitativa su base nominale)
  • year: anno di riferimento (variabile quantitativa discreta, qualitativa ordinale (ordinata rettilinea))
  • month: mese di riferimento (variabile qualitativa ordinata ciclica)
  • sales: numero totale di vendite (variabile quantitativa discreta)
  • volume: valore totale delle vendite in milioni di dollari (variabile quantitativa continua)
  • median_price: prezzo mediano di vendita in dollari (variabile quantitativa continua)
  • listings: numero totale di annunci attivi (variabile quantitativa discreta)
  • months_inventory: quantità di tempo necessaria per vendere tutte le inserzioni correnti al ritmo attuale delle vendite, espresso in mesi. (variabile quantitativa su scala di rapporti)

2. Calcola Indici di posizione, variabilità e forma per tutte le variabili per le quali ha senso farlo, per le altre crea una distribuzione di frequenza. Commenta tutto brevemente.

Gli indici di posizione sono:

  • moda (ottenibile con la funzione table(), per variabili quanlitative, quantitative discrete o quantitative suddivise in classi): è la modalità con la frequenza osservata più alta (momento primo della distribuzione)
  • minimo e massimo, mediana, media aritmetica, quartili (tutti ottenibili con la funzione summary())
    • minimo e massimo: valori minimo e massimo osservati
    • media aritmetica: si calcola sommando tutti i valori delle variabili quantitative e dividendo tale somma per il numero dei valori
    • quartili: sono quei tre valori della serie ordinata di dati che suddividono la serie stessa in 4 parti uguali. il 25esimo, il 50esimo (o mediana) e il 75esimo percentile
    • mediana: è il 50esimo percentile, viene calcolata per variabili quantitative o per qualitative ordinali ordinando i dati in modo crescente e prendendo il valore che sta esattamente in mezzo alla serie (momento secondo della distribuzione)
  • media ponderata (è la media che si utilizza nel caso di dati divisi in classi, si ottiene con la funzione weighted.mean(). La media aritmetica sui dati non suddivisi in classi rimane sempre più precisa)
  • media geometrica (ottenibile con la funzione meang() della library labstatR) è utile solo per dati che rappresentano delle variazioni di un fenomeno nel tempo (di solito in valori percentuali), non va utilizzata in caso di zeri o valori negativi
  • media armonica (ottenibile con la funzione meana() della library labstatR) è appropriato utilizzarla solo quando i dati rappresentano dei rapporti o delle velocità

Gli indici di variabilità sono:

  • range (ottenibile con la funzione range(), per variabili quantitative): è la differenza tra il massimo e il minimo
  • differenza interquartile (ottenibile con la funzione IQR(), per variabili quantitative): è la differenza tra il 75esimo e il 25esimo percentile. Rappresenta l’intervallo di variazione del 50% dei dati ed è utile perchè non risente della presenza di outlier
  • varianza (ottenibile con la funzione var(), per variabili quantitative): misura quanto i dati siano variabili rispetto alla media aritmetica
  • deviazione standard (ottenibile con la funzione sd(), per variabili quantitative): è la radice quadrata della varianza, è un indice di variabilità nella stessa unità di misura dei dati osservati
  • coefficiente di variazione (ottenibile con la funzione cv() della library labstatR, per variabili quantitative): permette di confrontare la variabilità di un campione rispetto a due diverse variabili o di due campioni rispetto alla stessa variabile, non va utilizzato se la variabile assume valori sia positivi che negativi o se c’è uno zero convenzionale nella scala di misura.
  • indice di eterogeneità di Gini (ottenibile con la funzione E() della library labstatR): misura la propensione di una variabile qualitativa ad assumere le sue diverse modalità (considera la distribuzione di frequenze). Se è zero abbiamo eterogeneità nulla o omogeneità (massima concentrazione). Se è 1 abbiamo eterogeneità massima o equidistribuzione.

Gli indici di forma sono:

  • indice di asimmetria di Fisher (ottenibile con la funzione skewness() della library moments): è dato dal momento terzo della distribuzione diviso la deviazione standard al cubo. Può essere uguale a 0 (distribuzione simmetrica, media = mediana = moda), maggiore di 0 (distribuzione asimmetrica positiva, coda a destra, media > mediana > moda), minore di 0 (distribuzione asimmetrica negativa, coda a sinistra, media < mediana < moda)
  • curtosi (ottenibile con la funzione kurtosis() della library moments oppure kurt() della libreria labstatR alla quale va sottratto il valore 3): è una misura dello schiacciamento/allungamento della forma di una distribuzione rispetto alla distribuzione normale. Abbiamo la leptocurtosi se è > 0 (risulta più allungata), platicurtosi se è < 0 (risulta più schiacciata), mesocurtosi se è = 0.

Gli indici di posizione (fatta eccezione della moda), variabilità e forma sono calcolabili per le variabili quantitative: sales, volume, median_price, listings, months_inventory.

#Creo una funzione per riassumere tutti gli indici di posizione, variabilità e forma che desidero calcolare
indici_uniti <- function(variabile){
#posizione
  var_summary <- summary(variabile)
  var_names <- names(var_summary)
  var_summary <- unname(var_summary)
  s = t(data.frame(as.numeric(var_summary)))
#variabilità
  r = range(variabile)[2]-range(variabile)[1]
  iqr = IQR(variabile)
  var = var(variabile)
  dev_stand = sd(variabile)
  coeff_var = dev_stand/mean(variabile)*100
#forma
  fisher = skewness(variabile)
  curtosis = kurt(variabile) - 3
  indici = cbind(s, r, iqr, var, dev_stand, coeff_var, fisher, curtosis)
  colonne <- c("Minimo", "1° Quartile", "Mediana", "Media aritmetica", 
               "3° Quartile", "Massimo", "Range", "Interquartile Range o IQR", 
               "Varianza", "Deviazione standard", "Coefficiente di variazione", 
               "Indice di asimmetria di Fisher", "Curtosi")
  matrice=matrix(data=round(indici, 2),
                 nrow=1,
                 ncol=13,
                 dimnames = list(NULL, colonne))
  return(matrice)
}
#Creo una funzione per riassumere tutti gli indici di posizione, variabilità e forma che desidero calcolare senza intestazioni di colonna
indici_uniti_no_intestazione <- function(variabile){
#posizione
  var_summary <- summary(variabile)
  var_names <- names(var_summary)
  var_summary <- unname(var_summary)
  s = t(data.frame(as.numeric(var_summary)))
#variabilità
  r = range(variabile)[2]-range(variabile)[1]
  iqr = IQR(variabile)
  var = var(variabile)
  dev_stand = sd(variabile)
  coeff_var = dev_stand/mean(variabile)*100
#forma
  fisher = skewness(variabile)
  curtosis = kurt(variabile) - 3
  indici = cbind(s, r, iqr, var, dev_stand, coeff_var, fisher, curtosis)
  matrice=matrix(data=round(indici, 2),
                 nrow=1,
                 ncol=13)
  return(matrice)
}

Creo una funzione tabella da utilizzare per rappresentare uniformemente i dati

tabella <- function(variabile, variabile2){
  return(knitr::kable(x=variabile, "html", caption = variabile2, digits = 2, booktabs=TRUE, linesep = "", longtable = FALSE) %>%
           kable_styling(fixed_thead = T, bootstrap_options = c("striped", "hover"), latex_options = "HOLD_position")  %>%
           kable_classic(latex_options="scale_down", full_width=FALSE, html_font="Calibri"))
}

e la relativa trasposta

tabella_trasposta <- function(variabile, variabile2){
  return(knitr::kable(x=t(variabile), "html", caption = variabile2, digits = 2, booktabs=TRUE, linesep = "", longtable = FALSE) %>%
           kable_styling(fixed_thead = T, bootstrap_options = c("striped", "hover"), latex_options = "HOLD_position")  %>%
           kable_classic(latex_options="scale_up", full_width=FALSE, html_font="Calibri"))
}

Visualizzo gli indici per sales, volume, median price, listings e month_inventory

colonne <- matrix(data=c("Minimo", "1° Quartile", "Mediana", "Media aritmetica",
                         "3° Quartile", "Massimo", "Range", "Interquartile Range o IQR", 
                         "Varianza", "Deviazione standard", "Coefficiente di variazione",
                         "Indice di asimmetria di Fisher", "Curtosi"),
                  nrow=1,
                  ncol=13)
c <- tabella_trasposta(colonne, "<br>**INDICI**")
t1 <- tabella_trasposta(indici_uniti_no_intestazione(sales), "<br>**sales**")
t2 <- tabella_trasposta(indici_uniti_no_intestazione(volume), "<br>**volume**")
t3 <- tabella_trasposta(indici_uniti_no_intestazione(median_price), "<br>**median price**")
t4 <- tabella_trasposta(indici_uniti_no_intestazione(listings), "<br>**listings**")
t5 <- tabella_trasposta(indici_uniti_no_intestazione(months_inventory), "**months inventory**")

kables(list(c,t1, t2, t3, t4, t5))

INDICI
Minimo
1° Quartile
Mediana
Media aritmetica
3° Quartile
Massimo
Range
Interquartile Range o IQR
Varianza
Deviazione standard
Coefficiente di variazione
Indice di asimmetria di Fisher
Curtosi

sales
79.00
127.00
175.50
192.29
247.00
423.00
344.00
120.00
6344.30
79.65
41.42
0.72
-0.31

volume
8.17
17.66
27.06
31.01
40.89
83.55
75.38
23.23
277.27
16.65
53.71
0.88
0.18

median price
73800.00
117300.00
134500.00
132665.42
150050.00
180000.00
106200.00
32750.00
513572983.09
22662.15
17.08
-0.36
-0.62

listings
743.00
1026.50
1618.50
1738.02
2056.00
3296.00
2553.00
1029.50
566568.97
752.71
43.31
0.65
-0.79
months inventory
3.40
7.80
8.95
9.19
10.95
14.90
11.50
3.15
5.31
2.30
25.06
0.04
-0.17

Da queste tabelle, a parte scoprire tutti gli indici che ci danno un’idea della forma delle distribuzioni delle singole variabili, possiamo dedurre che: Sales ha una distribuzione asimmetrica positiva, platicurtica Volume ha una distribuzione asimmetrica positiva, leptocurtica. È la variabile con un coefficiente di variazione maggiore quindi con una maggiore variabilità. Median price ha una distribuzione asimmetrica negativa, platicurtica. È la variabile con un coefficiente di variazione minore quindi con una minore variabilità. Listings ha una distribuzione asimmetrica positiva, platicurtica Months inventory ha una distribuzione lievemente asimmetrica positiva, platicurtica

Calcoliamo le distribuzioni di frequenza e gli indici di eterogeneità di Gini per le variabili qualitative.

#creo una funzione per le distribuzioni di frequenza.
distribuzioni_di_frequenza <- function(variabile){
  N <- dim(vendite)[1]
  ni <- table(variabile)
  fi <- ni/N
  Ni <- cumsum(ni)
  Fi <- Ni/N
  distr_freq <- cbind(ni,fi,Ni,Fi)
  return(distr_freq)
}
tabella(distribuzioni_di_frequenza(city), "**DISTR.FREQ. CITY**")#etereogeneità massima
DISTR.FREQ. CITY
ni fi Ni Fi
Beaumont 60 0.25 60 0.25
Bryan-College Station 60 0.25 120 0.50
Tyler 60 0.25 180 0.75
Wichita Falls 60 0.25 240 1.00
E(city) #gini
## [1] 1
tabella(distribuzioni_di_frequenza(year), "**DISTR.FREQ. YEAR**")#etereogeneità massima
DISTR.FREQ. YEAR
ni fi Ni Fi
2010 48 0.2 48 0.2
2011 48 0.2 96 0.4
2012 48 0.2 144 0.6
2013 48 0.2 192 0.8
2014 48 0.2 240 1.0
E(year)
## [1] 1
N_month <- dim(vendite)[1]
ni_month <- table(month)
fi_month <- ni_month/N_month
distr_freq_month <- cbind(ni_month,fi_month)

Per le variabili city e year abbiamo un’eterogeneità massima (city distribuzione tetramodale, year distribuzione pentamodale)

La frequenza cumulata è utile solo nelle variabili ordinate quindi per i mesi non creiamo le relative colonne

rownames(distr_freq_month) <- c("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre") 

colnames(distr_freq_month) <- c("ni", "fi")

tabella(distr_freq_month, "**DISTR.FREQ. MONTH**")#etereogeneità massima
DISTR.FREQ. MONTH
ni fi
Gennaio 20 0.08
Febbraio 20 0.08
Marzo 20 0.08
Aprile 20 0.08
Maggio 20 0.08
Giugno 20 0.08
Luglio 20 0.08
Agosto 20 0.08
Settembre 20 0.08
Ottobre 20 0.08
Novembre 20 0.08
Dicembre 20 0.08
E(month)
## [1] 1

Per la variabile month abbiamo un’eterogeneità massima (distribuzione dodecamodale)

3. Qual è la variabile con variabilità più elevata? Come ci sei arrivato? E quale quella più asimmetrica?

Per confrontare la variabilità di variabili differenti l’indice migliore è il coefficiente di variazione che dà una misura di variabilità relativa, riscalando la deviazione standard dividendola per la media. Dunque è indipendente dall’ordine di grandezza dei dati che si vanno a confrontare. Nel nostro caso è applicabile in quanto non abbiamo variabili con valori negativi. Potrei leggere dalle tabelle riportate sopra, ma per leggere di nuovo i valori qui sotto basta usarela funzione cv() del pacchetto labstatR

cv(sales)
## [1] 0.4133564
cv(volume)
## [1] 0.5359336
cv(median_price)
## [1] 0.1704656
cv(listings)
## [1] 0.4321801
cv(months_inventory)
## [1] 0.2500804

Da questi valori possiamo dedurre che la variabile con variabilità più elevata è volume come visto in precedenza.

Per confrontare invece l’asimmetria delle diverse variabili possiamo confrontare graficamente le distribuzioni tramite il grafico di densità

par(mfrow=c(2,3))
plot(density(sales), 
     main = "Distr.dens. vendite", 
     xlab = "Valori di sales", 
     ylab = "Densità", 
     col = "blue", 
     lwd = 2)
plot(density(volume), 
     main = "Distr.dens. valore totale \ndelle vendite", 
     xlab = "Valori di volume", 
     ylab = "Densità", 
     col = "blue", 
     lwd = 2)
plot(density(median_price), 
     main = "Distr.dens. prezzo mediano", 
     xlab = "Valori di median_price", 
     ylab = "Densità", 
     col = "blue", 
     lwd = 2)
plot(density(listings), 
     main = "Distr.dens. numero totale \ndi annunci attivi", 
     xlab = "Valori di listings", 
     ylab = "Densità", 
     col = "blue", 
     lwd = 2)
plot(density(months_inventory), 
     main = "Distr.dens. mesi necessari \nper vendere tutte \nle inserzioni correnti", 
     xlab = "Valori di months_inventory", 
     ylab = "Densità", 
     col = "blue", 
     lwd = 2)

Oppure possiamo usare l’indice di asimmetria di Fisher.

skewness(sales)
## [1] 0.718104
skewness(volume)
## [1] 0.884742
skewness(median_price)
## [1] -0.3645529
skewness(listings)
## [1] 0.6494982
skewness(months_inventory)
## [1] 0.04097527

Dai grafici e da questi valori possiamo dedurre che la variabile con asimmetria maggiore è volume.

4. Dividi una delle variabili quantitative in classi, scegli tu quale e come, costruisci la distribuzione di frequenze, il grafico a barre corrispondente e infine calcola l’indice di Gini.

Scelgo la variabile sales, la divido in classi da 50, partendo da 50 e arrivando a 450 (scelgo in base al minimo e massimo).

vendite$SALES_CL <- cut(sales,
                        breaks = seq(50,450,50))

distribuzioni_sales <- distribuzioni_di_frequenza(vendite$SALES_CL)


ggplot(vendite)+
  geom_bar(aes(x=SALES_CL),
           fill="steelblue2",
           stat = "count",
           col = "black")+
  labs(title = "Distribuzione delle classi di vendite",
       x = "Numero di vendite suddiviso in classi",
       y = "Frequenze assolute")+
  geom_text(aes(x=SALES_CL, y=after_stat(count + 3),label=after_stat(count)),
            stat = "count")+
  scale_y_continuous(breaks = seq(0,72,5))+
  theme_classic()

Calcolo l’indice di Gini

E(vendite$SALES_CL)
## [1] 0.9206349

È vicino a 1 quindi la variabile è eterogenea.

5. Indovina l’indice di gini per la variabile city.

L’indice di Gini per la variabile city è 1 perchè abbiamo eterogeneità massima, ovvero lo stesso numero di occorrenze per ogni valore. La distribuzione è infatti tetramodale.

E(city)
## [1] 1

6. Qual è la probabilità che presa una riga a caso di questo dataset essa riporti la città “Beaumont”? E la probabilità che riporti il mese di Luglio? E la probabilità che riporti il mese di dicembre 2012?

Dato che la variabile city ha una distribuzione tetramodale la probabilità che presa una riga a caso di questo dataset essa riporti la città “Beaumont” è di 1/4 ovvero del 25%

1/4*100
## [1] 25

La variabile month ha una distribuzione dodecamodale (indice di Gini=1 e 12 diversi valori) quindi la probabilità che presa una riga a caso di questo dataset essa riporti il mese di Luglio è 1/12 ovvero dell’8.33%

1/12*100
## [1] 8.333333

La variabile year ha una distribuzione pentamodale (indice di Gini=1 e 5 diversi valori). Tenuto conto delle distribuzioni delle variabili year e month possiamo calcolare che la probabilità che presa una riga a caso di questo dataset essa riporti il mese di dicembre 2012 è data dalla probabilità che essa riporti il mese di dicembre moltiplicata per la probabilità che essa riporti l’anno 2012 quindi 1/12*1/5=1/60 quindi 1.67%

1/12*1/5*100
## [1] 1.666667

7. Esiste una colonna col prezzo mediano, creane una che indica invece il prezzo medio, utilizzando le altre variabili che hai a disposizione.

Partendo dal volume totale delle vendite (colonna volume) e dal numero totale di vendite (colonna sales) possiamo calcolare il prezzo medio per ogni riga come volume diviso sales per 1000000 perchè volume è espresso in milioni di dollari.

vendite$mean_price <- volume/sales*1000000

8. Prova a creare un’altra colonna che dia un’idea di “efficacia” degli annunci di vendita. Riesci a fare qualche considerazione?

La variabile month_inventory ci dà una misura della quantità di tempo necessaria per vendere tutte le inserzioni al ritmo attuale delle vendite espresso in mesi. Se dividiamo questo valore per il numero di annunci attivi (colonna listings) otteniamo il tempo necessario per la vendita di un singolo annuncio (una quantità confrontabile riga per riga al contrario di month_inventory). Visto che verrebbero valori molto piccoli moltiplichiamo quanto ottenuto per 1000. Otteniamo così il tempo necessario per vendere 1000 inserzioni.

vendite$effectiveness <- months_inventory/listings*1000
tabella_trasposta(indici_uniti(vendite$effectiveness), "**INDICI EFFECTIVENESS**")
INDICI EFFECTIVENESS
Minimo 3.04
1° Quartile 4.24
Mediana 5.68
Media aritmetica 5.88
3° Quartile 7.15
Massimo 9.36
Range 6.32
Interquartile Range o IQR 2.91
Varianza 3.39
Deviazione standard 1.84
Coefficiente di variazione 31.29
Indice di asimmetria di Fisher 0.42
Curtosi -1.07

Come si può vedere il valore minimo è 3.04 e il massimo 9.36 Maggiore è il valore della colonna effectiveness e minore è l’“efficacia” degli annunci

Dal grafico sotto vediamo come al crescere del prezzo mediano diminuisce il numero di mesi necessari per la vendita.

ggplot(data = vendite)+
  geom_point(aes(x=median_price, y=effectiveness), col="red",size=2)+
  labs(x="Prezzo mediano",
       y="Tempo necessario per la vendita (mesi per 1000 annunci)",
       title = "Mesi necessari per la vendita di 1000 annunci\nin relazione al prezzo mediano case vendute in Texas (dollari)")+
  theme_classic()+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))

Mettendo in relazione la nostra variabile effectiveness con il numero di annunci attivi possiamo vedere che all’aumentare del numero di annunci attivi il tempo necessario per la vendita di 1000 annunci tende a diminuire (ovvero aumenta l’efficacia degli annunci stessi)

ggplot(data = vendite)+
  geom_point(aes(x=listings, y=effectiveness), col="blue", size=2)+
  labs(x="Annunci attivi",
       y="Tempo necessario per la vendita (mesi per 1000 annunci)",
       title = "Mesi necessari per la vendita di 1000 annunci\nin relazione al numero totale di annunci attivi")+
  theme_classic()+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))

Proviamo ad analizzare l’efficacia in relazione alle città. Dividiamo in 3 classi l’effectiveness.

vendite$EFFECTIVENESS_CL <- cut(vendite$effectiveness,
                                breaks = seq(3,9.5,6.5/3))

Realizziamo un plot con le frequenze assolute e uno con quelle relative delle classi di efficacia rispetto alla variabile City.

ggplot(vendite)+
  geom_bar(aes(x=EFFECTIVENESS_CL,
               fill=city),
           position = "dodge",
           stat = "count",
           col = "black")+
  labs(title = "Distribuzione delle classi di efficacia delle vendite\nnelle varie città",
       x = "Mesi per la vendita di 1000 annunci (classi)",
       y = "Frequenze assolute")+
  theme_classic()+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
  theme(legend.title = element_text(face="bold"))+
  guides(fill=guide_legend(title="Città"))

ggplot(vendite)+
  geom_bar(aes(x=EFFECTIVENESS_CL,
               fill=city),
           position = "fill",
           stat = "count",
           col = "black")+
  labs(title = "Distribuzione delle classi di efficacia delle vendite\nnelle varie città",
       x = "Mesi per la vendita di 1000 annunci (classi)",
       y = "Frequenze relative")+
  theme_classic()+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
  theme(legend.title = element_text(face="bold"))+
  guides(fill=guide_legend(title="Città"))

Da questi grafici possiamo dedurre che le inserzioni più efficaci sono quelle relative a Tyler mentre quelle a efficacia minima sono quelle di Wichita Falls. Beaumont e Bryan-College Station sono ad efficacia massima o media.

Realizziamo un grafico relativo alla distribuzione delle classi di efficacia in relazione al prezzo mediano delle case tenendo in considerazione le città. Utilizziamo la funzione geom_half_violin per creare metà grafico a violino che permette di visualizzare il profilo di densità dei valori osservati.

ggplot(data = vendite, aes(x=EFFECTIVENESS_CL, y=median_price/1000, fill=city))+
  geom_jitter(aes(col=city), size=1)+
  geom_half_boxplot(side="l", alpha=0.5)+
  geom_half_violin(side="r", alpha=0.5)+
  labs(x="Efficacia degli annunci (mesi)",
       y="Prezzo mediano delle case (migliaia di dollari)",
       title = "Distribuzione del prezzo mediano delle case \nin relazione alle classi di efficacia")+
  scale_y_continuous(breaks = seq(70,200,by=10))+
  theme_classic()+
  theme(legend.position = "right")+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
  theme(legend.title = element_text(face="bold"))+
  scale_fill_brewer(palette = "Set1")+
  scale_color_brewer(palette = "Set1")+
  guides(fill=guide_legend(title="Città"), color=guide_legend(title = "Città"))

Da questo grafico possiamo dedurre, oltre a quanto già dedotto nel grafico appena sopra, che Wichita Falls è caratterizzata da una distribuzione del prezzo mediano delle case più basso rispetto alle altre città. Bryan-College Station è caratterizzata da una distribuzione del prezzo mediano con valori più elevati rispetto alle altre.

Se andiamo a realizzare lo stesso grafico ma relativamente al volume delle vendite possiamo invece notare che chi ha riportato un volume di vendite mediamente maggiore è la città di Tyler.

ggplot(data = vendite, aes(x=EFFECTIVENESS_CL, y=volume, fill=city))+
  geom_jitter(aes(col=city), size=1)+
  geom_half_boxplot(side="l", alpha=0.5)+
  geom_half_violin(side="r", alpha=0.5)+
  labs(x="Efficacia degli annunci (mesi)",
       y="Volume delle vendite",
       title = "Distribuzione del volume delle vendite \nin relazione alle classi di efficacia")+
  scale_y_continuous(breaks = seq(10,90,by=10))+
  theme_classic()+
  theme(legend.position = "right")+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
  theme(legend.title = element_text(face="bold"))+
  scale_fill_brewer(palette = "Set1")+
  scale_color_brewer(palette = "Set1")+
  guides(fill=guide_legend(title="Città"), color=guide_legend(title = "Città"))

Con i seguenti due grafici valutiamo la distribuzione delle classi di efficacia rispetto agli anni. Possiamo fare le seguenti considerazioni:

  • nel 2014 gli annunci hanno avuto un’efficacia massima (principalmente) o minima, mai media.

  • nel 2013 si ha una prevalenza di annunci ad efficacia massima

  • gli annunci ad efficacia minima sono presenti in maniera costante nel corso degli anni

  • nell’intervallo 2010-2012 gli annunci hanno avuto un’efficacia media con una frequenza circa pari alla somma degli annunci con efficacia massima o minima

ggplot(vendite)+
  geom_bar(aes(x=EFFECTIVENESS_CL,
               fill=year),
           position = "dodge",
           stat = "count",
           col = "black")+
  labs(title = "Distribuzione delle classi di efficacia delle vendite\nnegli anni",
       x = "Mesi per la vendita di 1000 annunci (classi)",
       y = "Frequenze assolute")+
  theme_classic()+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
  theme(legend.title = element_text(face="bold"))+
  guides(fill=guide_legend(title="Anni"))

ggplot(vendite)+
  geom_bar(aes(x=EFFECTIVENESS_CL,
               fill=year),
           position = "fill",
           stat = "count",
           col = "black")+
  labs(title = "Distribuzione delle classi di efficacia delle vendite\nnegli anni",
       x = "Mesi per la vendita di 1000 annunci (classi)",
       y = "Frequenze relative")+
  theme_classic()+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
  theme(legend.title = element_text(face="bold"))+
  guides(fill=guide_legend(title="Anni"))

Andiamo a visualizzare invece la distribuzione del volume totale delle vendite in relazione alle classi di efficacia (distinguendo i valori relativi ai vari anni)

ggplot(data = vendite, aes(x=EFFECTIVENESS_CL, y=volume, fill=year))+
  geom_jitter(size=1, aes(colour=year))+
  geom_boxplot(size=0.35, alpha=0.7)+
  labs(x="Efficacia degli annunci (mesi)",
       y="Volume totale delle vendite (milioni di dollari)",
       title = "Distribuzione del volume totale delle vendite in Texas\nin relazione alle classi di efficacia")+
  scale_y_continuous(breaks = seq(0,90,10))+
  theme_classic()+
  theme(legend.position = "bottom")+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
  theme(legend.title = element_text(face="bold"))+
  scale_fill_brewer(palette = "Set1")+
  scale_color_brewer(palette = "Set1")+
  guides(fill=guide_legend(title="Anni"), colour=guide_legend("Anni"))

Da questo grafico possiamo dedurre che per gli annunci ad efficacia massima si è osservata una crescita del valore medio del volume totale delle vendite (con aumento anche della variabilità). Anche per gli annunci ad efficacia media si è osservata una crescita del valore medio del volume totale delle vendite. Per gli annunci ad efficacia minima si sono osservate piccole variazioni del valore medio del volume totale delle vendite.

Possiamo mettere a confronto la distribuzione delle classi di efficacia delle vendite nei mesi ma dai grafici non si rileva nulla di significativo se non che negli ultimi 3 mesi dell’anno si ha la tendenza ad avere un lieve aumento dell’efficacia con passaggio da efficacia media ad efficacia massima.

ggplot(vendite)+
  geom_bar(aes(x=EFFECTIVENESS_CL,
               fill=month),
           position = "dodge",
           stat = "count",
           col = "black")+
  labs(title = "Distribuzione delle classi di efficacia delle vendite\nnei mesi",
       x = "Mesi per la vendita di 1000 annunci (classi)",
       y = "Frequenze assolute")+
  scale_y_continuous(breaks = seq(0, 10, by = 1))+
  theme_classic()+
  theme(legend.position = "bottom")+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
  theme(legend.title = element_text(face="bold"))+
  guides(fill=guide_legend(title="Mesi"))

ggplot(vendite)+
  geom_bar(aes(x=EFFECTIVENESS_CL,
               fill=month),
           position = "fill",
           stat = "count",
           col = "black")+
  labs(title = "Distribuzione delle classi di efficacia delle vendite\nnei mesi",
       x = "Mesi per la vendita di 1000 annunci (classi)",
       y = "Frequenze relative")+
  theme_classic()+
  theme(legend.position = "bottom")+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
  theme(legend.title = element_text(face="bold"))+
  guides(fill=guide_legend(title="Mesi"))

Se invece andiamo a confrontare il volume totale delle vendite per ogni mese dell’anno in relazione all’efficacia degli annunci espressa in mesi otteniamo il seguente grafico:

ggplot(data = vendite, aes(x=EFFECTIVENESS_CL, y=volume, fill=month))+
  geom_jitter(size=1, aes(colour=month))+
  geom_boxplot(size=0.35, alpha=0.7)+
  labs(x="Mesi per la vendita di 1000 annunci (classi)",
       y="Volume totale delle vendite (milioni di dollari)",
       title = "Distribuzione del volume totale \ndelle vendite in Texas per ogni mese dell'anno \nin relazione alle classi di efficacia")+
  scale_y_continuous(breaks = seq(0,90,10))+
  theme_classic()+
  theme(legend.position = "bottom")+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
  theme(legend.title = element_text(face="bold"))+
  scale_fill_brewer(palette = "Set3")+
  scale_color_brewer(palette = "Set3")+
  guides(fill=guide_legend(title="Mesi"), colour=guide_legend("Mesi"))

Da tale grafico si può notare un andamento differenziato del volume delle vendite in base ai mesi, il volume cresce sino ai mesi centrali dell’anno per poi decrescere man mano che ci si avvicina alla fine dell’anno (con un piccolo rialzo a dicembre rispetto a novembre). Tale andamento è tanto più evidente tanto più gli annunci presentano un’efficacia alta arrivando ad appiattirsi notevolmente quando gli annunci appartengono alla classe di efficacia bassa.

9. Prova a creare dei summary(), o semplicemente media e deviazione standard, di alcune variabili a tua scelta, condizionatamente alla città, agli anni e ai mesi. Puoi utilizzare il linguaggio R di base oppure essere un vero Pro con il pacchetto dplyr.

Ti lascio un suggerimento in pseudocodice, oltre al cheatsheet nel materiale:

dati %>% group_by(una o più variabili di raggruppamento) %>% summarise(nomecolonna1=funzione1(variabile da sintetizzare), nomecolonna2=funzione2(variabile da sintetizzare))

Sfruttando questa notazione puoi creare anche dei grafici super!

Non avendo valori negativi possiamo usare il coefficiente di variazione

primo_quartile <- function(variabile){
  return(quantile(variabile)[2])
}

terzo_quartile <- function(variabile){
  return(quantile(variabile)[4])
}

Creo un primo summary per la variabile sales condizionatamente alla città e agli anni.

dplyr_city_year_sales <- vendite %>%
  group_by(city, year) %>%
  summarise("Minimo"=min(sales), 
            "1° Quartile"=primo_quartile(sales), 
            "Mediana"=median(sales), 
            "3° Quartile"=terzo_quartile(sales), 
            "Massimo"=max(sales),
            "Media aritmetica"=mean(sales),
            "Dev St"=sd(sales),
            "Coeff Var"=cv(sales))
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
knitr::kable(x=dplyr_city_year_sales, "html", caption = "**SUMMARY - SALES**", digits = 2, booktabs=TRUE,  longtable = FALSE) %>%
  kable_styling(fixed_thead = T, bootstrap_options = c("striped", "hover"), latex_options = "HOLD_position")  %>%
  kable_classic(latex_options="scale_down", full_width=FALSE, html_font="Calibri")
SUMMARY - SALES
city year Minimo 1° Quartile Mediana 3° Quartile Massimo Media aritmetica Dev St Coeff Var
Beaumont 2010 83 142.00 157.0 183.75 202 156.17 36.92 0.23
Beaumont 2011 108 126.25 148.5 160.75 177 144.00 22.66 0.15
Beaumont 2012 110 161.50 175.5 184.75 218 171.92 28.39 0.16
Beaumont 2013 140 175.25 202.0 217.75 273 201.17 37.73 0.18
Beaumont 2014 148 185.00 210.0 248.00 262 213.67 36.49 0.16
Bryan-College Station 2010 89 105.50 153.0 205.25 286 167.58 70.75 0.40
Bryan-College Station 2011 94 121.50 148.5 206.50 284 167.42 62.19 0.36
Bryan-College Station 2012 115 145.25 161.0 292.25 296 196.75 74.28 0.36
Bryan-College Station 2013 125 165.50 188.5 331.25 402 237.83 95.85 0.39
Bryan-College Station 2014 152 192.75 246.5 315.50 403 260.25 86.69 0.32
Tyler 2010 155 196.75 229.0 256.75 316 227.50 48.98 0.21
Tyler 2011 143 205.50 247.0 272.75 313 238.83 49.62 0.20
Tyler 2012 169 231.75 276.0 292.25 322 263.50 46.40 0.17
Tyler 2013 197 249.50 288.0 328.25 369 287.42 53.05 0.18
Tyler 2014 238 295.50 339.5 369.50 423 331.50 56.85 0.16
Wichita Falls 2010 89 102.25 123.0 135.75 167 123.42 26.62 0.21
Wichita Falls 2011 79 90.00 111.0 121.00 135 106.25 19.76 0.18
Wichita Falls 2012 90 100.75 115.5 123.50 132 112.42 14.25 0.12
Wichita Falls 2013 79 99.25 122.5 145.25 159 121.25 26.00 0.21
Wichita Falls 2014 89 100.50 111.0 137.75 150 117.00 21.09 0.17

Da questa tabella possiamo vedere che per la variabile Sales la città di Bryan-College Station presenta, nel corso degli anni, un coefficiente di variazione più alto delle altre città. La media aritmetica con valore massimo si osserva nella città di Tyler nel 2014 mentre la media aritmetica con valore minimo a Wichita Falls nel 2011 e 2014. Il valore massimo assoluto viene raggiunto dalla città Tyler nel 2014 e il minimo assoluto dalla città di Wichita Falls negli anni 2011 e 2013.

Creo un summary per la variabile volume condizionatamente alla città e agli anni.

dplyr_city_year_volume <- vendite %>%
  group_by(city, year) %>%
  summarise("Minimo"=min(volume), 
            "1° Quartile"=primo_quartile(volume), 
            "Mediana"=median(volume), 
            "3° Quartile"=terzo_quartile(volume), 
            "Massimo"=max(volume),
            "Media aritmetica"=mean(volume),
            "Dev St"=sd(volume),
            "Coeff Var"=cv(volume))
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
knitr::kable(x=dplyr_city_year_volume, "html", caption = "**SUMMARY - VOLUME**", digits = 2, booktabs=TRUE, longtable = FALSE) %>%
  kable_styling(fixed_thead = T, bootstrap_options = c("striped", "hover"), latex_options = "HOLD_position")  %>%
  kable_classic(latex_options="scale_down", full_width=FALSE, html_font="Calibri")
SUMMARY - VOLUME
city year Minimo 1° Quartile Mediana 3° Quartile Massimo Media aritmetica Dev St Coeff Var
Beaumont 2010 14.16 18.00 23.30 26.92 28.83 22.65 4.95 0.21
Beaumont 2011 15.49 16.73 21.38 24.30 28.48 21.10 4.30 0.20
Beaumont 2012 13.50 23.77 25.32 26.32 31.15 24.47 4.92 0.19
Beaumont 2013 20.34 25.65 30.13 34.84 42.03 30.31 6.44 0.20
Beaumont 2014 18.08 26.96 33.26 37.10 41.19 32.13 7.05 0.21
Bryan-College Station 2010 15.15 20.15 26.29 35.22 47.45 28.73 10.82 0.36
Bryan-College Station 2011 15.24 23.32 25.88 33.84 47.78 28.93 10.31 0.34
Bryan-College Station 2012 19.79 25.70 30.07 50.69 55.45 35.36 13.49 0.37
Bryan-College Station 2013 18.98 32.05 35.19 64.86 76.12 45.12 19.54 0.41
Bryan-College Station 2014 29.46 40.54 48.44 63.34 83.55 52.81 17.97 0.33
Tyler 2010 24.41 31.60 34.27 41.78 49.91 36.35 8.39 0.22
Tyler 2011 21.05 33.13 39.77 46.07 52.32 38.55 9.41 0.23
Tyler 2012 25.39 36.43 45.36 53.32 57.39 44.01 10.23 0.22
Tyler 2013 32.08 41.89 51.35 60.27 63.05 50.32 10.33 0.20
Tyler 2014 36.92 51.47 63.17 67.62 80.81 59.60 12.76 0.20
Wichita Falls 2010 8.95 11.98 15.01 18.44 20.88 14.97 4.07 0.26
Wichita Falls 2011 8.17 9.48 13.21 13.70 15.28 12.05 2.52 0.20
Wichita Falls 2012 9.70 11.52 12.78 14.54 17.79 13.23 2.66 0.19
Wichita Falls 2013 9.67 12.33 15.01 17.18 19.06 14.85 3.11 0.20
Wichita Falls 2014 9.63 11.84 13.90 17.80 18.67 14.54 3.13 0.21

Da questa tabella possiamo vedere che anche per la variabile Volume la città di Bryan-College Station presenta, nel corso degli anni, un coefficiente di variazione più alto delle altre città. La media aritmetica con valore massimo si osserva nella città di Tyler nel 2014 mentre la media aritmetica con valore minimo a Wichita Falls nel 2011. Il valore massimo assoluto viene raggiunto dalla città Bryan-College Station nel 2014 e il minimo assoluto dalla città di Wichita Falls nel 2011.

Creo un summary per la variabile prezzo mediano condizionatamente alla città e agli anni.

dplyr_city_year_median_price <- vendite %>%
  group_by(city, year) %>%
  summarise("Minimo"=min(median_price), 
            "1° Quartile"=primo_quartile(median_price), 
            "Mediana"=median(median_price), 
            "3° Quartile"=terzo_quartile(median_price), 
            "Massimo"=max(median_price),
            "Media aritmetica"=mean(median_price),
            "Dev St"=sd(median_price),            
            "Coeff Var"=cv(median_price))
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
knitr::kable(x=dplyr_city_year_median_price, "html", caption = "**SUMMARY - MEDIAN PRICE**", digits = 2, booktabs=TRUE,  longtable = FALSE) %>%
  kable_styling(fixed_thead = T, bootstrap_options = c("striped", "hover"), latex_options = "HOLD_position")  %>%
  kable_classic(latex_options="scale_down", full_width=FALSE, html_font="Calibri")
SUMMARY - MEDIAN PRICE
city year Minimo 1° Quartile Mediana 3° Quartile Massimo Media aritmetica Dev St Coeff Var
Beaumont 2010 121100 123025 128400 138275 163800 133116.67 13353.57 0.10
Beaumont 2011 111100 119175 126900 131425 144600 125641.67 9603.17 0.07
Beaumont 2012 110000 121050 128300 133725 134700 126533.33 7973.29 0.06
Beaumont 2013 121100 127675 132750 136250 147000 132400.00 7784.83 0.06
Beaumont 2014 106700 128850 134150 138875 142400 132250.00 9835.42 0.07
Bryan-College Station 2010 148300 149975 151800 154800 165300 153533.33 5474.13 0.03
Bryan-College Station 2011 146700 148650 150300 154475 157300 151416.67 3709.41 0.02
Bryan-College Station 2012 140700 149250 153700 155550 170000 153566.67 7095.75 0.04
Bryan-College Station 2013 146900 156500 159900 161825 167300 159391.67 5429.12 0.03
Bryan-College Station 2014 155300 167675 170900 173625 180000 169533.33 7776.46 0.04
Tyler 2010 129400 131125 134450 139025 143100 135175.00 4782.19 0.03
Tyler 2011 120600 132600 134650 140625 152600 136216.67 8505.17 0.06
Tyler 2012 124200 135375 138800 144650 152100 139250.00 7983.22 0.05
Tyler 2013 132400 142625 146100 149200 155600 146100.00 6725.53 0.04
Tyler 2014 130700 144775 151900 155900 161600 150466.67 8543.40 0.05
Wichita Falls 2010 86400 89200 98350 105350 119200 98941.67 10360.72 0.10
Wichita Falls 2011 73800 91475 101500 103475 113600 98141.67 10631.72 0.10
Wichita Falls 2012 82100 91625 99900 110225 118800 100958.33 12347.28 0.12
Wichita Falls 2013 85900 99825 103600 111900 121300 105000.00 10383.03 0.09
Wichita Falls 2014 90000 98200 104250 110825 135300 105675.00 12443.99 0.11

Da questa tabella possiamo vedere che per la variabile Median price si osservano basse variabilità in tutte le città, la città di Wichita Falls tende ad avere un coefficiente di variazione un po’ più alto. La media aritmetica con valore massimo si osserva nella città di Bryan-College Station nel 2014 mentre la media aritmetica con valore minimo a Wichita Falls nel 2011. Il valore massimo assoluto viene raggiunto dalla città Bryan-College Station nel 2014 e il minimo assoluto dalla città di Wichita Falls nel 2011.

Creo un summary per la variabile listings condizionatamente alla città e agli anni.

dplyr_city_year_listings <- vendite %>%
  group_by(city, year) %>%
  summarise("Minimo"=min(listings), 
            "1° Quartile"=primo_quartile(listings), 
            "Mediana"=median(listings), 
            "3° Quartile"=terzo_quartile(listings), 
            "Massimo"=max(listings),
            "Media aritmetica"=mean(listings),
            "Dev St"=sd(listings),
            "Coeff Var"=cv(listings))
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
knitr::kable(x=dplyr_city_year_listings, "html", caption = "**SUMMARY - LISTINGS**", digits = 2, booktabs=TRUE,  longtable = FALSE) %>%
  kable_styling(fixed_thead = T, bootstrap_options = c("striped", "hover"), latex_options = "HOLD_position")  %>%
  kable_classic(latex_options="scale_down", full_width=FALSE, html_font="Calibri")
SUMMARY - LISTINGS
city year Minimo 1° Quartile Mediana 3° Quartile Massimo Media aritmetica Dev St Coeff Var
Beaumont 2010 1533 1678.25 1756.5 1809.50 1857 1731.08 101.91 0.06
Beaumont 2011 1596 1690.00 1764.5 1797.25 1845 1747.92 74.67 0.04
Beaumont 2012 1570 1662.50 1693.5 1731.25 1765 1691.33 54.56 0.03
Beaumont 2013 1534 1610.25 1657.0 1676.50 1708 1639.58 54.92 0.03
Beaumont 2014 1500 1542.75 1589.5 1624.00 1672 1586.67 57.37 0.03
Bryan-College Station 2010 1298 1492.25 1563.0 1602.50 1984 1562.42 165.16 0.10
Bryan-College Station 2011 1362 1489.00 1571.5 1731.75 1840 1606.17 156.09 0.09
Bryan-College Station 2012 1442 1479.00 1576.0 1748.75 1834 1609.50 152.98 0.09
Bryan-College Station 2013 1057 1189.50 1423.5 1585.50 1750 1406.08 228.36 0.16
Bryan-College Station 2014 882 1020.50 1096.5 1213.50 1271 1106.50 127.44 0.11
Tyler 2010 2727 2849.25 3099.0 3268.25 3296 3051.08 226.43 0.07
Tyler 2011 2720 2922.50 3097.5 3227.50 3266 3069.67 184.60 0.06
Tyler 2012 2633 2850.25 2918.5 2996.00 3072 2910.42 122.95 0.04
Tyler 2013 2500 2692.25 2884.5 2947.75 2998 2823.75 159.72 0.05
Tyler 2014 2272 2607.25 2716.5 2781.25 2875 2670.33 172.17 0.06
Wichita Falls 2010 904 914.75 957.0 996.00 1028 959.42 45.17 0.05
Wichita Falls 2011 844 953.75 982.0 1011.00 1052 974.83 58.59 0.06
Wichita Falls 2012 801 873.00 907.0 931.50 941 896.00 41.22 0.04
Wichita Falls 2013 743 808.00 847.0 874.75 923 841.00 52.91 0.06
Wichita Falls 2014 746 833.75 884.5 940.25 973 876.67 73.05 0.08

Da questa tabella possiamo vedere che per la variabile listings si osserva un coefficiente di variazione un po’ più elevato nella città di Bryan-College Station in particolare nel 2013. La media aritmetica con valore massimo si osserva nella città di Tyler nel 2011 mentre la mediana con valore minimo a Wichita Falls nel 2013. Il valore massimo assoluto viene raggiunto dalla città Tyler nel 2010 e il minimo assoluto dalla città di Wichita Falls nel 2013.

Creo un summary per la variabile effectiveness condizionatamente alla città e agli anni. Solo nel caso della variabile effectiveness possiamo calcolare anche la media armonica.

dplyr_city_year_effectiveness <- vendite %>%
  group_by(city, year) %>%
  summarise("Min"=min(effectiveness), 
            "1° Quartile"=primo_quartile(effectiveness), 
            "Mediana"=median(effectiveness), 
            "3° Quartile"=terzo_quartile(effectiveness), 
            "Max"=max(effectiveness),
            "M. armonica"=meana(effectiveness),
            "M. aritmetica"=mean(effectiveness),
            "Dev St"=sd(effectiveness),
            "Coeff Var"=cv(effectiveness))
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
knitr::kable(x=dplyr_city_year_effectiveness, "html", caption = "**SUMMARY - EFFECTIVENESS**", digits = 2, booktabs=TRUE, longtable = FALSE) %>%
  kable_styling(fixed_thead = T, bootstrap_options = c("striped", "hover"), latex_options = "HOLD_position")  %>%
  kable_classic(latex_options="scale_down", full_width=FALSE, html_font="Calibri")
SUMMARY - EFFECTIVENESS
city year Min 1° Quartile Mediana 3° Quartile Max M. armonica M. aritmetica Dev St Coeff Var
Beaumont 2010 6.15 6.20 6.30 6.38 6.46 6.30 6.30 0.11 0.02
Beaumont 2011 6.32 6.53 6.82 6.88 6.95 6.70 6.71 0.24 0.03
Beaumont 2012 5.80 6.01 6.46 6.69 6.92 6.35 6.37 0.39 0.06
Beaumont 2013 4.95 5.13 5.32 5.62 5.69 5.35 5.36 0.26 0.05
Beaumont 2014 4.66 4.76 4.83 4.87 5.02 4.81 4.82 0.10 0.02
Bryan-College Station 2010 5.21 5.37 5.50 5.72 5.96 5.55 5.56 0.26 0.04
Bryan-College Station 2011 5.95 6.00 6.08 6.14 6.31 6.09 6.09 0.13 0.02
Bryan-College Station 2012 5.06 5.24 5.63 5.87 5.92 5.51 5.53 0.34 0.06
Bryan-College Station 2013 4.16 4.33 4.49 4.86 5.05 4.56 4.58 0.31 0.07
Bryan-College Station 2014 3.85 3.91 3.94 3.96 4.17 3.95 3.96 0.09 0.02
Tyler 2010 3.91 4.04 4.14 4.21 4.41 4.14 4.14 0.16 0.04
Tyler 2011 4.17 4.29 4.42 4.46 4.56 4.38 4.38 0.13 0.03
Tyler 2012 3.80 3.91 4.00 4.05 4.16 3.98 3.98 0.11 0.03
Tyler 2013 3.48 3.52 3.59 3.71 3.76 3.60 3.61 0.11 0.03
Tyler 2014 3.04 3.17 3.27 3.42 3.45 3.27 3.28 0.15 0.04
Wichita Falls 2010 7.74 7.90 8.02 8.12 8.26 8.00 8.00 0.17 0.02
Wichita Falls 2011 8.17 8.64 8.94 9.13 9.36 8.83 8.84 0.40 0.04
Wichita Falls 2012 8.86 9.12 9.16 9.23 9.34 9.16 9.16 0.13 0.01
Wichita Falls 2013 8.04 8.19 8.43 8.73 9.02 8.46 8.47 0.33 0.04
Wichita Falls 2014 8.18 8.45 8.51 8.60 8.62 8.48 8.48 0.14 0.02

Da questa tabella possiamo vedere che per la variabile listings si osserva un coefficiente di variazione basso in tutte le città. La media aritmetica con valore massimo si osserva nella città di Wichita Falls nel 2012 mentre la media aritmetica con valore minimo a Tyler nel 2014. Il valore massimo assoluto viene raggiunto dalla città Wichita Falls nel 2011 e il minimo assoluto dalla città di Tyler nel 2014. Le differenze tra la media aritmetica e la media armonica sono minime.

Da qui in poi utilizza ggplot2 per creare grafici fantastici! Ma non fermarti alla semplice soluzione del quesito, prova un po’ a personalizzare i grafici utilizzando temi, colori e annotazioni, e aggiustando i vari elementi come le etichette, gli assi e la legenda. Consiglio: Stai attento quando specifichi le variabili month e year tra le estetiche, potrebbe essere necessario considerarle come fattori.

1. Utilizza i boxplot per confrontare la distribuzione del prezzo mediano delle case tra le varie città. Commenta il risultato

ggplot(data = vendite)+
  geom_boxplot(size=0.6, alpha=0.5, aes(x=year,
                   y=median_price/1000,
                   fill=city))+
  scale_y_continuous(breaks = seq(70,200,by=10))+
  labs(x="Anno",
       y="Prezzo mediano (migliaia di dollari)",
       title = "Prezzo mediano delle case vendute in Texas \nnelle varie città per anno")+
  theme_classic()+
  theme(legend.position = "right")+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
  theme(legend.title = element_text(face="bold"))+
  guides(fill=guide_legend(title="Città"))

Dal grafico possiamo notare che la città con il prezzo mediano più alto è Bryan-College Station seguita da Tyler. Entrambe le città hanno registrato un aumento del prezzo mediano nel corso degli anni. La città di Wichita Falls registra una maggiore variabilità dei prezzi mediani nell’arco dei singoli anni. Bryan-College Station invece è quella con la minore variabilità. Tale osservazione è confermata numericamente anche dalla tabella sopra riportata relativa al summary per la variabile prezzo mediano condizionatamente alla città e agli anni.

2. Utilizza i boxplot o qualche variante per confrontare la distribuzione del valore totale delle vendite tra le varie città ma anche tra i vari anni. Qualche considerazione da fare?

ggplot(data = vendite)+
  geom_boxplot(aes(x=city,y=volume, fill = year))+
  labs(x="Città",
       y="Volume totale delle vendite in milioni di dollari",
       title = "Andamento negli anni del volume totale delle vendite\n nelle varie città")+  
  theme_classic()+
  theme(legend.position = "bottom")+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
  theme(legend.title = element_text(face="bold"))+
  scale_fill_brewer(palette = "Set1")+
  guides(fill=guide_legend(title="Anni"))

Nel corso degli anni per le città Beaumont, Bryan-College Station e Tyler c’è stato un aumento del valore medio del volume totale delle vendite. Per Wichita Falls tale valore è rimasto più o meno stabile nel corso degli anni.

3. Usa un grafico a barre sovrapposte per confrontare il totale delle vendite nei vari mesi, sempre considerando le città. Prova a commentare ciò che viene fuori. Già che ci sei prova anche il grafico a barre normalizzato. Consiglio: Stai attento alla differenza tra geom_bar() e geom_col(). PRO LEVEL: cerca un modo intelligente per inserire ANCHE la variabile Year allo stesso blocco di codice, senza però creare accrocchi nel grafico.

ggplot(vendite)+
  geom_col(aes(x=month,
               y=volume,
               fill=city),
           position = "stack")+
  labs(title = "Totale delle vendite nei vari mesi per città",
       x = "Mesi",
       y = "Totale delle vendite (milioni di dollari)")+
  theme_classic()+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
  theme(legend.title = element_text(face="bold"))+
  guides(fill=guide_legend(title="Città"))

ggplot(vendite)+
  geom_col(aes(x=month,
               y=volume,
               fill=city),
           position = "fill")+
  labs(title = "Distribuzione mensile del totale delle vendite per città",
       x = "Mesi",
       y = "Percentuale del totale delle vendite")+
  theme_classic()+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
  theme(legend.title = element_text(face="bold"))+
  guides(fill=guide_legend(title="Città"))

Osservando il grafico Totale delle vendite nei vari mesi per città si può notare come per Wichita falls tale valore non vari in maniera sostanziale nel corso dei mesi mentre per le altre tre città si ha un aumento del valore mano mano che l’anno procede verso la sua parte centrale e una diminuzione man mano che si va verso la parte finale dell’anno. Osservando invece il grafico normalizzato (Distribuzione mensile del totale delle vendite per città) si può dedurre che il contributo percentuale di ogni città al valore totale delle vendite per ogni mese è pressochè stabile, a parte per un lieve aumento nei mesi centrali per Bryan-College Station rispetto alle altre 3.

Ecco il grafico che prende in considerazione anche gli anni (a barre sovrapposte e normalizzato).

ggplot(vendite)+
  geom_col(aes(x=month,
               y=volume,
               fill=city),
           position = "stack")+
  labs(title = "Totale delle vendite nei vari mesi per ogni anno",
       x = "Mesi",
       y = "Totale delle vendite (milioni di dollari)")+
  facet_grid(year~., scales="free")+
  theme_classic()+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
  theme(legend.title = element_text(face="bold"))+
  guides(fill=guide_legend(title="Città"))

ggplot(vendite)+
  geom_col(aes(x=month,
               y=volume,
               fill=city),
           position = "fill")+
  labs(title = "Distribuzione del totale delle vendite\nnei mesi, per anno e città",
       x = "Mesi",
       y = "Percentuale del totale delle vendite")+
  facet_grid(year~., scales="free")+
  theme_classic()+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
  theme(legend.title = element_text(face="bold"))+
  guides(fill=guide_legend(title="Città"))

Il seguente grafico permette una migliore visione dell’andamento per le varie città nel corso del singolo anno.

ggplot(vendite)+
  geom_col(aes(x=month,
               y=volume,
               fill=city),
           position = "stack")+
  labs(title = "Totale delle vendite nei vari mesi per ogni anno",
       x = "Mesi",
       y = "Totale delle vendite (milioni di dollari)")+
  facet_grid(year~city, scales="free")+
  theme_classic()+
  theme(legend.position = "bottom")+
  theme(plot.title = element_text(size=14, hjust = 0.5, face = "bold"))+
  theme(legend.title = element_text(face="bold"))+
  guides(fill=guide_legend(title="Città"))

Nel primo e nel terzo grafico i confronti tra anni differenti non sono semplici in quanto cambia la scala dell’asse delle y.

4. Prova a creare un line chart di una variabile a tua scelta per fare confronti commentati fra città e periodi storici. Ti avviso che probabilmente all’inizio ti verranno fuori linee storte e poco chiare, ma non demordere.

Consigli: Prova inserendo una variabile per volta. Prova a usare variabili esterne al dataset, tipo vettori creati da te appositamente.

ggplot(data=vendite,aes(x=lubridate::dmy(paste(1, month, year)), y=volume, group=city))+
  geom_line(aes(color=city), linewidth=0.8)+
  geom_point(aes(color=city))+
  labs(title = "Totale delle vendite per ogni città nel tempo",
       x = "Tempo",
       y = "Totale delle vendite (milioni di dollari)")+
  geom_vline(xintercept = lubridate::dmy(paste(1, 1, 2010)), linetype=2, color = "black", linewidth=0.4, alpha=0.5)+
  geom_vline(xintercept = lubridate::dmy(paste(1, 1, 2011)), linetype=2, color = "black", linewidth=0.4, alpha=0.5)+
  geom_vline(xintercept = lubridate::dmy(paste(1, 1, 2012)), linetype=2, color = "black", linewidth=0.4, alpha=0.5)+
  geom_vline(xintercept = lubridate::dmy(paste(1, 1, 2013)), linetype=2, color = "black", linewidth=0.4, alpha=0.5)+
  geom_vline(xintercept = lubridate::dmy(paste(1, 1, 2014)), linetype=2, color = "black", linewidth=0.4, alpha=0.5)+
  geom_label(
    label="2010", 
    x=lubridate::dmy(paste(1, 1, 2010)),
    y=42,
    label.padding = unit(0.2, "lines"),
    label.size = 0.35,
    color = "black",
    fill="bisque"
  )+
  geom_label(
    label="2011", 
    x=lubridate::dmy(paste(1, 1, 2011)),
    y=42,
    label.padding = unit(0.2, "lines"),
    label.size = 0.35,
    color = "black",
    fill="bisque"
  )+
  geom_label(
    label="2012", 
    x=lubridate::dmy(paste(1, 1, 2012)),
    y=47,
    label.padding = unit(0.2, "lines"),
    label.size = 0.35,
    color = "black",
    fill="bisque"
  )+
  geom_label(
    label="2013", 
    x=lubridate::dmy(paste(1, 1, 2013)),
    y=53,
    label.padding = unit(0.2, "lines"),
    label.size = 0.35,
    color = "black",
    fill="bisque"
  )+
  geom_label(
    label="2014", 
    x=lubridate::dmy(paste(1, 1, 2014)),
    y=56,
    label.padding = unit(0.2, "lines"),
    label.size = 0.35,
    color = "black",
    fill="bisque"
  )+
  theme_classic()+
  theme(legend.position = "bottom", plot.title = element_text(size=14, hjust = 0.5, face = "bold"), legend.title = element_text(face="bold"), text = element_text(size=7))+
  guides(color=guide_legend(title="Città"))+
  scale_y_continuous(breaks = seq(0,80,10))+
  scale_x_date(breaks = "month", date_labels = "%m")

Il grafico può essere realizzato anche in quest’altra forma

ggplot(data=vendite,aes(x=lubridate::dmy(paste(1, month, year)), y=volume, group=city))+
  geom_line(aes(color=city), linewidth=0.8)+
  geom_point(aes(color=city))+
  labs(title = "Totale delle vendite nei vari mesi per ogni anno",
       x = "Mesi",
       y = "Totale delle vendite (milioni di dollari)",
       color = "Città")+
  facet_wrap(.~year, scales="free")+
  theme_classic()+
  theme(legend.position = "bottom", plot.title = element_text(size=14, hjust = 0.5, face = "bold"), legend.title = element_text(face="bold"), text = element_text(size=8))+
  scale_y_continuous(breaks = seq(0,80,10))+
  scale_x_date(breaks = "month", date_labels = "%b")

Dai grafici sopra possiamo notare come l’andamento del volume totale delle vendite: - per Wichita Falls vari sostanzialmente poco nel corso del tempo - per Beaumont ha una variazione medio-bassa nel corso del tempo ma con una variabilità maggiore rispetto a Wichita Falls - per Bryan-College Station e Tyler ha un aumento importante col passare del tempo e nel corso degli anni ha un aumento ciclico sostanziale nei mesi centrali dell’anno

Se non riesci proprio a venirne a capo inizia lavorando su dataset ridotti, ad esempio prendendo in considerazione un solo anno o una sola città. Aiutati con il pacchetto dplyr: dati2014 <- filter(dati, year==2014) dati_Beaumont <- filter(dati, city==”Beaumont”)