1. ANALISI DELLE VARIABILI

Analizzo le variabili presenti nel dataset Real Texas Estate.csv
L’obiettivo è identificare il tipo di ciascuna variabile, descriverne la natura statistica e commentare sul tipo di analisi applicabile.

Caricamento del dataset

# Carico il dataset
dati <- read.csv("realestate_texas.csv")
# Visualizzo le prime 5 righe per capire la struttura
head(dati,5)
##       city year month sales volume median_price listings months_inventory
## 1 Beaumont 2010     1    83 14.162       163800     1533              9.5
## 2 Beaumont 2010     2   108 17.690       138200     1586             10.0
## 3 Beaumont 2010     3   182 28.701       122400     1689             10.6
## 4 Beaumont 2010     4   200 26.819       123200     1708             10.6
## 5 Beaumont 2010     5   202 28.833       123100     1771             10.9

Il data set contiene: 240 osservazioni di 8 variabili.

str(dati) #mostro la struttura dei dati
## 'data.frame':    240 obs. of  8 variables:
##  $ city            : chr  "Beaumont" "Beaumont" "Beaumont" "Beaumont" ...
##  $ year            : int  2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
##  $ month           : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ sales           : int  83 108 182 200 202 189 164 174 124 150 ...
##  $ volume          : num  14.2 17.7 28.7 26.8 28.8 ...
##  $ median_price    : num  163800 138200 122400 123200 123100 ...
##  $ listings        : int  1533 1586 1689 1708 1771 1803 1857 1830 1829 1779 ...
##  $ months_inventory: num  9.5 10 10.6 10.6 10.9 11.1 11.7 11.6 11.7 11.5 ...
dim(dati) #mostro la dimensione del dataset n.righe e n.colonne
## [1] 240   8

Nella seguente tabella sono riportate le variabili presenti nel dataset, la loro tipologia statistica e il tipo di analisi che si può eseguire.

  • Le variabili year e month rappresentano la dimensione temporale ma sono trattate come qualitativa ordinale (year) e qualitativa nominale (month, codificata in numeri).Il calcolo della media, moda e mediana sono poco indicative. Queste variabili servono più per costruire le serie storiche e vedere come variano nel tempo le altre variabili quantitative (es. come varia il prezzo durante gli ultimi 5 anni). Le altre variabili quantitative (sales, volume, median_price, listings, months_inventory) consentono analisi descrittive e relazionali. La variabile qualitativa city consente confronti tra i gruppi geografici.

Visualizzare la tabella per una descrizione più dettagliata

Variabile CITY: (città di riferimento)

Eseguirò le frequenze assolute e relative per generare le tabelle di contingenza. Valuterò con la moda qual è la città che ha più osservazioni nel dataset.

Variabili YEAR:
Sarà utilizzata come time series per vedere come si comportano le altre variabili nel tempo.

Variabile MONTH:
Userò frequenze assolute e relative per individuare la stagionalità e analizzare pattern mensili nelle vendite e nei prezzi.

VARIABILI: SALES , VOLUME e MEDIAN_PRICE :
Valuterò tutti gli indici di posizione e dispersione. Controllerò il numero totale di vendite per ogni anno, la media, la vendità maggiore/minore, si potrà controllare con l’utilizzo di city anche dove è stata registrata la vendita maggiore e minore e il numero di più alto di vendite. Valutare l’utilizzo di media geometrica.

VARIABILI: LISTING E MONTHS_INVENTORY:
Valuterò gli indici di posizione e dispersione per identidicare le zone dove ci sono più annunci attivi. Si può effettuare un calcolo di probabilità per verificare qual è la probabilità che per una x città tutte le inserzioni vengano vendute nell’arco di x mesi.

#dataframe con nomi e tipi di variabili
tabella_var <- data.frame(
  Variabile = c("city","year","month","sales","volume","median_price","listings","months_inventory"),
  
  Tipo = c("Qualitativa nominale", 
           "Quantitativa continua", 
           "Qualitativa nominale",
           "Quantitativa discreta",
           "Quantitativa continua (scala di rapporti)",
           "Quantitativa continua(scala di rapporti)",
           "Quantitativa discreta",
           "Quantitativa continua (scala di rapporti)"),
  
  Trattare_come = c("/",
                    "Qualitativa ordinale",
                    "Codifica in numeri",
                    "/","/","/","/","/"),
  
  Indici_posizione = c("Moda",
                       "Mediana",
                       "Moda",
                       "Media, Mediana",
                       "Media, Mediana",
                       "Media, Mediana",
                       "Media, Mediana",
                       "Media, Mediana"),
  
  Indici_dispersione = c("Frequenze, percentuali",
                         "Range, Quartili",
                         "Frequenze, percentuali",
                         "Varianza, Deviazione standard, Range",
                         "Varianza, Deviazione standard, Range",
                         "Varianza, Deviazione standard, Range",
                         "Varianza, Deviazione standard, Range",
                         "Varianza, Deviazione standard, Range"),
  
  Analisi = c("Grafici a barre, tabelle di contingenza",
              "Analisi temporali, trend, serie storiche",
              "Analisi temporali, trend, serie stagionali",
              "Analisi descrittive, regressione, correlazione",
              "Analisi descrittive, regressione, correlazione",
              "Analisi temporali, regressione, trend di prezzo",
              "Analisi descrittive, correlazione con sales",
              "Analisi temporali, domanda/offerta")
)

# Mostro la tabella
knitr::kable(tabella_var, caption = "Tabella 1: Tipologia, indici e analisi per ciascuna variabile")
Tabella 1: Tipologia, indici e analisi per ciascuna variabile
Variabile Tipo Trattare_come Indici_posizione Indici_dispersione Analisi
city Qualitativa nominale / Moda Frequenze, percentuali Grafici a barre, tabelle di contingenza
year Quantitativa continua Qualitativa ordinale Mediana Range, Quartili Analisi temporali, trend, serie storiche
month Qualitativa nominale Codifica in numeri Moda Frequenze, percentuali Analisi temporali, trend, serie stagionali
sales Quantitativa discreta / Media, Mediana Varianza, Deviazione standard, Range Analisi descrittive, regressione, correlazione
volume Quantitativa continua (scala di rapporti) / Media, Mediana Varianza, Deviazione standard, Range Analisi descrittive, regressione, correlazione
median_price Quantitativa continua(scala di rapporti) / Media, Mediana Varianza, Deviazione standard, Range Analisi temporali, regressione, trend di prezzo
listings Quantitativa discreta / Media, Mediana Varianza, Deviazione standard, Range Analisi descrittive, correlazione con sales
months_inventory Quantitativa continua (scala di rapporti) / Media, Mediana Varianza, Deviazione standard, Range Analisi temporali, domanda/offerta

2 INDICI DI POSIZIONE, VARIABILITA’ E FORMA

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. Infine, commenta tutto brevemente.

GLI INDICI DI POSIZIONE CALCOLATI PER LE VARIABILI :
SALES, VOLUME , MEDIAN_PRICE, LISTING, MONTHS_INVENTORY

LA VARIABILITA’ CALCOLATA PER LE VARIABILI:
SALES, VOLUME, MEDIAN_PRICE, LISTING, MONTHS_INVENTORY E CITY
Per la variabile city ho calcolato l’Indice di Gini perchè è una variabile categorica nominale

LA FORMA DI DISTRIBUZIONE CALCOLATA PER LE VARIABILI:
SALES, VOLUME, MEDIAN_PRICE, LISTING E MONTHS_INVENTORY
La forma di distribuzione ha senso svolgerla per variabili quantitative (discrete o continue).

LA DISTRIBUZIONE DI FREQUENZA CALCOLATA PER LE VARIABILI:
CITY, YEAR. MONTHS.
Potrebbe essere svolta per tutte le variabili. Se le osservazioni sono molte come nel nostro database la distribuzione di frequenze genera tabelle molto lunghe e difficile lettura.

COMMENTO:

# INDICI DI POSIZIONE per le varibili SALES, VOLUME , MEDIAN_PRICE, LISTING, MONTHS_INVENTORY

#lascio la funzione moda come commento ma non va calcolata in questo caso
# Funzione per calcolare la moda
#moda_fun <- function(x) {
  #moda_value <- names(table(x))[which.max(table(x))]
  #return(moda_value)}

# Funzione principale per gli indici di posizione
 pos_index <- function(x) {
  
  quant <- quantile(x,na.rm=T)
  return(c(Media=round(mean(x, na.rm=T),2),
           Mediana=round(median(x, na.rm=T),2),
           #Moda= moda_fun(x), #uso la funzione precedentemente creata
           Min=round(quant[1],2), #indicizzo dentro quant
           Q1= round(quant[2],2),
           Q3= round(quant[4],2), #ho tolto la moda- indice 4 corrisponde a Q3
           Max=round(quant[5],2)))} 


# Calcolo indici posizione usando la funzione pos_index e sapply
   #Creo un vettore c con i nomi e i valori da usare con sapply

var_quanti <- c('sales','volume','median_price','listings','months_inventory')

indici_posizione_var <-sapply(dati[var_quanti],pos_index) #da "dati" prendo il vettore "c" e si applica la funz. pos_index

#Trasposizione delle righe con le colonne, posiziono le variabili sulle colonne
tab_index_pos <-as.data.frame(t(indici_posizione_var))
#uso kable
tab_index_pos %>%
  knitr::kable(caption="Tabella indici di posizione per le variabili quantitative di interesse", digits=2, align='c')
Tabella indici di posizione per le variabili quantitative di interesse
Media Mediana Min.0% Q1.25% Q3.75% Max.100%
sales 192.29 175.50 79.00 127.00 247.00 423.00
volume 31.01 27.06 8.17 17.66 40.89 83.55
median_price 132665.42 134500.00 73800.00 117300.00 150050.00 180000.00
listings 1738.02 1618.50 743.00 1026.50 2056.00 3296.00
months_inventory 9.19 8.95 3.40 7.80 10.95 14.90
# variabilità per SALES, VOLUME , MEDIAN_PRICE, LISTING, MONTHS_INVENTORY + Gini index per variabile City.
#creo le funzioni per calcolare gli indici di variabilità - deviazione standard e interquartile range (IQR) - coefficiente di variabilità

#funzione per il coefficiente di variazione CV
cv_fun <- function(x) {
  # Controlla per la divisione per zero e gestisce NA
  mu <- mean(x, na.rm = TRUE)
  sigma <- sd(x, na.rm = TRUE)
  if (is.na(mu) || mu == 0) return(NA)
  return(round((sigma / mu) * 100, 2))} # ritorna in percentuale


#funzione per indici di variabilità
var_index <-function(x){
  dev_st <- sd(x,na.rm = T)
  data_range <- max(x,na.rm=T) - min(x,na.rm = T)
  iqr_range <-IQR(x, na.rm=T)
  
  return(c( D_stand =round(sd(x,na.rm=T),2),
            Range=round(max(x,na.rm=T) - min(x,na.rm=T),2),
            IQR=round(IQR(x,na.rm=T),2),
            CV=cv_fun(x) ))} 

#Funzione per calcolare indice di Gini normalizzato

gini_normalized_fun <- function(x) {
  
  frequenze_relative <- prop.table(table(x))
  xx <- length(unique(x))
  # Gestione se k <= 1 (Gini non è definito)
  if (xx <= 1) return(NA)
  # Calcolo
  gini_non_norm <- 1 - sum(frequenze_relative^2)
  gini_norm <- gini_non_norm / ((xx - 1) / xx)
  
  return(round(gini_norm, 2))
}


### CALCOLO DELLA VARIABILITA' e TABELLE
#var_quanti <-c("sales", "volume", "median_price", "listings", "months_inventory") #giò definito prima riporto il vettore come commento

tab_Variability <- as.data.frame(t(sapply(dati[var_quanti],var_index)))
knitr::kable( tab_Variability,caption= " INDICI DI VARIABILITA'", digits = 2, align='c')
INDICI DI VARIABILITA’
D_stand Range IQR CV
sales 79.65 344.00 120.00 41.42
volume 16.65 75.38 23.23 53.71
median_price 22662.15 106200.00 32750.00 17.08
listings 752.71 2553.00 1029.50 43.31
months_inventory 2.30 11.50 3.15 25.06
#BOXPLOT MOSTRATI NELL'ESERCIZIO 9

# Calcolo dell'indice di Gini solo per la variabile city
gini_city_val <- gini_normalized_fun(dati$city)

# tabella Gini per city
tab_gini <- data.frame(Variabile = "City", "Gini normalizzato" = gini_city_val)

knitr::kable(tab_gini, caption = "Indice di Gini Normalizzato per Variabile City",align = 'c')
Indice di Gini Normalizzato per Variabile City
Variabile Gini.normalizzato
City 1
#FUNZIONI PER CALCOLARE LA FORMA DELLA DISTRIBUZIONE E RELATIVI CALCOLI E PLOT 
# variabili utilizzate: SALES, VOLUME , MEDIAN_PRICE, LISTING, MONTHS_INVENTORY

#creo funzioni per calcolo della forma:(funziona solo con pacchetto Moments! runnato all'inizio dello script)
forma_index <-function(x) {
  asimmetria <- skewness(x,na.rm=T)
  curtosi <- kurtosis(x,na.rm=T) -3 # -3 per calcolare la cursoti in eccesso e calcolare il valore partendo dallo zero. 
  
  return(c( Asimmetria=round(asimmetria,3),
            Curtosi=round(curtosi,3)))}


#CALCOLO DELLA FORMA E TABELLE

tab_forma <- as.data.frame(t(sapply(dati[var_quanti], forma_index)))
knitr::kable( tab_forma, caption= "Forma di distribuzione- asimmetria e curtosi",align="c")
Forma di distribuzione- asimmetria e curtosi
Asimmetria Curtosi
sales 0.718 -0.313
volume 0.885 0.177
median_price -0.365 -0.623
listings 0.649 -0.792
months_inventory 0.041 -0.174
#PLOT CON CICLO FOR DELLE TABELLE PER LE VARIABILI QUANTITATIVE DI INTERESSE. 

#vettore delle variabili quantitative riporato come commento, già definito negli script precedenti
#var_quanti <- c( "sales", "volume", "median_price", "listings", "months_inventory")

# Ciclo for per il plot densità per ogni variabile
for (var in var_quanti) {
  
  #Calcolo della media e mediana per il plot
media_val <-mean(dati[[var]],na.rm=T)
mediana_val <-median(dati[[var]],na.rm=T)
asim_val    <- round(skewness(dati[[var]], na.rm = TRUE), 2)

  
  # crea il grafico
  p<-ggplot(dati,aes(x=.data[[var]])) +
    # Curva densità
    geom_density(fill = "lightblue", alpha = 0.5,color = NA) + 
    
    # Linea della media rossa tratteggiata
    geom_vline(aes(xintercept = media_val, 
               color = 'Media'), 
               linetype = 'dashed', 
               linewidth= 1) + 
    geom_vline(aes(xintercept = mediana_val, 
               color = "Mediana"), 
               linetype = "dotted", linewidth = 1)+
    
    #assegno colori per la legenda
    scale_color_manual(name = "Index", 
                       values = c("Media" = "red", "Mediana" = "darkgreen")) +
    
    # Titoli dei grafici
    labs(
      title = paste("Distribuzione:", var),
      subtitle = paste("asimmetria:", asim_val), #contiene calcolo asimmetria
      x = var, 
      y = "densità"
    ) +
    theme_minimal()+
    theme(legend.position = "bottom")
  
  # Stampa i grafici
  print(p)}

library(knitr)
#result="asis" per evitare i print grezzi
# Funzione per fare le tabelle di frequenza
distr_freq_fun<- function(df,var_nome){
  x <- df[[var_nome]]
  tab_complete <- table(x)
  
# Calcolo delle frequenze
  assolute <- as.numeric(tab_complete)
  relative <- round(prop.table(tab_complete), 3) #arro
  
# Crea il Data Frame base
  tab_freq <- data.frame(Categoria = names(tab_complete),
    Assolute  = assolute, Relative  = relative )
  
  # Se la variabile non è uguale "city" allora aggiungo le cumulate
  if (var_nome != "city") {
    tab_freq$Cum_Asso <- cumsum(assolute)
    tab_freq$Cum_Rel  <- round(cumsum(relative), 3)}
  
  # tabella formattata con kable 
  return(knitr::kable(
    tab_freq, caption = paste("Distribuzione di frequenza:", var_nome), 
    align = "c", format = "markdown"))} # al posto di usare print grezzo

# Vettore con 3 variabili per la tabella
three_vars <- c("city", "year", "month")

# Genera una lista di tabelle e le visualizza
for (v in three_vars) {
  print(distr_freq_fun(dati, v))
  cat("\n\n")} # spazio tra le tabelle 
Distribuzione di frequenza: city
Categoria Assolute Relative.x Relative.Freq
Beaumont 60 Beaumont 0.25
Bryan-College Station 60 Bryan-College Station 0.25
Tyler 60 Tyler 0.25
Wichita Falls 60 Wichita Falls 0.25
Distribuzione di frequenza: year
Categoria Assolute Relative.x Relative.Freq Cum_Asso Cum_Rel
2010 48 2010 0.2 48 0.2
2011 48 2011 0.2 96 0.4
2012 48 2012 0.2 144 0.6
2013 48 2013 0.2 192 0.8
2014 48 2014 0.2 240 1.0
Distribuzione di frequenza: month
Categoria Assolute Relative.x Relative.Freq Cum_Asso Cum_Rel
1 20 1 0.083 20 0.083
2 20 2 0.083 40 0.166
3 20 3 0.083 60 0.249
4 20 4 0.083 80 0.332
5 20 5 0.083 100 0.415
6 20 6 0.083 120 0.498
7 20 7 0.083 140 0.581
8 20 8 0.083 160 0.664
9 20 9 0.083 180 0.747
10 20 10 0.083 200 0.830
11 20 11 0.083 220 0.913
12 20 12 0.083 240 0.996

3. Identificazione delle variabili con maggiore variabilità e asimmetria

La variabile con la più alta variabilità è Volume. Per confrontare la variabilità tra variabili che hanno unità di misura diverse (es. milioni di dollari, numero di annunci), ho osservato il coefficiente di variazione.
Volume ha un CV di 53.7% , un valore alto che indica un’elevata dispersione dei dati intorno alla media. Infatti, questa alta dispersione è visibile anche negli altri indici. Se consideriamo IQR (23.23) è un valore simile alla mediana (27.06), quindi il 50% dei dati centrali è molto sparso.

Confronto con altre variabili: Listing ha un CV del 43.3% (moderatamente variabile) mentre Median_price (17.1%) e months_inventory(25.1%) sono molto più stabili.

La variabile con la distribuzione più asimmetrica è sempre volume.
Per studiare l’asimmetria ho prima osservato gli indici di posizione (media>mediana>moda) e successivamente ho osservato se il valore di skewness fosse lontano da 0.Valori lontani da 0 indicano una forte asimmetria.
Volume, rispetto alle altre variabili, mostra un’evidente asimmetria positiva (a destra), con la media (31.01) più alta della mediana (27.06). La Skewness è 0.885, ed è il valore più alto tra tutte le variabili. Questi dati confermano che la distribuzione ha una marcata pendenza a destra. Questo significa che la maggior parte dei volumi di vendita è bassa, ma ci sono poche osservazioni con valori alti che spostano la media verso l’alto, verso la parte destra della curva. Infine ho carcato di capire anche la forma della punta della curca attraverso l’analisi della Kurtosi (0.177), che, essendo vicina a 0, indica una forma mesocurtica (simile quindi alla distribuzione normale).

4. Creazione di classi per una variabile quantitativa

Ho selezionato la variabile quantitativa “sales” e l’ho suddivisa in 5 classi. Ho creato una distribuzione di frequenze e ho aggiunto una tabella con il calcolo dell’indice di Gini. Infine, ho rappresentato i dati con un barplot.

Discussione: la distribuzione di frequenza relativa mostra che in generale il campione di n tot vendite è fortemente sbilanciato. Infatti il maggior numero di vendite totali è distribuito nelle classi valori più bassi. Dalle frequenze relative possiamo osservare che quindi la prima e la seconda classe hanno un maggior numero di vendite. Infatti, se osserviamo le frequenze relative cumulate, la prima e la seconda classe rappresentano più del 50 % delle vendite (67%). Poi ancora, si nota che la prima classe è la classe modale (quella con la frequenza più alta, 35%).Dalle precedenti analisi abbiamo visto che la forma della distribuzione è asimmetrica con pendenza a destra (skewness positiva: 0.71).Questo dato è rafforzato dall’indice di gini che è vicino all’1( Gini= 0.91). ciò signfica che esiste una forte disuguaglianza tra le classi e che i dati si concentrano fortemente in poche classi. Infatti, I 67% delle unità statistiche sta nelle prime due classi (valori bassi) mentre poche unità( solo il 4.6%) sta nell’ultima classe (valori alti).

#result="asis" per evitare i print grezzi
# Divisione di SALES in 5 classi 
dati$sales_classi <- cut(dati$sales, 
                    breaks = 5,ordered_result = T,include.lowest = T) #riodino i valori 



print (distr_freq_fun(dati, "sales_classi")) #richiamo la funzione distr_freq_fun definita precedentemente per calcolare la distribuzione di frequenze
Distribuzione di frequenza: sales_classi
Categoria Assolute Relative.x Relative.Freq Cum_Asso Cum_Rel
[78.7,148] 84 [78.7,148] 0.350 84 0.350
(148,217] 77 (148,217] 0.321 161 0.671
(217,285] 41 (217,285] 0.171 202 0.842
(285,354] 27 (285,354] 0.112 229 0.954
(354,423] 11 (354,423] 0.046 240 1.000
# Calcola Gini su sales classi
gini_norm_sales <- gini_normalized_fun(dati$sales_classi) 

tab_gini_sales <- data.frame(
  Indice = "Gini Sales (Norm.)",
  Valore = round(gini_norm_sales,4)) #arrotondato

print(knitr::kable(tab_gini_sales,caption = "Indice di Gini per le classi di vendita", align="c"))
Indice di Gini per le classi di vendita
Indice Valore
Gini Sales (Norm.) 0.91
# BARPLOT (utilizzare ggplot2 già caricato all'inizio)
# dataframe
tab_plot <-as.data.frame(prop.table(table(dati$sales_classi)))
colnames(tab_plot)<-c("Classi","Freq_Relativa")


#BARPLOT 
ggplot(tab_plot, aes(x = Classi, y = Freq_Relativa)) +
  geom_bar(stat = "identity", fill = "lightblue",alpha=0.8) + 
  # visualizzare le percentuali sulle barre
  geom_text(aes(label = scales::percent(Freq_Relativa, accuracy = 0.1)), vjust = -0.5, size = 1.5) +
  scale_y_continuous(labels=scales::percent)+
            
  labs(
    title = "Barplot della Distribuzione vendite (sales)",
    x = "classi di vendita",
    y = "Frequenza relativa in % "
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

5. Calcolo della probabilità

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?

Estraggo i dati totali (240 osservazioni) e i casi favorevoli per le condizioni richieste. Calcolo la probabilità come: Probabilità = Casi Favorevoli / Casi Totali.
Nota: risultati arrotondati a 3 cifre decimali (digits=3).

#1) Probabilità Città di Beaumont 
#casi favorevoli 
casi_fav_Beaumont <- sum(dati$city == "Beaumont") #sono 60
casi_tot <- nrow(dati) # tot osservazioni dataset 240
P_Beaumont <- casi_fav_Beaumont/casi_tot

#2) Probabilità mese luglio estratto a caso
#conteggio casi favorevoli 
casi_fav_luglio<-sum(dati$month==7)
P_luglio<-casi_fav_luglio/casi_tot

#3) Probabilità dicembre 2012
casi_fav_dic12 <- sum(dati$month ==12 & dati$year == 2012) # somma i casi con dicembre e 2012
prob_dic12 <- casi_fav_dic12/casi_tot

#tabella risultati probabilità
risultati_finali <- data.frame(
  Evento = c("Prob Beaumont)", "Prob Luglio", "Prob Dic 2012"),
  Probabilita = c(P_Beaumont, P_luglio, prob_dic12) 
)

# Visualizzazione con Kable
knitr::kable(risultati_finali %>% 
  mutate(Probabilita = scales::percent(Probabilita, accuracy = 0.1)),
    caption = "Tabella calcolo delle probabilità",
    align = 'c')
Tabella calcolo delle probabilità
Evento Probabilita
Prob Beaumont) 25.0%
Prob Luglio 8.3%
Prob Dic 2012 1.7%
#BARPLOT
# Grafico a barre per le probabilità (frequenze relative)
ggplot(dati, aes(x = city)) +
#group = 1 serve per calcolare la proporzione sul totale
  geom_bar(aes(y = after_stat(prop), group=1 ), 
           fill = "lightblue") +
  
  # Aggiunge etichette in % sopra le barre
  geom_text(aes(y = after_stat(prop), 
                label = percent(after_stat(prop), accuracy = 1)), group = 1,stat = "count", vjust = 0.5) +
  labs(title="Probabilità (Frequenza Relativa) per Città", x= "Città", y= "Frequenza Relativa")+
theme_minimal()

# Grafico a barre per le probabilità (frequenze relative) dei mesi
ggplot(dati, aes(x = month)) +
  geom_bar(aes(y = after_stat(prop), group = 1), 
           fill = "lightblue") +
  
  scale_y_continuous(labels = percent) +
  labs(title="Probabilità (Frequenza Relativa) per Mese", x="Mese", y= "Probabilità")+
  theme_minimal()

6. Creazione di nuove variabili

nuove variabili: Mean_price e efficacy

Abbiamo già a disposizione la variabile median_price(prezzo mediano). Ho deciso di aggiungere una nuova variabile chiamata mean_price che calcola il prezzo medio delle case vendute per città e volendo anche per mese.
Abbiamo a disposizione le variabili, “volume” che contiene il valore totale delle vendite (in milioni di dollari) e “sales” che contiene il numero totale di vendite. Se dividiamo “volume” valore totale delle vendite per il n. totale di vendite (come se fosse il n. delle nostre osservazioni) possiamo trovare il prezzo medio degli immobili per ogni città. mean_price=volume/sales Ho notato che volume è in milioni di dollari. Riportare il prezzo medio in milioni può essere poco comprensibile o in generale difficile da analizzare a colpo d’occhio. Per semplificare moltiplico per 10^6 e ottengo il valore medio in dollari.

Calcolo dell’efficaciia: Per calcolare l’efficacia ho pensato di creare un indice da 0 a 1 che indica quante vendite vengono effettuate in base al numero di annunci (listing) e il tempo mensile che ci impiegano gli annunci ad essere completati ( month_inventory). Valori più elevati indicano città o mesi in cui gli immobili si vendono più rapidamente, espressione un mercato che è più attivo e vendite efficaci.

si può usare per confrontrare le città in cui ci sono più vendite (es. max(efficacy)). o per vedere se nel tempo gli immobili vengono venduti meglio o peggio. oppure per vedere se ci sono mesi in cui si vende di più o di meno. (es. quando il mercato è dinamico o saturo).

Commento e analisi:

nel 2014 nella città di Bryan College c’è stato il maggior numero di efficienza nell vendite nel mese di luglio. 1041 annunci sono stati esauriti in 4 mesi circa (vedi: max(efficacy). il mercato sembra dinamico.

Andando più a fondo a questa analisi, ho creato un boxplot per vedere qual è la città che effettivamente ha livelli di efficacy maggiori, e che quindi ha un mercato più attivo. Senza questa analisi sarei potuto andare andato incontro ad un errore. Ovvero: inizialmente non avevo considerato gli outliers!. Infatti, come si può notare dal boxplot, è verò che il valore massimo di efficacia è stato registrato nella città di BC nel 2014, però questè è un valore unico e molto lontano dalla media per la stessa città di BC!. Da notare inoltre che, in media anche la città di Wichita Falls mostra di avere un mercato abbastanza dinamico. Wichita Falls ha meno variabilità nelle vendite rispetto a Brayan College e sono abbastanza efficaci nel tempo. Quindi rispetto a tutte le altre città, a BC si registrano delle vendite efficaci da record ( efficacy 0.23) , a Wichita Falls mediamente le vendite sono comunque efficaci ( efficacy 0.16) e guadagna il secondo posto.

#Creo le 2 nuove variabili e uso "mutate"
dati <- dati%>%
  mutate( mean_price=(volume*1e6)/sales,
          efficacy=sales /(listings*months_inventory))

#mostro le nuove variabili: summary del prezzo medio generale(media della media per le 60 osservazioni + il valore max di efficacia)
nuo_var <- dati%>%
  summarize(general_prezzo_medio= mean(mean_price,na.rm=T),
            max_efficacy=max(efficacy,na.rm=T))

knitr::kable(nuo_var, caption= "summary delle nuove variabili", digits=3,align="c")
summary delle nuove variabili
general_prezzo_medio max_efficacy
154320.4 0.094
# esempio: riga dove efficacy ha il valore maggiore
best_efficacy <- dati %>% filter(efficacy == max(efficacy, na.rm = TRUE))
knitr::kable(best_efficacy, caption = "il valore massimo di efficacia:")
il valore massimo di efficacia:
city year month sales volume median_price listings months_inventory sales_classi mean_price efficacy
Bryan-College Station 2014 7 403 83.547 172600 1041 4.1 (354,423] 207312.7 0.0944214
#GRAFICI: 
#grafico 1: andamento del prezzo medio degli immobili nel tempo per città

ggplot(dati, aes(x = as.Date(paste(year, month, "01", sep="-")), y = mean_price, color = city)) +
  geom_line(linewidth = 0.8) +
  labs(title = "Andamento del prezzo medio degli immobili per città nel Texas",
       x = "Data", y = "Prezzo medio ($)") +
  theme_minimal() +
  theme(legend.position = "bottom")

#grafico 2: Confronto efficacia per città 
#media generale efficacia
media_gen_eff <- mean(dati$efficacy,na.rm=T)
medie_città_eff <-dati%>%
  group_by(city)%>%
  summarise(m_eff=mean(efficacy, na.rm=T))

ggplot(dati,aes(x= reorder(city,efficacy),y=efficacy, fill= city)) +
  geom_boxplot(alpha=0.6,outlier.color = "red")+ #linea generale della media
  geom_hline(yintercept=media_gen_eff,linetype="dashed",color="red",linewidth=1)+
  #punti neri per la media specifica di ogni città
  geom_point(data=medie_città_eff,aes(x=city,y=m_eff), color="black",size=2)+
  
  labs(title = "Efficacia del mercato immobiliare per città", 
subtitle=paste("linea rossa=media generale:", round(media_gen_eff,3)),
x= "città(ordinate per efficacia)", y="indice efficacia")+
  theme_minimal() +
  theme(legend.position = "none")

7 ANALISI CONDIZIONALE

Ho iniziato raggruppando i dati nel mio nuovo dataset, e generando dei summary: summary city, season_summary).Questi summary contengono alcune nuove variabili (Price_mean, Vol_sales, Dev_st_prezzo, Listing_tot e Efficacy) rispetto al dataset originale.

Summary_city è stato usato per creare una tabella riassuntiva

Grafici: Ho usato dei boxplot, lineplot unificati e barplot per analizzare e visualizzare l’anndamento nel tempo (mesi e anni) per valutare per le varie città il cambio del prezzo medio, il numero di vendite, le vendite stagionali e l’andamento del numero di annunci.

#_____SUMMARY per città___

summary_city <- dati %>%
  group_by(city) %>%  # Raggruppo per city ed eseguo i calcoli
  summarise(
    # media calcolata sui prezzi di tutti i mesi e anni x città
    Price_mean = mean(mean_price, na.rm = T),
    Dev_st_prezzo =sd(mean_price, na.rm=T), # Media  e SDdei prezzi calcolata su tutti i mesi/anni
    #somma di tutte le vendite e annunci nel periodo
    Vol_sales= sum(sales, na.rm = T), #totale vendite 
    Listings_tot = sum(listings, na.rm = T), #totale annunci
    Efficacy_mean = mean(efficacy, na.rm = T),
    .groups = "drop"
  ) %>%
    arrange(desc(Price_mean)) #dispone in ordine di prezzo medio


#creo la tabella 
knitr::kable(summary_city, caption = "Sintesi delle performance medie per città", digits = 2)
Sintesi delle performance medie per città
city Price_mean Dev_st_prezzo Vol_sales Listings_tot Efficacy_mean
Bryan-College Station 183534.3 15149.35 12358 87488 0.02
Tyler 167676.8 12350.51 16185 174303 0.01
Beaumont 146640.4 11232.13 10643 100759 0.01
Wichita Falls 119430.0 11398.48 6964 54575 0.02
#_________________
# GRAFICI

#1) PREZZO MEDIO con facet wrap

# dettaglio del confronto tra le città: come cambia il prezzo medio per città nei mesi tra il 2010 e il 2014. approfondimento rispetto al grafico di prima al punto 6. 

ggplot(dati, aes(x = as.Date(paste(year, month, "01", sep="-")), y = mean_price)) +
  geom_line(color = "darkblue", linewidth = 0.7) +
  facet_wrap(~ city, ncol = 2) + #città divise
  labs(title = "Dettaglio andamento Prezzo Medio per singola città",
       subtitle = "Periodo 2010-2014",
       x = "Anno", y = "Prezzo medio ($)") +
  theme_minimal()

#BOXPLOT prezzi medii
# Calcolo media generale di tutte le città utile per il boxplot per le città
media_generale_texas <- mean(dati$mean_price, na.rm = TRUE)

# Grafico boxplot prezzi medi per città
ggplot(dati, aes(x = reorder(city,mean_price), y = mean_price, fill = city)) +
  geom_boxplot(alpha = 0.6, outlier.color="red") +
  # Linea rossa della media generale
  geom_hline(yintercept = media_generale_texas, linetype = "dashed", color = "red", linewidth = 1) +
  # Punti neri per la media di ciascuna città
  geom_point(data = summary_city, 
             aes(x = city, y =Price_mean),
             color = "black", size = 2.5) +
  labs(
    title = "Prezzo medio degli immobili per città",
    subtitle = paste("Linea rossa = media generale (", round(media_generale_texas,2), ")"),
    x = "Città",
    y = "Prezzo medio ($)"
  ) +
  theme_minimal() +
  theme(legend.position = "none")

#2) VENDITE 

# confronto tra le città: come cambia il numero di vendite per città nei mesi tra il 2010 e il 2014. in più la linea di tendenza per vedere il trend nel tempo.

ggplot(dati, aes(x = as.Date(paste(year, month, "01", sep="-")), y = sales, color=city)) +
  geom_line(linewidth =0.8) +
  geom_smooth(method = "lm", se = FALSE, linetype = "dotted", linewidth=0.5) +
  labs(title="Trend delle vendite mensili per città",
    subtitle = "linea: crescita nel tempo",
x= "anno", y="Num tot di vendite")+
theme_minimal() +
theme(legend.position="bottom")

# ANALISI VENDITE STAGIONALI 
#barplot vendite nei  mesi estivi vs mesi invernali 

# creo la variabile "season" che contiene i mesi estivi o invernali 
season_summary <- dati %>%  #con mutate creo la nuova variab season
  mutate(season = case_when(
    month %in% c(6, 7, 8) ~ "Estate", # case_when come ifelse se in month c'è il vet. c allora
    month %in% c(12, 1, 2) ~ "Inverno",TRUE ~ NA_character_)) %>% #gli altri sono NA. 
# uso pipe e collego calcoli vendite totali per città e stagione
  filter(!is.na(season)) %>% #rimuove i NA da season
  group_by(city, season) %>% #raggruppa per città e stagione
  summarise(total_sales_season = sum(sales, na.rm = TRUE), .groups = "drop") #nuova colonna che contiene sum di sales

#  Crea il barplot, facet per città
ggplot(season_summary, aes(x = city, y = total_sales_season, fill = season)) +
  geom_bar(stat="identity",position="dodge")+
  scale_fill_manual(values=c("Estate"="orange","Inverno"="steelblue"))+
  labs(title = "Confronto vendite tra mesi estivi e inve rnali (2010–2014)",
    x = "Città",
    y = "Totale vendite",
    fill="season") +
  theme_minimal() 

#3 ANNUNCI 
#confronto tra le città: come cambia il numero di annunci per città nei mesi tra il 2010 e il 2014

ggplot(dati, aes(x = as.Date(paste(year, month, "01", sep="-")), y =listings, color = city)) +
  geom_line(linewidth=0.8,alpha=0.8) +
  labs(title = "annunci per città (2010-2014)",
       x = "anno", y = " numero totale di annunci", color="Città") +
  theme_minimal()+
  theme(legend.position = "bottom")

8 e 9 Creazione di visualizzazioni con ggplot2 e CONCLUSIONI

1 Boxplot per confrontare la distribuzione del prezzo mediano tra le città:

Commento:

La città di Bryan-College Station ha una mediana più alta rispetto a tutte le altre. Se notiamo la grandezza dei box (IQR), la variabilità del 50% centrale dei dati per questa città è ridotta. I valori non sono molto dispersi attorno alla mediana (box IQR stretto) e possiamo immaginare un tipo di mercato piuttosto omogeneo; in generale i prezzi rimangono simili. Però allo stesso tempo i whiskers (baffi) allungati verso l’alto, e la media (pallino blu) posizionata sopra la mediana, ci informano che c’è una tendenza a prezzi più elevati. Questo dato è confermato anche dalla presenza di outliers, informandoci così che in questa città si registrano i prezzi più alti rispetto a tutte le altre. Deduco così che è l’area in cui le case sono mediamente più costose.

A seguire, in ordine dal più costoso al più economico, troviamo le città di Tyler e Beaumont. I loro prezzi mediani sono più bassi rispetto a Bryan-College Station. Nonostante qualche valore eccezionale a Beaumont (outlier alto), nella città di Tyler i prezzi mediani si mantengono più elevati. È importante notare che a Beaumont i prezzi hanno la maggiore variabilità centrale (la scatola IQR è visibilmente più larga delle altre), suggerendo un mercato più eterogeneo in quella fascia di prezzo.

Infine, la città che ha un prezzo mediano più economico di tutte è Wichita Falls. I valori degli immobili qui mostrano una chiara tendenza ad assumere prezzi più economici, come indicato dal baffo inferiore molto lungo (forte asimmetria negativa).

Riepilogo :Bryan-College Station ha la mediana più alta (prezzo mediano più alto) e una tendenza verso prezzi costosi (asimmetria positiva)

Beaumont ha la maggiore dispersione nella fascia centrale dei prezzi (IQR più largo), indicando un mercato eterogeneo

Wichita Falls ha il prezzo mediano più basso e una forte asimmetria verso prezzi economici (baffo inferiore lungo)

Tyler si posiziona come seconda città più costosa, con una distribuzione piuttosto simmetrica attorno alla sua mediana

#summary city

summary_median_city <- dati %>%
  group_by(city) %>%
  summarize(
    median_prezzo = median(median_price, na.rm=TRUE),
    #mean_price = mean((volume * 1e6) / sales, na.rm=TRUE),
    #sd_price = sd((volume * 1e6) / sales, na.rm = TRUE),
    .groups = "drop")

#summary_median_city


#boxplot confronto città

ggplot(dati, aes(x=reorder(city,median_price), y=median_price,fill=city))+
         geom_boxplot(alpha= 0.5, outlier.color="red", outlier.shape=16) + #trasparenza
         geom_point(data=summary_median_city, aes(x=city,y=median_prezzo),
         color="blue",size=3)+
         labs( title="Confronto della distribuzione del prezzo mediano tra le città", 
               x= "città", 
               y=" prezzo mediano ($)")+
         theme_minimal()+
         theme(axis.text.x = element_text(angle = 45, hjust = 1),
         legend.position = "none")

2. Boxplot per confrontare la distribuzione del numero delle vendite tra le varie città e tra i vari anni

Commento: Dall’analisi del confronto della distribuzione del valore totale delle vendite tra le varie città nel periodo di tempo compreso dal 2010 al 2014 si può osservare che tutte le cittè eccetto Wichita Falls,la quale rimane costante nel tempo, mostrano un aumento del numero delle vendite. In particolare, il valore mediano delle vendite come visto precedentemente aumenta anno dopo anno. Un esempio è la città di Bryan College che dal 2013 al 2014 registra un aumento notevole superando ampiamente Beaumont. Nella città di Tyler si registra un numero di vendite mediano costantemente più alto rispetto a tutte le altre città e in tutti i 5 anni. Anche la città di Bryan College Station mostra un numero elevato di vendite totali (raggiungendo quasi Tyler). però si distingue per avere una variabilità dei valori molto elevata (i suoi box e baffi sono spesso i più lunghi, ad esempio nel 2013 e 2014).

#boxplot confronto città e anno

ggplot(dati, aes(x=city, y=sales,fill= factor(year)))+ #factor discreta non continua
         geom_boxplot(alpha= 0.6, position= position_dodge(width=0.8)) + #trasparenza e sovrapposizione boxplot
         labs( 
           title="Distribuzione delle vendite mensili per città e anno", 
           x= "città", 
           y=" n vendite mensili",
           fill="Anno")+
         theme_minimal()+
         theme(axis.text.x = element_text(angle = 45, hjust = 1))

3 Grafici a barre per il confronto il totale delle vendite per mese e città

1)barplot vendite totali per città e trend

2)barplot a barre sovraimposte

3)barplot a barre sovraimposte normalizzato

Commento:

1)il linechart 1 mostra il confronto delle vendite tra le città dell’arco di tempo dal 2010 al 2014. La città che mostra il numero di elevato di vendite è Tyler(max=423, mean=269). A seguire troviamo le città di Bryan College Station e Beaumont. Per la città di Bryan College le vendite sono molto fluttuanti durante i 5 anni e si può notare come aumentano e diminuiscono: all’inizio e alla fine di ogni anno si notano dei picchi positivi e negativi. Nonostante ciò, le vendite hanno avuto un trend in aumento, specialmente nell’ultimo anno (2014). Similmente possiamo osservare a Beaumont, dove la variabilità di vendite è più bassa e il trend di n.di vendite negli anni è in lieve ma costante aumento positivo. Infine all’ultimo posto troviamo Wichita Falls dove il numero di vendite è rimasto costante negli anni, senza variazioni trend di crescita e registra i valori di vendite più bassi rispetto alle altre città (max 167, mean 116). La linea nera tratteggiata mostra il trend medio, il mercato texano negli anni è in fase di espansione.

2)Il grafico 2 a barre sovrapposte mostra e conferma il contributo maggiore della città di Tyler nel n.totale di vendite nel tempo. Le vendite sembrano seguire un pattern stagionale, con picchi di vendite di mesi primaverili/estivi e un calo nei mesi autunnali/invernali, creando così un’onda sinusoidale che mostra l’andamento oscillatorio delle vendite durante l’anno. Questo andamento oscillatorio però è caratterizzato dall’ un trend di crescita positivo dal 2010 al 2014 per tuttè le cittè tranne che per Wichita Falls.

3) Il grafico 3 mostra le stesse informazioni del precedente, ma in forma percentuale. Si nota che Tyler e Bryan College Station sono le città che contribuiscono in modo più consistente alle vendite totali (ciascuna con circa il 30–35%), seguite da Beaumont e infine Wichita Falls, che mantiene una quota intorno al 10–15%. Le proporzioni restano abbastanza stabili nel tempo, indicando che la distribuzione delle vendite tra le città non è cambiata in modo significativo tra il 2010 e il 2014.

#grafico 1) LineChart vendite per città e trend 
ggplot(dati,aes(x = as.Date(paste(year, month, "01", sep="-")), y = sales, color = city)) + #colore per distinguere le linee quando si sovrappongono
  geom_line(linewidth= 0.8, alpha=0.7 )+
  #trend line
  geom_smooth(method = "lm", color = "black", se = FALSE, linewidth = 1, linetype="dashed") +
  labs(title= "Andamento vendite a confronto tra le città", subtitle = "linea tratteggiata = trend medio delle vendite",
       x= "Mesi/Anni",
       y=" N. Vendite")+
   theme_minimal() +
  theme(
    legend.position="bottom",
    legend.title=element_blank(),
    axis.text.x = element_text(angle = 45, hjust = 1))

#grafico 2) 

# grafico a barre sovrapposte non normalizzato
ggplot(dati, aes(x = factor(month), y = sales, fill = city)) +
  geom_col(position = "stack") +
  #dati suddivisi in base all'anno utilizzando facet_wrap(~ year)
  facet_wrap(~ year, scales="free_x",ncol=3)+
  labs(
    title = "Confronto totale vendite mensili tra città (2010–2014)",
    subtitle = "Le barre sovrapposte mostrano il contributo di ogni città al totale mensile",
    x = "Mese",
    y = "Vendite totali",
    fill = "Città"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45,hjust=1,size = 6),
    legend.position = "bottom")

#grafico 3) grafico a barre normalizzato (per mostrare le percentuali)

ggplot(dati,aes(x= factor(month), y= sales, fill= city ))+
  geom_col(position="fill")+
  #suddivido i dati in base all'anno usando facet_wrap( year)
  facet_wrap(~ year,ncol=3)+
  scale_y_continuous(labels = scales::percent)+
  #converte es. 0.50 in 50% , Mostra i numeri come percentuali asse y
  labs(
    title= "Vendite in percentuale per città (anno) ",
    x= "Mese",
    y="percentuale di vendite",
    fill="Città")+
  theme_minimal()+
  theme( axis.text.x=element_text(angle=45, hjust = 1,size=6),
legend.position="bottom")

4 Line charts per confrontare l’andamento delle vendite nel tempo

  1. linechart per confrontare l’andamento delle vendite in periodi storici differenti.

  2. Prova a creare un line chart di una variabile a tua scelta per fare confronti commentati fra città e periodi storici. Ho scelto la variabile listings: numero totale di annunci.

Commento:

Linechart 1) : Dall’analisi della linechart si può osservare che il numerodi vendite nel tempo è fluttuante. Però si può notare per ttutte le città tranne Wichita Falls, un trend di aumento delle vendite nei 5 anni. Il trend sembra crescere in maniera oscillatoria: ci sono periodi di basse vendite all’inizio dell’anno corrispondenti ai mesi invernali, i quali sono seguiti da picchi positivi nei mesi estivi. Questo pattern stagionale si ripete negli anni ed è accompagnato da un aumento del numero di vendite mediano i tutte le città tranne Wichita Falls.In quest’ultima città, questo trend di crescita non è visibile e al contrario si nota una situzione di stazionarietà (mercato fermo). Sebbene siano presenti anche qui delle oscillazioni stagionali come le altre città, queste avvengono attorno a un numero di vendite medio che rimane basso e costante nel tempo (linea di regressione piatta).

Linechart 2): come nel grafico precedente, possiamo assistere ad un pattern con andamento oscillatorio. il numero di annunci per città nel tempo è sottoposto a un incremento nei mesi estivi e un decremento nei mesi invernali. questo pattern si può sovrapporre a quello precedente del numero delle vendite e si potrebbe avanzare un ipotesi di correlazione: ” l’aumento del numero di vendite potrebbe essere correlato all’aumentare del numero di annunci”. Diversamente dall’altro grafico, però , è evidente un trend negativo negli anni. Anno dopo anno ,nelle varie città ,si registrano minori numeri di annunci. In particolare nelle città di Tyler e Bryan College station, le quali sono le città con il maggior numero di vendite. Questo dato potrebbe essere giustificato dall numero elevato di vendite, e quindi un mercato che sta andando incontro a saturazione ( poche vendite di immobili disponibili) e quindi minore inserimento di annunci. anche qui si potrebbe ipotizzare una possibile correlazione tra l’aumentare del numero di vendite e la riduzione del numero di annunci. Per una possibile conferma di queste ipotesi torna utile osservare l’andamento a Wichita Falls. il numero delle vendite è piatto e lo è anche quello degli annunci. Non c’è la dinamica “vendite in crescita vs. annunci in calo” delle altre città.

# 1) Linechart per confronto vendite in periodi storici differenti: 
# confronto tra le città: come cambia il numero di vendite per città nei mesi tra il 2010 e il 2014. la linea di tendenza per vedere il trend nel tempo.

ggplot(dati, aes(x= as.Date(paste(year,month,"01",sep = "-")), y= sales))+
  geom_line(color = "black", alpha = 0.7, size = 1) +
  geom_point(size = 0.5, color="tomato") +
  geom_smooth(method = "lm", color = "orange", se = FALSE, linewidth = 1) +
  facet_wrap(~ city, ncol = 2) +
  scale_x_date(date_breaks = "3 months",date_labels = "%b-%y") + #etichetta ogni 3 mese in formato mese/anno
  labs(
    title = "Andamento mensile delle vendite per città (2010–2014)",
    subtitle = "Linea rossa = trend line (retta di regressione)",
    x = "Mese e anno",
    y = "Numero di vendite"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, size = 6))

#2)linechart variabile a scelta:
#confronto tra le città: come cambia il numero di annunci per città nei mesi tra il 2010 e il #2014

#grafico
ggplot(dati, aes(x= as.Date(paste(year,month,"01",sep = "-")), y=listings, color=city))+
  geom_line(linewidth = 0.7)+
  geom_smooth(method = "lm", color = "black", se = FALSE, linewidth = 0.5, linetype="dashed")+ #trend 
  facet_wrap(~ city, ncol = 2) +
  scale_x_date(date_breaks = "1 year",date_labels = "%Y")+
  labs(title="N. annunci per città dal 2010 al 2014",
       x="anni", y=" n.tot annunci")+
  theme_minimal()+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, size = 6), legend.position="none", strip.text=element_text(face="bold"))