Questo progetto analizza il mercato immobiliare del Texas utilizzando dati relativi alle vendite nel periodo 2010–2014. L’obiettivo è identificare trend, variabilità e differenze tra città, anni e mesi, fornendo insight utili per supportare decisioni strategiche.
Il dataset contiene le seguenti variabili:
dati <- read.csv("realestate_texas.csv", sep=",")
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
# Riepilogo statistico generale delle variabili
summary(dati)
## 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
dim(dati)
## [1] 240 8
# Numero di osservazioni
N <- dim(dati)[1]
Il dataset contiene le seguenti variabili statistiche:
city: variabile qualitativa su scala nominale che rappresenta la città di riferimento. Non è ordinabile.
year: variabile temporale discreta su scala ordinale, rappresenta l’anno di osservazione.
month: variabile temporale discreta su scala ordinale, rappresenta il mese (da 1 a 12).
sales: variabile quantitativa discreta su scala di rapporti, rappresenta il numero totale di vendite.
volume: variabile quantitativa continua su scala di rapporti, rappresenta il valore totale delle vendite in milioni di dollari.
median_price: variabile quantitativa continua su scala di rapporti, rappresenta il prezzo mediano di vendita degli immobili.
listings: variabile quantitativa discreta su scala di rapporti, rappresenta il numero totale di annunci attivi.
months_inventory: variabile quantitativa continua su scala di rapporti, rappresenta il numero di mesi necessari per vendere tutte le inserzioni attive.
L’unità statistica è rappresentata da una specifica città in un determinato mese e anno. Ogni riga del dataset rappresenta quindi un’osservazione identificata dalla combinazione delle variabili city, year e month.
La variabile city è una variabile qualitativa su scala nominale. Per questo tipo di variabile non ha senso calcolare indici di posizione o variabilità, ma è appropriato analizzare la distribuzione delle frequenze e l’indice di eterogeneità di Gini.
# Frequenze assolute e relative
freq_ass_city <- table(dati$city)
numero_di_city <- length(freq_ass_city)
freq_rel_city <- freq_ass_city / N
freq_ass_city
##
## Beaumont Bryan-College Station Tyler
## 60 60 60
## Wichita Falls
## 60
freq_rel_city
##
## Beaumont Bryan-College Station Tyler
## 0.25 0.25 0.25
## Wichita Falls
## 0.25
Per misurare il grado di eterogeneità della distribuzione si utilizza l’indice di Gini normalizzato.
# Funzione per l'indice di eterogeneità di Gini normalizzato
gini.index <- function(x){
ni <- table(x)
fi <- ni / length(x)
fi2 <- fi^2
J <- length(ni)
gini <- 1 - sum(fi2)
gini.normalizzato <- gini / ((J - 1) / J)
return(gini.normalizzato)
}
# Indice normalizzato di Gini
gini_city <- gini.index(dati$city)
gini_city
## [1] 1
Il dataset comprende quattro diverse città, ciascuna presente esattamente 60 volte su un totale di 240 osservazioni. La distribuzione risulta quindi perfettamente uniforme.
L’indice di eterogeneità di Gini normalizzato assume valore pari a 1, indicando la massima eterogeneità possibile. Questo risultato conferma che le osservazioni sono distribuite in modo perfettamente uniforme tra le diverse modalità della variabile.
La distribuzione delle frequenze assolute è rappresentata nel seguente grafico:
barplot(freq_ass_city,
col = "steelblue",
main = "Distribuzione delle frequenze assolute della variabile <city>",
ylab = "Frequenze assolute",
cex.names = 0.8)
La variabile year è una variabile temporale discreta che rappresenta l’anno di osservazione. Sebbene sia rappresentata numericamente, viene trattata come variabile temporale utilizzata per analizzare l’evoluzione del mercato nel tempo.
summary(dati$year)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2010 2011 2012 2012 2013 2014
# Frequenze assolute e relative
freq_ass_year <- table(dati$year)
numero_di_year <- length(freq_ass_year)
freq_rel_year <- freq_ass_year / N
freq_ass_year
##
## 2010 2011 2012 2013 2014
## 48 48 48 48 48
freq_rel_year
##
## 2010 2011 2012 2013 2014
## 0.2 0.2 0.2 0.2 0.2
# Visualizzazione
barplot(freq_ass_year,
col="steelblue",
main="Distribuzione frequenze assolute della variabile <year>",
ylab="Frequenze assolute")
La distribuzione della variabile risulta uniforme: ogni anno compare esattamente 48 volte. Questo deriva dal fatto che per ciascun anno sono presenti osservazioni per 12 mesi e 4 città (12 × 4 = 48).
Il dataset copre quindi in modo completo e uniforme il periodo compreso tra gennaio 2010 e dicembre 2014.
Poiché la distribuzione è uniforme e la variabile rappresenta una dimensione temporale discreta, gli indici di posizione e variabilità non forniscono informazioni particolarmente rilevanti ed interpretabili. La variabile risulta invece utile per l’analisi dei trend temporali, che verranno approfonditi nelle sezioni successive.
La variabile month è una variabile qualitativa ordinale (ciclica), codificata numericamente da 1 a 12. Ogni numero rappresenta un mese dell’anno, non una quantità misurabile.
Per questa variabile ha senso calcolare le frequenze assolute e relative.
# Frequenze assolute e relative
freq_ass_month <- table(dati$month)
numero_di_month <- length(freq_ass_month)
freq_rel_month <- freq_ass_month / N
# Indice normalizzato di Gini
gini_month <- gini.index(dati$month)
gini_month
## [1] 1
# Visualizzazione
barplot(freq_ass_month,
col="steelblue",
main="Distribuzione frequenze assolute della variabile <month>",
ylab="Frequenze assolute")
Come si vede dai risultati:
La variabile sales è quantitativa discreta e rappresenta il numero di vendite per ogni città in ogni mese dei cinque anni osservati.
Vengono calcolati gli indici di posizione, variabilità e forma, e rappresentata graficamente la distribuzione.
library(moments)
# Riepilogo statistico
summary(dati$sales)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 79.0 127.0 175.5 192.3 247.0 423.0
# Indici di posizione
media_sales <- mean(dati$sales)
mediana_sales <- median(dati$sales)
quantili_sales <- quantile(dati$sales, probs = seq(0,1,0.25))
quantile1_sales <- quantile(dati$sales, 0.25)
quantile3_sales <- quantile(dati$sales, 0.75)
minimo_sales <- min(dati$sales)
massimo_sales <- max(dati$sales)
# Indici di variabilità
range_sales <- massimo_sales - minimo_sales
IQR_sales <- IQR(dati$sales)
varianza_sales <- var(dati$sales)
dev_std_sales <- sd(dati$sales)
CV_sales <- dev_std_sales / media_sales * 100
CV_sales
## [1] 41.42203
# Indici di forma
gamma1_sales <- skewness(dati$sales)
gamma1_sales
## [1] 0.718104
gamma2_sales <- kurtosis(dati$sales) - 3
gamma2_sales
## [1] -0.3131764
# Istogramma
hist(dati$sales,
col=3,
breaks=10,
main="Distribuzione del numero di vendite",
xlab="Numero di vendite")
# Boxplot
boxplot(dati$sales,
col=3,
ylab="Numero di vendite",
main="Boxplot della variabile <sales>")
abline(h=media_sales, col="red", lwd=2)
legend("topright", legend="Media", col="red", lwd=2)
Interpretazione:
La variabile volume è una variabile quantitativa continua che rappresenta il volume totale delle vendite espresso in milioni di dollari.
Vengono calcolati gli indici di posizione, variabilità e forma per descrivere la distribuzione della variabile.
# Riepilogo statistico
summary(dati$volume)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8.166 17.660 27.062 31.005 40.893 83.547
# Indici di posizione
media_volume <- mean(dati$volume)
mediana_volume <- median(dati$volume)
quantili_volume <- quantile(dati$volume, probs = seq(0, 1, 0.25))
quantile1_volume <- quantile(dati$volume, 0.25)
quantile3_volume <- quantile(dati$volume, 0.75)
minimo_volume <- min(dati$volume)
massimo_volume <- max(dati$volume)
# Indici di variabilità
range_volume <- massimo_volume - minimo_volume
IQR_volume <- IQR(dati$volume)
varianza_volume <- var(dati$volume)
dev_std_volume <- sd(dati$volume)
CV_volume <- dev_std_volume / media_volume * 100
CV_volume
## [1] 53.70536
# Indici di forma
gamma1_volume <- skewness(dati$volume)
gamma1_volume
## [1] 0.884742
gamma2_volume <- kurtosis(dati$volume) - 3
gamma2_volume
## [1] 0.176987
# Istogramma
hist(dati$volume,
col=3,
breaks=10,
main="Distribuzione del volume delle vendite",
xlab="Volume (milioni di dollari)")
# Boxplot
boxplot(dati$volume,
col=3,
ylab="Volume delle vendite (milioni di dollari)",
main="Boxplot della variabile volume")
abline(h=media_volume, col="red", lwd=2)
legend("topright",
legend="Media",
col="red",
lwd=2)
Interpretazione:
La variabile median_price è una variabile quantitativa continua che rappresenta il prezzo mediano delle vendite immobiliari espresso in dollari.
Questa variabile è particolarmente importante in quanto rappresenta un indicatore sintetico del livello dei prezzi nel mercato immobiliare.
# Riepilogo statistico
summary(dati$median_price)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 73800 117300 134500 132665 150050 180000
# Indici di posizione
media_median_price <- mean(dati$median_price)
mediana_median_price <- median(dati$median_price)
quantili_median_price <- quantile(dati$median_price, probs = seq(0, 1, 0.25))
quantile1_median_price <- quantile(dati$median_price, 0.25)
quantile3_median_price <- quantile(dati$median_price, 0.75)
minimo_median_price <- min(dati$median_price)
massimo_median_price <- max(dati$median_price)
# Indici di variabilità
range_median_price <- massimo_median_price - minimo_median_price
IQR_median_price <- IQR(dati$median_price)
varianza_median_price <- var(dati$median_price)
dev_std_median_price <- sd(dati$median_price)
CV_median_price <- dev_std_median_price / media_median_price * 100
CV_median_price
## [1] 17.08218
# Indici di forma
gamma1_median_price <- skewness(dati$median_price)
gamma1_median_price
## [1] -0.3645529
gamma2_median_price <- kurtosis(dati$median_price) - 3
gamma2_median_price
## [1] -0.6229618
# Istogramma
hist(dati$median_price,
col=3,
breaks=10,
main="Distribuzione del prezzo mediano di vendita",
xlab="Prezzo mediano (dollari)")
# Boxplot
boxplot(dati$median_price,
col=3,
ylab="Prezzo mediano (dollari)",
main="Boxplot della variabile <median_price>")
abline(h=media_median_price, col="red", lwd=2)
legend("topright",
legend="Media",
col="red",
lwd=2)
Interpretazione:
La variabile listings è una variabile quantitativa discreta che rappresenta il numero totale di annunci attivi presenti sul mercato.
Vengono calcolati gli indici di posizione, variabilità e forma, e rappresentata graficamente la distribuzione.
# Riepilogo statistico
summary(dati$listings)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 743 1026 1618 1738 2056 3296
# Indici di posizione
media_listings <- mean(dati$listings)
mediana_listings <- median(dati$listings)
quantili_listings <- quantile(dati$listings, probs = seq(0, 1, 0.25))
quantile1_listings <- quantile(dati$listings, 0.25)
quantile3_listings <- quantile(dati$listings, 0.75)
minimo_listings <- min(dati$listings)
massimo_listings <- max(dati$listings)
# Indici di variabilità
range_listings <- massimo_listings - minimo_listings
IQR_listings <- IQR(dati$listings)
varianza_listings <- var(dati$listings)
dev_std_listings <- sd(dati$listings)
CV_listings <- dev_std_listings / media_listings * 100
CV_listings
## [1] 43.30833
# Indici di forma
gamma1_listings <- skewness(dati$listings)
gamma1_listings
## [1] 0.6494982
gamma2_listings <- kurtosis(dati$listings) - 3
gamma2_listings
## [1] -0.79179
# Istogramma
hist(dati$listings,
col=3,
breaks=10,
main="Distribuzione del numero di annunci",
xlab="Numero di annunci")
# Boxplot
boxplot(dati$listings,
col=3,
ylab="Numero di annunci",
main="Boxplot della variabile <listings>")
abline(h=media_listings, col="red", lwd=2)
legend("topright",
legend="Media",
col="red",
lwd=2)
Interpretazione:
La variabile months_inventory è una variabile quantitativa continua che rappresenta il numero di mesi necessari per vendere tutte le inserzioni correnti presenti sul mercato.
Questa variabile fornisce un indicatore importante della velocità di assorbimento del mercato immobiliare.
# Riepilogo statistico
summary(dati$months_inventory)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 3.400 7.800 8.950 9.193 10.950 14.900
# Indici di posizione
media_months_inventory <- mean(dati$months_inventory)
mediana_months_inventory <- median(dati$months_inventory)
quantili_months_inventory <- quantile(dati$months_inventory, probs = seq(0, 1, 0.25))
quantile1_months_inventory <- quantile(dati$months_inventory, 0.25)
quantile3_months_inventory <- quantile(dati$months_inventory, 0.75)
minimo_months_inventory <- min(dati$months_inventory)
massimo_months_inventory <- max(dati$months_inventory)
# Indici di variabilità
range_months_inventory <- massimo_months_inventory - minimo_months_inventory
IQR_months_inventory <- IQR(dati$months_inventory)
varianza_months_inventory <- var(dati$months_inventory)
dev_std_months_inventory <- sd(dati$months_inventory)
CV_months_inventory <- dev_std_months_inventory / media_months_inventory * 100
CV_months_inventory
## [1] 25.06031
# Indici di forma
gamma1_months_inventory <- skewness(dati$months_inventory)
gamma1_months_inventory
## [1] 0.04097527
gamma2_months_inventory <- kurtosis(dati$months_inventory) - 3
gamma2_months_inventory
## [1] -0.1744475
# Istogramma
hist(dati$months_inventory,
col=3,
breaks=10,
main="Distribuzione della variabile <months_inventory>",
xlab="Mesi")
# Boxplot
boxplot(dati$months_inventory,
col=3,
ylab="Numero di mesi",
main="Boxplot della variabile <months_inventory>")
abline(h=media_months_inventory, col="red", lwd=2)
legend("topright",
legend="Media",
col="red",
lwd=2)
Interpretazione:
In questa sezione vengono confrontate le variabili quantitative in termini di variabilità relativa e asimmetria della distribuzione.
Per confrontare la variabilità delle diverse variabili quantitative si utilizza il coefficiente di variazione (CV), definito come il rapporto tra deviazione standard e media, parametro già calcolato nella sezione precedente.
CV_sales
## [1] 41.42203
CV_volume
## [1] 53.70536
CV_median_price
## [1] 17.08218
CV_listings
## [1] 43.30833
CV_months_inventory
## [1] 25.06031
Dall’analisi dei coefficienti di variazione emerge che la variabile volume presenta la più alta variabilità relativa, con un coefficiente di variazione pari a circa 53.7%. Questo indica una forte dispersione dei valori rispetto alla media. Il volume delle vendite varia molto da mese a mese o tra città.
La variabile con la più bassa variabilità relativa risulta invece essere median_price, con un coefficiente di variazione di circa il 17%, indicando una distribuzione relativamente più concentrata attorno alla media.
Le altre variabili presentano valori intermedi di variabilità relativa.
Per valutare la forma delle distribuzioni si considera il coefficiente di asimmetria skewness.
gamma1_sales
## [1] 0.718104
gamma1_volume
## [1] 0.884742
gamma1_median_price
## [1] -0.3645529
gamma1_listings
## [1] 0.6494982
gamma1_months_inventory
## [1] 0.04097527
Come già visto, sono tutte distribuzioni tendenzialmente positivamente asimmetrica, a parte l’eccezione della variabile median_price.
La distribuzione più asimmetrica risulta essere quella della variabile volume, con un coefficiente di asimmetria positivo pari a circa 0.88. Questo valore indica una moderata asimmetria positiva, confermata anche dall’istogramma, che mostra una coda verso destra dovuta alla presenza di alcuni valori elevati.
Le altre variabili presentano livelli di asimmetria più contenuti. In generale, nessuna variabile presenta una forte asimmetria (|γ₁| > 1), indicando distribuzioni complessivamente abbastanza equilibrate.
Si considera la variabile sales e si procede con una suddivisione in classi per analizzarne la distribuzione tramite frequenze.
# Definizione delle classi (scelta di 5 classi di uguale ampiezza)
breaks <- seq(min(dati$sales),
max(dati$sales),
length.out = 6)
sales_cl <- cut(dati$sales,
breaks = breaks,
include.lowest = TRUE) # per non perdere il valore minimo
# Frequenze assolute e relative
ni_sales <- table(sales_cl)
fi_sales <- ni_sales / N
Ni_sales <- cumsum(ni_sales)
Fi_sales <- Ni_sales / N
# Creazione del DataFrame
distr_freq <- as.data.frame(cbind(ni_sales, fi_sales, Ni_sales, Fi_sales))
# Aggiunta della colonna creata al dataset
dati$sales_cl <- sales_cl
distr_freq
## ni_sales fi_sales Ni_sales Fi_sales
## [79,148] 84 0.35000000 84 0.3500000
## (148,217] 77 0.32083333 161 0.6708333
## (217,285] 41 0.17083333 202 0.8416667
## (285,354] 27 0.11250000 229 0.9541667
## (354,423] 11 0.04583333 240 1.0000000
Si rappresenta ora graficamente la distribuzione delle classi.
library(ggplot2)
# Grafico a barre
ggplot(data = dati) +
geom_bar(aes(x = sales_cl),
stat = "count",
col = "black",
fill = "steelblue") +
labs(title = "Distribuzione delle classi della variabile <sales>",
x = "Classi del numero di vendite",
y = "Frequenze assolute") +
theme_classic()
Si calcola inoltre l’indice di eterogeneità di Gini sulle classi, avendola di fatto trasformata in qualitativa:
gini_sales_cl <- gini.index(sales_cl)
gini_sales_cl
## [1] 0.9132813
L’indice di Gini normalizzato risulta pari a circa 0.91, indicando un livello molto elevato di eterogeneità.
Ciò significa che le osservazioni non sono distribuite uniformemente tra le classi, ma risultano maggiormente concentrate in alcune di esse, come evidenziato anche dal grafico a barre.
Poiché il dataset rappresenta una popolazione finita di osservazioni, è possibile calcolare probabilità empiriche come frequenze relative.
La variabile city comprende quattro città, ciascuna presente esattamente 60 volte su un totale di 240 osservazioni.
La probabilità che una osservazione estratta casualmente dal dataset appartenga alla città Beaumont è quindi:
p_Beaumont <- table(dati$city)["Beaumont"] / N
p_Beaumont
## Beaumont
## 0.25
Il risultato è pari a 0.25, ovvero il 25%.
Poiché ciascun mese compare esattamente 20 volte nel dataset, la probabilità di estrarre una osservazione relativa al mese di luglio è:
p_month <- table(dati$month)["7"] / N
p_month
## 7
## 0.08333333
Il risultato è pari a 1/12 (20/240), ovvero 0.0833 (8.33%).
Per calcolare questa probabilità si considerano le osservazioni che soddisfano entrambe le condizioni:
p_dicembre_2012 <- sum(dati$year == 2012 & dati$month == 12) / N
p_dicembre_2012
## [1] 0.01666667
Il risultato è pari a 4/240, ovvero circa 0.0167 (1.67%).
Questo valore è coerente con la struttura uniforme del dataset, in cui per ogni combinazione anno-mese sono presenti esattamente 4 osservazioni (una per ciascuna città).
In questa sezione vengono costruite nuove variabili derivate al fine di ottenere ulteriori indicatori del mercato immobiliare.
Il prezzo medio per singola vendita viene calcolato come:
volume / sales
Poiché volume è espresso in milioni di dollari, il valore viene moltiplicato per 1000000 per ottenere il prezzo in dollari.
mean_price <- dati$volume / dati$sales * 1000000
dati$mean_price <- mean_price
summary(mean_price)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 97010 132939 156588 154320 173915 213234
median_mean_price <- median(mean_price)
media_mean_price <- mean(mean_price)
dev_std_mean_price <- sd(mean_price)
CV_mean_price <- dev_std_mean_price / media_mean_price * 100
CV_mean_price
## [1] 17.59162
gamma1_mean_price <- skewness(mean_price)
gamma1_mean_price
## [1] -0.06870528
gamma2_mean_price <- kurtosis(mean_price) - 3
gamma2_mean_price
## [1] -0.7784329
#Istogramma
hist(mean_price,
col=3,
breaks=10,
main="Distribuzione del prezzo medio di vendita",
xlab="Prezzo medio (dollari)")
#Boxplot
boxplot(mean_price,
col=3,
ylab="Prezzo medio di vendita (dollari)",
main="Boxplot della variabile mean_price")
abline(h=media_mean_price, col="red", lwd=2)
legend("topright",
legend="Media",
col="red",
lwd=2)
La distribuzione del prezzo medio risulta quasi simmetrica, con una leggera asimmetria negativa. La media e la mediana risultano infatti molto vicine. La distribuzione è platicurtica.
Si costruisce ora una misura di efficacia del mercato, definita come:
sales / listings
che rappresenta il numero di vendite per ogni annuncio attivo.
efficiency <- dati$sales / dati$listings
dati$efficiency <- efficiency
summary(efficiency)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.05014 0.08980 0.10963 0.11874 0.13492 0.38713
media_efficiency <- mean(efficiency)
dev_std_efficiency <- sd(efficiency)
CV_efficiency <- dev_std_efficiency / media_efficiency * 100
CV_efficiency
## [1] 39.49558
gamma1_efficiency <- skewness(efficiency)
gamma1_efficiency
## [1] 2.089318
gamma2_efficiency <- kurtosis(efficiency) - 3
gamma2_efficiency
## [1] 6.881747
# Istogramma
hist(efficiency,
col=3,
breaks=10,
main="Distribuzione della variabile efficiency",
xlab="Vendite per annuncio")
# Boxplot
boxplot(efficiency,
col=3,
ylab="Efficacia degli annunci",
main="Boxplot della variabile efficiency")
abline(h=media_efficiency, col="red", lwd=2)
legend("topright",
legend="Media",
col="red",
lwd=2)
Dai risultati emerge che:
Potrebbe risultare interessante approfondire l’analisi dell’efficacia distinguendo per città.
In questa sezione si analizzano le variabili mean_price ed efficiency condizionatamente rispetto alle variabili city, year e month, al fine di individuare eventuali differenze.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Raggruppamento
dati %>%
group_by(city) %>%
summarise(media = mean(mean_price),
dev_st = sd(mean_price))
## # A tibble: 4 × 3
## city media dev_st
## <chr> <dbl> <dbl>
## 1 Beaumont 146640. 11232.
## 2 Bryan-College Station 183534. 15149.
## 3 Tyler 167677. 12351.
## 4 Wichita Falls 119430. 11398.
mean(mean_price)
## [1] 154320.4
La media generale del prezzo medio di vendita è pari a circa 154000 dollari.
Si osserva che:
Le deviazioni standard risultano relativamente contenute per tutte le città (circa 10000–15000 dollari), indicando una dispersione limitata dei prezzi medi all’interno di ciascuna città.
dati %>%
group_by(year) %>%
summarise(media = mean(mean_price),
dev_st = sd(mean_price))
## # A tibble: 5 × 3
## year media dev_st
## <int> <dbl> <dbl>
## 1 2010 150189. 23280.
## 2 2011 148251. 24938.
## 3 2012 150899. 26438.
## 4 2013 158705. 26524.
## 5 2014 163559. 31741.
L’anno con il prezzo medio più elevato è il 2014, con un valore di circa 164000 dollari.
Nel complesso si osserva un trend crescente nel tempo, con una lieve flessione nel 2011, seguita da un aumento costante negli anni successivi.
dati %>%
group_by(month) %>%
summarise(media = mean(mean_price),
dev_st = sd(mean_price))
## # A tibble: 12 × 3
## month media dev_st
## <int> <dbl> <dbl>
## 1 1 145640. 29819.
## 2 2 148840. 25120.
## 3 3 151137. 23238.
## 4 4 151461. 26174.
## 5 5 158235. 25787.
## 6 6 161546. 23470.
## 7 7 156881. 27220.
## 8 8 156456. 28253.
## 9 9 156522. 29669.
## 10 10 155897. 32527.
## 11 11 154233. 29685.
## 12 12 154996. 27009.
Il mese con il prezzo medio più elevato risulta essere giugno, mentre gennaio presenta i valori più bassi.
Si evidenzia una stagionalità, con prezzi medi più elevati nei mesi estivi e più bassi nei mesi invernali.
dati %>%
group_by(city) %>%
summarise(media = mean(efficiency),
dev_st = sd(efficiency))
## # A tibble: 4 × 3
## city media dev_st
## <chr> <dbl> <dbl>
## 1 Beaumont 0.106 0.0267
## 2 Bryan-College Station 0.147 0.0729
## 3 Tyler 0.0935 0.0235
## 4 Wichita Falls 0.128 0.0247
mean(efficiency)
## [1] 0.1187449
La media generale della variabile efficiency è pari a circa 0.12, corrispondente a quasi 12 vendite ogni 100 annunci.
Si osserva che:
Ciò indica differenze rilevanti nell’efficacia del mercato immobiliare tra le diverse città.
dati %>%
group_by(year) %>%
summarise(media = mean(efficiency),
dev_st = sd(efficiency))
## # A tibble: 5 × 3
## year media dev_st
## <int> <dbl> <dbl>
## 1 2010 0.0997 0.0337
## 2 2011 0.0927 0.0232
## 3 2012 0.110 0.0281
## 4 2013 0.135 0.0448
## 5 2014 0.157 0.0618
L’efficienza minima si registra nel 2011, mentre il valore massimo si osserva nel 2014.
Nel complesso si osserva un trend crescente dell’efficienza nel tempo.
Si calcola inoltre il tasso medio di crescita annuo:
# Creazione del vettore
medie_per_anno <- c(0.0997, 0.0927, 0.110, 0.135, 0.157)
incrementi <- quantmod::Delt(medie_per_anno) * 100
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
incrementi <- incrementi[-1,1]
media_aritm <- mean(incrementi)
fattori <- medie_per_anno[-1] / medie_per_anno[-length(medie_per_anno)]
media_geom <- prod(fattori)^(1/length(fattori))
media_aritm
## [1] 12.66621
media_geom
## [1] 1.120214
La crescita media annua risulta pari a circa:
Si può quindi concludere che l’efficienza degli annunci è cresciuta mediamente del 12% all’anno.
dati %>%
group_by(month) %>%
summarise(media = mean(efficiency),
dev_st = sd(efficiency))
## # A tibble: 12 × 3
## month media dev_st
## <int> <dbl> <dbl>
## 1 1 0.0831 0.0230
## 2 2 0.0878 0.0219
## 3 3 0.116 0.0346
## 4 4 0.125 0.0380
## 5 5 0.141 0.0503
## 6 6 0.142 0.0576
## 7 7 0.143 0.0740
## 8 8 0.142 0.0526
## 9 9 0.112 0.0348
## 10 10 0.112 0.0360
## 11 11 0.102 0.0293
## 12 12 0.117 0.0379
Anche in questo caso emerge una componente stagionale: i valori più elevati di efficienza si registrano nei mesi estivi, in particolare tra maggio e agosto.
Ciò suggerisce una maggiore dinamicità del mercato immobiliare durante il periodo estivo.
In questa sezione verrà usato ggplot per creare grafici personalizzati di alcune variabili.
ggplot(dati, aes(x = city, y = median_price, fill = city)) +
geom_boxplot() +
labs(title = "Distribuzione del prezzo mediano per città",
x = "Città",
y = "Prezzo mediano ($)") +
theme_classic() +
theme(legend.position = "none")
Dal boxplot si può osservare come i valori del prezzo mediano siano più alti per la città di Bryan-College Station, seguita da Tyler. I valori di Bryan-College Station sono i più concentrati (IQR più basso) mentre quelli di Wichita Falls sono i più dispersivi (oltre che mediamente più bassi). Si individuano un outlier per città, a parte Tyler.
ggplot(dati, aes(x = factor(year), y = volume, fill = city)) +
geom_boxplot() +
labs(title = "Distribuzione del volume delle vendite per anno e città",
x = "Anno",
y = "Volume (milioni di dollari)") +
theme_classic()
Questo grafico permette sia di apprezzare le variazioni del prezzo mediano per ogni città rispetto ai vari anni, sia di confrontare tra di loro le varie città nello stesso anno.
Escludendo la città Wichita Falls (che ha il volume nettamente più basso e pressoché costante nel tempo), il volume generale ha un trend crescente negli anni. La città di Bryan-College Station dimostra di avere una alta volatilità (soprattutto nell’anno 2013) e la classificazione ogni anno conferma il primato di Tyler, seguito da Bryan-College Station, poi Beaumont e infine Wichita Falls.
# Aggregazione dei dati
sales_month_city <- dati %>%
group_by(month, city) %>%
summarise(total_sales = sum(sales))
## `summarise()` has regrouped the output.
## ℹ Summaries were computed grouped by month and city.
## ℹ Output is grouped by month.
## ℹ Use `summarise(.groups = "drop_last")` to silence this message.
## ℹ Use `summarise(.by = c(month, city))` for per-operation grouping
## (`?dplyr::dplyr_by`) instead.
head(sales_month_city, 10)
## # A tibble: 10 × 3
## # Groups: month [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
# Barplot
ggplot(sales_month_city,
aes(x = factor(month),
y = total_sales,
fill = city)) +
geom_col(position = "dodge") +
labs(title = "Vendite totali per mese e città",
x = "Mese",
y = "Vendite totali") +
theme_classic()
Dal grafico si osserva che il maggior numero di vendite si registra nei mesi estivi e che le città in cui si vende di più sono Tyler e Bryan-College Station.
#Grafico a barre sovrapposte
ggplot(sales_month_city,
aes(x = factor(month),
y = total_sales,
fill = city)) +
geom_col(position = "fill") +
labs(title = "Distribuzione percentuale delle vendite per mese",
x = "Mese",
y = "Percentuale") +
theme_classic()
Ogni mese la città con più vendite appare essere Tyler, seguita da Bryan-College Station. Questo grafico conferma il precedente.
In questa sezione si costruiranno dei line chart, che rappresentranno il numero di vendite in funzione del tempo.
# Creazione della colonna tempo
dati$date <- as.Date(paste(dati$year, dati$month, "1", sep = "-"))
# Line chart
ggplot(dati,
aes(x = date,
y = sales,
color = city)) +
geom_line(lwd = 1) +
labs(title = "Trend temporale delle vendite",
x = "Anno",
y = "Numero vendite") +
theme_classic()
È osservabile il “dominio”, almeno per quanto riguarda il numero di vendite nel tempo, della città Tyler, seguita da Bryan-College Station con andamenti oscillatori dovuti alle stagioni e anche una crescita generale negli anni.
# Line chart separati
ggplot(dati,
aes(x = date,
y = sales)) +
geom_line(color = "blue") +
labs(title = "Trend temporale delle vendite per città singola",
x = "Anno",
y = "Numero vendite") +
facet_wrap(~city) +
theme_classic()
Questi quattro grafici permettono di apprezzare meglio l’andamento oscillatorio annuale ma crescente di anno in anno.
L’analisi del mercato immobiliare del Texas nel periodo 2010–2014 evidenzia un trend complessivamente crescente, caratterizzato da un aumento progressivo sia del numero di vendite sia del prezzo medio degli immobili.
Emergono differenze significative tra le città considerate. In particolare, Bryan-College Station presenta i prezzi medi più elevati e una maggiore efficienza degli annunci, mentre Wichita Falls mostra livelli medi inferiori sia in termini di prezzi sia di volume di attività.
L’analisi temporale mette inoltre in luce una chiara componente stagionale: le vendite e l’efficienza del mercato risultano generalmente più elevate nei mesi estivi e più contenute nei mesi invernali.
Dal punto di vista della variabilità, la variabile volume è quella che presenta la maggiore dispersione e asimmetria, segnalando la presenza di mesi con attività di mercato particolarmente intensa.
Nel complesso, i risultati suggeriscono un progressivo miglioramento delle condizioni di mercato, con segnali di crescita e rafforzamento delle performance di vendita nel periodo analizzato.