Introduzione

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.

Caricamento del dataset

Il dataset contiene le seguenti variabili:

  • city: città di riferimento
  • year: anno di riferimento
  • month: mese di riferimento
  • sales: numero totale di vendite
  • volume: volume totale delle vendite (in milioni di dollari)
  • median_price: prezzo mediano (in dollari)
  • listings: numero di annunci attivi
  • months_inventory: numero di mesi necessari per vendere tutte le inserzioni
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]

1. Analisi delle variabili

Il dataset contiene le seguenti variabili statistiche:

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.


2. Indici di posizione, variabilità e forma

2.1 Analisi della variabile city

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)

2.2 Analisi della variabile year

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.

2.3 Analisi della variabile month

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:

  • Ogni mese compare 20 volte, coerente con la struttura del dataset: 4 città × 5 anni × 1 mese per anno.
  • Frequenze tutte uguali: distribuzione uniforme.
  • Indice di Gini = 1: rappesenta massima eterogeneità tra le modalità.

2.4 Analisi della variabile sales

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 media è superiore alla mediana, il che determina una asimmetria positiva.
  • Il boxplot conferma la coda a destra osservabile dall’istogramma.
  • La distribuzione è platicurtica (γ₂ < 0).
  • Non si osservano outliers.

2.5 Analisi della variabile volume

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 media risulta superiore alla mediana, indicando una asimmetria positiva della distribuzione.
  • Il coefficiente di asimmetria γ₁ > 0 conferma la presenza di una coda verso destra.
  • Il coefficiente di curtosi γ₂ > 0 indica una distribuzione leptocurtica.
  • Il boxplot evidenzia la presenza di alcuni outliers superiori, coerenti con la coda destra osservata nell’istogramma.

2.6 Analisi della variabile median_price

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 media risulta inferiore alla mediana, indicando una asimmetria negativa della distribuzione.
  • Il coefficiente di asimmetria γ₁ < 0 conferma la presenza di una coda verso sinistra.
  • Il coefficiente di curtosi γ₂ < 0 indica una distribuzione platicurtica.
  • I grafici confermano visivamente l’asimmetria negativa, con una maggiore dispersione verso i valori più bassi.

2.7 Analisi della variabile listings

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 media risulta superiore alla mediana, indicando una asimmetria positiva della distribuzione.
  • Il coefficiente di asimmetria γ₁ > 0 conferma la presenza di una coda verso destra.
  • Il coefficiente di curtosi γ₂ < 0 indica una distribuzione platicurtica.
  • L’istogramma e il boxplot confermano la presenza di una distribuzione moderatamente asimmetrica positiva.

2.8 Analisi della variabile months_inventory

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:

  • La distribuzione risulta quasi simmetrica, con una leggera asimmetria positiva (γ₁ > 0).
  • La media e la mediana risultano molto vicine, confermando la quasi simmetria della distribuzione.
  • Il coefficiente di curtosi γ₂ < 0 indica una distribuzione platicurtica.
  • I grafici confermano visivamente la quasi simmetria della distribuzione.

3. Confronto tra variabilità e forma delle distribuzioni

In questa sezione vengono confrontate le variabili quantitative in termini di variabilità relativa e asimmetria della distribuzione.

3.1 Variabilità relativa (coefficiente di variazione)

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.

3.2 Asimmetria delle distribuzioni

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.


4. Distribuzione in classi della variabile sales

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.


5. Calcolo delle probabilità

Poiché il dataset rappresenta una popolazione finita di osservazioni, è possibile calcolare probabilità empiriche come frequenze relative.

5.1 Probabilità che la città sia Beaumont

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%.

5.2 Probabilità che il mese sia luglio

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%).

5.3 Probabilità che l’osservazione sia dicembre 2012

Per calcolare questa probabilità si considerano le osservazioni che soddisfano entrambe le condizioni:

  • year = 2012
  • month = 12
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à).


6. Costruzione di nuove variabili

In questa sezione vengono costruite nuove variabili derivate al fine di ottenere ulteriori indicatori del mercato immobiliare.

6.1 Prezzo medio di vendita mean_price

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.

6.2 Efficacia degli annunci efficiency

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:

  • in media si registrano quasi 0.12 vendite per annuncio (circa 12 vendite ogni 100 annunci);
  • la distribuzione presenta una marcata asimmetria positiva (γ₁ > 0);
  • il coefficiente di curtosi positivo indica una distribuzione molto leptocurtica (appuntita).

Potrebbe risultare interessante approfondire l’analisi dell’efficacia distinguendo per città.


7. Analisi condizionata

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

7.1 Analisi della variabile mean_price

Condizionamento rispetto alla città

# 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:

  • Bryan-College Station presenta il valore medio più elevato (circa 183000 dollari);
  • Tyler segue con circa 168000 dollari;
  • Beaumont presenta valori leggermente inferiori alla media generale;
  • Wichita Falls registra i valori più bassi.

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à.

Condizionamento rispetto all’anno

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.

Condizionamento rispetto al mese

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.

7.2 Analisi della variabile efficiency

Condizionamento rispetto alla città

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:

  • Bryan-College Station presenta l’efficienza più elevata (circa 15 vendite ogni 100 annunci);
  • Tyler presenta invece l’efficienza più bassa (circa 9 vendite ogni 100 annunci).

Ciò indica differenze rilevanti nell’efficacia del mercato immobiliare tra le diverse città.

Condizionamento rispetto all’anno

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:

  • 12.66% (media aritmetica)
  • 12.02% (media geometrica)

Si può quindi concludere che l’efficienza degli annunci è cresciuta mediamente del 12% all’anno.

Condizionamento rispetto al mese

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.


8. Grafici

In questa sezione verrà usato ggplot per creare grafici personalizzati di alcune variabili.

8.1 Boxplot del prezzo mediano per città

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.

8.2 Boxplot del volume per città e anno

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.

8.3 Barplot vendite per mese e città

# 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.

8.4 Trend temporale

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.


9. Conclusioni

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.