R Markdown

CARICAMENTO LIBRERIE E DEL DATASET

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
library(ggplot2)
library(e1071)
## 
## Attaching package: 'e1071'
## The following object is masked from 'package:ggplot2':
## 
##     element
library(scales)

Caricamento del file CSV

texas <- read.csv("realestate_texas.csv")

Analizzo la struttura del Dataset

head(texas)
##       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
str(texas)
## '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(texas)
##      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
colSums(is.na(texas))
##             city             year            month            sales 
##                0                0                0                0 
##           volume     median_price         listings months_inventory 
##                0                0                0                0
colonne_attese <- c("city", "year", "month", "sales", "volume",
                    "median_price", "listings", "months_inventory")

Il dataset allegato contiene 240 osservazioni e 8 variabili. Non risultano valori mancanti.

1. Analisi delle variabili

# Trasformo city in variabile qualitativa
texas$city <- as.factor(texas$city)

# Creo una versione categorica dell'anno
texas$year_factor <- as.factor(texas$year)

# Trasformo month in fattore ordinato
texas$month_factor <- factor(
  texas$month,
  levels = 1:12,
  labels = c("Gennaio", "Febbraio", "Marzo", "Aprile",
             "Maggio", "Giugno", "Luglio", "Agosto",
             "Settembre", "Ottobre", "Novembre", "Dicembre"),
  ordered = TRUE
)

# Creo una variabile data per le successive analisi temporali
texas$date <- as.Date(
  paste(texas$year, texas$month, "01", sep = "-"),
  format = "%Y-%m-%d"
)

Il dataset contiene 8 variabili di diversa natura:

Le variabili year e month rappresentano la dimensione temporale del dataset. Per questo motivo vengono mantenute nella loro forma originale e vengono create anche delle versioni categoriali, utili per i confronti tra anni e mesi. month viene trasformata in un fattore ordinato per rispettare la successione naturale dei mesi.

Viene inoltre creata la variabile date, combinando anno e mese, che permetterà nelle analisi successive di rappresentare correttamente l’andamento del mercato nel tempo.

La classificazione delle variabili consente quindi di scegliere gli strumenti statistici più appropriati: distribuzioni di frequenza per le variabili qualitative e indici descrittivi per le variabili quantitative.

2. Indici di posizione, variabilità e forma

# Media e mediana: indici di posizione centrale

# Varianza, deviazione standard e IQR:
# misurano la dispersione dei valori

# Skewness:
# misura l'asimmetria della distribuzione
# valori > 0: asimmetria a destra
# valori < 0: asimmetria a sinistra
# valori vicini a 0: distribuzione circa simmetrica

# Seleziono le variabili quantitative
variabili_quantitative <- texas[c(
  "sales",
  "volume",
  "median_price",
  "listings",
  "months_inventory"
)]

# Creo una funzione con gli indici descrittivi
indici_descrittivi <- function(x) {
  c(
    Media = mean(x),
    Mediana = median(x),
    Minimo = min(x),
    Q1 = quantile(x, 0.25),
    Q3 = quantile(x, 0.75),
    Massimo = max(x),
    Varianza = var(x),
    Dev_standard = sd(x),
    IQR = IQR(x),
    Skewness = skewness(x)
  )
}

# Applico la stessa funzione a tutte le variabili quantitative
tabella_indici <- t(sapply(variabili_quantitative, indici_descrittivi))

# Tabella riassuntiva
knitr::kable(
  round(tabella_indici, 2),
  caption = "Indici descrittivi delle variabili quantitative"
)
Indici descrittivi delle variabili quantitative
Media Mediana Minimo Q1.25% Q3.75% Massimo Varianza Dev_standard IQR Skewness
sales 192.29 175.50 79.00 127.00 247.00 423.00 6.34430e+03 79.65 120.00 0.71
volume 31.01 27.06 8.17 17.66 40.89 83.55 2.77270e+02 16.65 23.23 0.88
median_price 132665.42 134500.00 73800.00 117300.00 150050.00 180000.00 5.13573e+08 22662.15 32750.00 -0.36
listings 1738.02 1618.50 743.00 1026.50 2056.00 3296.00 5.66569e+05 752.71 1029.50 0.65
months_inventory 9.19 8.95 3.40 7.80 10.95 14.90 5.31000e+00 2.30 3.15 0.04
#per le variabili qualitative procedo con le frequenze
# Distribuzioni di frequenza
table(texas$city)
## 
##              Beaumont Bryan-College Station                 Tyler 
##                    60                    60                    60 
##         Wichita Falls 
##                    60
prop.table(table(texas$city))
## 
##              Beaumont Bryan-College Station                 Tyler 
##                  0.25                  0.25                  0.25 
##         Wichita Falls 
##                  0.25
table(texas$year_factor)
## 
## 2010 2011 2012 2013 2014 
##   48   48   48   48   48
prop.table(table(texas$year_factor))
## 
## 2010 2011 2012 2013 2014 
##  0.2  0.2  0.2  0.2  0.2
table(texas$month_factor)
## 
##   Gennaio  Febbraio     Marzo    Aprile    Maggio    Giugno    Luglio    Agosto 
##        20        20        20        20        20        20        20        20 
## Settembre   Ottobre  Novembre  Dicembre 
##        20        20        20        20
prop.table(table(texas$month_factor))
## 
##    Gennaio   Febbraio      Marzo     Aprile     Maggio     Giugno     Luglio 
## 0.08333333 0.08333333 0.08333333 0.08333333 0.08333333 0.08333333 0.08333333 
##     Agosto  Settembre    Ottobre   Novembre   Dicembre 
## 0.08333333 0.08333333 0.08333333 0.08333333 0.08333333

Per le variabili quantitative sono stati calcolati indici di posizione, variabilità e forma. Media e mediana descrivono la posizione centrale della distribuzione; varianza, deviazione standard e IQR ne misurano la dispersione; la skewness fornisce informazioni sulla forma della distribuzione, indicando il grado e la direzione dell’asimmetria.

Per sales, la media (192,29) è superiore alla mediana (175,50), indicando la presenza di alcuni valori elevati. La skewness positiva (0,72) conferma una moderata asimmetria verso destra.

Anche volume presenta una media (31,01 milioni di dollari) superiore alla mediana (27,06 milioni) e una skewness positiva (0,89), indicando una distribuzione asimmetrica verso i valori più elevati.

Per median_price, media (132.665 dollari) e mediana (134.500 dollari) sono abbastanza vicine. La skewness negativa (-0,37) evidenzia una lieve asimmetria verso sinistra.

Anche listings presenta una media (1.738,02) superiore alla mediana (1.618,50) e una skewness positiva (0,65), mentre months_inventory presenta media (9,19) e mediana (8,95) molto simili e una skewness prossima a zero (0,04), indicando una distribuzione sostanzialmente simmetrica.

Gli indici di dispersione mostrano quanto i valori siano distribuiti attorno alla parte centrale della distribuzione. Il loro confronto diretto tra variabili espresse in scale differenti verrà approfondito nel punto successivo mediante una misura di variabilità relativa.

Per city, year e month sono state invece utilizzate distribuzioni di frequenza. Il dataset risulta bilanciato: sono presenti 60 osservazioni per ciascuna città, 48 per ciascun anno e 20 per ciascun mese. Di conseguenza, le differenze osservate nelle analisi successive non dipendono da una diversa numerosità dei gruppi.

3. Identificazione delle variabili con maggiore variabilità e asimmetria

# Coefficiente di variazione (%)
cv <- sapply(
  variabili_quantitative,
  function(x) sd(x) / mean(x) * 100
)

# Asimmetria
asimmetria <- sapply(
  variabili_quantitative,
  skewness
)

# Tabella di confronto
confronto <- data.frame(
  CV = cv,
  Skewness = asimmetria
)

knitr::kable(
  round(confronto, 2),
  caption = "Confronto della variabilità e dell'asimmetria"
)
Confronto della variabilità e dell’asimmetria
CV Skewness
sales 41.42 0.71
volume 53.71 0.88
median_price 17.08 -0.36
listings 43.31 0.65
months_inventory 25.06 0.04
# Variabile con maggiore variabilità relativa
names(which.max(cv))
## [1] "volume"
# Variabile con maggiore asimmetria
names(which.max(abs(asimmetria)))
## [1] "volume"

Per individuare la variabile con maggiore variabilità è stato utilizzato il coefficiente di variazione (CV), che rapporta la deviazione standard alla media. Questo indice consente di confrontare variabili espresse con unità di misura e scale differenti.

La variabile volume presenta il coefficiente di variazione più elevato, pari a circa 53,7%. È quindi la variabile caratterizzata dalla maggiore variabilità relativa rispetto alla propria media. Seguono listings (circa 43,3%) e sales (circa 41,4%).

Per individuare la distribuzione più asimmetrica sono stati confrontati i valori assoluti della skewness. Anche in questo caso la variabile volume presenta il valore più elevato, con una skewness di circa 0,89.

Per la distribuzione più asimmetrica sono stati confrontati i valori assoluti della skewness, poiché il segno indica la direzione dell’asimmetria, mentre per l’intensità è stato usato il valore assoluto.

Poiché la skewness è positiva, la distribuzione di volume è asimmetrica verso destra: la maggior parte delle osservazioni si concentra sui valori più bassi o intermedi, mentre alcuni periodi presentano volumi di vendita particolarmente elevati.

Volume è sia la variabile con maggiore variabilità relativa sia quella con la distribuzione più asimmetrica.

4. Creazione di classi per una variabile quantitativa

# Creo classi di ampiezza 50
breaks_sales <- seq(
  floor(min(texas$sales) / 50) * 50,
  ceiling(max(texas$sales) / 50) * 50,
  by = 50
)

texas$sales_class <- cut(
  texas$sales,
  breaks = breaks_sales,
  include.lowest = TRUE
)

# Frequenze assolute e relative
frequenze_sales <- table(texas$sales_class)
frequenze_relative <- prop.table(frequenze_sales)

# Tabella riassuntiva
tabella_classi <- data.frame(
  Classe = names(frequenze_sales),
  Frequenza = as.numeric(frequenze_sales),
  Percentuale = round(as.numeric(frequenze_relative) * 100, 2)
)

knitr::kable(
  tabella_classi,
  caption = "Distribuzione delle vendite per classi"
)
Distribuzione delle vendite per classi
Classe Frequenza Percentuale
[50,100] 21 8.75
(100,150] 72 30.00
(150,200] 56 23.33
(200,250] 32 13.33
(250,300] 34 14.17
(300,350] 13 5.42
(350,400] 9 3.75
(400,450] 3 1.25
barplot(
  frequenze_sales,
  main = "Distribuzione delle vendite per classi",
  xlab = "Classi di vendite",
  ylab = "Frequenza",
  las = 2
)

# Indice di eterogeneità di Gini
gini <- 1 - sum(frequenze_relative^2)

gini
## [1] 0.8055556

La variabile sales è stata suddivisa in classi di ampiezza pari a 50 vendite, in modo da ottenere una rappresentazione sintetica della sua distribuzione.

La tabella delle frequenze e il grafico a barre mostrano che le osservazioni non sono distribuite uniformemente tra le classi. Le classi centrali, in particolare quelle corrispondenti a circa 100-200 vendite, risultano maggiormente rappresentate, mentre le classi caratterizzate da valori molto elevati sono meno frequenti.

L’indice di eterogeneità di Gini varia tra 0 e un valore massimo che dipende dal numero di classi. Valori vicini a 0 indicano una forte concentrazione delle osservazioni in poche classi, mentre valori più elevati indicano una distribuzione più eterogenea tra le classi. Il valore ottenuto, pari a circa 0,81, indica che le osservazioni sono distribuite tra più classi e non risultano concentrate in una sola fascia di vendite. La distribuzione presenta quindi un buon grado di eterogeneità, pur mostrando una maggiore concentrazione delle osservazioni nelle classi centrali.

5. Calcolo della probabilità

#numero totale di osservazioni
n_totale <- nrow(texas)

#calcolo delle probabilità
prob_beaumont <- sum(texas$city == "Beaumont") / n_totale

prob_luglio <- sum(texas$month == 7) / n_totale

prob_dicembre_2012 <- sum(
  texas$month == 12 & texas$year == 2012
) / n_totale

#tabella riassuntiva
tabella_probabilita <- data.frame(
  Evento = c(
    "Città = Beaumont",
    "Mese = Luglio",
    "Dicembre 2012"
  ),
  Probabilita = c(
    prob_beaumont,
    prob_luglio,
    prob_dicembre_2012
  ),
  Percentuale = c(
    prob_beaumont,
    prob_luglio,
    prob_dicembre_2012
  ) * 100
)

#arrotondo solo le colonne numeriche
tabella_probabilita$Probabilita <- round(
  tabella_probabilita$Probabilita, 4
)

tabella_probabilita$Percentuale <- round(
  tabella_probabilita$Percentuale, 2
)

#visualizzo la tabella
knitr::kable(
  tabella_probabilita,
  caption = "Probabilità degli eventi considerati"
)
Probabilità degli eventi considerati
Evento Probabilita Percentuale
Città = Beaumont 0.2500 25.00
Mese = Luglio 0.0833 8.33
Dicembre 2012 0.0167 1.67

Le probabilità sono state calcolate in modo empirico, utilizzando le frequenze osservate nel dataset. In ciascun caso, la probabilità è data dal rapporto tra il numero di osservazioni favorevoli e il numero totale di osservazioni, pari a 240.

La probabilità che una riga scelta casualmente riguardi Beaumont è pari al 25%.

La probabilità che una riga scelta casualmente riguardi il mese di luglio è pari all’8,33%.

Infine, la probabilità che una riga riguardi contemporaneamente dicembre e l’anno 2012 è pari all’1,67%.

I risultati riflettono la struttura bilanciata del dataset rispetto a città, mesi e anni.

6. Creazione di nuove variabili

# 1. Prezzo medio degli immobili venduti
# La variabile volume è espressa in milioni di dollari.
# La trasformo in dollari e la divido per il numero di vendite.

texas$average_price <- (texas$volume * 1000000) / texas$sales


# 2. indicatore di assorbimento degli annunci
# Rapporto tra il numero di vendite e il numero di annunci attivi, con risultato espresso in percentuale.
texas$listing_absorption_pct <- 
  (texas$sales / texas$listings) * 100


# 3. Controllo delle nuove variabili
head(
  texas[, c(
    "sales",
    "volume",
    "median_price",
    "listings",
    "average_price",
    "listing_absorption_pct"
  )]
)
##   sales volume median_price listings average_price listing_absorption_pct
## 1    83 14.162       163800     1533      170626.5               5.414220
## 2   108 17.690       138200     1586      163796.3               6.809584
## 3   182 28.701       122400     1689      157697.8              10.775607
## 4   200 26.819       123200     1708      134095.0              11.709602
## 5   202 28.833       123100     1771      142737.6              11.405985
## 6   189 27.219       122800     1803      144015.9              10.482529
# 4.statistiche descrittive delle nuove variabili

summary(
  texas[, c(
    "average_price",
    "listing_absorption_pct"
  )]
)
##  average_price    listing_absorption_pct
##  Min.   : 97010   Min.   : 5.014        
##  1st Qu.:132939   1st Qu.: 8.980        
##  Median :156588   Median :10.963        
##  Mean   :154320   Mean   :11.874        
##  3rd Qu.:173915   3rd Qu.:13.492        
##  Max.   :213234   Max.   :38.713
# 5. Tabella riassuntiva
tabella_nuove_variabili <- data.frame(
  Variabile = c(
    "Prezzo medio",
    "Assorbimento annunci (%)"
  ),
  Media = c(
    mean(texas$average_price),
    mean(texas$listing_absorption_pct)
  ),
  Mediana = c(
    median(texas$average_price),
    median(texas$listing_absorption_pct)
  ),
  Dev_standard = c(
    sd(texas$average_price),
    sd(texas$listing_absorption_pct)
  ),
  Minimo = c(
    min(texas$average_price),
    min(texas$listing_absorption_pct)
  ),
  Massimo = c(
    max(texas$average_price),
    max(texas$listing_absorption_pct)
  )
)

# Arrotondo solo le colonne numeriche
tabella_nuove_variabili[, -1] <- round(
  tabella_nuove_variabili[, -1],
  2
)

# Visualizzo la tabella
knitr::kable(
  tabella_nuove_variabili,
  caption = "Statistiche descrittive delle nuove variabili"
)
Statistiche descrittive delle nuove variabili
Variabile Media Mediana Dev_standard Minimo Massimo
Prezzo medio 154320.37 156588.48 27147.46 97010.20 213233.94
Assorbimento annunci (%) 11.87 10.96 4.69 5.01 38.71

La variabile average_price ha un valore medio di circa 154.320 dollari e una mediana di circa 156.588 dollari. La vicinanza tra media e mediana indica che il prezzo medio degli immobili venduti non presenta forti squilibri nella distribuzione complessiva.

La variabile listing_absorption_pct presenta invece una media di circa 11,87% e una mediana di circa 10,96%. Ciò significa che, mediamente, il numero di vendite rappresenta circa il 12% degli annunci attivi osservati nel periodo.

Valori più elevati di questo indicatore suggeriscono una maggiore capacità del mercato di assorbire gli immobili disponibili, mentre valori più bassi indicano una maggiore presenza di offerta rispetto alle vendite.

L’indicatore deve comunque essere interpretato con cautela: non misura direttamente l’efficacia delle strategie di marketing, poiché il dataset non permette di verificare se gli immobili venduti corrispondano esattamente agli annunci attivi dello stesso periodo.

7. Analisi condizionata

library(dplyr)

#variabili quantitative da analizzare
variabili_analisi <- c(
  "sales",
  "volume",
  "median_price",
  "listings",
  "months_inventory"
)


# 7.1 analisi per città

analisi_citta <- texas %>%
  group_by(city) %>%
  summarise(
    across(
      all_of(variabili_analisi),
      list(Media = mean, SD = sd)
    ),
    .groups = "drop"
  )

#tabella per città
analisi_citta %>%
  mutate(across(where(is.numeric), ~ round(.x, 2))) %>%
  knitr::kable(
    caption = "Media e deviazione standard per città"
  )
Media e deviazione standard per città
city sales_Media sales_SD volume_Media volume_SD median_price_Media median_price_SD listings_Media listings_SD months_inventory_Media months_inventory_SD
Beaumont 177.38 41.48 26.13 6.97 129988.3 10104.99 1679.32 91.13 9.97 1.65
Bryan-College Station 205.97 84.98 38.19 17.25 157488.3 8852.24 1458.13 252.53 7.66 2.25
Tyler 269.75 61.96 45.77 13.11 141441.7 9336.54 2905.05 226.75 11.32 1.89
Wichita Falls 116.07 22.15 13.93 3.24 101743.3 11320.03 909.58 73.76 7.82 0.78
# 7.2 analisi per anno

analisi_anno <- texas %>%
  group_by(year) %>%
  summarise(
    across(
      all_of(variabili_analisi),
      list(Media = mean, SD = sd)
    ),
    .groups = "drop"
  )

#tabella per anno
analisi_anno %>%
  mutate(across(where(is.numeric), ~ round(.x, 2))) %>%
  knitr::kable(
    caption = "Media e deviazione standard per anno"
  )
Media e deviazione standard per anno
year sales_Media sales_SD volume_Media volume_SD median_price_Media median_price_SD listings_Media listings_SD months_inventory_Media months_inventory_SD
2010 168.67 60.54 25.68 10.80 130191.7 21821.76 1826.00 785.02 9.97 2.08
2011 164.12 63.87 25.16 12.20 127854.2 21317.80 1849.65 780.38 10.90 2.07
2012 186.15 70.91 29.27 14.52 130077.1 21431.52 1776.81 738.45 9.88 1.61
2013 211.92 84.00 35.15 17.93 135722.9 21708.08 1677.60 743.52 8.15 1.69
2014 230.60 95.51 39.77 21.19 139481.2 25625.41 1560.04 706.71 7.06 1.75
# 7.3 analisi per mese

analisi_mese <- texas %>%
  group_by(month_factor) %>%
  summarise(
    across(
      all_of(variabili_analisi),
      list(Media = mean, SD = sd)
    ),
    .groups = "drop"
  )

#tabella per mese
analisi_mese %>%
  mutate(across(where(is.numeric), ~ round(.x, 2))) %>%
  knitr::kable(
    caption = "Media e deviazione standard per mese"
  )
Media e deviazione standard per mese
month_factor sales_Media sales_SD volume_Media volume_SD median_price_Media median_price_SD listings_Media listings_SD months_inventory_Media months_inventory_SD
Gennaio 127.40 43.38 19.00 8.37 124250 25151.28 1647.05 704.61 8.84 1.97
Febbraio 140.85 51.07 21.65 10.09 130075 22822.59 1692.50 711.20 9.06 1.98
Marzo 189.45 59.18 29.38 12.02 127415 23442.03 1756.70 727.35 9.40 2.06
Aprile 211.70 65.40 33.30 14.52 131490 21458.40 1825.70 770.43 9.72 2.24
Maggio 238.85 83.12 39.70 19.02 134485 18796.26 1823.85 790.22 9.68 2.38
Giugno 243.55 95.00 41.30 21.08 137620 19231.02 1833.25 811.63 9.70 2.41
Luglio 235.75 96.27 39.12 21.41 134750 21944.78 1821.20 826.72 9.62 2.50
Agosto 231.45 79.23 38.01 18.05 136675 22488.38 1786.30 815.87 9.39 2.45
Settembre 182.35 72.52 29.60 15.22 134040 24344.10 1748.90 802.66 9.19 2.52
Ottobre 179.90 74.95 29.08 15.13 133480 26358.07 1710.35 779.16 8.94 2.44
Novembre 156.85 55.47 24.81 11.15 134305 24691.47 1652.70 741.25 8.66 2.37
Dicembre 169.40 60.75 27.09 12.57 133400 22809.76 1557.75 692.57 8.12 2.27
#vendite medie per città
barplot(
  analisi_citta$sales_Media,
  names.arg = analisi_citta$city,
  main = "Vendite medie per città",
  xlab = "Città",
  ylab = "Vendite medie",
  las = 2
)

#vendite medie per anno
plot(
  analisi_anno$year,
  analisi_anno$sales_Media,
  type = "b",
  main = "Vendite medie per anno",
  xlab = "Anno",
  ylab = "Vendite medie"
)

#vendite medie per mese
barplot(
  analisi_mese$sales_Media,
  names.arg = analisi_mese$month_factor,
  main = "Vendite medie per mese",
  xlab = "Mese",
  ylab = "Vendite medie",
  las = 2
)

L’analisi condizionata evidenzia differenze tra città considernado i periodi temporali.

Nel confronto per città, Tyler presenta il numero medio di vendite più elevato, pari a circa 269,75, e anche il volume medio delle vendite più alto, pari a circa 45,77 milioni di dollari. Bryan-College Station presenta invece il prezzo mediano medio più elevato, pari a circa 157.488 dollari. Wichita Falls mostra livelli medi più bassi sia per le vendite sia per il volume.

L’analisi per anno evidenzia una lieve diminuzione delle vendite medie nel 2011, seguita da una crescita negli anni successivi, fino a raggiungere circa 230,60 vendite medie nel 2014.

L’analisi per mese mostra una componente stagionale: le vendite medie risultano più basse a gennaio, con circa 127,40 vendite, e raggiungono il valore massimo a giugno, con circa 243,55 vendite.

L’analisi condizionata evidenzia quindi differenze sia geografiche, tra le diverse città, sia temporali, con una crescita negli ultimi anni osservati e una maggiore attività del mercato nei mesi primaverili ed estivi.

8. Creazione di visualizzazioni con ggplot2

library(ggplot2)
library(dplyr)

# 8.1 prezzo mediano per città

ggplot(texas, aes(x = city, y = median_price)) +
  geom_boxplot() +
  labs(
    title = "Distribuzione del prezzo mediano per città",
    x = "Città",
    y = "Prezzo mediano ($)"
  ) +
  theme_minimal()

Il boxplot mostra differenze evidenti tra le città. Bryan-College Station presenta i prezzi mediani più elevati, con una mediana di circa 155.400 dollari, mentre Wichita Falls presenta i valori più bassi, con una mediana di circa 102.300 dollari. Tyler e Beaumont occupano una posizione intermedia.

La dispersione dei prezzi varia tra le città; Wichita Falls mostra una maggiore ampiezza della distribuzione rispetto a Bryan-College Station e Beaumont. Sono inoltre presenti alcuni valori anomali, soprattutto per Beaumont, Bryan-College Station e Wichita Falls.

ggplot(texas, aes(x = city, y = volume)) +
  geom_boxplot() +
  facet_wrap(~ year) +
  labs(
    title = "Distribuzione del volume delle vendite per città e anno",
    x = "Città",
    y = "Volume delle vendite (milioni di $)"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

Il volume delle vendite presenta differenze sia tra città sia tra anni. Tyler registra generalmente i volumi più elevati, mentre Wichita Falls presenta i livelli più bassi.

Dal confronto annuale emerge inoltre una crescita del volume complessivo soprattutto dal 2012 al 2014. Il volume medio passa infatti da circa 25,7 milioni di dollari nel 2010 a circa 39,8 milioni nel 2014, indicando una progressiva espansione dell’attività immobiliare nel periodo osservato.

#aggrego le vendite
vendite_mese_citta_anno <- texas %>%
  group_by(year, month_factor, city) %>%
  summarise(
    totale_sales = sum(sales),
    .groups = "drop"
  )

#faccio grafico a barre sovrapposte
ggplot(
  vendite_mese_citta_anno,
  aes(
    x = month_factor,
    y = totale_sales,
    fill = city
  )
) +
  geom_col() +
  facet_wrap(~ year) +
  labs(
    title = "Vendite mensili per città e anno",
    x = "Mese",
    y = "Vendite totali",
    fill = "Città"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

Il grafico evidenzia una componente stagionale delle vendite. L’attività immobiliare tende ad aumentare nei mesi primaverili ed estivi, mentre risulta più contenuta nei mesi invernali.

In particolare, considerando le vendite medie mensili, il valore più basso si registra a gennaio, con circa 127,40 vendite, mentre il valore massimo si osserva a giugno, con circa 243,55 vendite.

La suddivisione per anno permette inoltre di confrontare l’intensità delle vendite nei diversi periodi storici e di osservare una crescita complessiva soprattutto negli ultimi anni analizzati.

È stato utilizzato geom_col() perché il valore delle vendite è già contenuto nella variabile totale_sales; geom_bar(), invece, viene generalmente utilizzizzato quando si vuole che R conteggi automaticamente il numero delle osservazioni.

ggplot(
  vendite_mese_citta_anno,
  aes(
    x = month_factor,
    y = totale_sales,
    fill = city
  )
) +
  geom_col(position = "fill") +
  facet_wrap(~ year) +
  scale_y_continuous(labels = scales::percent) +
  labs(
    title = "Composizione percentuale delle vendite mensili",
    x = "Mese",
    y = "Percentuale",
    fill = "Città"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

Nel grafico normalizzato ogni barra rappresenta il 100% delle vendite del relativo mese, suddiviso tra le diverse città.

Questa rappresentazione non permette di confrontare direttamente il numero assoluto di vendite tra i mesi, ma consente di osservare il peso percentuale di ciascuna città sul totale mensile.

Il confronto tra mesi e anni permette quindi di verificare se la composizione geografica delle vendite rimane relativamente stabile oppure se alcune città aumentano o diminuiscono il proprio peso nel mercato nel corso del tempo.

Il grafico normalizzato completa quello precedente: il primo evidenzia le variazioni nel volume complessivo delle vendite, mentre questo evidenzia la loro composizione percentuale tra le città.

ggplot(
  texas,
  aes(
    x = date,
    y = sales,
    color = city,
    group = city
  )
) +
  geom_line() +
  labs(
    title = "Andamento delle vendite nel tempo per città",
    x = "Periodo",
    y = "Numero di vendite",
    color = "Città"
  ) +
  theme_minimal()

Il line chart conferma sia le differenze tra città sia la presenza di variazioni stagionali nel tempo. Tyler presenta generalmente i livelli di vendita più elevati, mentre Wichita Falls si colloca su livelli inferiori.

Dal punto di vista temporale, dopo una lieve diminuzione nel 2011, le vendite mostrano una crescita progressiva fino al 2014. Le oscillazioni ricorrenti all’interno dei singoli anni confermano inoltre una maggiore attività del mercato nei mesi primaverili ed estivi.

9. Conclusioni

L’analisi descrittiva del mercato immobiliare texano ha evidenziato differenze significative sia tra le città sia tra i diversi periodi temporali.

Tra le variabili quantitative, volume è risultata quella con la maggiore variabilità relativa, con un coefficiente di variazione di circa 53,7%, ed è anche la variabile con la maggiore asimmetria positiva. Questo indica che il valore complessivo delle vendite presenta forti oscillazioni e alcuni periodi caratterizzati da volumi particolarmente elevati.

Dal confronto tra città emerge che Tyler presenta il numero medio di vendite più elevato, circa 269,75, e anche il volume medio maggiore, circa 45,77 milioni di dollari. Bryan-College Station registra invece il prezzo mediano medio più elevato, circa 157.488 dollari, mentre Wichita Falls presenta livelli medi più bassi sia nelle vendite sia nel volume.

L’analisi temporale mostra una lieve diminuzione delle vendite nel 2011, seguita da una crescita progressiva fino al 2014, anno in cui le vendite medie raggiungono circa 230,60. È inoltre presente una componente stagionale: le vendite risultano mediamente più basse a gennaio e raggiungono il valore massimo a giugno, evidenziando una maggiore attività nei mesi primaverili ed estivi.

Le nuove variabili hanno permesso di approfondire ulteriormente il mercato. Il prezzo medio degli immobili venduti è pari a circa 154.320 dollari, mentre l’indicatore di assorbimento degli annunci presenta un valore medio di circa 11,87%.

Dal punto di vista operativo, Texas Realty Insights potrebbe quindi concentrare l’attenzione sui periodi dell’anno caratterizzati da maggiore attività, monitorare le forti variazioni del volume delle vendite e differenziare le strategie commerciali in base alle caratteristiche dei diversi mercati locali.

Nel complesso, i risultati suggeriscono che il mercato immobiliare analizzato non presenta un andamento uniforme, ma varia in funzione della città, dell’anno e del mese. Le decisioni strategiche dovrebbero quindi tenere conto sia delle differenze territoriali sia della componente temporale e stagionale.