Librerie

  1. Analisi delle variabili

Il dataset contiene variabili di tipo categorico/temporale (città, anno, mese) e variabili quantitative (sales, volume, median_price, listings, months_inventory).

Queste ultime ci permettono di studiare vendite, prezzi e l’efficacia del mercato nel tempo.

str(df)
## '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(df)
##      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

Dalla sintesi emerge che:

Le vendite mensili variano da circa 80 a oltre 400 unità.

Il prezzo mediano varia tra 73.800 $ e 180.000 $.

Per quanto riguarda le specifiche città, Bryan-College Station è la città con il valore degli immobili mediamente più alto, mentre Tyler è la città dove avvengono più compravendite.

La città che risulta meno redditizia è Wichita.

  1. Indici di posizione, variabilità e forma
vars_quant <- df %>%
  dplyr::select(sales, volume, median_price, listings, months_inventory)


stats <- data.frame(
media = sapply(vars_quant, mean, na.rm = TRUE),
mediana = sapply(vars_quant, median, na.rm = TRUE),
sd = sapply(vars_quant, sd, na.rm = TRUE),
varianza = sapply(vars_quant, var, na.rm = TRUE),
skewness = sapply(vars_quant, skewness, na.rm = TRUE),
kurtosis = sapply(vars_quant, kurtosis, na.rm = TRUE)
)
stats <- round(stats, 2)
stats
##                      media   mediana       sd    varianza skewness kurtosis
## sales               192.29    175.50    79.65 6.34430e+03     0.72     2.69
## volume               31.01     27.06    16.65 2.77270e+02     0.88     3.18
## median_price     132665.42 134500.00 22662.15 5.13573e+08    -0.36     2.38
## listings           1738.02   1618.50   752.71 5.66569e+05     0.65     2.21
## months_inventory      9.19      8.95     2.30 5.31000e+00     0.04     2.83
freq_city <- table(df$city)
prop_city <- prop.table(freq_city)

knitr::kable(
  data.frame(
    Frequenza = freq_city,
    Percentuale = round(prop_city * 100, 2)
  )
)
Frequenza.Var1 Frequenza.Freq Percentuale.Var1 Percentuale.Freq
Beaumont 60 Beaumont 25
Bryan-College Station 60 Bryan-College Station 25
Tyler 60 Tyler 25
Wichita Falls 60 Wichita Falls 25

Il confronto tra media e mediana evidenzia asimmetrie positive, in particolare per volume e median_price. Le deviazioni standard elevate indicano una forte eterogeneità tra città e periodi temporali.

  1. Variabili con maggiore variabilità e asimmetria

Per confrontare le variabili in termini di variabilità relativa, si utilizza il coefficiente di variazione (CV).

cv <- stats$sd / stats$media
knitr::kable(data.frame(Coeff_Variazione = cv))
Coeff_Variazione
0.4142181
0.5369236
0.1708218
0.4330848
0.2502720

Il CV più alto si osserva per la variabile sales, indicando che il numero di vendite mensili è la più variabile.

La maggiore asimmetria invece si riscontra ancora nelle vendite, che presentano valori estremi in alcuni mesi.

  1. Creazione di classi per una variabile quantitativa

Si suddivide la variabile sales in classi da 50 unità.

df$sales_cl <- cut(df$sales, breaks = seq(50, 450, 50))
table(df$sales_cl)
## 
##  (50,100] (100,150] (150,200] (200,250] (250,300] (300,350] (350,400] (400,450] 
##        21        72        56        32        34        13         9         3
ggplot(df, aes(x = sales_cl)) +
  geom_bar(fill = "steelblue") +
  labs(title = "Distribuzione delle vendite per classi", x = "Classi di vendite", y = "Frequenza") +
  theme_bw()

gini.index<-function(x){
  ni=table(x)
  fi=ni/length(x)
  fi2=fi^2
  J=length(table(x))
  gini=1-sum(fi2)
  gini.normalizzato=gini/((J-1)/J)
  return(gini.normalizzato)
}
round(gini.index(df$sales), 3)
## [1] 0.998

Le classi mostrano che l’andamento delle vendite si concentra per lo pù tra i 100 e 200 immobili al mese.

Grazie all’indice di Gini si può evidenziare che le vendite sono una variabile molto eterogenea.

  1. Calcolo di probabilità

Si calcolano alcune probabilità di estrazione casuale di una riga dal dataset.

N <- nrow(df)

P_beaumont <- sum(df$city == "Beaumont") / N
P_july <- sum(df$month == 7) / N
P_dec2012 <- sum(df$month == 12 & df$year == 2012) / N

round(c(P_Beaumont = P_beaumont,
P_Luglio = P_july,
P_Dicembre_2012 = P_dec2012), 3)
##      P_Beaumont        P_Luglio P_Dicembre_2012 
##           0.250           0.083           0.017

Probabilità che la riga appartenga ad una città specifica (60 su 240): 25%

Probabilità che esca un mese specifico (20 su 240): 8,3%

Probabilità che sia di un mese e di un anno specifico (4 su 240): 1,6%

  1. Creazione di nuove variabili

Si introducono due nuove variabili:

mean_price: prezzo medio degli immobili (volume / numero vendite).

efficiency: efficacia degli annunci (listings / months_inventory).

df$mean_price <- (df$volume * 1e6) / df$sales
df$efficiency <- df$listings / df$months_inventory

summary(df$mean_price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   97010  132939  156588  154320  173915  213234
summary(df$efficiency)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   106.8   140.1   176.0   187.3   236.0   329.3

Queste variabili aiutano a capire meglio il valore medio delle case e quanto rapidamente vengono smaltite le inserzioni.

Un locale in un annuncio medio si può stimare che venga venduto in 176 giorni.

  1. Analisi condizionata

Si calcolano statistiche descrittive per città e anno.

summary_city <- df %>%
  group_by(city) %>%
  summarise(
  mean_sales = mean(sales, na.rm = TRUE),
  sd_sales = sd(sales, na.rm = TRUE),
  mean_price = mean(median_price, na.rm = TRUE)
  )

summary_city <- summary_city %>%
  mutate(across(where(is.numeric), ~round(.x, 2)))

knitr::kable(summary_city)
city mean_sales sd_sales mean_price
Beaumont 177.38 41.48 129988.3
Bryan-College Station 205.97 84.98 157488.3
Tyler 269.75 61.96 141441.7
Wichita Falls 116.07 22.15 101743.3
  1. Visualizzazioni con ggplot2

Prezzi mediani per città

ggplot(data = df, aes(x = city, y = median_price)) +
  geom_boxplot(fill = "green") +
  labs(title = "Prezzi mediani per città") +
  theme_bw()

Volume delle vendite per città e anno

ggplot(data = df, aes(x = city, y = volume, fill = factor(year))) +
  geom_boxplot() +
  labs(title = "Volume vendite per città e anno") +
  theme_bw()

Vendite per mese e città

library(lubridate)
ggplot(data = df, aes(x = factor(month), y = sales, fill = city)) +
  geom_col(position = "dodge") +
  facet_wrap(~year, scales="free", nrow=3) +
  labs(title = "Vendite mensili per città e anno",
       x = "Mese", y = "Numero di vendite") +
  theme_bw()

Vendite nel tempo

# Creazione della variabile data (primo giorno del mese)
df$date <- ymd(paste(df$year, df$month, "01", sep = "-"))

# Line chart delle vendite nel tempo
ggplot(df, aes(x = date, y = sales, color = city)) +
  geom_line(linewidth = 1) +
  labs(title = "Andamento delle vendite nel tempo per città",
       x = "Data", y = "Numero di vendite") +
  theme_bw()

  1. Conclusioni

I mesi estivi, in particolare agosto, registrano il numero più alto di vendite.

Tra le città, Bryan-College Station ha i prezzi mediani più elevati.

Tyler è la città con il maggior numero di compravendite.

Wichita Falls risulta la meno redditizia.

In generale, l’analisi evidenzia una forte stagionalità e differenze significative tra città, utili per ottimizzare le strategie di mercato.