1. Analisi delle variabili

La variabile city è qualitativa su scala nominale, in quanto identifica la città a cui si riferisce ciascuna osservazione senza presentare un ordinamento naturale.

La variabile year è quantitativa continua, ma in questa analisi viene trattata come una variabile qualitativa ordinale, poiché gli anni rappresentano periodi temporali distinti caratterizzati da un naturale ordinamento cronologico.

La variabile month è qualitativa nominale di tipo ciclico. Sebbene sia codificata mediante valori numerici da 1 a 12, questi identificano categorie corrispondenti ai diversi mesi dell’anno e presentano una struttura ciclica: dicembre e gennaio, ad esempio, sono mesi consecutivi pur avendo rispettivamente i codici 12 e 1.

Le variabili sales e listings sono quantitative discrete, in quanto rappresentano conteggi e assumono pertanto valori interi. volume, median price e months inventory sono invece quantitative continue. Tutte le variabili quantitative continue sono misurate su scala di rapporti, poiché è definito uno zero assoluto e i rapporti tra i valori hanno significato.

Le variabili city, year e month vengono utilizzate principalmente come variabili di raggruppamento e come dimensioni temporali per l’analisi delle altre variabili. In particolare, city permette di confrontare i diversi mercati locali, mentre year e month consentono di studiare l’evoluzione temporale e la componente stagionale del fenomeno.

Per le variabili quantitative è possibile calcolare gli indici di posizione, variabilità e forma. L’indice di Gini può invece essere utilizzato per valutare l’eterogeneità della distribuzione, sia rispetto alla variabile city sia rispetto a classi costruite a partire da una variabile quantitativa.

L’evoluzione temporale può essere rappresentata mediante grafici a linee, mentre i grafici a barre sono utili per confrontare i valori medi tra le diverse città. Le distribuzioni delle variabili quantitative possono infine essere rappresentate mediante boxplot.

2. Indici di posizione, variabilità e forma

Indici di posizione

texas <- read.csv('realestate_texas.csv', sep = ',') 
attach(texas)
variables <- texas[, c("sales", "volume", "median_price",
                                         "listings", "months_inventory")]

ind.pos <- data.frame(
  Min = sapply(variables, min),
  Primo_Quart = sapply(variables, quantile, probs=0.25),
  Mediana = sapply(variables, median),
  Media = sapply(variables, mean),
  Terzo_Quart = sapply(variables, quantile, probs=0.75),
  Max = sapply(variables, max)
)

rownames(ind.pos) <- c(
  "`sales`",
  "`volume`",
  "`median price`",
  "`listings`",
  "`months inventory`"
)

knitr::kable(
  ind.pos,
  digits = 2,
  col.names = c("", "Min", "Primo quart.",
                "Mediana", "Media", "Terzo quart.", "Max"),
  align = c("l", "r", "r", "r", "r", "r", "r"))
Min Primo quart. Mediana Media Terzo quart. Max
sales 79.00 127.00 175.50 192.29 247.00 423.00
volume 8.17 17.66 27.06 31.01 40.89 83.55
median price 73800.00 117300.00 134500.00 132665.42 150050.00 180000.00
listings 743.00 1026.50 1618.50 1738.02 2056.00 3296.00
months inventory 3.40 7.80 8.95 9.19 10.95 14.90

Indici di variabilità

CV<-function(x){
  return(sd(x)/mean(x)*100)
}

ind.var <- data.frame(
  Deviazione_standard = sapply(variables, sd),
  Coeff.variazione = sapply(variables, CV)
)

rownames(ind.var) <- c(
  "`sales`",
  "`volume`",
  "`median price`",
  "`listings`",
  "`months inventory`"
)

knitr::kable(
  ind.var,
  digits = 2,
  col.names = c("", "Deviazione standard", "Coeff. di variazione"),
  align = c("c", "c"))
Deviazione standard Coeff. di variazione
sales 79.65 41.42
volume 16.65 53.71
median price 22662.15 17.08
listings 752.71 43.31
months inventory 2.30 25.06

Indici di Forma

library(moments)

correct_kurt <- function(x){
  return(kurtosis(x)-3)
}

ind.for <- data.frame(
  Fisher_Index = sapply(variables, skewness),
  Curtosi = sapply(variables, correct_kurt)
)

rownames(ind.for) <- c(
  "`sales`",
  "`volume`",
  "`median price`",
  "`listings`",
  "`months inventory`"
)

knitr::kable(
  ind.for, 
  digits = 3,
  col.names = c("", "Indice di Fisher", "Curtosi"),
  align = c("c", "c"))
Indice di Fisher 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

Guardando i dati ottenuti, possiamo fare una serie di considerazioni.

Le variabili median price e months inventory hanno media e mediana molto simili, il che ci fa pensare che le loro distribuzioni siano particolarmente simmetriche. Dando uno sguardo agli indici di forma, possiamo vedere che questo è effettivamente il caso, specialmente per months inventory.

Il coefficiente di variazione ci permette di confrontare i livelli di dispersione relativa delle varie variabili. Possiamo quindi affermare che volume è la variabile che presenta la maggiore variabilità relativa, mentre median price è quella che presenta la minore variabilità relativa.

Tutte le variabili tranne median price hanno distribuzione asimmetrica positiva, come possiamo vedere dal segno dell’indice di Fisher. Per quanto riguarda lo schiacciamento dei dati, la distribuzione di volume è leptocurtica, mentre tutte le altre sono platicurtiche.

3. Identificazione delle variabili con maggiore variabilità e asimmetria

La variabile con la più alta variabilità è la variabile volume, perché ha il coefficiente di variazione più alto. Sempre volume è anche la variabile più asimmetrica, con asimmetria positiva, dal momento che il valore assoluto del suo indice di Fisher è il più alto.

4. Creazione di classi per una variabile quantitativa

Suddividiamo la variabile sales in classi. Scegliamo il numero di classi utlizzando la regola di Sturges:

N <- round(1+log(length(sales), base = 2))
N
## [1] 9

Quindi il numero di classi è uguale a 9.

In basso ecco una tabella con frequenze assolute e relative:

freq_ass<-table(sales_cl)
freq_rel<-table(sales_cl)/length(sales)
distr_frq_sales_cl<-cbind(freq_ass,freq_rel)

knitr::kable(
  distr_frq_sales_cl,
  digits = 2,
  col.names = c("Classi", "Frequenza assoluta", "Frequenza relativa"),
  align = c("c", "c"))
Classi Frequenza assoluta Frequenza relativa
(78,116] 45 0.19
(116,155] 50 0.21
(155,193] 46 0.19
(193,231] 27 0.11
(231,270] 23 0.10
(270,308] 26 0.11
(308,346] 10 0.04
(346,385] 9 0.04
(385,423] 4 0.02

Rappresentiamo ora per maggior chiarezza le frequenze assolute con un grafico a barre.

ggplot(data=texas)+
  geom_bar(aes(x=sales_cl),
           stat='count',
           col='black',
           fill='blue')+
  labs(title = 'Distribuzione delle classi numero vendite mensili',
       x='Classi di vendita',
       y='Frequenze assolute')+
  theme_classic()

gini.index<-function(x){
  ni=table(x)
  fi=ni/length(x)
  fi2=fi^2
  J=length(table(x))
  gini=1-sum(fi2)
  gini.norm=gini/((J-1)/J)
  return(gini.norm)
}

paste("L'indice di Gini è", round(gini.index(sales_cl), digits = 3))
## [1] "L'indice di Gini è 0.954"

L’indice di eterogeneità è molto alto, indicando una distribuzione relativamente equa del numero di vendite tra le varie classi.

5. Calcolo della probabilità

“Qual è la probabilità che, presa una riga a caso di questo dataset, essa riporti la città “Beaumont”?”

C’è una riga col nome di una delle quattro città per ogni mese degli anni dal 2010 al 2014. Quindi c’è lo stesso numero di righe per ogni città. Di conseguenza, la probabilità è 1/4.

“E la probabilità che riporti il mese di Luglio?”

Il mese di luglio è presente una volta per ogni anno, ognuno dei quali contiene 12 mesi, perciò la probabilità è di 1/12.

“E la probabilità che riporti il mese di dicembre 2012?”

Per dicembre 2012 ci sono quattro osservazioni, una per ciascuna città, su un totale di 240 righe. La probabilità è quindi 4/240=1/60.

6. Creazione di nuove variabili

Creiamo una nuova variabile che rappresenti il prezzo medio degli immobili dividendo il volume totale delle vendite per il numero delle vendite: mean price=volume/salesx 1000000, dove abbiamo moltiplicato per un milione perché volume è espresso in milioni di dollari. Poi misuriamo l’efficacia degli annunci di vendita introducendo una variabile che fornisca il numero di vendite per ogni annuncio pubblicato: efficacy=sales/listings.

Per poter commentare e analizzare queste nuove variabili, ci chiediamo ad esempio, come variano i loro valori medi tra le varie città.

texas %>%
  group_by(city) %>%
  summarise(
    mean_price = mean(mean_price),
    efficacy = mean(listings_efficacy)
  )%>%
  knitr::kable(
    digits = 3,
    col.names = c("Città", "Prezzo medio", "Efficacia annunci"),
    align = c("l", "r", "r"))
Città Prezzo medio Efficacia annunci
Beaumont 146640.4 0.106
Bryan-College Station 183534.3 0.147
Tyler 167676.8 0.093
Wichita Falls 119430.0 0.128

Dalla tabella risulta che nell’arco degli anni dal 2010 al 2014 i prezzi più alti e la maggiore efficacia degli annunci sono stati a Bryan-College Station, mentre i prezzi più bassi a Wichita Falls e l’efficacia peggiore a Tyler.

Calcoliamo ora i valori medi delle variabili nei 5 anni presi in considerazione.

texas %>%
  group_by(year) %>%
  summarise(
    mean_price = mean(mean_price),
    efficacy = mean(listings_efficacy)
  )%>%
  knitr::kable(
    digits = 3,
    col.names = c("Anno", "Prezzo medio", "Efficacia annunci"),
    align = c("l", "r", "r"))
Anno Prezzo medio Efficacia annunci
2010 150188.6 0.100
2011 148250.6 0.093
2012 150898.7 0.110
2013 158705.2 0.135
2014 163558.7 0.157

Possiamo osservare, quindi, che complessivamente nelle quattro città considerate sia i prezzi medi che l’efficacia degli annunci sembra essere cresciuta nei 5 anni in esame, specialmente nel 2013 e 2014.

7. Analisi Condizionata

Procediamo a usare il pacchetto dplyr per effettuare analisi statistiche condizionate per città, anno e mese. I risultati saranno rappresentati graficamente.

7.1 Numero totale di vendite

sales_city <- texas %>%
  group_by(city)%>%
  summarise(media=mean(sales),
            dev.standard=sd(sales)
            )

knitr::kable(
  sales_city,
  digits = 2,
  col.names = c("Città", "Media", "Deviazione standard"),
  align = c("l", "c", "c"))
Città Media Deviazione standard
Beaumont 177.38 41.48
Bryan-College Station 205.97 84.98
Tyler 269.75 61.96
Wichita Falls 116.07 22.15
ggplot(sales_city, aes(x = city, y = media)) +
  geom_col(fill = 'blue') +
  geom_errorbar(
    aes(
      ymin = media - dev.standard,
      ymax = media + dev.standard
    ), width = 0.2) +
  labs(
    x = "Città",
    y = "Media delle vendite",
    title = "7.1.1 Vendite medie per città"
  )

sales_year <- texas %>%
  group_by(year)%>%
  summarise(media=mean(sales),
            dev.standard=sd(sales))

knitr::kable(
  sales_year,
  digits = 2,
  col.names = c("Anno", "Media", "Deviazione standard"),
  align = c("l", "c", "c"))
Anno Media Deviazione standard
2010 168.67 60.54
2011 164.12 63.87
2012 186.15 70.91
2013 211.92 84.00
2014 230.60 95.51
ggplot(sales_year, aes(x = year, y = media)) +
  geom_line(col = 'blue') +
  geom_point() +
  geom_errorbar(
    aes(
      ymin = media - dev.standard,
      ymax = media + dev.standard
    ),
    width = 0.1, col='red'
  ) +
  scale_x_continuous(breaks = 2010:2014) +
  labs(
    x = "Anno",
    y = "Media delle vendite",
    title = "7.1.2 Vendite medie per anno"
  )

sales_month <- texas %>%
  group_by(month)%>%
  summarise(media=mean(sales),
            dev.standard=sd(sales))

knitr::kable(
  sales_month,
  digits = 2,
  col.names = c("Mese", "Media", "Deviazione standard"),
  align = c("l", "c", "c"))
Mese Media Deviazione standard
1 127.40 43.38
2 140.85 51.07
3 189.45 59.18
4 211.70 65.40
5 238.85 83.12
6 243.55 95.00
7 235.75 96.27
8 231.45 79.23
9 182.35 72.52
10 179.90 74.95
11 156.85 55.47
12 169.40 60.75
ggplot(sales_month, aes(x = month, y = media)) +
  geom_line(col = 'blue') +
  geom_point() +
  geom_errorbar(
    aes(
      ymin = media - dev.standard,
      ymax = media + dev.standard
    ),
    width = 0.1, col='red'
  ) +
  scale_x_continuous(breaks = 1:12) +
  labs(
    x = "Mese",
    y = "Media delle vendite",
    title = "7.1.3 Vendite medie per mese"
  )

I valori medi delle vendite differiscono sensibilmente tra le città, con Tyler che presenta il valore medio più elevato e Wichita Falls quello più basso. Nel tempo si osserva una crescita della media annuale, mentre l’andamento mensile evidenzia una componente stagionale, con valori generalmente più elevati nei mesi estivi.

7.2 Valore totale delle vendite

volume_city<-texas %>%
  group_by(city)%>%
  summarise(media=mean(volume),
            dev.standard=sd(volume))

knitr::kable(
  volume_city,
  digits = 2,
  col.names = c("Città", "Media", "Deviazione standard"),
  align = c("l", "c", "c"))
Città Media Deviazione standard
Beaumont 26.13 6.97
Bryan-College Station 38.19 17.25
Tyler 45.77 13.11
Wichita Falls 13.93 3.24
ggplot(volume_city, aes(x = city, y = media)) +
  geom_col(fill = 'darkgreen') +
  geom_errorbar(
    aes(
      ymin = media - dev.standard,
      ymax = media + dev.standard
    ), width = 0.2) +
  labs(
    x = "Città",
    y = "Media valori vendite",
    title = "7.2.1 Valore medio delle vendite per città"
  )

volume_year<-texas %>%
  group_by(year)%>%
  summarise(media=mean(volume),
            dev.standard=sd(volume))

knitr::kable(
  volume_year,
  digits = 2,
  col.names = c("Anno", "Media", "Deviazione standard"),
  align = c("l", "c", "c"))
Anno Media Deviazione standard
2010 25.68 10.80
2011 25.16 12.20
2012 29.27 14.52
2013 35.15 17.93
2014 39.77 21.19
ggplot(volume_year, aes(x = year, y = media)) +
  geom_line(col = 'darkgreen') +
  geom_point() +
  geom_errorbar(
    aes(
      ymin = media - dev.standard,
      ymax = media + dev.standard
    ),
    width = 0.1, col='red'
  ) +
  scale_x_continuous(breaks = 2010:2014) +
  labs(
    x = "Anno",
    y = "Media valori vendite",
    title = "7.2.2 Valore medio delle vendite per anno"
  )

volume_month<-texas %>%
  group_by(month)%>%
  summarise(media=mean(volume),
            dev.standard=sd(volume))

knitr::kable(
  volume_month,
  digits = 2,
  col.names = c("Mese", "Media", "Deviazione standard"),
  align = c("l", "c", "c"))
Mese Media Deviazione standard
1 19.00 8.37
2 21.65 10.09
3 29.38 12.02
4 33.30 14.52
5 39.70 19.02
6 41.30 21.08
7 39.12 21.41
8 38.01 18.05
9 29.60 15.22
10 29.08 15.13
11 24.81 11.15
12 27.09 12.57
ggplot(volume_month, aes(x = month, y = media)) +
  geom_line(col = 'darkgreen') +
  geom_point() +
  geom_errorbar(
    aes(
      ymin = media - dev.standard,
      ymax = media + dev.standard
    ),
    width = 0.1, col='red'
  ) +
  scale_x_continuous(breaks = 1:12) +
  labs(
    x = "Mese",
    y = "Media valori vendite",
    title = "7.2.3 Valore medio delle vendite per mese"
  )

L’andamento del valore totale delle vendite è coerente con quello osservato per sales: Tyler presenta mediamente i valori più elevati, mentre Wichita Falls quelli più bassi. Anche in questo caso si osserva una crescita nel periodo considerato e una marcata variabilità tra i mesi.

7.3 Numero totale di annunci attivi

list_city<-texas %>%
  group_by(city)%>%
  summarise(media=mean(listings),
            dev.standard=sd(listings))

knitr::kable(
  list_city,
  digits = 2,
  col.names = c("Città", "Media", "Deviazione standard"),
  align = c("l", "c", "c"))
Città Media Deviazione standard
Beaumont 1679.32 91.13
Bryan-College Station 1458.13 252.53
Tyler 2905.05 226.75
Wichita Falls 909.58 73.76
ggplot(list_city, aes(x = city, y = media)) +
  geom_col(fill = 'orange') +
  geom_errorbar(
    aes(
      ymin = media - dev.standard,
      ymax = media + dev.standard
    ), width = 0.2) +
  labs(
    x = "Città",
    y = "Media degli annunci",
    title = "7.3.1 Numero annunci medio per città"
  )

list_year<-texas %>%
  group_by(year)%>%
  summarise(media=mean(listings),
            dev.standard=sd(listings))

knitr::kable(
  list_year,
  digits = 2,
  col.names = c("Anno", "Media", "Deviazione standard"),
  align = c("l", "c", "c"))
Anno Media Deviazione standard
2010 1826.00 785.02
2011 1849.65 780.38
2012 1776.81 738.45
2013 1677.60 743.52
2014 1560.04 706.71
ggplot(list_year, aes(x = year, y = media)) +
  geom_line(col = 'orange') +
  geom_point() +
  geom_errorbar(
    aes(
      ymin = media - dev.standard,
      ymax = media + dev.standard
    ),
    width = 0.1, col='red'
  ) +
  scale_x_continuous(breaks = 2010:2014) +
  labs(
    x = "Anno",
    y = "Media degli annunci",
    title = "7.3.2 Numero annunci medio per anno"
  )

list_month<-texas %>%
  group_by(month)%>%
  summarise(media=mean(listings),
            dev.standard=sd(listings))

knitr::kable(
  list_month,
  digits = 2,
  col.names = c("Mese", "Media", "Deviazione standard"),
  align = c("l", "c", "c"))
Mese Media Deviazione standard
1 1647.05 704.61
2 1692.50 711.20
3 1756.70 727.35
4 1825.70 770.43
5 1823.85 790.22
6 1833.25 811.63
7 1821.20 826.72
8 1786.30 815.87
9 1748.90 802.66
10 1710.35 779.16
11 1652.70 741.25
12 1557.75 692.57
ggplot(list_month, aes(x = month, y = media)) +
  geom_line(col = 'orange') +
  geom_point() +
  geom_errorbar(
    aes(
      ymin = media - dev.standard,
      ymax = media + dev.standard
    ),
    width = 0.1, col='red'
  ) +
  scale_x_continuous(breaks = 1:12) +
  labs(
    x = "Mese",
    y = "Media degli annunci",
    title = "7.3.3 Numero annunci medio per mese"
  )

Per quanto riguarda il numero di annunci attivi, Bryan-College Station presenta valori medi inferiori rispetto alle altre città. A livello temporale, la media annuale mostra una diminuzione nel periodo considerato, mentre l’andamento mensile presenta variazioni proporzionalmente più contenute rispetto a quelle osservate per sales e volume.

7.4 Mesi di inventario

invent_city<-texas %>%
  group_by(city)%>%
  summarise(media=mean(months_inventory),
            dev.standard=sd(months_inventory))

knitr::kable(
  invent_city,
  digits = 2,
  col.names = c("Città", "Media", "Deviazione standard"),
  align = c("l", "c", "c"))
Città Media Deviazione standard
Beaumont 9.97 1.65
Bryan-College Station 7.66 2.25
Tyler 11.32 1.89
Wichita Falls 7.82 0.78
ggplot(invent_city, aes(x = city, y = media)) +
  geom_col(fill = 'purple') +
  geom_errorbar(
    aes(
      ymin = media - dev.standard,
      ymax = media + dev.standard
    ), width = 0.2) +
  labs(
    x = "Città",
    y = "Media mesi di inventario",
    title = "7.4.1 Media dei mesi di inventario per città"
  )

invent_year<-texas %>%
  group_by(year)%>%
  summarise(media=mean(months_inventory),
            dev.standard=sd(months_inventory))

knitr::kable(
  invent_year,
  digits = 2,
  col.names = c("Anno", "Media", "Deviazione standard"),
  align = c("l", "c", "c"))
Anno Media Deviazione standard
2010 9.97 2.08
2011 10.90 2.07
2012 9.88 1.61
2013 8.15 1.69
2014 7.06 1.75
ggplot(invent_year, aes(x = year, y = media)) +
  geom_line(col = 'purple') +
  geom_point() +
  geom_errorbar(
    aes(
      ymin = media - dev.standard,
      ymax = media + dev.standard
    ),
    width = 0.1, col='red'
  ) +
  scale_x_continuous(breaks = 2010:2014) +
  labs(
    x = "Anno",
    y = "Media mesi di inventario",
    title = "7.4.2 Media dei mesi di inventario per anno"
  )

invent_month<-texas %>%
  group_by(month)%>%
  summarise(media=mean(months_inventory),
            dev.standard=sd(months_inventory))

knitr::kable(
  invent_month,
  digits = 2,
  col.names = c("Mese", "Media", "Deviazione standard"),
  align = c("l", "c", "c"))
Mese Media Deviazione standard
1 8.84 1.97
2 9.06 1.98
3 9.40 2.06
4 9.72 2.24
5 9.68 2.38
6 9.70 2.41
7 9.62 2.50
8 9.39 2.45
9 9.19 2.52
10 8.94 2.44
11 8.66 2.37
12 8.12 2.27
ggplot(invent_month, aes(x = month, y = media)) +
  geom_line(col = 'purple') +
  geom_point() +
  geom_errorbar(
    aes(
      ymin = media - dev.standard,
      ymax = media + dev.standard
    ),
    width = 0.1, col='red'
  ) +
  scale_x_continuous(breaks = 1:12) +
  labs(
    x = "Mese",
    y = "Media mesi di inventario",
    title = "7.4.3 Media dei mesi di inventario per mese"
    )

La variabile months inventory presenta valori medi relativamente bassi a Bryan-College Station e mostra una diminuzione della media annuale a partire dal 2011. L’andamento mensile presenta caratteristiche di stagionalità, meno marcate di sales e volume, ma più di listings.

7.5 Prezzo mediano di vendita

median_city<-texas %>%
  group_by(city)%>%
  summarise(media=mean(median_price),
            dev.standard=sd(median_price))

knitr::kable(
  median_city,
  digits = 2,
  col.names = c("Città", "Media", "Deviazione standard"),
  align = c("l", "c", "c"))
Città Media Deviazione standard
Beaumont 129988.3 10104.99
Bryan-College Station 157488.3 8852.24
Tyler 141441.7 9336.54
Wichita Falls 101743.3 11320.03
ggplot(median_city, aes(x = city, y = media)) +
  geom_col(fill = 'lightgreen') +
  geom_errorbar(
    aes(
      ymin = media - dev.standard,
      ymax = media + dev.standard
    ), width = 0.2) +
  labs(
    x = "Città",
    y = "Media prezzo mediano",
    title = "7.5.1 Media prezzo mediano per città"
  )

median_year<-texas %>%
  group_by(year)%>%
  summarise(media=mean(median_price),
            dev.standard=sd(median_price))

knitr::kable(
  median_year,
  digits = 2,
  col.names = c("Anno", "Media", "Deviazione standard"),
  align = c("l", "c", "c"))
Anno Media Deviazione standard
2010 130191.7 21821.76
2011 127854.2 21317.80
2012 130077.1 21431.52
2013 135722.9 21708.08
2014 139481.2 25625.41
ggplot(median_year, aes(x = year, y = media)) +
  geom_line(col = 'lightgreen') +
  geom_point() +
  geom_errorbar(
    aes(
      ymin = media - dev.standard,
      ymax = media + dev.standard
    ),
    width = 0.1, col='red'
  ) +
  scale_x_continuous(breaks = 2010:2014) +
  labs(
    x = "Anno",
    y = "Media prezzo mediano",
    title = "7.5.2 Media prezzo mediano per anno"
  )

median_month<-texas %>%
  group_by(month)%>%
  summarise(media=mean(median_price),
            dev.standard=sd(median_price))

knitr::kable(
  median_month,
  digits = 2,
  col.names = c("Mese", "Media", "Deviazione standard"),
  align = c("l", "c", "c"))
Mese Media Deviazione standard
1 124250 25151.28
2 130075 22822.59
3 127415 23442.03
4 131490 21458.40
5 134485 18796.26
6 137620 19231.02
7 134750 21944.78
8 136675 22488.38
9 134040 24344.10
10 133480 26358.07
11 134305 24691.47
12 133400 22809.76
ggplot(median_month, aes(x = month, y = media)) +
  geom_line(col = 'lightgreen') +
  geom_point() +
  geom_errorbar(
    aes(
      ymin = media - dev.standard,
      ymax = media + dev.standard
    ),
    width = 0.1, col='red'
  ) +
  scale_x_continuous(breaks = 1:12) +
  labs(
    x = "Mese",
    y = "Media prezzo mediano",
    title = "7.5.3 Media prezzo mediano per mese"
  )

Il prezzo mediano presenta valori medi nettamente più elevati a Bryan-College Station e più bassi a Wichita Falls. Nel periodo considerato si osserva inoltre un aumento della media annuale, mentre l’andamento stagionale appare un po’meno evidente rispetto ai casi precedenti.

8. Creazione di visualizzazioni con ggplot2

ggplot(data=texas)+
  geom_boxplot(aes(x=city, y=median_price), fill='lightblue')+
  labs(x='Città', y='Prezzo mediano', title = '8.1 Boxplot del prezzo mediano per città')

texas3 <- data.frame(texas)
texas3$year <- as.character(texas$year)

Il grafico 8.1 evidenzia una netta differenza nei livelli dei prezzi mediani tra le quattro città. Bryan-College Station presenta i valori più elevati, seguita da Tyler, Beaumont e infine Wichita Falls. Per quanto riguarda la dispersione, Wichita Falls mostra l’intervallo interquartile più ampio, mentre Bryan-College Station presenta una distribuzione centrale relativamente più concentrata. Sono inoltre presenti valori anomali per Beaumont, Wichita Falls e Bryan-College Station.

ggplot(data=texas3)+
  geom_boxplot(aes(x=year, y=volume, fill=city))+
  labs(x='Anni', y='Totale vendite (in milioni di $)',
       title = '8.2 Boxplot del totale vendite per anni e città')

Il grafico 8.2 presenta una forte variabilità del valore totale delle vendite, che differisce tra città e anni. Bryan-College Station e Tyler presentano in diversi anni intervalli interquartili più ampi, indicando una maggiore dispersione dei valori mensili, mentre Wichita Falls mostra generalmente una variabilità più contenuta. Si osserva inoltre uno spostamento verso valori più elevati negli anni successivi e dei valori anomali per Beaumont nel 2012.

ggplot(data=texas)+
  geom_bar(aes(x=month, y=volume,
               fill=city),
           position = 'stack',
           stat='identity',
           col='black')+
  facet_wrap(year, ncol=2)+
  labs(title = '8.3 Totale vendite per mese, anno e città',
       x='Mesi',
       y='Totale vendite (in milioni di $)')+
  scale_x_continuous(breaks=1:12)+
  theme_classic()

Il grafico 8.3 mostra la componente stagionale del valore totale delle vendite e permette allo stesso tempo di osservare il contributo delle singole città. I valori complessivi tendono a essere maggiori nei mesi primaverili ed estivi e inferiori nei mesi invernali. L’anno 2010 presenta un andamento parzialmente diverso, con il picco concentrato tra aprile e giugno.

ggplot(data=texas)+
  geom_bar(aes(x=month, y=volume,
               fill=city),
           position = 'fill',
           stat='identity',
           col='black')+
  facet_wrap(year, ncol=2)+
  labs(title = '8.4 Totale vendite normalizzato per mese, anno e città',
       x='Mesi',
       y='Quota percentuale del totale')+
  scale_x_continuous(breaks=1:12)+
  theme_classic()

La normalizzazione in 8.4 permette di confrontare il peso relativo delle diverse città indipendentemente dal valore assoluto delle vendite. Tyler e Bryan-College Station rappresentano generalmente le quote maggiori del volume complessivo, mentre Beaumont e soprattutto Wichita Falls contribuiscono in misura minore. Le proporzioni risultano abbastanza stabili negli anni.

texas2 <- data.frame(texas)
texas2$year <- rep(seq(2010+1/24,2014+23/24,1/12),times=4)
texas2$month <- NULL

ggplot(texas2, aes(x = year, y = sales, color = city, group = city)) +
  geom_line(linewidth = 1) +
  geom_point() +
  labs(
    x = "Anno",
    y = "Numero di vendite",
    title = "8.5 Andamento delle vendite per città"
  ) +
  scale_x_continuous(breaks = 2010:2014)

Infine, il grafico 8.5 consente di osservare l’andamento delle vendite nelle singole città lungo l’intero periodo considerato. Beaumont, Bryan-College Station e Tyler mostrano un andamento complessivamente crescente, pur con marcate oscillazioni stagionali. Wichita Falls si mantiene invece su livelli inferiori e non presenta un andamento globale chiaramente crescente o decrescente.

9. Conclusioni

Dall’analisi emerge una marcata componente stagionale delle vendite, con valori generalmente più elevati nei mesi tardo primaverili ed estivi e più bassi nei mesi invernali. Tale andamento è presente nella maggior parte degli anni, sebbene il 2010 costituisca un’eccezione, e interessa in misura diversa le singole città.

Un secondo elemento rilevante è la forte eterogeneità tra i mercati locali. Tyler e Bryan-College Station presentano generalmente livelli più elevati di numero e valore delle vendite, mentre Wichita Falls si colloca sui livelli più bassi. L’analisi disaggregata mostra inoltre che la crescita osservata a livello aggregato non è uniforme tra tutte le città.

Nel periodo considerato, il numero delle vendite, il valore delle vendite e il prezzo mediano mostrano complessivamente una crescita a partire dal 2011, mentre il numero degli annunci e i mesi di inventario diminuiscono. Tuttavia, le elevate deviazioni standard osservate in molte analisi indicano che le medie aggregate non rappresentano pienamente la variabilità dei singoli mercati. Per questo motivo, l’analisi per città risulta fondamentale per interpretare correttamente le dinamiche osservate.

Sulla base dei risultati ottenuti, Texas Realty Insights dovrebbe tenere conto della componente stagionale delle vendite nella pianificazione e nell’interpretazione dei dati, evitando di confrontare direttamente periodi appartenenti a stagioni diverse senza considerare questo effetto. Inoltre, le marcate differenze osservate tra i mercati locali suggeriscono di affiancare agli indicatori aggregati attività di monitoraggio e analisi specifiche per ciascuna città.