Introduzione

In questa analisi statistica, verrà esaminato il mercato immobiliare del Texas utilizzando il dataset realestate_texas.csv. Verranno calcolati vari indici statistici, analizzate le distribuzioni delle variabili e create visualizzazioni per comprendere meglio le dinamiche delle vendite immobiliari nelle diverse città del Texas.

Installa i pacchetti necessari e caricamento dei pacchetti stessi

required_packages <- c("tidyverse", "ggplot2", "dplyr", "readr", "e1071", "ineq", "zoo", "reshape2", "ggcorrplot")
installed_packages <- rownames(installed.packages())

for(p in required_packages){
  if(!(p %in% installed_packages)){
    install.packages(p)
  }
}

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(dplyr)
library(readr)
library(e1071)      
library(ineq)       
library(zoo)        
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(reshape2)   
## 
## Attaching package: 'reshape2'
## 
## The following object is masked from 'package:tidyr':
## 
##     smiths
library(ggcorrplot) 

Carica il dataset

data <- read_csv("C:/Users/milan/Desktop/Master Profession Ai/Statistica_descrittiva/realestate_texas.csv")
## Rows: 240 Columns: 8
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): city
## dbl (7): year, month, sales, volume, median_price, listings, months_inventory
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Esplora i dati

summary(data)
##      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
str(data)
## spc_tbl_ [240 × 8] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ city            : chr [1:240] "Beaumont" "Beaumont" "Beaumont" "Beaumont" ...
##  $ year            : num [1:240] 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
##  $ month           : num [1:240] 1 2 3 4 5 6 7 8 9 10 ...
##  $ sales           : num [1:240] 83 108 182 200 202 189 164 174 124 150 ...
##  $ volume          : num [1:240] 14.2 17.7 28.7 26.8 28.8 ...
##  $ median_price    : num [1:240] 163800 138200 122400 123200 123100 ...
##  $ listings        : num [1:240] 1533 1586 1689 1708 1771 ...
##  $ months_inventory: num [1:240] 9.5 10 10.6 10.6 10.9 11.1 11.7 11.6 11.7 11.5 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   city = col_character(),
##   ..   year = col_double(),
##   ..   month = col_double(),
##   ..   sales = col_double(),
##   ..   volume = col_double(),
##   ..   median_price = col_double(),
##   ..   listings = col_double(),
##   ..   months_inventory = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
Variabile Tipo
city col_character()
year col_double()
month col_double()
sales col_double()
volume col_double()
median_price col_double()
listings col_double()
months_inventory col_double()

Analisi Statistica Descrittiva

Analisi delle Variabili

# Analisi delle Variabili 
variabili <- data.frame(
  Variabile = c("city", "year", "month", "sales", "volume", "median_price", "listings", "months_inventory"), 
  Tipo = c(
    "Categorica Nominale",       # city
    "Categorica Ordinale",       # year
    "Categorica Ordinale",       # month
    "Quantitativa Continua",     # sales
    "Quantitativa Continua",     # volume
    "Quantitativa Continua",     # median_price
    "Quantitativa Discreta",     # listings
    "Quantitativa Continua"      # months_inventory
  ), 
  Descrizione = c(
    "Città in cui si sono verificate le vendite", 
    "Anno di riferimento", 
    "Mese dell'anno", 
    "Numero totale di vendite", 
    "Valore totale delle vendite (milioni di dollari)", 
    "Prezzo mediano degli immobili venduti", 
    "Numero totale di annunci attivi", 
    "Tempo necessario per vendere tutte le inserzioni attive (mesi)"
  )
)

# Stampa della tabella aggiornata
print(variabili)
##          Variabile                  Tipo
## 1             city   Categorica Nominale
## 2             year   Categorica Ordinale
## 3            month   Categorica Ordinale
## 4            sales Quantitativa Continua
## 5           volume Quantitativa Continua
## 6     median_price Quantitativa Continua
## 7         listings Quantitativa Discreta
## 8 months_inventory Quantitativa Continua
##                                                      Descrizione
## 1                     Città in cui si sono verificate le vendite
## 2                                            Anno di riferimento
## 3                                                 Mese dell'anno
## 4                                       Numero totale di vendite
## 5               Valore totale delle vendite (milioni di dollari)
## 6                          Prezzo mediano degli immobili venduti
## 7                                Numero totale di annunci attivi
## 8 Tempo necessario per vendere tutte le inserzioni attive (mesi)
Variabile Tipo Tipo Statistico Descrizione
city col_character() Categorica Nominale Nome della città in cui sono avvenute le vendite immobiliari
year col_double() Categorica Ordinale Anno di riferimento
month col_double() Categorica Ordinale Mese di riferimento (valori da 1 a 12)
sales col_double() Quantitativa Continua Numero totale di vendite
volume col_double() Quantitativa Continua Valore totale delle vendite, in milioni di dollari
median_price col_double() Quantitativa Continua Prezzo mediano degli immobili venduti, in dollari
listings col_double() Quantitativa Discreta Numero totale di annunci immobiliari attivi
months_inventory col_double() Quantitativa Continua Tempo necessario per vendere tutte le inserzioni correnti, espresso in mesi

Indici di Posizione e Variabilità

# Calcolo degli indici di posizione e variabilità per le variabili quantitative
stats_summary <- data %>%
    select(sales, volume, median_price, listings, months_inventory) %>%  # Solo variabili quantitative
    summarise_all(list(
        Mean = ~mean(., na.rm = TRUE),
        Median = ~median(., na.rm = TRUE),
        SD = ~sd(., na.rm = TRUE),
        Range = ~diff(range(., na.rm = TRUE)),
        IQR = ~IQR(., na.rm = TRUE)
    ))

# Aggiungi i nomi delle variabili alla tabella
stats_summary <- tibble::rownames_to_column(as.data.frame(stats_summary), "Variabile")

# Stampa il risultato
print(stats_summary)
##   Variabile sales_Mean volume_Mean median_price_Mean listings_Mean
## 1         1   192.2917    31.00519          132665.4      1738.021
##   months_inventory_Mean sales_Median volume_Median median_price_Median
## 1                9.1925        175.5       27.0625              134500
##   listings_Median months_inventory_Median sales_SD volume_SD median_price_SD
## 1          1618.5                    8.95 79.65111  16.65145        22662.15
##   listings_SD months_inventory_SD sales_Range volume_Range median_price_Range
## 1    752.7078            2.303669         344       75.381             106200
##   listings_Range months_inventory_Range sales_IQR volume_IQR median_price_IQR
## 1           2553                   11.5       120    23.2335            32750
##   listings_IQR months_inventory_IQR
## 1       1029.5                 3.15
Variabile Media Mediana Dev. Std. Range IQR
sales 192.3 175.5 78.43 344 120
volume (milioni $) 31.00 27.06 15.0126 75.38 23.23
median_price ($) 132,665 134,500 22,662.15 106,200 32,75
listings 1738 1618 752.71 2553 1030
months_inventory 9.19 8.95 2.30 11.5 3.15

Interpretazione delle Statistiche

  • Sales

    • Media: 192.3, mediana: 175.5, leggera asimmetria positiva.

    • Variabilità: elevata, con un range di 344 e un IQR di 120.

  • Volume

    • Media: 31 milioni, mediana: 27.06 milioni, significativa diversità nei dati.

    • Variabilità: importante, con un range di 75.38 milioni.

  • Median Price

    • Media: $132,665, mediana: $134,500, distribuzione quasi simmetrica.

    • Variabilità: elevata, con un range di $106,200.

  • Listings

    • Media: 1738, mediana: 1618, distribuzione relativamente uniforme.

    • Variabilità: ampia, con un range di 2553 e un IQR di 1030.

  • Months Inventory

    • Media: 9.19 mesi, mediana: 8.95 mesi, buona coerenza nei dati.

    • Variabilità: moderata, con un range di 11.5 mesi e un IQR di 3.15.

Distribuzione di Frequenza per Variabili Categoriche

Distribuzione di frequenza per la variabile ‘city’ (grafico a Barre)

x11(width = 12, height = 6)

# Calcolo della distribuzione di frequenza per 'city'
freq_city <- table(data$city)

# Impostazione limite massimo dell'asse y
max_freq_city <- max(freq_city) + 5  # Aggiungi un margine superiore

barplot(
  freq_city,
  main = "Distribuzione delle Città",
  col = "skyblue",
  xlab = "Città",
  ylab = "Frequenza",
  las = 2,
  ylim = c(0, max_freq_city)  # Imposta il limite dell'asse y
)

  • Caratteristica Principale: La distribuzione mostra che le quattro città analizzate (Beaumont, College Station, Tyler e Wichita Falls) hanno un numero uniforme di osservazioni, con una frequenza di circa 60 per ciascuna.

  • Osservazione: Questo suggerisce che i dati sono equamente distribuiti tra le città, il che permette un confronto bilanciato tra di esse per le analisi successive.

Distribuzione di frequenza per la variabile ‘year’ (grafico a Barre)

x11(width = 12, height = 6)

# Calcolo dela distribuzione di frequenza per 'year'
freq_year <- table(data$year)

# Impostazione limite massimo dell'asse y
max_freq_year <- max(freq_year) + 5  # Aggiungi un margine superiore

barplot(
  freq_year,
  main = "Distribuzione degli Anni",
  col = "lightgreen",
  xlab = "Anno",
  ylab = "Frequenza",
  ylim = c(0, max_freq_year),  # Imposta il limite dell'asse y
  las = 1
)

  • Caratteristica Principale: La distribuzione degli anni è uniforme, con una frequenza di circa 48 osservazioni per ciascun anno dal 2010 al 2014.

  • Osservazione: Questa distribuzione indica che i dati sono stati raccolti in modo omogeneo nel periodo analizzato, garantendo una rappresentazione consistente delle tendenze temporali.

Distribuzione di frequenza per la variabile ‘month’ (grafico a Barre)

x11(width = 12, height = 6)

# Calcolo della distribuzione di frequenza per 'month'
freq_month <- table(data$month)

# Impostazione limite massimo dell'asse y
max_freq_month <- max(freq_month) + 5  # Aggiunge un margine superiore

barplot(
  freq_month,
  main = "Distribuzione dei Mesi",
  col = "salmon",
  xlab = "Mese",
  ylab = "Frequenza",
  ylim = c(0, max_freq_month),  # Imposta il limite dell'asse y
  las = 1
)

  • Caratteristica Principale: La distribuzione mensile mostra una frequenza costante di 20 osservazioni per ciascun mese dell’anno, da gennaio a dicembre.

  • Osservazione: Questo evidenzia che i dati sono distribuiti uniformemente durante l’anno, consentendo un’analisi equa delle variazioni stagionali.

Identificazione delle Variabili con Maggiore Variabilità e Asimmetria

Calcolo della variabilità assoluta (Varianza)

# Caricamento della libreria scales per la formattazione
library(scales)
## 
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
## 
##     discard
## The following object is masked from 'package:readr':
## 
##     col_factor
# Calcolo della variabilità assoluta (Varianza)
variability_var <- data %>%
    select(sales, volume, median_price, listings, months_inventory) %>%  # Escludiamo 'month'
    summarise_all(var, na.rm = TRUE) %>%
    pivot_longer(cols = everything(), names_to = "Variabile", values_to = "Varianza") %>%
    mutate(
        Varianza = format(Varianza, big.mark = ".", decimal.mark = ",", scientific = FALSE)  # Formattazione dei valori
    )

# Stampa delle varianze calcolate
print("Varianza per tutte le variabili quantitative:")
## [1] "Varianza per tutte le variabili quantitative:"
print(variability_var)
## # A tibble: 5 × 2
##   Variabile        Varianza            
##   <chr>            <chr>               
## 1 sales            "      6.344,299512"
## 2 volume           "        277,270692"
## 3 median_price     "513.572.983,089261"
## 4 listings         "    566.568,966091"
## 5 months_inventory "          5,306889"
Variabile Varianza
sales 6344.00
volume 277.00
median_price ($) 513,572,983.00
listings 566,569.00
months_inventory 5.31

Calcolo della variabilità relativa (CV)

# Calcolo della variabilità relativa (CV) per le variabili quantitative
variability_cv <- data %>%
    select(sales, volume, median_price, listings, months_inventory) %>%  
    summarise_all(list(CV = ~sd(., na.rm = TRUE) / mean(., na.rm = TRUE))) %>%  
    pivot_longer(cols = everything(), names_to = "Variabile", values_to = "CV") %>%
    mutate(
        CV = format(CV, big.mark = ".", decimal.mark = ",", scientific = FALSE)  
    ) %>%
    arrange(desc(as.numeric(gsub(",", ".", CV))))  # Ordinazione dei valori numerici 

# Stampa dei risultati
print("Coefficiente di variazione (CV) per tutte le variabili quantitative:")
## [1] "Coefficiente di variazione (CV) per tutte le variabili quantitative:"
print(variability_cv)
## # A tibble: 5 × 2
##   Variabile           CV       
##   <chr>               <chr>    
## 1 volume_CV           0,5370536
## 2 listings_CV         0,4330833
## 3 sales_CV            0,4142203
## 4 months_inventory_CV 0,2506031
## 5 median_price_CV     0,1708218
Variabile CV
Volume 0.54
Listings 0.43
Sales 0.41
Months Inventory 0.25
Median Price 0.17

Identificazione della Variabile con la Massima Variabilità (assoluta e relativa)

Calcolo della variabilità assoluta

# Calcolo della variabilità assoluta (varianza) per le variabili quantitative
variability_var <- data %>%    
  select(sales, volume, median_price, listings, months_inventory) %>%  
  summarise_all(var, na.rm = TRUE) %>%    
  pivot_longer(cols = everything(), names_to = "Variabile", values_to = "Varianza") %>%    
  arrange(desc(Varianza)) %>% 
  mutate(
    Varianza = format(Varianza, big.mark = ".", decimal.mark = ",", scientific = FALSE)  # Rende i valori leggibili
  ) %>%
  slice(1)  # Seleziona la variabile con la massima varianza

# Stampa del risultato
print("Variabile con la massima varianza assoluta:")
## [1] "Variabile con la massima varianza assoluta:"
print(variability_var)
## # A tibble: 1 × 2
##   Variabile    Varianza          
##   <chr>        <chr>             
## 1 median_price 513.572.983,089261
Variabile Varianza max
median_price ($) 513572983

Massima variabilità assoluta (varianza):

  • Variabile: median_price

  • Valore della varianza: 513,572,983 (molto alta, dovuta alla scala dei valori di median_price).

Calcolo della variabilità relativa (CV)

# Calcolo della massima variabilità relativa (CV)
variability_cv <- data %>%
  select(sales, volume, median_price, listings, months_inventory) %>%  
  summarise_all(list(CV = ~sd(., na.rm = TRUE) / mean(., na.rm = TRUE))) %>%  
  pivot_longer(cols = everything(), names_to = "Variabile", values_to = "CV") %>%  
  mutate(
    CV = format(CV, big.mark = ".", decimal.mark = ",", scientific = FALSE)  # Rende i valori leggibili
  ) %>%
  arrange(desc(as.numeric(gsub(",", ".", CV)))) %>% 
  slice(1)  # Seleziona la variabile con il massimo CV

# Stampa del risultato
print("Variabile con il massimo coefficiente di variazione (CV):")
## [1] "Variabile con il massimo coefficiente di variazione (CV):"
print(variability_cv)
## # A tibble: 1 × 2
##   Variabile CV       
##   <chr>     <chr>    
## 1 volume_CV 0,5370536
Variabile CV max
Volume ($) 0.53

Massima variabilità relativa (CV - Coefficiente di Variazione):

  • Variabile: volume

  • Valore del CV: 0.537 (indica che volume ha una variabilità relativa alta rispetto alla media).

Calcolo della skewness per tutte le variabili numeriche

# Calcolo della skewness per le variabili numeriche
skewness_vals <- data %>%
  select(sales, volume, median_price, listings, months_inventory) %>%
  summarise_all(e1071::skewness, na.rm = TRUE) %>%
  pivot_longer(cols = everything(), names_to = "Variabile", values_to = "Skewness") %>%
  mutate(
    Skewness = round(Skewness, 2)  # Arrotonda a 2 cifre decimali
  )

# Stampa dei risultati
print("Skewness delle variabili numeriche rilevanti:")
## [1] "Skewness delle variabili numeriche rilevanti:"
print(skewness_vals)
## # A tibble: 5 × 2
##   Variabile        Skewness
##   <chr>               <dbl>
## 1 sales                0.71
## 2 volume               0.88
## 3 median_price        -0.36
## 4 listings             0.65
## 5 months_inventory     0.04
Variabile Skewness
sales 0.71
volume 0.88
median_price ($) -0.36
listings 0.65
months_inventory 0.04
  • sales (0.714): Distribuzione leggermente asimmetrica a destra, con una coda più lunga verso valori alti.

  • volume (0.879): Distribuzione con maggiore asimmetria positiva rispetto a sales, indicante la presenza di valori elevati che spostano la distribuzione.

  • median_price (-0.362): Leggera asimmetria a sinistra, suggerendo la presenza di valori più concentrati verso la fascia alta dei prezzi.

  • listings (0.645): Moderata asimmetria positiva, con una coda a destra più lunga.

  • months_inventory (0.0407): Praticamente simmetrica.

Identificazione della Variabile con Maggiore Asimmetria

# Identificazione della variabile con la skewness maggiore
most_asymmetric <- skewness_vals %>%
  arrange(desc(abs(Skewness))) %>%
  slice(1)

# Stampa della variabile con maggiore asimmetria
print("Variabile con la distribuzione più asimmetrica (skewness):")
## [1] "Variabile con la distribuzione più asimmetrica (skewness):"
print(most_asymmetric)
## # A tibble: 1 × 2
##   Variabile Skewness
##   <chr>        <dbl>
## 1 volume        0.88
Variabile Skewness
volume 0.88

La variabile volume ha la skewness più elevata (0.88), indicando una distribuzione asimmetrica positiva. Questo suggerisce che una parte significativa dei valori è concentrata verso l’estremo inferiore, con una coda lunga verso l’estremo superiore.

Creazione di Classi per una Variabile Quantitativa

Creazione di classi per ‘median_price’ utilizzando 5 classi

# Creazione di classi per median_price utilizzando 5 intervalli equidistanti
breaks <- seq(
  min(data$median_price, na.rm = TRUE),
  max(data$median_price, na.rm = TRUE),
  length.out = 6
)

data <- data %>%
  mutate(price_class = cut(median_price, breaks = breaks, include.lowest = TRUE))

# Calcolo della distribuzione di frequenza per le classi
price_class_freq <- table(data$price_class)

# Stampa della distribuzione di frequenza
print("Distribuzione di frequenza delle classi di prezzo mediano:")
## [1] "Distribuzione di frequenza delle classi di prezzo mediano:"
print(price_class_freq)
## 
##  [7.38e+04,9.5e+04]  (9.5e+04,1.16e+05] (1.16e+05,1.38e+05] (1.38e+05,1.59e+05] 
##                  18                  40                  73                  84 
##  (1.59e+05,1.8e+05] 
##                  25

Grafico a Barre delle Classi di Prezzo Mediano

library(ggplot2)
library(scales)

# Creazione del grafico
plot2 <- ggplot(data, aes(x = price_class)) +
  geom_bar(fill = "darkorange", color = "black") +
  labs(
    title = "Distribuzione delle Classi di Prezzo Mediano",
    x = "Classe di Prezzo",
    y = "Frequenza"
  ) +
  scale_x_discrete(labels = function(x) {
    # Formattazione dei limiti delle classi per renderli leggibili
    gsub("\\(|\\)|\\[|\\]", "", x) %>%
      gsub(",", " - ", .) %>%
      strsplit(split = " - ") %>%
      lapply(function(y) paste0(format(as.numeric(y), big.mark = ".", decimal.mark = ","), collapse = " - ")) %>%
      unlist()
  }) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Rotazione delle etichette per leggibilità

# Visualizzazione del grafico
print(plot2)

Il grafico rappresenta la distribuzione delle classi di prezzo mediano suddivise in 5 intervalli equidistanti. Analizzando il grafico:

  1. Range di prezzo:

    • Le classi vanno da 73.800 a 180.000 dollari, con intervalli ben definiti.

    • Ogni intervallo rappresenta un range uniforme calcolato tra il minimo e il massimo dei prezzi mediani.

  2. Distribuzione delle frequenze:

    • La classe 138.000 - 159.000 ha la frequenza più alta, suggerendo che la maggior parte delle vendite si concentra in questa fascia di prezzo.

    • La classe più bassa 73.800 - 95.000 ha la frequenza minore, indicando che immobili con prezzi così bassi sono rari.

  3. Uniformità della distribuzione:

    • Sebbene gli intervalli siano equidistanti, la distribuzione delle frequenze non è uniforme. Ciò evidenzia una concentrazione significativa in determinati range di prezzo.
  4. Osservazioni generali:

    • Il grafico evidenzia una tendenza a concentrare i prezzi mediani nella fascia medio-alta del range (tra 116.000 e 159.000 dollari).

Calcolo dell’Indice di Gini

Calcolo dell’Indice di Gini per ‘median_price’

# Funzione per calcolare l'indice di Gini normalizzato
gini.index <- function(x) {
  ni <- table(x)             # Frequenze assolute
  fi <- ni / length(x)       # Frequenze relative
  fi2 <- fi^2                # Quadrato delle frequenze relative
  J <- length(table(x))      # Numero di modalità

  gini <- 1 - sum(fi2)       # Calcolo dell'indice di Gini
  gini.normalizzato <- gini / ((J - 1) / J)  # Normalizzazione
  return(gini.normalizzato)
}

# Applicazione alla variabile median_price (utilizzando le classi create)
gini_median_price <- gini.index(data$price_class)

# Stampa del risultato
print(paste("Indice di Gini normalizzato per 'median_price':", round(gini_median_price, 2)))
## [1] "Indice di Gini normalizzato per 'median_price': 0.93"

L’indice di Gini normalizzato calcolato per la variabile median_price è 0.93, indicando un’elevata eterogeneità nella distribuzione dei prezzi mediani. Questo significa che i prezzi mediani degli immobili sono distribuiti in modo relativamente uniforme tra le classi definite, senza una concentrazione marcata in una sola classe.

Un valore così alto suggerisce che il mercato immobiliare analizzato presenta una significativa varietà nei prezzi mediani, riflettendo potenzialmente la diversità delle caratteristiche degli immobili o le dinamiche di mercato tra diverse località o periodi temporali.

Calcolo delle Probabilità

Probabilità della città “Beaumont”

# Probabilità della città “Beaumont”
prob_beaumont <- mean(data$city == "Beaumont", na.rm = TRUE)
print(paste("Probabilità di Beaumont:", round(prob_beaumont, 4)))
## [1] "Probabilità di Beaumont: 0.25"
Evento Probabilità
Città: Beaumont 0.2500

Probabilità della città “Beaumont”:
La probabilità calcolata rappresenta la proporzione di righe nel dataset associate alla città di Beaumont. Un valore di 0.25 indica che il 25% delle osservazioni appartengono a questa città.

Probabilità del mese di luglio

# Probabilità del mese di luglio
prob_luglio <- mean(data$month == 7, na.rm = TRUE)
print(paste("Probabilità di Luglio:", round(prob_luglio, 4)))
## [1] "Probabilità di Luglio: 0.0833"
Evento Probabilità
Mese: Luglio 0.08

Probabilità del mese di luglio:
La probabilità rappresenta la proporzione di righe nel dataset che si riferiscono al mese di luglio, indipendentemente dall’anno. Un valore di 0.0833 indica che l’8.33% delle righe corrisponde a questo mese.

Probabilità di dicembre 2012

# Probabilità di dicembre 2012
prob_dicembre_2012 <- mean(data$year == 2012 & data$month == 12, na.rm = TRUE)
print(paste("Probabilità di dicembre 2012:", round(prob_dicembre_2012, 4)))
## [1] "Probabilità di dicembre 2012: 0.0167"
Evento Probabilità
Mese: Dicembre 2012 0.01

Probabilità di dicembre 2012:
Questa probabilità è calcolata considerando le righe in cui l’anno è il 2012 e il mese è dicembre. Un valore di 0.0167 indica che solo l’1.67% delle righe del dataset soddisfa entrambe le condizioni.

Creazione di Nuove Variabili

Creazione della colonna che calcola il prezzo medio degli immobili

library(ggplot2)

# Creazione della colonna che calcola il prezzo medio degli immobili
data <- data %>%
  mutate(prezzo_medio = volume / sales)

# Verifica della colonna creata
print("Esempio di Prezzo Medio calcolato:")
## [1] "Esempio di Prezzo Medio calcolato:"
print(head(data$prezzo_medio))
## [1] 0.1706265 0.1637963 0.1576978 0.1340950 0.1427376 0.1440159
#calcolo statistiche del prezzo medio
summary(data$prezzo_medio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.09701 0.13294 0.15659 0.15432 0.17392 0.21323
# Creazione dell'istogramma
plot_prezzo_medio <- ggplot(data, aes(x = prezzo_medio)) +
  geom_histogram(
    binwidth = 0.01,  # valore in base alla granularità scelta
    fill = "steelblue",
    color = "black"
  ) +
  labs(
    title = "Distribuzione del Prezzo Medio degli Immobili (milioni $)",
    x = "Prezzo Medio ($)",
    y = "Frequenza"
  ) +
  theme_minimal()

# Visualizzazione del grafico
print(plot_prezzo_medio)

1. Distribuzione del Prezzo Medio (Istogramma)

L’istogramma mostra una distribuzione relativamente simmetrica, con una concentrazione di valori nella fascia tra 0.15 e 0.17 milioni di dollari. La distribuzione suggerisce che i prezzi medi degli immobili sono raggruppati intorno a un valore centrale, senza evidenti picchi o outlier estremi.

2. Statistiche Descrittive

  • Minimo: 0.0970 milioni di dollari – il prezzo medio più basso osservato.

  • Primo Quartile (Q1): 0.1329 milioni di dollari – il 25% dei prezzi medi è inferiore a questo valore.

  • Mediana: 0.1566 milioni di dollari – metà dei prezzi medi si trova al di sotto di questo valore.

  • Media: 0.1543 milioni di dollari – rappresenta il valore medio dell’intera distribuzione.

  • Terzo Quartile (Q3): 0.1739 milioni di dollari – il 75% dei prezzi medi è inferiore a questo valore.

  • Massimo: 0.2132 milioni di dollari – il prezzo medio più alto registrato.

3. Interpretazione

  • Simmetria della Distribuzione: La vicinanza tra media (0.1543 milioni di dollari) e mediana (0.1566 milioni di dollari) conferma una distribuzione simmetrica, come evidenziato dall’istogramma.

  • Variabilità Moderata: Il range tra il minimo e il massimo (0.2132 - 0.0970 = 0.1162 milioni di dollari) evidenzia una variabilità moderata nei prezzi medi degli immobili.

  • Focalizzazione dei Prezzi: La maggior parte dei valori è concentrata intorno a 0.15 milioni di dollari, riflettendo una tendenza generale dei prezzi medi a essere uniformemente distribuiti, senza significative deviazioni.

Creazione di una colonna che misuri l’efficacia degli annunci Efficacia = vendite / annunci

# Creazione della colonna per l'efficacia degli annunci (vendite / annunci attivi)
data <- data %>%
  mutate(efficacia_annunci = sales / listings)

# Gestione dei valori Inf o NaN
data$efficacia_annunci[is.infinite(data$efficacia_annunci)] <- NA
data$efficacia_annunci[is.nan(data$efficacia_annunci)] <- NA

La colonna efficacia_annunci è stata calcolata dividendo il numero di vendite (sales) per il numero di annunci attivi (listings). Questo rapporto rappresenta la percentuale di annunci che hanno portato a una vendita, fornendo un’indicazione di quanto efficacemente gli annunci siano stati convertiti in vendite. Eventuali valori infiniti (derivanti da divisioni con zero) o non numerici (NaN) sono stati gestiti e sostituiti con valori mancanti (NA) per evitare distorsioni nell’analisi

Calcolo delle Statistiche Descrittive

# Riassunto delle statistiche per l'efficacia degli annunci
summary_efficacia <- summary(data$efficacia_annunci)
print("Summary dell'efficacia degli annunci:")
## [1] "Summary dell'efficacia degli annunci:"
print(summary_efficacia)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.05014 0.08980 0.10963 0.11874 0.13492 0.38713
Statistica Valore
Minimo 0.05
1° Quartile 0.08
Mediana 0.10
Media 0.11
3° Quartile 0.13
Massimo 0.38

Le statistiche descrittive della colonna efficacia_annunci sono state calcolate per identificare i valori principali:

  • Il valore minimo di efficacia degli annunci è 0.05, indicando che solo il 5% degli annunci è stato convertito in vendite in alcuni casi.

  • Il valore massimo è 0.38, suggerendo che in alcuni casi il 38% degli annunci ha portato a una vendita.

  • La mediana è 0.10, il che implica che il 50% degli annunci ha un’efficacia di almeno il 10%.

  • Il primo e il terzo quartile (0.08 e 0.13) mostrano che la maggior parte dei dati è compresa in questo intervallo.

Visualizzazione della Distribuzione dell’Efficacia degli Annunci

library(ggplot2)

plot_efficacia <- ggplot(data, aes(x = efficacia_annunci)) +
  geom_histogram(
    binwidth = 0.03,  # Scelta ottimale per rappresentare la distribuzione
    fill = "steelblue",
    color = "black"
  ) +
  labs(
    title = "Distribuzione dell'Efficacia degli Annunci di Vendita",
    x = "Efficacia degli Annunci (Vendite per Annuncio)",
    y = "Frequenza"
  ) +
  theme_minimal()

# Visualizzazione del grafico
print(plot_efficacia)

l grafico mostra una distribuzione asimmetrica positiva, con la maggior parte degli annunci che hanno un’efficacia compresa tra 0.1 e 0.2, rappresentando la fascia più frequente di conversione degli annunci in vendite. I valori superiori a 0.2 diventano progressivamente meno frequenti, con una coda che si estende fino a circa 0.4, evidenziando che solo pochi annunci raggiungono un’efficacia elevata. Questa distribuzione suggerisce che, in generale, l’efficacia degli annunci nel dataset tende ad essere moderata, con un numero limitato di casi di alta efficacia. La presenza di questa asimmetria positiva indica un mercato immobiliare in cui l’efficacia massima è rara e concentrata in un numero limitato di annunci.

Analisi Statistiche Condizionate

Analisi per Città

# Analisi per Città
summary_city <- data %>%
  group_by(city) %>%
  summarise(
    mean_sales = round(mean(sales, na.rm = TRUE), 2),
    sd_sales = round(sd(sales, na.rm = TRUE), 2),
    mean_median_price = round(mean(median_price, na.rm = TRUE), 2),
    sd_median_price = round(sd(median_price, na.rm = TRUE), 2),
    mean_efficacia_annunci = round(mean(efficacia_annunci, na.rm = TRUE), 2),
    sd_efficacia_annunci = round(sd(efficacia_annunci, na.rm = TRUE), 2)
  )

print("Summary per città:")
## [1] "Summary per città:"
print(summary_city)
## # A tibble: 4 × 7
##   city                  mean_sales sd_sales mean_median_price sd_median_price
##   <chr>                      <dbl>    <dbl>             <dbl>           <dbl>
## 1 Beaumont                    177.     41.5           129988.          10105.
## 2 Bryan-College Station       206.     85.0           157488.           8852.
## 3 Tyler                       270.     62.0           141442.           9337.
## 4 Wichita Falls               116.     22.2           101743.          11320.
## # ℹ 2 more variables: mean_efficacia_annunci <dbl>, sd_efficacia_annunci <dbl>
# Grafico: Vendite Medie per Città (orientamento orizzontale)
plot_city <- ggplot(summary_city, aes(x = reorder(city, mean_sales), y = mean_sales)) +
  geom_bar(stat = "identity", fill = "skyblue", color = "black") +
  labs(
    title = "Vendite Medie per Città",
    x = "Città",
    y = "Media Vendite"
  ) +
  coord_flip() +
  theme_minimal()

print(plot_city)

Città Media Vendite Dev. Std. Vendite Media Prezzo Mediano Media Efficacia Annunci Dev. Std. Efficacia Annunci
Beaumont 177.0 41.5 129,988 10,105 0.10
Bryan-College Station 206.0 85.0 157,488 8,852 0.14
Tyler 270.0 62.0 141,442 9,337 0.09
Wichita Falls 116.0 22.2 101,743 11,320 0.12

Statistiche:

  • La città con la media più alta di vendite è Tyler (270.0), seguita da Bryan-College Station (206.0).

  • Le deviazioni standard sono relativamente alte per Bryan-College Station (85.0) e Tyler (62.0), suggerendo una maggiore variabilità nelle vendite rispetto a Wichita Falls e Beaumont.

  • Per quanto riguarda i prezzi medi, Bryan-College Station mostra il valore più alto (157,488), mentre Wichita Falls ha il più basso (101,743).

  • L’efficacia degli annunci è più alta a Bryan-College Station (media: 0.14), mentre Tyler ha l’efficacia più bassa (media: 0.09).

Grafico:

  • Il grafico mostra chiaramente che Tyler ha il numero medio più alto di vendite, mentre Wichita Falls si colloca all’estremo opposto.

Analisi per Anno

# Analisi per Anno
summary_year <- data %>%
  group_by(year) %>%
  summarise(
    mean_sales = round(mean(sales, na.rm = TRUE), 2),
    sd_sales = round(sd(sales, na.rm = TRUE), 2),
    mean_median_price = round(mean(median_price, na.rm = TRUE), 2),
    sd_median_price = round(sd(median_price, na.rm = TRUE), 2),
    mean_efficacia_annunci = round(mean(efficacia_annunci, na.rm = TRUE), 2),
    sd_efficacia_annunci = round(sd(efficacia_annunci, na.rm = TRUE), 2)
  )

print("Summary per anno:")
## [1] "Summary per anno:"
print(summary_year)
## # A tibble: 5 × 7
##    year mean_sales sd_sales mean_median_price sd_median_price
##   <dbl>      <dbl>    <dbl>             <dbl>           <dbl>
## 1  2010       169.     60.5           130192.          21822.
## 2  2011       164.     63.9           127854.          21318.
## 3  2012       186.     70.9           130077.          21432.
## 4  2013       212.     84             135723.          21708.
## 5  2014       231.     95.5           139481.          25625.
## # ℹ 2 more variables: mean_efficacia_annunci <dbl>, sd_efficacia_annunci <dbl>
# Grafico: Prezzo Mediano per Anno 
plot_year <- ggplot(summary_year, aes(x = as.factor(year), y = mean_median_price)) +
  geom_bar(stat = "identity", fill = "steelblue", color = "black") +
  labs(
    title = "Prezzo Mediano per Anno",
    x = "Anno",
    y = "Prezzo Mediano ($)"
  ) +
  scale_y_continuous(
    limits = c(0, 150000),  # Impostazione limite dell'asse Y
    labels = scales::comma
  ) +
  theme_minimal()

print(plot_year)

Anno Media Vendite Dev. Std. Vendite Media Prezzo Mediano Media Efficacia Annunci Dev. Std. Efficacia Annunci
2010 169.0 60.5 130,192 21,822 0.09
2011 164.0 63.9 127,854 21,318 0.09
2012 186.0 70.9 130,077 21,432 0.11
2013 212.0 84.0 135,723 21,708 0.13
2014 231.0 95.5 139,481 25,625 0.15

Statistiche:

  • Il numero medio di vendite aumenta progressivamente dal 2010 (169.0) al 2014 (231.0), indicando una crescita costante del mercato.

  • Il prezzo mediano degli immobili segue una tendenza simile, passando da $130,192 nel 2010 a $139,481 nel 2014.

  • L’efficacia degli annunci aumenta gradualmente, con il valore più alto registrato nel 2014 (0.15), suggerendo un miglioramento delle strategie di vendita.

Grafico:

  • Il grafico evidenzia la crescita costante del prezzo mediano per anno. L’impostazione del limite massimo dell’asse Y a $150,000 migliora la leggibilità, poiché include tutti i valori senza spazio inutile.

Analisi per Mese

# Analisi per Mese
summary_month <- data %>%
  group_by(month) %>%
  summarise(
    mean_sales = round(mean(sales, na.rm = TRUE), 2),
    sd_sales = round(sd(sales, na.rm = TRUE), 2),
    mean_median_price = round(mean(median_price, na.rm = TRUE), 2),
    sd_median_price = round(sd(median_price, na.rm = TRUE), 2),
    mean_efficacia_annunci = round(mean(efficacia_annunci, na.rm = TRUE), 2),
    sd_efficacia_annunci = round(sd(efficacia_annunci, na.rm = TRUE), 2)
  )

print("Summary per mese:")
## [1] "Summary per mese:"
print(summary_month)
## # A tibble: 12 × 7
##    month mean_sales sd_sales mean_median_price sd_median_price
##    <dbl>      <dbl>    <dbl>             <dbl>           <dbl>
##  1     1       127.     43.4            124250          25151.
##  2     2       141.     51.1            130075          22823.
##  3     3       189.     59.2            127415          23442.
##  4     4       212.     65.4            131490          21458.
##  5     5       239.     83.1            134485          18796.
##  6     6       244.     95              137620          19231.
##  7     7       236.     96.3            134750          21945.
##  8     8       231.     79.2            136675          22488.
##  9     9       182.     72.5            134040          24344.
## 10    10       180.     75.0            133480          26358.
## 11    11       157.     55.5            134305          24691.
## 12    12       169.     60.8            133400          22810.
## # ℹ 2 more variables: mean_efficacia_annunci <dbl>, sd_efficacia_annunci <dbl>
# Grafico: Efficacia degli Annunci per Mese
plot_month <- ggplot(summary_month, aes(x = as.factor(month), y = mean_efficacia_annunci)) +
  geom_bar(stat = "identity", fill = "lightgreen", color = "black") +
  labs(
    title = "Efficacia degli Annunci per Mese",
    x = "Mese",
    y = "Media Efficacia"
  ) +
  theme_minimal()

print(plot_month)

Mese Media Vendite Dev. Std. Vendite Media Prezzo Mediano Media Efficacia Annunci Dev. Std. Efficacia Annunci
1 127.0 43.4 124,250 25,151 0.08
2 141.0 51.1 130,075 22,823 0.08
3 189.0 59.2 127,415 23,442 0.11
4 212.0 65.4 131,490 21,458 0.12
5 239.0 83.1 134,485 18,796 0.14
6 244.0 95.0 137,620 19,231 0.14
7 236.0 96.3 134,750 21,945 0.14
8 231.0 79.2 136,675 22,488 0.14
9 182.0 72.5 134,040 24,344 0.11
10 180.0 75.0 133,480 26,358 0.11
11 157.0 55.5 134,305 24,691 0.10
12 169.0 60.7 133,400 22,810 0.11

Statistiche:

  • Le vendite medie sono più alte nei mesi estivi (giugno e luglio), con un massimo di 244.0 a giugno, probabilmente a causa della stagionalità.

  • L’efficacia degli annunci raggiunge il picco tra maggio e agosto (media intorno a 0.14), suggerendo che i mesi estivi siano più propizi per il mercato.

  • La deviazione standard dell’efficacia degli annunci è generalmente bassa, indicando una distribuzione abbastanza uniforme.

Grafico:

  • Il grafico mostra che i mesi estivi sono i più produttivi in termini di efficacia.

  • I valori per gennaio e febbraio sono i più bassi, probabilmente influenzati da una minore attività del mercato durante i mesi invernali.

Boxplot del Volume delle Vendite per Città

plot_box <- ggplot(data, aes(x = city, y = volume)) +
  geom_boxplot(fill = "darkgreen", color = "black", outlier.color = "red") +
  labs(
    title = "Distribuzione del Valore Totale delle Vendite per Città",
    x = "Città",
    y = "Volume delle Vendite (Milioni di $)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

print(plot_box)

Commento: Il grafico mostra la distribuzione del valore totale delle vendite (in milioni di $) per ciascuna città. Le barre verticali rappresentano l’intervallo interquartile (IQR), mentre i pallini rossi identificano eventuali outliers, ossia valori atipici che si discostano significativamente dal resto della distribuzione.

  • Osservazioni principali:

    • Bryan-College Station presenta una distribuzione piuttosto ampia rispetto alle altre città, suggerendo maggiore variabilità nei valori delle vendite totali.

    • Tyler ha un outlier particolarmente alto (pallino rosso), indicando che in alcuni casi si sono registrati valori di vendite molto elevati rispetto alla media.

    • Wichita Falls ha la distribuzione più concentrata, con un range molto stretto di valori.

    • Beaumont mostra una distribuzione compatta, con valori generalmente più bassi rispetto a Bryan-College Station e Tyler.

Boxplot del Prezzo Mediano per Città

# Boxplot del Prezzo Mediano per Città
plot8 <- ggplot(data, aes(x = reorder(city, median_price, FUN = median), y = median_price)) +
  geom_boxplot(fill = "purple", color = "black", outlier.color = "red", outlier.shape = 16) +
  labs(
    title = "Distribuzione del Prezzo Mediano per Città",
    x = "Città",
    y = "Prezzo Mediano ($)"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),  # Rotazione per miglior leggibilità
    plot.title = element_text(size = 14, face = "bold")  # Miglioramento del titolo
  )

# Visualizzazione del grafico
print(plot8)

Commento generale: Il grafico rappresenta la distribuzione del prezzo mediano degli immobili per ciascuna città. Anche in questo caso, i pallini rossi indicano la presenza di outliers.

  • Osservazioni principali:

    • Bryan-College Station registra il prezzo mediano più alto, con un outlier che si colloca al di sopra del valore massimo .

    • Tyler ha una distribuzione simile a Bryan-College Station, ma con valori leggermente più bassi.

    • Beaumont mostra una distribuzione più compatta, con prezzi medi più contenuti rispetto a Bryan-College Station e Tyler (presenza di outlier).

    • Wichita Falls ha il prezzo mediano più basso tra tutte le città, suggerendo che in questa città gli immobili tendono a essere più economici (presenza di outlier).

Vendite Medie per anno

# Grafico: Vendite Medie per Anno
plot_mean_sales <- ggplot(summary_year, aes(x = year, y = mean_sales)) +
  geom_line(color = "blue", size = 1.5) +  # Linea blu per il trend
  geom_point(color = "red", size = 3) +   # Punti rossi per evidenziare le medie
  labs(
    title = "Vendite Medie per Anno",
    x = "Anno",
    y = "Vendite Medie"
  ) +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# Visualizzazione del grafico
print(plot_mean_sales)

Osservazioni:

  • Il grafico evidenzia una tendenza generale di crescita delle vendite medie annuali nel periodo dal 2010 al 2014.

  • Dopo un leggero calo tra il 2010 e il 2011, si nota una ripresa costante dal 2012 fino a raggiungere il valore massimo nel 2014.

  • Gli incrementi maggiori si verificano tra il 2012 e il 2014, suggerendo un’accelerazione nel mercato immobiliare in questi anni.

Totale Vendite per Mese e Città (Dodge)

sales_month_city <- data %>%
  group_by(month, city) %>%
  summarise(total_sales = sum(sales, na.rm = TRUE)) %>%
  ungroup()
## `summarise()` has grouped output by 'month'. You can override using the
## `.groups` argument.
plot_dodge <- ggplot(sales_month_city, aes(x = factor(month), y = total_sales, fill = city)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Totale Vendite per Mese e Città",
    x = "Mese",
    y = "Totale Vendite",
    fill = "Città"
  ) +
  theme_minimal()

print(plot_dodge)

  • Osservazioni:

    • Tyler emerge come la città con il volume maggiore di vendite nei mesi di picco, seguita da Bryan-College Station.

    • Il mese di giugno il totale delle vendite più alto nelle città Tyler e Bryan-College Station. Per le altre due,invece, risulta essere il mese di Agosto.

    • Wichita Falls mostra il volume di vendite più basso rispetto alle altre città, mantenendo un trend costante durante l’anno.

Totale Vendite per Mese e Città (Normalizzato)

plot_fill <- ggplot(sales_month_city, aes(x = factor(month), y = total_sales, fill = city)) +
  geom_bar(stat = "identity", position = "fill") +
  labs(
    title = "Totale Vendite per Mese e Città (Normalizzato)",
    x = "Mese",
    y = "Proporzione Vendite",
    fill = "Città"
  ) +
  scale_y_continuous(labels = scales::percent_format()) +
  theme_minimal()

print(plot_fill)

  • Osservazioni:

    • La normalizzazione consente di confrontare le proporzioni relative delle vendite tra le città in ogni mese.

    • Tyler domina in termini di proporzione di vendite per quasi tutti i mesi, mentre Wichita Falls rappresenta una percentuale minore.

    • Bryan-College Station mantiene una proporzione relativamente costante nel corso dell’anno.

  • Considerazioni:

    • La proporzione maggiore di vendite per Tyler può indicare un mercato con una domanda più alta.

    • Questo grafico aiuta a osservare la distribuzione relativa delle vendite tra le città, indipendentemente dal totale assoluto.

Totale Vendite per Mese e Città per Anno

x11()

# Preparazione dei dati
sales_month_city_year <- data %>%
  group_by(year, month, city) %>%
  summarise(total_sales = sum(sales, na.rm = TRUE), .groups = "drop")  # Rimuove l'avviso

# Creazione del grafico
plot_facet <- ggplot(sales_month_city_year, aes(x = factor(month), y = total_sales, fill = city)) +
  geom_bar(stat = "identity", position = "dodge") +
  facet_wrap(~ year, ncol = 1) +  # Faceting per anno, con disposizione verticale
  labs(
    title = "Totale Vendite per Mese e Città per Anno",
    x = "Mese",
    y = "Totale Vendite",
    fill = "Città"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),  # Migliora la leggibilità delle etichette
    strip.text = element_text(size = 12),  # Incrementa la dimensione del testo per le etichette del faceting
    panel.spacing = unit(1.5, "lines")  # Aumenta lo spazio tra i pannelli
  )

# Visualizzazione del grafico
print(plot_facet)

  • Osservazioni:

    • Il grafico conferma il trend di crescita delle vendite durante i mesi estivi (giugno e luglio) per la maggior parte degli anni.

    • L’anno 2010 sembra deviare da questo pattern, mostrando un andamento più uniforme senza un picco evidente nei mesi estivi.

    • Tyler continua a essere la città dominante in termini di vendite in tutti gli anni, con Wichita Falls che rimane la città con i volumi più bassi.

Andamento delle Vendite Temporali per Città

sales_time_city <- data %>%
  mutate(date = as.Date(paste(year, month, "01", sep = "-"))) %>%
  group_by(date, city) %>%
  summarise(total_sales = sum(sales, na.rm = TRUE)) %>%
  ungroup()
## `summarise()` has grouped output by 'date'. You can override using the
## `.groups` argument.
plot_line <- ggplot(sales_time_city, aes(x = date, y = total_sales, color = city)) +
  geom_line(size = 1) +
  labs(
    title = "Andamento delle Vendite nel Tempo per Città",
    x = "Data",
    y = "Vendite Totali",
    color = "Città"
  ) +
  theme_minimal()

print(plot_line)

Osservazioni:
Questo grafico mostra l’andamento delle vendite totali nel tempo per ciascuna città. È evidente che le città hanno pattern di vendita distinti. Tyler ha il volume di vendite più alto in quasi tutti gli anni. Bryan-College Station segue un andamento simile ma con valori inferiori. Beaumont e Wichita Falls mostrano volumi di vendita più contenuti, con Wichita Falls che si distingue per un andamento più irregolare e volumi significativamente più bassi rispetto alle altre città.

Totale Vendite per Città

sales_city <- data %>%
  group_by(city) %>%
  summarise(total_sales = sum(sales, na.rm = TRUE)) %>%
  ungroup()

plot_total_city <- ggplot(sales_city, aes(x = reorder(city, total_sales), y = total_sales)) +
  geom_bar(stat = "identity", fill = "gold") +
  labs(
    title = "Totale Vendite per Città",
    x = "Città",
    y = "Totale Vendite"
  ) +
  coord_flip() +
  theme_minimal()

print(plot_total_city)

Commento:
In questo grafico a barre orizzontali, possiamo osservare chiaramente il totale delle vendite per ciascuna città. Tyler domina il totale con oltre 15.000 vendite, seguita da Bryan-College Station con circa 13.000 vendite. Beaumont e Wichita Falls presentano volumi inferiori, rispettivamente con circa 10.000 e 7.000 vendite. Questo conferma l’importanza di Tyler come centro dominante per il mercato immobiliare in quest’area, probabilmente per fattori come popolazione, economia locale o attrattiva.

Conclusioni

L’analisi del mercato immobiliare del Texas tra il 2010 e il 2014 ha rivelato una serie di trend e caratteristiche fondamentali che consentono una comprensione approfondita delle dinamiche di vendita. Attraverso un dataset equilibrato di 240 osservazioni, distribuite equamente tra le città di Beaumont, Bryan-College Station, Tyler e Wichita Falls, è stato possibile esplorare le principali variabili del mercato e individuare le differenze geografiche, temporali e stagionali.

Crescita del mercato e tendenze temporali

Il mercato immobiliare texano ha registrato una crescita costante durante il periodo analizzato. Le vendite medie annuali sono aumentate da 169 nel 2010 a 231 nel 2014, con un miglioramento continuo dell’efficacia degli annunci di vendita, che è passata dal 9% al 15%. Questo suggerisce un mercato in espansione, supportato probabilmente da strategie di marketing più efficaci e da una domanda crescente.

La stagionalità è un elemento chiave del mercato: i mesi estivi (da maggio ad agosto) si confermano come il periodo più favorevole, con picchi di vendite e un’efficacia degli annunci superiore al 14%. Al contrario, i mesi invernali registrano vendite medie più basse e un’efficacia che scende sotto il 10%. Questo pattern stagionale è visibile sia nei dati aggregati che nei grafici, confermando l’impatto delle condizioni stagionali sulle transazioni immobiliari.

Differenze tra città

L’analisi geografica ha evidenziato significative differenze tra le città:

  • Tyler si distingue per il volume di vendite più alto, con oltre 15.000 transazioni totali, ma presenta un’efficacia degli annunci relativamente bassa (9,35%). Questo potrebbe indicare un mercato molto competitivo o una saturazione dell’offerta.

  • Bryan-College Station emerge come il mercato più efficiente, con l’efficacia degli annunci più alta (14,7%) e il prezzo mediano degli immobili più elevato ($157.488). Questo suggerisce un mercato caratterizzato da immobili di maggior valore e da una domanda stabile.

  • Wichita Falls, pur registrando il numero di vendite più basso, mostra un’efficacia degli annunci sorprendentemente alta (12,8%), indicando un mercato più piccolo ma ben bilanciato.

  • Beaumont si colloca in una posizione intermedia, con volumi di vendita e prezzi mediani inferiori rispetto a Bryan-College Station e Tyler.

Prezzi e variabilità

Il prezzo mediano degli immobili è la variabile con la maggiore variabilità assoluta, con una varianza di oltre $513 milioni. Questo riflette la significativa eterogeneità del mercato, influenzata da differenze economiche regionali e dalle caratteristiche specifiche degli immobili.

L’asimmetria positiva nella distribuzione del volume delle vendite (skewness di 0,88) evidenzia che, mentre la maggior parte dei mesi registra volumi moderati, esistono periodi con picchi elevati, spesso legati alla stagionalità o a condizioni di mercato favorevoli.

La creazione di classi di prezzo mediano ha permesso di osservare che la maggior parte delle vendite si concentra nella fascia medio-alta ($138.000 - $159.000), confermata da un indice di Gini di 0,0968, che indica una distribuzione abbastanza equa dei prezzi.

Efficienza del mercato

L’introduzione della variabile “efficacia degli annunci” (rapporto tra vendite e annunci attivi) ha fornito una nuova prospettiva sul mercato. L’efficacia media è risultata essere intorno al 12%, con una distribuzione asimmetrica positiva. I picchi di efficacia (oltre il 30%) suggeriscono che esistono condizioni specifiche in cui il mercato immobiliare è particolarmente dinamico, probabilmente legate a una forte domanda o a strategie di marketing ben mirate.

Visualizzazioni e interpretazioni

Le visualizzazioni avanzate hanno supportato le analisi, rendendo più chiari i trend e le relazioni tra le variabili:

  • Il grafico delle vendite medie per anno ha evidenziato la crescita costante del mercato.

  • Il boxplot del volume delle vendite per città ha mostrato la presenza di outlier significativi, specialmente a Tyler e Bryan-College Station.

  • Il grafico dell’andamento temporale delle vendite per città ha confermato la forza del mercato di Tyler e Bryan-College Station, con Wichita Falls che rimane la città con i volumi più bassi.

Considerazioni finali

L’analisi ha messo in evidenza un mercato immobiliare in crescita, con differenze geografiche significative e una chiara stagionalità. Le città , come Tyler e Bryan-College Station, dominano per volume di vendite, mentre le città più piccole mostrano efficienza nella conversione degli annunci. La stagionalità estiva rappresenta una finestra cruciale per il mercato, suggerendo opportunità strategiche per le agenzie immobiliari.

Questi risultati migliorano la comprensione delle dinamiche del mercato immobiliare texano e offrono anche indicazioni pratiche per strategie di vendita e marketing più mirate.