Questo report presenta un’analisi statistica descrittiva dei dati storici del mercato immobiliare di alcune città del Texas. L’obiettivo è descrivere la struttura del dataset, sintetizzare le caratteristiche principali delle variabili, analizzare le differenze tra città e periodi e individuare tendenze per supportare decisioni operative.
Prima di procedere con l’analisi statistica, è necessario verificare la struttura del dataset e controllare la qualità dei dati disponibili.
real_estate <- read.csv("realestate_texas.csv")
Il dataset viene importato come dataframe R e sarà utilizzato come base per tutte le analisi future.
head(real_estate)
## 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
## 6 Beaumont 2010 6 189 27.219 122800 1803 11.1
dim(real_estate)
## [1] 240 8
str(real_estate)
## '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 ...
summary(real_estate)
## city year month sales
## Length:240 Min. :2010 Min. : 1.00 Min. : 79.0
## Class :character 1st Qu.:2011 1st Qu.: 3.75 1st Qu.:127.0
## Mode :character Median :2012 Median : 6.50 Median :175.5
## Mean :2012 Mean : 6.50 Mean :192.3
## 3rd Qu.:2013 3rd Qu.: 9.25 3rd Qu.:247.0
## Max. :2014 Max. :12.00 Max. :423.0
## volume median_price listings months_inventory
## Min. : 8.166 Min. : 73800 Min. : 743 Min. : 3.400
## 1st Qu.:17.660 1st Qu.:117300 1st Qu.:1026 1st Qu.: 7.800
## Median :27.062 Median :134500 Median :1618 Median : 8.950
## Mean :31.005 Mean :132665 Mean :1738 Mean : 9.193
## 3rd Qu.:40.893 3rd Qu.:150050 3rd Qu.:2056 3rd Qu.:10.950
## Max. :83.547 Max. :180000 Max. :3296 Max. :14.900
Il dataset contiene 240 osservazioni e 8 variabili; ogni osservazione rappresenta il mercato immobiliare di una determinata città in un specifico mese e anno.
La variabile city è stata memorizzata da R come
variabile testuale, mentre year, month,
sales e listings sono memorizzate come numeri
interi. Le variabili volume, median_price e
months_inventory sono invece memorizzate come variabili
numeriche. Questa classificazione non coincide necessariamente con la
loro classificazione statistica: year e month,
pur essendo registrate come numeri, rappresentano dimensioni temporali e
verranno trattate in modo appropriato nelle analisi successive.
colSums(is.na(real_estate))
## city year month sales
## 0 0 0 0
## volume median_price listings months_inventory
## 0 0 0 0
Non sono presenti valori mancanti nelle otto variabili del dataset, quindi non è necessario applicare procedure di esclusione o imputazione prima dell’analisi descrittiva.
sum(duplicated(real_estate))
## [1] 0
real_estate %>%
count(city, year, month) %>%
filter(n > 1)
## [1] city year month n
## <0 righe> (o 0-length row.names)
Non sono presenti righe completamente duplicate e nessuna
combinazione di città, anno e mese compare più di una volta: ogni
osservazione può essere identificata dalla combinazione
city-year-month.
unique(real_estate$city)
## [1] "Beaumont" "Bryan-College Station" "Tyler"
## [4] "Wichita Falls"
sort(unique(real_estate$year))
## [1] 2010 2011 2012 2013 2014
sort(unique(real_estate$month))
## [1] 1 2 3 4 5 6 7 8 9 10 11 12
real_estate %>%
count(city)
## city n
## 1 Beaumont 60
## 2 Bryan-College Station 60
## 3 Tyler 60
## 4 Wichita Falls 60
real_estate %>%
count(city, year)
## city year n
## 1 Beaumont 2010 12
## 2 Beaumont 2011 12
## 3 Beaumont 2012 12
## 4 Beaumont 2013 12
## 5 Beaumont 2014 12
## 6 Bryan-College Station 2010 12
## 7 Bryan-College Station 2011 12
## 8 Bryan-College Station 2012 12
## 9 Bryan-College Station 2013 12
## 10 Bryan-College Station 2014 12
## 11 Tyler 2010 12
## 12 Tyler 2011 12
## 13 Tyler 2012 12
## 14 Tyler 2013 12
## 15 Tyler 2014 12
## 16 Wichita Falls 2010 12
## 17 Wichita Falls 2011 12
## 18 Wichita Falls 2012 12
## 19 Wichita Falls 2013 12
## 20 Wichita Falls 2014 12
Il dataset comprende quattro città: Beaumont, Bryan-College Station, Tyler e Wichita Falls. Le osservazioni coprono il periodo dal 2010 al 2014 e sono disponibili per tutti e dodici i mesi dell’anno. Per ciascuna città sono presenti 60 osservazioni relative a 5 anni di rilevazioni mensili. Per ogni combinazione città-anno sono disponibili 12 osservazioni. Il dataset risulta quindi completo, caratteristica che consente di confrontare città e periodi senza dover gestire mesi mancanti o quantità diverse di osservazioni.
str(real_estate)
## '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 ...
Nella seguente tabella è stata riportata la classificazione statistica delle variabili.
| Variabile | Tipo statistico | Scala / natura | Analisi |
|---|---|---|---|
city |
Qualitativa nominale | Categorie senza ordine naturale | Distribuzioni di frequenza, proporzioni e confronti tra città |
year |
Temporale discreta e ordinata | Dimensione temporale | Raggruppamenti, confronti tra anni e analisi dell’andamento nel tempo |
month |
Temporale discreta e ciclica | Dimensione temporale | Distribuzioni di frequenza, confronti tra mesi e analisi stagionalità |
sales |
Quantitativa discreta | Scala di rapporti | Indici di posizione, variabilità e forma |
volume |
Quantitativa continua | Scala di rapporti | Indici di posizione, variabilità e forma |
median_price |
Quantitativa continua | Scala di rapporti | Indici di posizione, variabilità e forma |
listings |
Quantitativa discreta | Scala di rapporti | Indici di posizione, variabilità e forma |
months_inventory |
Quantitativa continua | Scala di rapporti | Indici di posizione, variabilità e forma |
Le variabili year e month sono registrate
da R come numeri interi ma rappresentano una dimensione temporale,
quindi saranno utilizzate principalmente come variabili di
raggruppamento e ordinamento.
city è una variabile qualitativa nominale, mentre
sales e listings sono variabili quantitative
discrete perché rappresentano dei conteggi. volume,
median_price e months_inventory sono trattate
come variabili quantitative continue per cui verranno calcolati indici
di posizione, variabilità e forma. Per city,
year e month sono più appropriate
distribuzioni di frequenza e analisi condizionate.
Per descrivere la posizione delle distribuzioni delle variabili quantitative vengono calcolati minimo, primo quartile, mediana, media, terzo quartile e massimo.
summary(real_estate[, c("sales",
"volume",
"median_price",
"listings",
"months_inventory")])
## sales volume median_price listings
## Min. : 79.0 Min. : 8.166 Min. : 73800 Min. : 743
## 1st Qu.:127.0 1st Qu.:17.660 1st Qu.:117300 1st Qu.:1026
## Median :175.5 Median :27.062 Median :134500 Median :1618
## Mean :192.3 Mean :31.005 Mean :132665 Mean :1738
## 3rd Qu.:247.0 3rd Qu.:40.893 3rd Qu.:150050 3rd Qu.:2056
## Max. :423.0 Max. :83.547 Max. :180000 Max. :3296
## months_inventory
## Min. : 3.400
## 1st Qu.: 7.800
## Median : 8.950
## Mean : 9.193
## 3rd Qu.:10.950
## Max. :14.900
# Funzione per calcolare la moda statistica
stat_mode <- function(x) {
freq <- table(x)
max_freq <- max(freq)
if (max_freq == 1) {
return("Nessuna moda univoca")
}
paste(names(freq)[freq == max_freq], collapse = ", ")
}
# Frequenza massima associata alla moda
mode_frequency <- function(x) {
max(table(x))
}
mode_table <- data.frame(
Variabile = c(
"sales",
"volume",
"median_price",
"listings",
"months_inventory"
),
Moda = c(
stat_mode(real_estate$sales),
stat_mode(real_estate$volume),
stat_mode(real_estate$median_price),
stat_mode(real_estate$listings),
stat_mode(real_estate$months_inventory)
),
Frequenza = c(
mode_frequency(real_estate$sales),
mode_frequency(real_estate$volume),
mode_frequency(real_estate$median_price),
mode_frequency(real_estate$listings),
mode_frequency(real_estate$months_inventory)
)
)
knitr::kable(
mode_table,
caption = "Moda delle variabili quantitative"
)
| Variabile | Moda | Frequenza |
|---|---|---|
| sales | 124 | 5 |
| volume | 14.003, 35.335, 42.553 | 2 |
| median_price | 130000 | 4 |
| listings | 1581 | 3 |
| months_inventory | 8.1 | 10 |
Per completezza è stato riportato anche l’indice di moda, anche se
per le variabili quantitative con molti valori distinti può risultare
meno informativo rispetto a media e mediana. La moda rappresenta il
valore osservato con maggiore frequenza e la colonna
Frequenza indica quante volte compare il valore modale nel
dataset. Nel caso in cui nessun valore si ripeta più frequentemente
degli altri, non si individua una moda univoca.
Gli indici di posizione evidenziano importanti differenze tra le variabili quantitative considerate. Il numero mensile di vendite (sales) varia da 79 a 423, con una mediana di 175,5 e una media di circa 192 vendite. La metà centrale delle osservazioni è compresa tra 127 e 247 vendite mensili. Il valore totale mensile delle compravendite (volume) varia da circa 8,2 a 83,5 milioni di dollari, con una mediana di circa 27,1 milioni e una media di circa 31,0 milioni. Anche in questo caso la media risulta superiore alla mediana, indicando che alcuni mesi caratterizzati da valori particolarmente elevati potrebbero influenzare la media complessiva. Il prezzo mediano mensile di vendita (median_price) varia da 73.800 a 180.000 dollari. La mediana della distribuzione dei prezzi mediani mensili è pari a 134.500 dollari, mentre la media è leggermente inferiore, circa 132.665 dollari. Il 50% centrale delle osservazioni è compreso tra 117.300 e 150.050 dollari. Il numero di annunci attivi (listings) varia da 743 a 3.296, con una mediana di 1.618.5 e una media di circa 1.738 annunci. Infine, months_inventory presenta valori compresi tra 3,4 e 14,9 mesi, con una mediana di 8,95 mesi e una media di circa 9,19 mesi. Le differenze tra media e mediana forniscono una prima indicazione sulla possibile forma delle distribuzioni, ma l’eventuale presenza e direzione dell’asimmetria verranno valutate successivamente attraverso gli specifici indici di forma.
Gli indici di posizione descrivono il centro delle distribuzioni, ma non indicano quanto i valori siano dispersi. Per le variabili quantitative vengono quindi calcolati range, intervallo interquartile, varianza, deviazione standard e coefficiente di variazione.
CV <- function(x){
return(sd(x) / mean(x) * 100)
}
variability_table <- data.frame(
Variabile = c("sales",
"volume",
"median_price",
"listings",
"months_inventory"),
Range = c(
max(real_estate$sales) - min(real_estate$sales),
max(real_estate$volume) - min(real_estate$volume),
max(real_estate$median_price) - min(real_estate$median_price),
max(real_estate$listings) - min(real_estate$listings),
max(real_estate$months_inventory) - min(real_estate$months_inventory)
),
IQR = c(
IQR(real_estate$sales),
IQR(real_estate$volume),
IQR(real_estate$median_price),
IQR(real_estate$listings),
IQR(real_estate$months_inventory)
),
Varianza = c(
var(real_estate$sales),
var(real_estate$volume),
var(real_estate$median_price),
var(real_estate$listings),
var(real_estate$months_inventory)
),
Deviazione_standard = c(
sd(real_estate$sales),
sd(real_estate$volume),
sd(real_estate$median_price),
sd(real_estate$listings),
sd(real_estate$months_inventory)
),
CV_percentuale = c(
CV(real_estate$sales),
CV(real_estate$volume),
CV(real_estate$median_price),
CV(real_estate$listings),
CV(real_estate$months_inventory)
)
)
variability_table %>%
mutate(across(where(is.numeric), ~ round(.x, 2))) %>%
knitr::kable(
caption = "Indici di variabilità delle variabili quantitative"
)
| Variabile | Range | IQR | Varianza | Deviazione_standard | CV_percentuale |
|---|---|---|---|---|---|
| sales | 344.00 | 120.00 | 6.34430e+03 | 79.65 | 41.42 |
| volume | 75.38 | 23.23 | 2.77270e+02 | 16.65 | 53.71 |
| median_price | 106200.00 | 32750.00 | 5.13573e+08 | 22662.15 | 17.08 |
| listings | 2553.00 | 1029.50 | 5.66569e+05 | 752.71 | 43.31 |
| months_inventory | 11.50 | 3.15 | 5.31000e+00 | 2.30 | 25.06 |
Gli indici di variabilità mostrano che le variabili quantitative presentano livelli di dispersione differenti. Tuttavia, range, varianza e deviazione standard sono misure assolute e dipendono dall’unità di misura e dall’ordine di grandezza della variabile; non possono quindi essere utilizzate direttamente per stabilire quale variabile sia complessivamente più variabile. Per effettuare un confronto corretto viene utilizzato il coefficiente di variazione, che rapporta la deviazione standard alla media ed esprime la variabilità in termini percentuali. volume presenta il coefficiente di variazione più elevato, pari a circa 53,7%, seguito da listings (43,3%) e sales (41,4%). months_inventory presenta una variabilità relativa più contenuta, pari a circa 25,1%, mentre median_price mostra il valore più basso, circa 17,1%. Il valore totale mensile delle vendite risulta quindi la grandezza relativamente più variabile nel dataset. Al contrario, i prezzi mediani mensili mostrano una maggiore stabilità relativa rispetto alla propria media.
Per descrivere la forma delle distribuzioni delle variabili quantitative vengono calcolati l’indice di asimmetria di Fisher e l’eccesso di curtosi.
shape_table <- data.frame(
Variabile = c("sales",
"volume",
"median_price",
"listings",
"months_inventory"),
Asimmetria = c(
skewness(real_estate$sales),
skewness(real_estate$volume),
skewness(real_estate$median_price),
skewness(real_estate$listings),
skewness(real_estate$months_inventory)
),
Curtosi = c(
kurtosis(real_estate$sales) - 3,
kurtosis(real_estate$volume) - 3,
kurtosis(real_estate$median_price) - 3,
kurtosis(real_estate$listings) - 3,
kurtosis(real_estate$months_inventory) - 3
)
)
shape_table %>%
mutate(across(where(is.numeric), ~ round(.x, 3))) %>%
knitr::kable(
caption = "Indici di forma delle variabili quantitative"
)
| Variabile | 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 |
Gli indici di forma evidenziano differenze nella simmetria delle distribuzioni. sales, volume e listings presentano valori positivi dell’indice di asimmetria, indicando distribuzioni caratterizzate da una coda verso i valori più elevati. median_price presenta invece un’asimmetria negativa, mentre months_inventory, con un valore di skewness prossimo a zero, mostra una distribuzione approssimativamente simmetrica. Per confrontare l’intensità dell’asimmetria è stato considerato il valore assoluto della skewness, poiché il segno indica la direzione della coda ma non la sua intensità. volume presenta il valore assoluto più elevato (circa 0,885) e risulta quindi la variabile con la distribuzione più asimmetrica. L’asimmetria è positiva, suggerendo la presenza di alcune osservazioni con valori totali delle vendite particolarmente elevati. Per quanto riguarda la curtosi, sales, median_price e listings presentano valori negativi dell’eccesso di curtosi e risultano quindi platicurtiche rispetto alla distribuzione normale. volume e months_inventory presentano invece valori leggermente positivi e risultano lievemente leptocurtiche. In entrambi questi ultimi casi i valori sono comunque relativamente vicini a zero.
Per le variabili non trattate come quantitative vengono costruite
distribuzioni di frequenza. Per city sono sufficienti
frequenze assolute e relative, mentre per year e
month, essendo variabili ordinate temporalmente, vengono
considerate anche le frequenze cumulate.
N <- nrow(real_estate)
city_ni <- table(real_estate$city)
city_fi <- city_ni / N
city_freq <- data.frame(
city = names(city_ni),
ni = as.vector(city_ni),
fi = as.vector(city_fi)
)
city_freq %>%
mutate(
fi = round(fi, 4)
) %>%
knitr::kable(
caption = "Distribuzione di frequenza per città"
)
| city | ni | fi |
|---|---|---|
| Beaumont | 60 | 0.25 |
| Bryan-College Station | 60 | 0.25 |
| Tyler | 60 | 0.25 |
| Wichita Falls | 60 | 0.25 |
Le quattro città sono rappresentate in modo perfettamente bilanciato nel dataset: ciascuna compare in 60 osservazioni, pari al 25% del totale. Questo equilibrio deriva dalla struttura del dataset, che contiene cinque anni completi di osservazioni mensili per ciascuna città, e consente confronti diretti senza che una città pesi più delle altre semplicemente per una maggiore numerosità di osservazioni.
year_ni <- table(real_estate$year)
year_fi <- year_ni / N
year_Ni <- cumsum(year_ni)
year_Fi <- cumsum(year_fi)
year_freq <- data.frame(
year = names(year_ni),
ni = as.vector(year_ni),
fi = as.vector(year_fi),
Ni = as.vector(year_Ni),
Fi = as.vector(year_Fi)
)
year_freq %>%
mutate(
fi = round(fi, 4),
Fi = round(Fi, 4)
) %>%
knitr::kable(
caption = "Distribuzione di frequenza per anno"
)
| 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 |
Anche la distribuzione per anno è bilanciata: ciascuno dei cinque anni dal 2010 al 2014 contiene 48 osservazioni, pari al 20% del dataset. Le frequenze cumulate crescono quindi in modo regolare di 48 osservazioni, o 20 punti percentuali, per ogni anno successivo. Questo conferma che nessun anno è sovra- o sottorappresentato. Le frequenze cumulate assolute (Ni) e relative (Fi) crescono regolarmente perché ogni anno è rappresentato dallo stesso numero di osservazioni. Ad esempio, al termine del 2012 risultano accumulate 144 osservazioni, pari al 60% del dataset.
month_ni <- table(real_estate$month)
month_fi <- month_ni / N
month_Ni <- cumsum(month_ni)
month_Fi <- cumsum(month_fi)
mesi <- c("Gennaio", "Febbraio", "Marzo", "Aprile",
"Maggio", "Giugno", "Luglio", "Agosto",
"Settembre", "Ottobre", "Novembre", "Dicembre")
month_freq <- data.frame(
month = as.numeric(names(month_ni)),
month_name = mesi[as.numeric(names(month_ni))],
ni = as.vector(month_ni),
fi = as.vector(month_fi),
Ni = as.vector(month_Ni),
Fi = as.vector(month_Fi)
)
month_freq %>%
mutate(
fi = round(fi, 4),
Fi = round(Fi, 4)
) %>%
knitr::kable(
caption = "Distribuzione di frequenza per mese"
)
| month | month_name | ni | fi | Ni | Fi |
|---|---|---|---|---|---|
| 1 | Gennaio | 20 | 0.0833 | 20 | 0.0833 |
| 2 | Febbraio | 20 | 0.0833 | 40 | 0.1667 |
| 3 | Marzo | 20 | 0.0833 | 60 | 0.2500 |
| 4 | Aprile | 20 | 0.0833 | 80 | 0.3333 |
| 5 | Maggio | 20 | 0.0833 | 100 | 0.4167 |
| 6 | Giugno | 20 | 0.0833 | 120 | 0.5000 |
| 7 | Luglio | 20 | 0.0833 | 140 | 0.5833 |
| 8 | Agosto | 20 | 0.0833 | 160 | 0.6667 |
| 9 | Settembre | 20 | 0.0833 | 180 | 0.7500 |
| 10 | Ottobre | 20 | 0.0833 | 200 | 0.8333 |
| 11 | Novembre | 20 | 0.0833 | 220 | 0.9167 |
| 12 | Dicembre | 20 | 0.0833 | 240 | 1.0000 |
Tutti i dodici mesi sono rappresentati con la stessa frequenza: ciascun mese compare in 20 osservazioni, pari a circa l’8,33% del totale. Anche la dimensione mensile è quindi completamente bilanciata. Questo aspetto è particolarmente utile per le successive analisi stagionali, perché eventuali differenze tra mesi non saranno dovute a una diversa numerosità delle osservazioni disponibili. Anche le frequenze cumulate mensili crescono in modo regolare: ogni mese aggiunge 20 osservazioni, pari a circa l’8,33% del totale. Ad esempio, entro giugno risultano accumulate 120 osservazioni, cioè il 50% del dataset.
comparison_table <- data.frame(
Variabile = c("sales",
"volume",
"median_price",
"listings",
"months_inventory"),
CV_percentuale = c(
CV(real_estate$sales),
CV(real_estate$volume),
CV(real_estate$median_price),
CV(real_estate$listings),
CV(real_estate$months_inventory)
),
Asimmetria = c(
skewness(real_estate$sales),
skewness(real_estate$volume),
skewness(real_estate$median_price),
skewness(real_estate$listings),
skewness(real_estate$months_inventory)
),
Asimmetria_assoluta = c(
abs(skewness(real_estate$sales)),
abs(skewness(real_estate$volume)),
abs(skewness(real_estate$median_price)),
abs(skewness(real_estate$listings)),
abs(skewness(real_estate$months_inventory))
)
)
comparison_table %>%
mutate(across(where(is.numeric), ~ round(.x, 3))) %>%
knitr::kable(
caption = "Confronto della variabilità relativa e dell'asimmetria"
)
| Variabile | CV_percentuale | Asimmetria | Asimmetria_assoluta |
|---|---|---|---|
| sales | 41.422 | 0.718 | 0.718 |
| volume | 53.705 | 0.885 | 0.885 |
| median_price | 17.082 | -0.365 | 0.365 |
| listings | 43.308 | 0.649 | 0.649 |
| months_inventory | 25.060 | 0.041 | 0.041 |
Il confronto tra le variabili quantitative richiede criteri differenti per variabilità e asimmetria. Poiché le variabili sono espresse in unità di misura e ordini di grandezza diversi, la variabilità viene confrontata tramite il coefficiente di variazione e non tramite la deviazione standard assoluta. volume presenta il coefficiente di variazione più elevato, pari a circa 53,7%, e risulta quindi la variabile con la maggiore variabilità relativa. Seguono listings e sales, mentre median_price presenta la variabilità relativa più contenuta. Per confrontare l’intensità dell’asimmetria viene considerato il valore assoluto dell’indice di asimmetria di Fisher. Anche in questo caso volume presenta il valore più elevato, con una skewness di circa 0,885. La sua distribuzione è quindi la più asimmetrica tra quelle considerate e presenta un’asimmetria positiva, cioè una coda verso i valori più elevati.
Per sintetizzare la distribuzione del numero mensile di vendite, la
variabile sales viene suddivisa in classi di uguale
ampiezza.
min(real_estate$sales)
## [1] 79
max(real_estate$sales)
## [1] 423
real_estate$sales_class <- cut(
real_estate$sales,
breaks = seq(50, 450, 50),
right = FALSE
)
table(real_estate$sales_class)
##
## [50,100) [100,150) [150,200) [200,250) [250,300) [300,350) [350,400) [400,450)
## 20 69 58 33 34 14 9 3
sales_ni <- table(real_estate$sales_class)
sales_fi <- sales_ni / nrow(real_estate)
sales_Ni <- cumsum(sales_ni)
sales_Fi <- cumsum(sales_fi)
sales_freq <- data.frame(
Classe = names(sales_ni),
ni = as.vector(sales_ni),
fi = as.vector(sales_fi),
Ni = as.vector(sales_Ni),
Fi = as.vector(sales_Fi)
)
sales_freq %>%
mutate(
fi = round(fi, 4),
Fi = round(Fi, 4)
) %>%
knitr::kable(
caption = "Distribuzione di frequenza delle vendite mensili per classi"
)
| Classe | ni | fi | Ni | Fi |
|---|---|---|---|---|
| [50,100) | 20 | 0.0833 | 20 | 0.0833 |
| [100,150) | 69 | 0.2875 | 89 | 0.3708 |
| [150,200) | 58 | 0.2417 | 147 | 0.6125 |
| [200,250) | 33 | 0.1375 | 180 | 0.7500 |
| [250,300) | 34 | 0.1417 | 214 | 0.8917 |
| [300,350) | 14 | 0.0583 | 228 | 0.9500 |
| [350,400) | 9 | 0.0375 | 237 | 0.9875 |
| [400,450) | 3 | 0.0125 | 240 | 1.0000 |
sales_freq$Classe <- factor(
sales_freq$Classe,
levels = names(sales_ni)
)
ggplot(sales_freq, aes(x = Classe, y = ni)) +
geom_col() +
labs(
title = "Distribuzione delle vendite mensili per classi",
x = "Numero di vendite mensili",
y = "Frequenza assoluta"
) +
theme_classic()
J <- nrow(sales_freq)
gini <- 1 - sum(sales_freq$fi^2)
gini_normalizzato <- gini / ((J - 1) / J)
gini_normalizzato
## [1] 0.9234921
La distribuzione delle vendite mensili è maggiormente concentrata nelle classi intermedie. La classe più frequente è [100,150), che comprende 69 osservazioni, pari al 28,75% del totale, seguita dalla classe [150,200) con il 24,17%. Complessivamente, il 61,25% delle osservazioni registra meno di 200 vendite mensili, mentre il 90% rimane al di sotto delle 300 vendite. Le classi caratterizzate dai valori più elevati risultano progressivamente meno frequenti: soltanto il 10% delle osservazioni presenta almeno 300 vendite mensili. Questo andamento è coerente con l’asimmetria positiva precedentemente osservata per sales, dovuta alla presenza di un numero relativamente limitato di osservazioni con valori elevati. L’indice di eterogeneità di Gini normalizzato è pari a circa 0,923. Essendo vicino al valore massimo di 1, indica un’elevata eterogeneità della distribuzione: le osservazioni non sono concentrate in una singola classe, ma risultano distribuite su gran parte degli intervalli considerati. Le frequenze non sono tuttavia uniformi, poiché le classi comprese tra 100 e 199 vendite raccolgono una quota particolarmente elevata delle osservazioni.
Le probabilità richieste vengono ricavate empiricamente dal dataset. Poiché si considera l’estrazione casuale di una riga, la probabilità di ciascun evento viene calcolata come rapporto tra il numero di osservazioni che soddisfano la condizione e il numero totale di osservazioni.
total_obs <- nrow(real_estate)
beaumont_cases <- sum(real_estate$city == "Beaumont")
prob_beaumont <- beaumont_cases / total_obs
beaumont_cases
## [1] 60
prob_beaumont
## [1] 0.25
Beaumont compare in 60 delle 240 osservazioni del dataset. La probabilità che una riga scelta casualmente faccia riferimento a Beaumont è quindi pari a 0,25, cioè al 25%. Il risultato riflette la struttura bilanciata del dataset, nel quale ciascuna delle quattro città è rappresentata dallo stesso numero di osservazioni.
july_cases <- sum(real_estate$month == 7)
prob_july <- july_cases / total_obs
july_cases
## [1] 20
prob_july
## [1] 0.08333333
Il mese di luglio compare in 20 delle 240 osservazioni. La probabilità che una riga selezionata casualmente corrisponda al mese di luglio è quindi pari a circa 0,0833, cioè all’8,33%. Poiché tutti i dodici mesi sono rappresentati in modo uniforme, la stessa probabilità vale per ciascun mese dell’anno.
december_2012_cases <- sum(
real_estate$year == 2012 &
real_estate$month == 12
)
prob_december_2012 <- december_2012_cases / total_obs
december_2012_cases
## [1] 4
prob_december_2012
## [1] 0.01666667
La condizione “dicembre 2012” è congiunta, perché richiede contemporaneamente year = 2012 e month = 12. Nel dataset sono presenti quattro osservazioni che soddisfano entrambe le condizioni, una per ciascuna città. La probabilità di selezionare casualmente una riga relativa a dicembre 2012 è quindi pari a circa 0,0167, cioè all’1,67%.
probability_table <- data.frame(
Evento = c(
"Beaumont",
"Luglio",
"Dicembre 2012"
),
Casi_favorevoli = c(
beaumont_cases,
july_cases,
december_2012_cases
),
Totale = c(
total_obs,
total_obs,
total_obs
),
Probabilita = c(
prob_beaumont,
prob_july,
prob_december_2012
),
Percentuale = c(
prob_beaumont,
prob_july,
prob_december_2012
) * 100
)
probability_table %>%
mutate(
Probabilita = round(Probabilita, 4),
Percentuale = round(Percentuale, 2)
) %>%
knitr::kable(
caption = "Probabilità empiriche richieste"
)
| Evento | Casi_favorevoli | Totale | Probabilita | Percentuale |
|---|---|---|---|---|
| Beaumont | 60 | 240 | 0.2500 | 25.00 |
| Luglio | 20 | 240 | 0.0833 | 8.33 |
| Dicembre 2012 | 4 | 240 | 0.0167 | 1.67 |
Le probabilità calcolate riflettono la struttura del dataset e non rappresentano direttamente quote del mercato immobiliare texano. Beaumont ha una probabilità del 25% perché ciascuna delle quattro città è rappresentata dallo stesso numero di osservazioni. Il mese di luglio ha una probabilità dell’8,33%, coerente con la presenza uniforme dei dodici mesi nel dataset. La probabilità relativa a dicembre 2012 è invece pari all’1,67%, poiché la condizione richiede contemporaneamente uno specifico mese e uno specifico anno e corrisponde a sole quattro osservazioni, una per ciascuna città. Nel complesso, questi risultati confermano che le probabilità empiriche dipendono direttamente dalla frequenza con cui gli eventi considerati compaiono nel dataset.
A partire dalle variabili disponibili vengono costruiti due nuovi indicatori: il prezzo medio degli immobili venduti e un indicatore dell’efficacia degli annunci.
real_estate$average_price <-
(real_estate$volume * 1000000) / real_estate$sales
head(real_estate[, c("volume",
"sales",
"average_price")])
## volume sales average_price
## 1 14.162 83 170626.5
## 2 17.690 108 163796.3
## 3 28.701 182 157697.8
## 4 26.819 200 134095.0
## 5 28.833 202 142737.6
## 6 27.219 189 144015.9
summary(real_estate$average_price)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 97010 132939 156588 154320 173915 213234
Il prezzo medio degli immobili venduti è stato calcolato dividendo il valore complessivo delle vendite mensili per il numero di transazioni, dopo aver convertito volume da milioni di dollari a dollari. La nuova variabile presenta valori compresi tra circa 97.000 e 213.000 dollari, con una media di circa 154.000 dollari e una mediana di circa 157.000 dollari. Questo indicatore non coincide con median_price: il prezzo medio considera il valore di tutte le transazioni ed è quindi maggiormente influenzabile da vendite particolarmente costose, mentre la mediana rappresenta il valore centrale della distribuzione dei prezzi ed è più robusta rispetto ai valori estremi.
real_estate$listing_effectiveness <-
(real_estate$sales / real_estate$listings) * 100
head(real_estate[, c("sales",
"listings",
"listing_effectiveness")])
## sales listings listing_effectiveness
## 1 83 1533 5.414220
## 2 108 1586 6.809584
## 3 182 1689 10.775607
## 4 200 1708 11.709602
## 5 202 1771 11.405985
## 6 189 1803 10.482529
summary(real_estate$listing_effectiveness)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 5.014 8.980 10.963 11.874 13.492 38.713
L’indicatore di efficacia degli annunci è stato costruito come rapporto percentuale tra vendite mensili e annunci attivi. Il valore medio è pari a circa 11,9, indicando che nell’intero dataset si osservano mediamente circa 12 vendite mensili ogni 100 annunci attivi. La mediana è leggermente inferiore, circa 11 vendite ogni 100 annunci, mentre i valori osservati variano da circa 5 a quasi 39. Valori più elevati dell’indicatore suggeriscono una maggiore capacità del mercato di assorbire lo stock di annunci disponibili, mentre valori più bassi indicano un rapporto più ridotto tra vendite e offerta attiva. L’indicatore deve tuttavia essere interpretato come una misura proxy e non come un vero tasso di conversione, poiché le vendite del mese non sono necessariamente riconducibili agli stessi annunci presenti nel denominatore.
Le statistiche complessive descrivono il dataset nel suo insieme, ma possono nascondere differenze tra aree geografiche e periodi temporali. Per questo motivo vengono calcolate media e deviazione standard delle variabili quantitative condizionatamente alla città, all’anno e al mese.
city_market_stats <- real_estate %>%
group_by(city) %>%
summarise(
sales_mean = mean(sales),
sales_sd = sd(sales),
volume_mean = mean(volume),
volume_sd = sd(volume),
listings_mean = mean(listings),
listings_sd = sd(listings),
inventory_mean = mean(months_inventory),
inventory_sd = sd(months_inventory)
)
city_market_stats %>%
mutate(across(where(is.numeric), ~ round(.x, 2))) %>%
knitr::kable(
caption = "Statistiche di mercato per città"
)
| city | sales_mean | sales_sd | volume_mean | volume_sd | listings_mean | listings_sd | inventory_mean | inventory_sd |
|---|---|---|---|---|---|---|---|---|
| Beaumont | 177.38 | 41.48 | 26.13 | 6.97 | 1679.32 | 91.13 | 9.97 | 1.65 |
| Bryan-College Station | 205.97 | 84.98 | 38.19 | 17.25 | 1458.13 | 252.53 | 7.66 | 2.25 |
| Tyler | 269.75 | 61.96 | 45.77 | 13.11 | 2905.05 | 226.75 | 11.32 | 1.89 |
| Wichita Falls | 116.07 | 22.15 | 13.93 | 3.24 | 909.58 | 73.76 | 7.82 | 0.78 |
Le statistiche per città evidenziano differenze marcate nella dimensione dei mercati considerati. Tyler presenta il maggior numero medio di vendite e il volume medio più elevato, ma anche il maggior numero medio di annunci attivi e il livello più alto di inventory. Wichita Falls mostra invece i livelli medi più bassi di vendite e volume. Le deviazioni standard indicano inoltre che la variabilità mensile non è uniforme tra le città.
city_price_stats <- real_estate %>%
group_by(city) %>%
summarise(
median_price_mean = mean(median_price),
median_price_sd = sd(median_price),
average_price_mean = mean(average_price),
average_price_sd = sd(average_price),
effectiveness_mean = mean(listing_effectiveness),
effectiveness_sd = sd(listing_effectiveness)
)
city_price_stats %>%
mutate(across(where(is.numeric), ~ round(.x, 2))) %>%
knitr::kable(
caption = "Prezzi ed efficacia degli annunci per città"
)
| city | median_price_mean | median_price_sd | average_price_mean | average_price_sd | effectiveness_mean | effectiveness_sd |
|---|---|---|---|---|---|---|
| Beaumont | 129988.3 | 10104.99 | 146640.4 | 11232.13 | 10.61 | 2.67 |
| Bryan-College Station | 157488.3 | 8852.24 | 183534.3 | 15149.35 | 14.73 | 7.29 |
| Tyler | 141441.7 | 9336.54 | 167676.8 | 12350.51 | 9.35 | 2.35 |
| Wichita Falls | 101743.3 | 11320.03 | 119430.0 | 11398.48 | 12.80 | 2.47 |
Sul fronte dei prezzi e dell’efficacia degli annunci, Bryan-College Station presenta sia il prezzo mediano medio sia il prezzo medio per immobile più elevati. La stessa città registra anche il valore medio più alto dell’indicatore di efficacia, sebbene con una variabilità sensibilmente maggiore rispetto alle altre città. Tyler, pur essendo il mercato con più vendite in termini assoluti, presenta invece il rapporto medio vendite/annunci più basso.
ggplot(city_market_stats,
aes(x = city, y = sales_mean)) +
geom_col() +
labs(
title = "Vendite mensili medie per città",
x = "Città",
y = "Numero medio di vendite mensili"
) +
theme_classic()
Il confronto delle vendite mensili medie evidenzia differenze marcate tra le città. Tyler presenta il livello di attività più elevato, con circa 270 vendite mensili, seguita da Bryan-College Station con circa 206 e Beaumont con circa 177. Wichita Falls registra invece il numero medio più basso, circa 116 vendite mensili. Il grafico evidenzia quindi mercati di dimensioni differenti, ma il solo numero di vendite non è sufficiente a valutare l’efficienza con cui l’offerta disponibile viene assorbita.
ggplot(city_price_stats,
aes(x = city, y = effectiveness_mean)) +
geom_col() +
labs(
title = "Efficacia media degli annunci per città",
x = "Città",
y = "Vendite mensili ogni 100 annunci attivi"
) +
theme_classic()
Il confronto dell’indicatore di efficacia degli annunci modifica parzialmente la graduatoria osservata per le vendite assolute. Bryan-College Station presenta il valore medio più elevato, con circa 14,7 vendite mensili ogni 100 annunci attivi, seguita da Wichita Falls con circa 12,8. Beaumont si colloca intorno a 10,6, mentre Tyler, nonostante presenti il maggior numero assoluto di vendite, mostra il valore medio più basso, circa 9,3 vendite ogni 100 annunci. Il risultato suggerisce che un volume elevato di transazioni non implica necessariamente una maggiore capacità di assorbimento rispetto allo stock di annunci disponibili.
year_market_stats <- real_estate %>%
group_by(year) %>%
summarise(
sales_mean = mean(sales),
sales_sd = sd(sales),
volume_mean = mean(volume),
volume_sd = sd(volume),
listings_mean = mean(listings),
listings_sd = sd(listings),
inventory_mean = mean(months_inventory),
inventory_sd = sd(months_inventory)
)
year_market_stats %>%
mutate(across(where(is.numeric), ~ round(.x, 2))) %>%
knitr::kable(
caption = "Statistiche di mercato per anno"
)
| year | sales_mean | sales_sd | volume_mean | volume_sd | listings_mean | listings_sd | inventory_mean | inventory_sd |
|---|---|---|---|---|---|---|---|---|
| 2010 | 168.67 | 60.54 | 25.68 | 10.80 | 1826.00 | 785.02 | 9.97 | 2.08 |
| 2011 | 164.12 | 63.87 | 25.16 | 12.20 | 1849.65 | 780.38 | 10.90 | 2.07 |
| 2012 | 186.15 | 70.91 | 29.27 | 14.52 | 1776.81 | 738.45 | 9.88 | 1.61 |
| 2013 | 211.92 | 84.00 | 35.15 | 17.93 | 1677.60 | 743.52 | 8.15 | 1.69 |
| 2014 | 230.60 | 95.51 | 39.77 | 21.19 | 1560.04 | 706.71 | 7.06 | 1.75 |
L’analisi per anno evidenzia una lieve flessione dell’attività tra il 2010 e il 2011, seguita da una crescita progressiva dal 2012 al 2014. Le vendite mensili medie passano da circa 169 nel 2010 a circa 231 nel 2014, mentre il volume medio delle compravendite cresce da circa 25,7 a 39,8 milioni di dollari. Nello stesso periodo, il numero medio di annunci attivi diminuisce da circa 1.826 a 1.560 e i mesi medi di inventory si riducono da circa 10,0 a 7,1. Nel complesso, questi risultati descrivono un mercato che, soprattutto dal 2012 in avanti, registra più vendite e maggiore volume a fronte di uno stock di annunci progressivamente più contenuto. Le deviazioni standard di sales e volume aumentano nel tempo, indicando che l’attività mensile diventa anche più variabile negli anni più recenti. La variabilità di months_inventory rimane invece relativamente più contenuta
year_price_stats <- real_estate %>%
group_by(year) %>%
summarise(
median_price_mean = mean(median_price),
median_price_sd = sd(median_price),
average_price_mean = mean(average_price),
average_price_sd = sd(average_price),
effectiveness_mean = mean(listing_effectiveness),
effectiveness_sd = sd(listing_effectiveness)
)
year_price_stats %>%
mutate(across(where(is.numeric), ~ round(.x, 2))) %>%
knitr::kable(
caption = "Prezzi ed efficacia degli annunci per anno"
)
| year | median_price_mean | median_price_sd | average_price_mean | average_price_sd | effectiveness_mean | effectiveness_sd |
|---|---|---|---|---|---|---|
| 2010 | 130191.7 | 21821.76 | 150188.6 | 23279.55 | 9.97 | 3.37 |
| 2011 | 127854.2 | 21317.80 | 148250.6 | 24938.38 | 9.27 | 2.32 |
| 2012 | 130077.1 | 21431.52 | 150898.7 | 26438.50 | 10.97 | 2.81 |
| 2013 | 135722.9 | 21708.08 | 158705.2 | 26523.81 | 13.46 | 4.48 |
| 2014 | 139481.2 | 25625.41 | 163558.7 | 31740.53 | 15.70 | 6.18 |
Anche gli indicatori di prezzo mostrano una lieve contrazione nel 2011 e una successiva crescita. Il prezzo mediano medio passa da circa 130.200 dollari nel 2010 a circa 139.500 nel 2014, mentre il prezzo medio per immobile cresce da circa 150.200 a 163.600 dollari. L’indicatore di efficacia degli annunci mostra un’evoluzione ancora più marcata: dopo una diminuzione da circa 10,0 vendite ogni 100 annunci attivi nel 2010 a circa 9,3 nel 2011, aumenta progressivamente fino a circa 15,7 nel 2014. Tuttavia, aumenta anche la deviazione standard dell’indicatore negli ultimi anni, suggerendo che il miglioramento medio dell’efficacia è accompagnato da una maggiore variabilità tra le osservazioni mensili e tra le città.
ggplot(year_market_stats,
aes(x = factor(year), y = sales_mean)) +
geom_col() +
labs(
title = "Vendite mensili medie per anno",
x = "Anno",
y = "Numero medio di vendite mensili"
) +
theme_classic()
Il grafico rende evidente la dinamica temporale delle vendite: dopo una lieve diminuzione nel 2011, il numero medio di compravendite cresce in modo continuo dal 2012 al 2014. Il 2014 presenta il livello medio più elevato dell’intero periodo analizzato. La crescita delle vendite osservata negli ultimi tre anni suggerisce un rafforzamento dell’attività del mercato rispetto alla fase iniziale della serie.
ggplot(year_price_stats,
aes(x = factor(year), y = effectiveness_mean)) +
geom_col() +
labs(
title = "Efficacia media degli annunci per anno",
x = "Anno",
y = "Vendite mensili ogni 100 annunci attivi"
) +
theme_classic()
L’efficacia media degli annunci segue un andamento simile ma ancora più pronunciato. Dopo il minimo osservato nel 2011, il rapporto tra vendite mensili e annunci attivi aumenta progressivamente, raggiungendo il valore massimo nel 2014. Questo andamento indica che, nel periodo più recente, viene osservato un numero maggiore di vendite in rapporto allo stock di annunci disponibili. L’indicatore resta comunque una misura proxy dell’assorbimento del mercato e non un vero tasso di conversione dei singoli annunci.
month_market_stats <- real_estate %>%
group_by(month) %>%
summarise(
sales_mean = mean(sales),
sales_sd = sd(sales),
volume_mean = mean(volume),
volume_sd = sd(volume),
listings_mean = mean(listings),
listings_sd = sd(listings),
inventory_mean = mean(months_inventory),
inventory_sd = sd(months_inventory)
)
month_market_stats %>%
mutate(across(where(is.numeric), ~ round(.x, 2))) %>%
knitr::kable(
caption = "Statistiche di mercato per mese"
)
| month | sales_mean | sales_sd | volume_mean | volume_sd | listings_mean | listings_sd | inventory_mean | inventory_sd |
|---|---|---|---|---|---|---|---|---|
| 1 | 127.40 | 43.38 | 19.00 | 8.37 | 1647.05 | 704.61 | 8.84 | 1.97 |
| 2 | 140.85 | 51.07 | 21.65 | 10.09 | 1692.50 | 711.20 | 9.06 | 1.98 |
| 3 | 189.45 | 59.18 | 29.38 | 12.02 | 1756.70 | 727.35 | 9.40 | 2.06 |
| 4 | 211.70 | 65.40 | 33.30 | 14.52 | 1825.70 | 770.43 | 9.72 | 2.24 |
| 5 | 238.85 | 83.12 | 39.70 | 19.02 | 1823.85 | 790.22 | 9.68 | 2.38 |
| 6 | 243.55 | 95.00 | 41.30 | 21.08 | 1833.25 | 811.63 | 9.70 | 2.41 |
| 7 | 235.75 | 96.27 | 39.12 | 21.41 | 1821.20 | 826.72 | 9.62 | 2.50 |
| 8 | 231.45 | 79.23 | 38.01 | 18.05 | 1786.30 | 815.87 | 9.39 | 2.45 |
| 9 | 182.35 | 72.52 | 29.60 | 15.22 | 1748.90 | 802.66 | 9.19 | 2.52 |
| 10 | 179.90 | 74.95 | 29.08 | 15.13 | 1710.35 | 779.16 | 8.94 | 2.44 |
| 11 | 156.85 | 55.47 | 24.81 | 11.15 | 1652.70 | 741.25 | 8.66 | 2.37 |
| 12 | 169.40 | 60.75 | 27.09 | 12.57 | 1557.75 | 692.57 | 8.12 | 2.27 |
L’analisi per mese evidenzia una marcata componente stagionale nell’attività immobiliare. Le vendite mensili medie aumentano progressivamente dall’inizio dell’anno, passando da circa 127 a gennaio a un massimo di circa 244 a giugno. Restano elevate anche a luglio e agosto, per poi diminuire nei mesi autunnali. Novembre presenta circa 157 vendite medie, mentre dicembre mostra una lieve risalita a circa 169. Anche il volume medio delle compravendite segue un andamento simile, con valori più contenuti nei primi mesi dell’anno e un picco nel periodo tarda primavera-estate. Il numero medio di annunci attivi cresce fino ai mesi centrali dell’anno e diminuisce successivamente. months_inventory varia meno rispetto alle altre grandezze, ma tende anch’esso a essere più elevato nei mesi primaverili ed estivi e più contenuto verso la fine dell’anno. Le deviazioni standard di vendite e volume risultano generalmente più elevate nei mesi di maggiore attività, indicando che nei periodi più dinamici aumentano anche le differenze tra le osservazioni considerate.
month_price_stats <- real_estate %>%
group_by(month) %>%
summarise(
median_price_mean = mean(median_price),
median_price_sd = sd(median_price),
average_price_mean = mean(average_price),
average_price_sd = sd(average_price),
effectiveness_mean = mean(listing_effectiveness),
effectiveness_sd = sd(listing_effectiveness)
)
month_price_stats %>%
mutate(across(where(is.numeric), ~ round(.x, 2))) %>%
knitr::kable(
caption = "Prezzi ed efficacia degli annunci per mese"
)
| month | median_price_mean | median_price_sd | average_price_mean | average_price_sd | effectiveness_mean | effectiveness_sd |
|---|---|---|---|---|---|---|
| 1 | 124250 | 25151.28 | 145640.4 | 29819.11 | 8.31 | 2.30 |
| 2 | 130075 | 22822.59 | 148840.5 | 25120.42 | 8.78 | 2.19 |
| 3 | 127415 | 23442.03 | 151136.5 | 23237.92 | 11.60 | 3.46 |
| 4 | 131490 | 21458.40 | 151461.3 | 26174.30 | 12.53 | 3.80 |
| 5 | 134485 | 18796.26 | 158235.0 | 25787.19 | 14.15 | 5.03 |
| 6 | 137620 | 19231.02 | 161545.8 | 23470.46 | 14.24 | 5.76 |
| 7 | 134750 | 21944.78 | 156881.0 | 27220.12 | 14.35 | 7.40 |
| 8 | 136675 | 22488.38 | 156455.6 | 28253.21 | 14.19 | 5.26 |
| 9 | 134040 | 24344.10 | 156522.3 | 29669.41 | 11.17 | 3.48 |
| 10 | 133480 | 26358.07 | 155897.4 | 32527.29 | 11.19 | 3.60 |
| 11 | 134305 | 24691.47 | 154233.0 | 29684.87 | 10.25 | 2.93 |
| 12 | 133400 | 22809.76 | 154995.5 | 27008.87 | 11.73 | 3.79 |
I prezzi mostrano una stagionalità meno marcata rispetto alle quantità vendute. Il prezzo mediano medio varia infatti in un intervallo relativamente contenuto, da circa 124.000 dollari a gennaio a un massimo di circa 138.000 dollari a giugno. Anche il prezzo medio per immobile tende ad aumentare nella prima metà dell’anno e raggiunge i valori più elevati nel periodo primaverile-estivo. L’indicatore di efficacia degli annunci presenta invece un andamento stagionale evidente: passa da circa 8,3 vendite ogni 100 annunci attivi a gennaio a valori superiori a 14 tra maggio e agosto, con un massimo di circa 14,35 a luglio. Nei mesi successivi diminuisce, pur mostrando una nuova crescita a dicembre. Le deviazioni standard dell’indicatore sono particolarmente elevate nei mesi estivi, soprattutto a luglio, suggerendo che in questo periodo l’efficacia media è alta ma anche meno uniforme tra le osservazioni.
month_market_stats$month_name <- factor(
month_market_stats$month,
levels = 1:12,
labels = c(
"Gen", "Feb", "Mar", "Apr",
"Mag", "Giu", "Lug", "Ago",
"Set", "Ott", "Nov", "Dic"
)
)
ggplot(month_market_stats,
aes(x = month_name, y = sales_mean)) +
geom_col() +
labs(
title = "Vendite mensili medie per mese",
x = "Mese",
y = "Numero medio di vendite"
) +
theme_classic()
Il grafico mostra chiaramente una stagionalità nelle vendite immobiliari. L’attività cresce dai mesi invernali verso la primavera e raggiunge il massimo a giugno, con circa 244 vendite medie. I livelli restano elevati tra maggio e agosto, mentre da settembre si osserva una riduzione progressiva. Gennaio rappresenta il mese con il numero medio di vendite più basso. Il periodo compreso tra tarda primavera ed estate risulta quindi quello caratterizzato dalla maggiore attività di compravendita.
month_price_stats$month_name <- factor(
month_price_stats$month,
levels = 1:12,
labels = c(
"Gen", "Feb", "Mar", "Apr",
"Mag", "Giu", "Lug", "Ago",
"Set", "Ott", "Nov", "Dic"
)
)
ggplot(month_price_stats,
aes(x = month_name, y = effectiveness_mean)) +
geom_col() +
labs(
title = "Efficacia media degli annunci per mese",
x = "Mese",
y = "Vendite mensili ogni 100 annunci attivi"
) +
theme_classic()
Anche l’efficacia degli annunci presenta un andamento stagionale. I valori più bassi si osservano a gennaio e febbraio, mentre l’indicatore cresce rapidamente durante la primavera e raggiunge i livelli più elevati tra maggio e agosto. Luglio presenta il valore medio massimo, pari a circa 14,35 vendite mensili ogni 100 annunci attivi. Successivamente, l’efficacia diminuisce nei mesi autunnali, con una ripresa moderata a dicembre. Il risultato suggerisce che il periodo primaverile-estivo non è soltanto quello con il maggior numero di compravendite, ma anche quello in cui le vendite sono più elevate rispetto allo stock di annunci disponibili.
ggplot(real_estate,
aes(x = city, y = median_price)) +
geom_boxplot() +
labs(
title = "Distribuzione del prezzo mediano per città",
x = "Città",
y = "Prezzo mediano di vendita ($)"
) +
theme_classic()
Il boxplot evidenzia differenze nette nel livello dei prezzi mediani tra le città. Bryan-College Station presenta i valori più elevati, con una mediana superiore a quella delle altre città e una distribuzione relativamente concentrata. Tyler si colloca su livelli intermedi-alti, mentre Beaumont presenta prezzi mediani mediamente più bassi. Wichita Falls mostra invece i livelli di prezzo più contenuti dell’intero campione. La dispersione varia tra le città: Wichita Falls presenta un intervallo complessivo più ampio rispetto alla propria mediana, mentre Bryan-College Station mostra una distribuzione più compatta. Il grafico evidenzia inoltre alcuni valori anomali isolati, in particolare per Beaumont e Wichita Falls, che rappresentano mesi con prezzi mediani insolitamente elevati rispetto alla distribuzione tipica della rispettiva città.
ggplot(real_estate,
aes(x = city, y = volume)) +
geom_boxplot() +
labs(
title = "Distribuzione del volume delle vendite per città",
x = "Città",
y = "Volume totale delle vendite (milioni di $)"
) +
theme_classic()
Il confronto del volume mensile delle vendite evidenzia differenze marcate tra le città. Tyler presenta i livelli tipicamente più elevati, con una mediana del volume superiore rispetto agli altri mercati, mentre Wichita Falls mostra i valori più contenuti. Bryan-College Station si colloca su livelli intermedi ma presenta una dispersione particolarmente ampia, con mesi caratterizzati da volumi molto diversi tra loro. Beaumont mostra una distribuzione più concentrata rispetto a Bryan-College Station e Tyler. Nel caso di Tyler è inoltre presente un valore anomalo superiore agli 80 milioni di dollari, corrispondente a un mese con volume eccezionalmente elevato rispetto alla distribuzione tipica della città. Nel complesso, il grafico conferma che le città differiscono non solo per il livello medio del volume delle vendite, ma anche per la variabilità mensile dell’attività immobiliare.
ggplot(real_estate,
aes(x = factor(year), y = volume)) +
geom_boxplot() +
labs(
title = "Distribuzione del volume delle vendite per anno",
x = "Anno",
y = "Volume totale delle vendite (milioni di $)"
) +
theme_classic()
La distribuzione del volume mensile delle vendite mostra un progressivo spostamento verso valori più elevati nel corso del periodo analizzato. Nel 2010 e nel 2011 le mediane sono simili e relativamente contenute, mentre dal 2012 si osserva un aumento graduale, più marcato nel 2013 e nel 2014. Oltre alla crescita del livello centrale, aumenta anche la dispersione della distribuzione negli anni più recenti: i box e i baffi risultano più ampi nel 2013 e soprattutto nel 2014. Questo indica che, insieme all’aumento del volume tipico delle vendite, crescono anche le differenze tra i mesi e le città considerate. Il 2014 presenta sia la mediana più elevata sia l’intervallo complessivo più ampio, confermando quanto già emerso dall’analisi annuale delle medie: negli ultimi anni del periodo osservato il mercato registra volumi di transazione generalmente più alti, ma anche una maggiore variabilità.
monthly_city_sales <- real_estate %>%
group_by(month, city) %>%
summarise(
total_sales = sum(sales),
.groups = "drop"
)
monthly_city_sales
## # A tibble: 48 × 3
## month city total_sales
## <int> <chr> <int>
## 1 1 Beaumont 608
## 2 1 Bryan-College Station 591
## 3 1 Tyler 907
## 4 1 Wichita Falls 442
## 5 2 Beaumont 677
## 6 2 Bryan-College Station 628
## 7 2 Tyler 1058
## 8 2 Wichita Falls 454
## 9 3 Beaumont 855
## 10 3 Bryan-College Station 949
## # ℹ 38 more rows
monthly_city_sales$month_name <- factor(
monthly_city_sales$month,
levels = 1:12,
labels = c(
"Gen", "Feb", "Mar", "Apr",
"Mag", "Giu", "Lug", "Ago",
"Set", "Ott", "Nov", "Dic"
)
)
ggplot(monthly_city_sales,
aes(x = month_name,
y = total_sales,
fill = city)) +
geom_col(position = "stack") +
labs(
title = "Totale delle vendite per mese e città",
x = "Mese",
y = "Totale vendite",
fill = "Città"
) +
theme_classic() +
theme(legend.position = "bottom")
Il totale delle vendite presenta un chiaro andamento stagionale. L’attività cresce progressivamente dai primi mesi dell’anno, raggiunge i livelli più elevati tra maggio e luglio e diminuisce successivamente nei mesi autunnali, con una lieve ripresa a dicembre. La composizione delle barre mostra inoltre che Tyler contribuisce in misura rilevante al totale delle vendite in tutti i mesi, mentre Wichita Falls presenta generalmente il contributo più contenuto. Il grafico conferma quindi il pattern stagionale già emerso dall’analisi delle vendite medie mensili, aggiungendo l’informazione relativa al contributo delle singole città.
ggplot(monthly_city_sales,
aes(x = month_name,
y = total_sales,
fill = city)) +
geom_col(position = "fill") +
labs(
title = "Composizione percentuale delle vendite mensili per città",
x = "Mese",
y = "Quota sul totale mensile",
fill = "Città"
) +
scale_y_continuous(
labels = scales::percent
) +
theme_classic() +
theme(legend.position = "bottom")
La versione normalizzata consente di confrontare la composizione percentuale delle vendite tra le città indipendentemente dal diverso numero totale di transazioni registrate nei vari mesi. Le quote delle quattro città risultano relativamente stabili durante l’anno, anche se sono presenti alcune variazioni stagionali. Tyler mantiene generalmente una delle quote più elevate, mentre Wichita Falls rappresenta la componente più contenuta. Bryan-College Station aumenta il proprio peso relativo soprattutto nei mesi centrali dell’anno. Il confronto con il grafico precedente mostra perché la normalizzazione sia utile: mentre le vendite complessive cambiano sensibilmente tra inverno ed estate, la composizione relativa tra le città varia in misura più contenuta.
monthly_city_year_sales <- real_estate %>%
group_by(year, month, city) %>%
summarise(
total_sales = sum(sales),
.groups = "drop"
)
monthly_city_year_sales$month_name <- factor(
monthly_city_year_sales$month,
levels = 1:12,
labels = c(
"Gen", "Feb", "Mar", "Apr",
"Mag", "Giu", "Lug", "Ago",
"Set", "Ott", "Nov", "Dic"
)
)
ggplot(monthly_city_year_sales,
aes(x = month_name,
y = total_sales,
fill = city)) +
geom_col(position = "stack") +
facet_wrap(
~ year,
ncol = 2,
axes = "all_x",
axis.labels = "all_x"
) +
labs(
title = "Vendite mensili per città e anno",
x = "Mese",
y = "Totale vendite",
fill = "Città"
) +
theme_classic() +
theme(
legend.position = "bottom",
axis.text.x = element_text(
angle = 45,
hjust = 1,
size = 8
)
)
La suddivisione per anno permette di osservare contemporaneamente la stagionalità mensile e l’evoluzione storica delle vendite. Nel 2010 e nel 2011 i livelli complessivi risultano generalmente più contenuti, mentre dal 2012 si osserva una crescita che diventa particolarmente evidente nel 2013 e nel 2014. All’interno dei singoli anni ritorna inoltre un andamento stagionale ricorrente, con un aumento delle vendite durante la primavera e l’estate e una successiva riduzione nei mesi autunnali. Il contributo delle singole città rimane riconoscibile nel tempo: Tyler rappresenta generalmente una quota rilevante delle vendite, mentre Wichita Falls contribuisce in misura più contenuta. La rappresentazione per pannelli consente quindi di distinguere l’effetto stagionale dall’evoluzione tra gli anni, evitando la sovrapposizione eccessiva che si avrebbe rappresentando tutte le combinazioni nello stesso grafico.
real_estate$date <- as.Date(
paste(real_estate$year,
real_estate$month,
"01",
sep = "-")
)
ggplot(real_estate,
aes(x = date,
y = median_price,
color = city,
group = city)) +
geom_line(linewidth = 0.8) +
labs(
title = "Andamento storico del prezzo mediano per città",
x = "Periodo",
y = "Prezzo mediano di vendita ($)",
color = "Città"
) +
theme_classic() +
theme(legend.position = "bottom")
Il line chart evidenzia le differenze tra le città nel livello dei prezzi mediani e permette di seguirne l’evoluzione nei cinque anni esaminati. Bryan-College Station mantiene generalmente i valori più elevati per tutto il periodo, mentre Wichita Falls si colloca ai livelli più bassi. Tyler mostra un andamento crescente, soprattutto negli anni finali, mentre Beaumont presenta oscillazioni più frequenti e una complessiva stabilità. Il grafico mostra che le differenze tra le città persistono lungo l’intero arco temporale, pur con variazioni mensili e tendenze differenti.
L’analisi descrittiva evidenzia differenze significative tra le città considerate, sia per dimensione del mercato sia per l’andamento dei prezzi, la disponibilità di annunci e la capacità di assorbimento dell’offerta. Tyler rappresenta il mercato con il livello medio di attività più elevato: registra il numero medio di vendite più elevato e il volume mensile medio delle compravendite più alto. Allo stesso tempo, presenta anche il numero medio più alto di annunci attivi e il livello medio più elevato di months_inventory. Questo suggerisce un mercato ampio e dinamico, ma caratterizzato anche da un’offerta consistente. Bryan-College Station si distingue invece per i prezzi più elevati. Presenta sia il prezzo mediano medio sia il prezzo medio per immobile più alti tra le quattro città. Inoltre, mostra il valore medio più elevato dell’indicatore di efficacia degli annunci, pur accompagnato da una variabilità maggiore rispetto alle altre città. Wichita Falls presenta il mercato con il numero di vendite, volume e livelli di prezzo più contenuti. Tuttavia, il rapporto medio tra vendite e annunci attivi risulta relativamente favorevole, superiore a quello osservato a Beaumont e Tyler. Questo indica che una minore dimensione del mercato non coincide necessariamente con una minore capacità di assorbimento dell’offerta. Beaumont assume una posizione intermedia per la maggior parte degli indicatori, senza mostrare valori estremi né sul fronte dei prezzi né su quello dell’attività di mercato.
Dal punto di vista temporale, dopo una lieve flessione nel 2011 il mercato mostra una crescita progressiva dal 2012 al 2014. Nel periodo considerato aumentano sia le vendite mensili medie sia il volume medio delle transazioni, mentre il numero medio di annunci attivi e i mesi di inventory diminuiscono. Anche i prezzi mostrano una crescita negli anni più recenti, sebbene meno marcata rispetto a quella delle vendite e del volume. L’indicatore di efficacia degli annunci cresce sensibilmente dal 2012 in poi, raggiungendo il valore medio massimo nel 2014. Nel complesso, questi risultati descrivono un mercato che, negli ultimi anni della serie, presenta un’attività più intensa e una maggiore capacità di assorbimento dello stock disponibile rispetto alla fase iniziale del periodo analizzato.
L’analisi mensile evidenzia inoltre una chiara componente stagionale. Le vendite e il volume delle transazioni aumentano progressivamente durante la primavera e raggiungono i livelli più elevati tra maggio e agosto. Giugno presenta il numero medio di vendite più alto, mentre luglio registra il valore medio massimo dell’indicatore di efficacia degli annunci. Nei mesi autunnali l’attività diminuisce, mentre a dicembre si registra una moderata ripresa rispetto a novembre. Il periodo compreso tra la tarda primavera e l’estate appare quindi quello caratterizzato dalla maggiore intensità delle compravendite e dal rapporto più favorevole tra vendite e annunci attivi.
Sulla base delle evidenze osservate, le agenzie clienti potrebbero considerare alcune indicazioni operative. Tyler merita attenzione per la dimensione e la crescita dell’attività, ma l’elevato numero di annunci e il livello relativamente alto di inventory suggeriscono di monitorare attentamente il rapporto tra domanda e offerta. Una strategia orientata esclusivamente all’aumento del numero di inserzioni potrebbe non essere sufficiente; è più importante migliorare la capacità di assorbimento dello stock già disponibile. Bryan-College Station presenta un profilo particolarmente interessante per il livello dei prezzi e per l’elevata efficacia media degli annunci. Tuttavia, la maggiore variabilità di questo indicatore suggerisce che le performance non siano uniformi nel tempo. Le agenzie potrebbero quindi concentrare l’attenzione sui periodi in cui il rapporto tra vendite e stock disponibile risulta più favorevole. Wichita Falls, pur essendo il mercato più piccolo e con i prezzi più contenuti, presenta un rapporto vendite/annunci relativamente elevato. Questo può rappresentare un elemento interessante per operatori orientati a mercati meno costosi ma con una buona capacità relativa di assorbimento dell’offerta. Dal punto di vista temporale, i mesi compresi tra maggio e agosto sono i più favorevoli per l’attività di vendita. Le agenzie potrebbero quindi concentrare in questo periodo una quota maggiore delle iniziative commerciali e delle attività di promozione, tenendo conto che l’indicatore utilizzato misura il rapporto tra vendite e annunci attivi, e non un vero tasso di conversione dei singoli annunci.
Le raccomandazioni riportate derivano esclusivamente dall’analisi descrittiva dei dati disponibili. Esse evidenziano associazioni e pattern osservati nel periodo 2010–2014, ma non consentono di stabilire relazioni causali né di formulare previsioni sul comportamento futuro del mercato.