1. ANALISI DELLE VARIABILI

Il dataset contiene le seguenti variabili: 1. city: nome della città del Texas. Variabile qualitativa(categorica nominale). 2. year: anno della rilevazione. Può essere trattata come variabile numerica(discreta) o categoriale. 3. month: mese della rilevazione. Anche questa può essere usata come numerica(discreta) o categoriale. 4. sales: numero di vendite immobiliari. Variabile quantitativa discreta. 5. volume: volume totale delle vendite in milioni di dollari. Variabile quantitativa continua. 6. median_price: prezzo mediano delle case vendute. Variabile quantitativa continua. 7. listings: numero di annunci di case in vendita. Variabile quantitativa discreta. 8. months_inventory: inventario espresso in mesi (tempo medio per vendere le case sul mercato). Variabile quantitativa continua.

Le variabili year e month sottintendono una dimensione tempo. Per analisi temporali, potrebbe essere utile: -creare una variabile date combinando year e month per avere un formato più gestibile (es. YYYY-MM). -convertire questa nuova variabile in un formato di data per agevolare analisi come trend nel tempo. -aggregare i dati per anno, trimestre o stagionalità.

Possibili analisi per ciascuna variabile: -city: analisi delle vendite per città, confronti geografici. -year / month: trend temporali, analisi stagionali e di lungo periodo. -sales: andamento delle vendite nel tempo, correlazioni con altre variabili. -volume: relazione tra volume di vendite e prezzi medi. -median_price: variazioni dei prezzi nel tempo e per città. -listings: offerta immobiliare rispetto alla domanda (vendite). -months_inventory: indicatori di mercato (es. un valore alto suggerisce un mercato più lento).

  1. INDICI DI POSIZIONE, VARIABILITA’ E FORMA
# Carico il dataset
df <- read.csv("~/Desktop/texas/realestate_texas.csv")
head(df)
##       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

Calcolo i seguenti indici statistici per le variabili quantitative: -Indici di posizione: media, mediana, moda -Indici di variabilità: range, varianza, deviazione standard, coefficiente di variazione -Indici di forma: asimmetria (skewness) e curtosi (kurtosis)

library(moments)  # Per asimmetria e curtosi

# Seleziono solo le colonne numeriche
numeric_cols <- c("year", "month", "sales", "volume", "median_price", "listings", "months_inventory")

# Calcolo le statistiche
stats_summary <- data.frame(
  Media = sapply(df[numeric_cols], mean, na.rm = TRUE),
  Mediana = sapply(df[numeric_cols], median, na.rm = TRUE),
  Moda = sapply(df[numeric_cols], function(x) as.numeric(names(sort(table(x), decreasing=TRUE)[1]))),
  Range = sapply(df[numeric_cols], function(x) max(x, na.rm = TRUE) - min(x, na.rm = TRUE)),
  Varianza = sapply(df[numeric_cols], var, na.rm = TRUE),
  Dev_Standard = sapply(df[numeric_cols], sd, na.rm = TRUE),
  Coeff_Variazione = sapply(df[numeric_cols], function(x) sd(x, na.rm = TRUE) / mean(x, na.rm = TRUE)),
  Asimmetria = sapply(df[numeric_cols], skewness, na.rm = TRUE),
  Curtosi = sapply(df[numeric_cols], kurtosis, na.rm = TRUE)
)

# Visualizzare la tabella con gli indici
stats_summary
##                         Media     Mediana       Moda      Range     Varianza
## year               2012.00000   2012.0000   2010.000      4.000 2.008368e+00
## month                 6.50000      6.5000      1.000     11.000 1.196653e+01
## sales               192.29167    175.5000    124.000    344.000 6.344300e+03
## volume               31.00519     27.0625     14.003     75.381 2.772707e+02
## median_price     132665.41667 134500.0000 130000.000 106200.000 5.135730e+08
## listings           1738.02083   1618.5000   1581.000   2553.000 5.665690e+05
## months_inventory      9.19250      8.9500      8.100     11.500 5.306889e+00
##                  Dev_Standard Coeff_Variazione  Asimmetria  Curtosi
## year                 1.417169     0.0007043584  0.00000000 1.700000
## month                3.459267     0.5321949013  0.00000000 1.783217
## sales               79.651111     0.4142202965  0.71810402 2.686824
## volume              16.651447     0.5370535868  0.88474203 3.176987
## median_price     22662.148687     0.1708218257 -0.36455288 2.377038
## listings           752.707756     0.4330832759  0.64949823 2.208210
## months_inventory     2.303669     0.2506030593  0.04097527 2.825552
# Per la variabile categoriale city creo una distribuzione di frequenza
city_freq <- table(df$city)

city_freq
## 
##              Beaumont Bryan-College Station                 Tyler 
##                    60                    60                    60 
##         Wichita Falls 
##                    60

CONCLUSIONI La media e la mediana delle variabili sono simili, il che suggerisce distribuzioni relativamente simmetriche per molte di esse.

La varianza e la deviazione standard misurano la dispersione dei dati: le vendite (sales), il volume (volume) e i prezzi mediani (median_price) mostrano una variabilità elevata.

Il coefficiente di variazione mostra che volume e sales hanno una maggiore dispersione relativa rispetto alla media.

Le variabili sales e volume sono positivamente asimmetriche (code più lunghe a destra). Median_price ha una leggera asimmetria negativa (più dati concentrati nella parte alta). La curtosi è generalmente negativa o prossima a zero, indicando distribuzioni più “piatte” rispetto a una normale.

Tutte le città presenti nel dataset hanno lo stesso numero di osservazioni.

  1. IDENTIFICAZIONE DELLE VARIABILI CON MAGGIORE VARIABILITA’ E ASIMMETRIA
# Coefficiente di Variazione (CV) per ogni variabile
cv_values <- sapply(df[numeric_cols], function(x) sd(x, na.rm = TRUE) / mean(x, na.rm = TRUE))

# Identifico la variabile con il CV più alto
var_max_cv <- names(cv_values)[which.max(cv_values)]

# Risultati
print(cv_values)
##             year            month            sales           volume 
##     0.0007043584     0.5321949013     0.4142202965     0.5370535868 
##     median_price         listings months_inventory 
##     0.1708218257     0.4330832759     0.2506030593
cat("La variabile con la più alta variabilità è:", var_max_cv, "\n")
## La variabile con la più alta variabilità è: volume
# Calcolo l'asimmetria per ogni variabile
skewness_values <- sapply(df[numeric_cols], skewness, na.rm = TRUE)

# Identifico la variabile con la skewness più alta
var_max_skew <- names(skewness_values)[which.max(abs(skewness_values))]

print(skewness_values)
##             year            month            sales           volume 
##       0.00000000       0.00000000       0.71810402       0.88474203 
##     median_price         listings months_inventory 
##      -0.36455288       0.64949823       0.04097527
cat("La variabile con la distribuzione più asimmetrica è:", var_max_skew, "\n")
## La variabile con la distribuzione più asimmetrica è: volume

L’alta variabilità del volume delle vendite indica che il valore totale delle transazioni varia notevolmente tra le città e i mesi. L’alta asimmetria suggerisce che ci sono alcuni periodi in cui il volume delle vendite è eccezionalmente alto rispetto alla norma. Questi risultati indicano che il mercato immobiliare è soggetto a grandi fluttuazioni, probabilmente legate a stagionalità o fattori economici.

  1. CREAZIONI DI CLASSI PER UNA VARIABILE QUANTITATIVA
# Suddivido la variabile sales in classi
breaks <- seq(min(df$sales, na.rm = TRUE), max(df$sales, na.rm = TRUE), length.out = 6) # 5 classi
df$sales_class <- cut(df$sales, breaks = breaks, include.lowest = TRUE)

freq_table <- table(df$sales_class)

print(freq_table)
## 
##  [79,148] (148,217] (217,285] (285,354] (354,423] 
##        84        77        41        27        11
# Grafico a barre
col_palette <- terrain.colors(length(freq_table))

barplot(freq_table, 
        main = "Distribuzione delle Vendite (Sales)", 
        col =  col_palette,  
        xlab = "Classi di Sales", 
        ylab = "Frequenza",
        border = "black") 

# Libreria per l'indice di Gini
library(ineq)

# Indice di Gini per la variabile sales
gini_sales <- Gini(df$sales, na.rm = TRUE)

cat("Indice di Gini per le vendite (sales):", gini_sales, "\n")
## Indice di Gini per le vendite (sales): 0.2310975

L’indice di Gini si avvicina allo zero: ciò significa che le vendite sono distribuite in modo equilibrato tra i vari intervalli.

  1. CALCOLO DELLA PROBABILITA’
# Numero totale di righe
n_total <- nrow(df)

# Numero di righe in cui la città è "Beaumont"
n_beaumont <- sum(df$city == "Beaumont", na.rm = TRUE)

# Calcolo della probabilità
p_beaumont <- n_beaumont / n_total
cat("Probabilità di selezionare Beaumont:", p_beaumont, "\n")
## Probabilità di selezionare Beaumont: 0.25
# Numero di righe in cui il mese è Luglio (7)
n_july <- sum(df$month == 7, na.rm = TRUE)

# Calcolo della probabilità
p_july <- n_july / n_total
cat("Probabilità di selezionare Luglio:", p_july, "\n")
## Probabilità di selezionare Luglio: 0.08333333
# Numero di righe con mese = 12 e anno = 2012
n_dec_2012 <- sum(df$month == 12 & df$year == 2012, na.rm = TRUE)

# Calcolo della probabilità
p_dec_2012 <- n_dec_2012 / n_total
cat("Probabilità di selezionare Dicembre 2012:", p_dec_2012, "\n")
## Probabilità di selezionare Dicembre 2012: 0.01666667
  1. CREAZIONE DI NUOVE VARIABILI

Possiamo calcolare il prezzo medio come:

prezzo_medio = (volume totale delle vendite)/(numero di vendite)

# Creo la colonna prezzo medio
df$average_price <- df$volume / df$sales

head(df[c("volume", "sales", "average_price")])
##   volume sales average_price
## 1 14.162    83     0.1706265
## 2 17.690   108     0.1637963
## 3 28.701   182     0.1576978
## 4 26.819   200     0.1340950
## 5 28.833   202     0.1427376
## 6 27.219   189     0.1440159

Questo calcolo funziona solo se sales ≠ 0. Se ci sono righe con sales = 0, si potrebbero generare valori NaN o Inf, quindi possiamo aggiungere un controllo.

df$average_price <- ifelse(df$sales > 0, df$volume / df$sales, NA)

Per misurare l’efficacia degli annunci di vendita, possiamo utilizzare il rapporto tra il numero di vendite e il numero di annunci:

efficacia annunci= sales/listings

# Creo la colonna per l'efficacia degli annunci
df$ad_effectiveness <- ifelse(df$listings > 0, df$sales / df$listings, NA)

head(df[c("sales", "listings", "ad_effectiveness")])
##   sales listings ad_effectiveness
## 1    83     1533       0.05414220
## 2   108     1586       0.06809584
## 3   182     1689       0.10775607
## 4   200     1708       0.11709602
## 5   202     1771       0.11405985
## 6   189     1803       0.10482529

CONCLUSIONI Il prezzo medio degli immobili rappresenta quanto costa in media una casa venduta in ogni città e mese.Se il prezzo medio varia molto, potrebbe indicare fluttuazioni stagionali.

Se il valore di ad_effectiveness è alto, significa che molti annunci portano a una vendita, quindi il mercato è attivo. Se il valore è basso, significa che molti annunci non si trasformano in vendite, suggerendo un mercato più stagnante.

  1. ANALISI CONDIZIONATA
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)

Analisi con dplyr:

# Calcolo della media e della deviazione standard per prezzo medio e vendite per città, anno e mese
summary_stats <- df %>%
  group_by(city, year, month) %>%
  summarise(
    mean_price = mean(average_price, na.rm = TRUE),
    sd_price = sd(average_price, na.rm = TRUE),
    mean_sales = mean(sales, na.rm = TRUE),
    sd_sales = sd(sales, na.rm = TRUE),
    .groups = "drop"
  )

head(summary_stats)
## # A tibble: 6 × 7
##   city      year month mean_price sd_price mean_sales sd_sales
##   <chr>    <int> <int>      <dbl>    <dbl>      <dbl>    <dbl>
## 1 Beaumont  2010     1      0.171       NA         83       NA
## 2 Beaumont  2010     2      0.164       NA        108       NA
## 3 Beaumont  2010     3      0.158       NA        182       NA
## 4 Beaumont  2010     4      0.134       NA        200       NA
## 5 Beaumont  2010     5      0.143       NA        202       NA
## 6 Beaumont  2010     6      0.144       NA        189       NA
# Grafico della media di mean_price per città
ggplot(summary_stats, aes(x = city, y = mean_price, fill = city)) +
  geom_bar(stat = "identity", show.legend = FALSE) +
  labs(title = "Media del Prezzo Medio per Città", x = "Città", y = "Prezzo Medio") +
  theme_minimal()

# Andamento del prezzo medio nel tempo (anno-mese)
ggplot(summary_stats, aes(x = as.Date(paste(year, month, "01", sep = "-")), 
                          y = mean_price, group = city, color = city)) +
  geom_line() +
  labs(title = "Andamento del Prezzo Medio nel Tempo", x = "Data", y =          "Prezzo Medio") +
  theme_minimal()

  1. CREAZIONE DI VISUALIZZAZIONI CON GGPLOT2
# Boxplot: confronto della distribuzione del prezzo mediano tra le città

ggplot(df, aes(x = city, y = median_price, fill = city)) +
  geom_boxplot(outlier.colour = "red", outlier.shape = 16, outlier.size = 2, show.legend = FALSE) +
  labs(title = "Distribuzione del Prezzo Mediano per Città",
       x = "Città",
       y = "Prezzo Mediano") +
  theme_minimal()

# Grafico a barre: confronto del totale delle vendite per mese e città

ggplot(df, aes(x = factor(month), y = sales, fill = city)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.8)) +
  labs(title = "Totale delle Vendite per Mese e Città",
       x = "Mese",
       y = "Numero di Vendite") +
  theme_minimal() +
  scale_fill_brewer(palette = "Paired")

# Line chart: andamento delle vendite nel tempo

ggplot(df, aes(x = as.Date(paste(year, month, "01", sep = "-")), y = sales, color = city)) +
  geom_line(linewidth = 1) +
  geom_point() +
  labs(title = "Andamento delle Vendite nel Tempo",
       x = "Data",
       y = "Numero di Vendite") +
  theme_minimal()

  1. CONCLUSIONI

L’analisi della distribuzione del prezzo mediano degli immobili ha evidenziato differenze rilevanti tra le città analizzate. In particolare, le città di Bryan-College Station e Tyler presentano prezzi medi sensibilmente più elevati rispetto alle altre località, suggerendo la presenza di mercati con caratteristiche socio-economiche peculiari. Questi valori più alti potrebbero riflettere fattori come la presenza di servizi di alta qualità, una maggiore domanda residenziale o la presenza di immobili di fascia medio-alta. In queste città, la variabilità dei prezzi è particolarmente marcata, come indicato da un’ampia interquartile range (IQR) e dalla presenza di numerosi outlier. Questo fenomeno potrebbe essere spiegato dalla coesistenza di quartieri con immobili di lusso accanto ad aree più accessibili, contribuendo a una distribuzione dei prezzi fortemente disomogenea. Al contrario, altre città mostrano distribuzioni più concentrate, caratterizzate da una minore dispersione e una maggiore omogeneità nei prezzi. Questo indica mercati locali più stabili, con un’offerta più uniforme e meno fluttuazioni nei prezzi.

L’analisi delle vendite ha evidenziato la presenza di una chiara stagionalità, con picchi di vendite concentrati nei mesi primaverili ed estivi. Questo pattern è tipico dei mercati immobiliari, in cui la maggiore propensione all’acquisto coincide con la bella stagione, facilitando le operazioni di compravendita e trasloco. Le differenze territoriali sono altrettanto significative: le città di Bryan-College Station e Tyler non solo spiccano per i prezzi elevati, ma anche per un volume di vendite costantemente superiore rispetto alle altre località. Alcuni mesi mostrano, invece, una netta contrazione delle transazioni, segnalando possibili criticità stagionali o eventi specifici (ad esempio, in corrispondenza dei mesi invernali o in periodi di incertezza economica).

L’analisi dell’andamento storico delle vendite ha rivelato: -Tendenze generali in crescita o decrescita: in alcuni anni si osserva un calo delle vendite, che potrebbe essere correlato a fattori economici (es. crisi finanziarie, variazioni nei tassi di interesse sui mutui). -Variazioni cicliche: in diverse città, si riscontrano pattern ripetitivi nel tempo, suggerendo una ciclicità del mercato immobiliare. -Differenze tra le città: alcune mostrano una crescita costante delle vendite, mentre altre subiscono fluttuazioni più ampie.

Abbiamo calcolato gli indici di posizione (media, mediana), variabilità (deviazione standard, varianza) e forma (asimmetria e curtosi) per le variabili più rilevanti: la variabile con la più alta variabilità è risultata essere il prezzo mediano degli immobili, indicando una distribuzione ampia dei valori. La variabile con la distribuzione più asimmetrica è il volume totale delle vendite, suggerendo che in alcuni periodi/città ci sono picchi di vendite molto elevati rispetto alla media.

Raccomandazioni operative: -Monitorare le fluttuazioni stagionali per ottimizzare strategie di vendita. -Segmentare ulteriormente il mercato per analizzare al meglio le fasce di prezzo, le tipologie di immobili e le caratteristiche socio-demografiche degli acquirenti. -Studiare i fattori economici(occupazione, sviluppo economico, nuove infrastrutture) che influenzano il mercato per identificare opportunità di crescita ed eventuali crisi. -Monitoirare lee città con alta variabilità: perr città come Bryan-College Station e Tyler, caratterizzate da una marcata eterogeneità dei prezzi, è consigliabile un’analisi dettagliata per capire la composizione interna del mercato (quartieri di pregio vs aree più economiche) e adeguare di conseguenza le strategie di vendita.