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