1. Analisi Esplorativa dei Dati

Obiettivo: Esplorare e comprendere la struttura del dataset, verificando la corretta importazione dei dati e identificando le variabili disponibili per l’analisi.

In questa fase iniziale, è stato importato ed esplorato il dataset relativo al mercato immobiliare del Texas. Il dataset contiene 240 osservazioni e 8 variabili, che includono dati sia categorici che numerici. Questa esplorazione preliminare ha confermato la presenza di dati coerenti e ha preparato il terreno per le successive analisi.

dati <- read.csv("realestate_texas.csv")
dim(dati)
## [1] 240   8
names(dati)
## [1] "city"             "year"             "month"            "sales"           
## [5] "volume"           "median_price"     "listings"         "months_inventory"
head(dati)
##       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

Nel dataset in esame, le variabili possono essere classificate come quantitative o qualitative, a seconda della loro natura e del modo in cui possono essere misurate o contate. Di seguito, è riportata una tabella che riassume il nome di ciascuna variabile e il suo tipo:

Nome Variabile Tipo di Variabile
city Qualitativa Nominale
year Quantitativa Discreta
month Quantitativa Discreta
sales Quantitativa Discreta
volume Quantitativa Continua
median_price Quantitativa Continua
listings Quantitativa Discreta
months_inventory Quantitativa Continua

2. Analisi Descrittiva delle Variabili Numeriche

Obiettivo: Calcolare le statistiche descrittive per comprendere la distribuzione delle variabili numeriche principali.

library(moments)

risultati <- sapply(dati[, c("sales", "volume", "median_price", "listings", "months_inventory")], function(x){
  c(Mean = round(mean(x), 2),
    Median = round(median(x), 2),
    SD = round(sd(x), 2),
    IQR = round(IQR(x), 2),
    percentil = round(quantile(x), 2),
    Skewness = round(skewness(x), 2),
    Kurtosis = round(kurtosis(x) - 3, 2))
})

risultati
##                 sales volume median_price listings months_inventory
## Mean           192.29  31.01    132665.42  1738.02             9.19
## Median         175.50  27.06    134500.00  1618.50             8.95
## SD              79.65  16.65     22662.15   752.71             2.30
## IQR            120.00  23.23     32750.00  1029.50             3.15
## percentil.0%    79.00   8.17     73800.00   743.00             3.40
## percentil.25%  127.00  17.66    117300.00  1026.50             7.80
## percentil.50%  175.50  27.06    134500.00  1618.50             8.95
## percentil.75%  247.00  40.89    150050.00  2056.00            10.95
## percentil.100% 423.00  83.55    180000.00  3296.00            14.90
## Skewness         0.72   0.88        -0.36     0.65             0.04
## Kurtosis        -0.31   0.18        -0.62    -0.79            -0.17

In questa seconda parte del progetto, ci siamo concentrati sull’analisi descrittiva delle variabili numeriche principali del dataset. Gli indicatori calcolati includono media, mediana, deviazione standard, IQR, percentili, skewness e kurtosis.

Queste misure offrono una panoramica completa della distribuzione dei dati, evidenziando asimmetrie e variabilità.

3. Distribuzione di Frequenza delle Variabili Qualitative

Obiettivo: Analizzare la distribuzione delle variabili qualitative e valutare la rappresentatività delle diverse modalità.

È stata condotta un’analisi delle frequenze assolute e relative per le variabili categoriche city, year, e month. Non sono state inserite le rispettive frequenze cumulate, poiché per le variabili categoriche come queste, che rappresentano città, anni e mesi, l’uso non sarebbe informativo. Le frequenze mostrano semplicemente quante volte ciascuna categoria appare nel dataset, offrendo un quadro utile per comprendere come le osservazioni siano distribuite tra le diverse modalità.

La distribuzione delle frequenze per le variabili city, year, e month mostra che il dataset è ben bilanciato, con ogni categoria che contribuisce in modo uniforme al totale delle osservazioni. Questo equilibrio garantisce che non vi sia una sovrarappresentazione o sottorappresentazione significativa di una particolare città, anno o mese.

attach(dati)
N = dim(dati)[1]

freq_ass <- table(dati$city)
freq_rel <- table(dati$city)/N
distr_freq_city<-as.data.frame(cbind(freq_ass,freq_rel))
distr_freq_city
##                       freq_ass freq_rel
## Beaumont                    60     0.25
## Bryan-College Station       60     0.25
## Tyler                       60     0.25
## Wichita Falls               60     0.25
freq_ass <- table(dati$year)
freq_rel <- table(dati$year)/N
distr_freq_year<-as.data.frame(cbind(freq_ass,freq_rel))
distr_freq_year
##      freq_ass freq_rel
## 2010       48      0.2
## 2011       48      0.2
## 2012       48      0.2
## 2013       48      0.2
## 2014       48      0.2
freq_ass <- table(dati$month)
freq_rel <- table(dati$month)/N
distr_freq_month<-as.data.frame(cbind(freq_ass,freq_rel))
distr_freq_month
##    freq_ass   freq_rel
## 1        20 0.08333333
## 2        20 0.08333333
## 3        20 0.08333333
## 4        20 0.08333333
## 5        20 0.08333333
## 6        20 0.08333333
## 7        20 0.08333333
## 8        20 0.08333333
## 9        20 0.08333333
## 10       20 0.08333333
## 11       20 0.08333333
## 12       20 0.08333333

4. Analisi della variabilità relativa

Obiettivo: Misurare e confrontare la variabilità relativa delle variabili numeriche attraverso il calcolo del coefficiente di variazione. Individuare la variabile con maggiore variabilità.

cv <- function(x) {
  (sd(x)/mean(x))*100
}

variabilità <- sapply(dati[, c("sales","volume","median_price","listings", "months_inventory")], cv)
print(variabilità)
##            sales           volume     median_price         listings 
##         41.42203         53.70536         17.08218         43.30833 
## months_inventory 
##         25.06031

Abbiamo calcolato il coefficiente di variazione (CV) per confrontare la variabilità relativa delle variabili numeriche. Il coefficiente di variazione è una misura senza unità di misura, questo lo rende particolarmente utile per confrontare variabili con scale diverse, permettendo di valutare la dispersione dei dati in modo proporzionale rispetto alla loro media.

La variabile volume ha mostrato la maggiore variabilità relativa, indicando una distribuzione più dispersa rispetto alla media.

5. Analisi della Asimmetria

Dopo un’analisi preliminare del dataset, è stata calcolata la skewness (asimmetria) per diverse variabili numeriche, tra cui sales, volume, median_price, listings, e months_inventory. Dall’analisi è emerso che la variabile con il valore di skewness più elevato è stata volume, con un valore di 0.8847. Questo valore di skewness positivo indica che la distribuzione della variabile volume presenta un’asimmetria positiva. In altre parole, la coda destra della distribuzione è più lunga di quella sinistra, suggerendo che la maggior parte dei dati è concentrata verso i valori più bassi, mentre alcuni valori più alti allungano la distribuzione verso destra.

library("moments")
sapply(dati[, c("sales", "volume", "median_price", "listings", "months_inventory")], function(x) {
  c(Skewness = skewness(x))
})
##            sales.Skewness           volume.Skewness     median_price.Skewness 
##                0.71810402                0.88474203               -0.36455288 
##         listings.Skewness months_inventory.Skewness 
##                0.64949823                0.04097527

Per visualizzare meglio questa asimmetria, è stato plottato un grafico composto da un istogramma con sovrapposizione di una curva di densità. Nel grafico è stata inoltre tracciata una linea tratteggiata che rappresenta la media della variabile volume, evidenziando ulteriormente la presenza di valori superiori alla media che contribuiscono all’asimmetria positiva. Questo tipo di rappresentazione grafica permette di comprendere intuitivamente la distribuzione della variabile volume, mostrando chiaramente come i dati siano distribuiti e dove si concentri la maggior parte delle osservazioni, facilitando così un’analisi più approfondita dell’asimmetria riscontrata.

library(ggplot2)

mean_volume <- mean(dati$volume)

ggplot(dati, aes(x = volume)) +
  geom_histogram(aes(y = ..density..), bins = 20, fill = "lightblue", color = "black") +
  geom_density(color = "darkblue", size = 1.2) +
  geom_vline(aes(xintercept = mean(volume)), color = "blue", linetype = "dashed", size = 1) +
  labs(title = "Distribuzione della Variabile Volume",
       x = "Volume (milioni di dollari)",
       y = "Densità") +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 16)
  )
## 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.
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

6. Analisi della Variabile Volume Suddivisa in Classi

Obiettivo: Esaminare la distribuzione della variabile volume dopo la suddivisione in classi e confermare l’asimmetria della distribuzione.

num_classi <- 5
classi = cut(dati$volume, breaks = num_classi, include.lowest = TRUE)

ni<-table(classi)
fi<-ni/N
Ni<-cumsum(ni)
Fi<-Ni/N

distr_freq<-as.data.frame(cbind(ni,fi,Ni,Fi))
distr_freq
##             ni         fi  Ni        Fi
## [8.09,23.2] 93 0.38750000  93 0.3875000
## (23.2,38.3] 79 0.32916667 172 0.7166667
## (38.3,53.4] 43 0.17916667 215 0.8958333
## (53.4,68.5] 17 0.07083333 232 0.9666667
## (68.5,83.6]  8 0.03333333 240 1.0000000

La variabile volume è stata suddivisa in 5 intervalli di uguale ampiezza, definiti dai valori minimi e massimi della variabile. Questo ha generato 5 classi, ciascuna rappresentante un intervallo di valori di volume.

La tabella risultante mostra che la maggior parte dei dati è concentrata nelle prime tre classi, con frequenze cumulative relative che aumentano gradualmente fino al 100%.

Inoltre, la distribuzione delle frequenze conferma la presenza di un’asimmetria positiva, evidenziata dalla maggiore concentrazione di osservazioni nelle classi con valori di volume più bassi e dalla coda più lunga verso i valori più elevati. Questo risultato è coerente con l’analisi della skewness precedentemente calcolata.

6.1. Visualizzazione con Grafico a Barre

Obiettivo: Visualizzare la distribuzione delle frequenze delle classi di volume tramite un grafico a barre.

library(ggplot2)

ggplot(data = distr_freq) +
  geom_col(
    aes(x = rownames(distr_freq), y = ni),
    fill = "darkblue"
  ) +
  geom_text(
    aes(x = rownames(distr_freq), y = ni, label = ni),
    vjust = -0.5, 
    color = "black",  
    size = 3.5       
  ) +
  labs(
    x = "Volume in classi",
    y = "Frequenze assolute",
    title = "Grafico a barre"
  ) +
  theme_bw() +
  scale_y_continuous(breaks = seq(0, 120, 10))

Il grafico a barre risultante fornisce una rappresentazione visiva chiara della distribuzione delle frequenze delle classi di volume.

7. Calcolo dell’Indice di Gini per variabile volume suddivisa in classi

Obiettivo: Misurare la disuguaglianza nella distribuzione delle frequenze all’interno delle classi di volume.

gini.index <- function(x){
  ni = table(x)
  fi = ni/length(x)
  fi2 = fi^2
  J = length(table(x))
  
  gini = 1-sum(fi2)
  gini.norm = gini/((J-1)/J)
  
  return(gini.norm)
}

gini.index(classi)
## [1] 0.8790799

In questo passaggio del progetto, è stato calcolato l’indice di Gini normalizzato per la variabile volume, che precedentemente è stata suddivisa in 5 classi. L’obiettivo di questo calcolo è stato quello di misurare il grado di disuguaglianza nella distribuzione delle frequenze all’interno di queste classi.

Un valore elevato dell’indice di Gini normalizzato per le classi di volume indicherebbe che la distribuzione è abbastanza uniforme, mentre un valore basso evidenzierebbe una concentrazione di osservazioni in un numero limitato di classi, rafforzando l’evidenza di una distribuzione asimmetrica.

L’indice di Gini pari a 0.8790 indica che la distribuzione delle osservazioni tra le classi di volume è eterogenea.

8. Indice di Gini della variabile city

Basandoci sulle frequenze assolute calcolate al punto 3, dove ogni città ha lo stesso numero di osservazioni (60), possiamo determinare che l’indice di Gini per la variabile city è pari a 0. Questo valore riflette una distribuzione perfettamente bilanciata, in cui non esiste disuguaglianza tra le categorie. Tutte le città contribuiscono in modo uguale al totale delle osservazioni, indicando una distribuzione equa.

9. Calcolo delle Probabilità per Caratteristiche Specifiche

Obiettivo: Calcolare la probabilità che una riga del dataset appartenga a specifiche categorie, come una città o un periodo temporale.

num_beaumont <- sum(dati$city == "Beaumont")
prob_beaumont <- (num_beaumont / N)
prob_beaumont
## [1] 0.25
num_dicembre_2012 <- sum(dati$month == "12" & dati$year == 2012)
prob_dicembre_2012 <- (num_dicembre_2012 / N)
prob_dicembre_2012
## [1] 0.01666667

Abbiamo calcolato la probabilità che una riga del dataset rappresenti la città di Beaumont o il mese di dicembre 2012. Questi calcoli offrono una visione della rappresentatività di queste categorie nel dataset.

10. Creazione di Nuove Variabili: Prezzo Medio ed Efficacia degli Annunci

Obiettivo: Arricchire il dataset con nuove variabili che forniscano informazioni aggiuntive rispetto a quelle esistenti.

dati$prezzo_medio <- (dati$volume*10^6)/(dati$sales)
dati$efficacia_annunci <- ((dati$sales)/(dati$listings))*100
head(dati)
##       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
##   prezzo_medio efficacia_annunci
## 1     170626.5          5.414220
## 2     163796.3          6.809584
## 3     157697.8         10.775607
## 4     134095.0         11.709602
## 5     142737.6         11.405985
## 6     144015.9         10.482529

Sono state create due nuove variabili: prezzo_medio, calcolato utilizzando volume e sales, e efficacia_annunci, che misura l’efficacia degli annunci di vendita. Queste variabili offrono nuove prospettive per l’analisi del mercato immobiliare:

11. Analisi della Media e Deviazione Standard delle Vendite per Città

Obiettivo: Confrontare le vendite medie e la variabilità delle vendite tra le diverse città.

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
summarise_city_sales <- dati%>%
  group_by(city) %>%
  summarise(mean_sales = mean(sales),
            sd_sales = sd(sales))
summarise_city_sales
## # A tibble: 4 × 3
##   city                  mean_sales sd_sales
##   <chr>                      <dbl>    <dbl>
## 1 Beaumont                    177.     41.5
## 2 Bryan-College Station       206.     85.0
## 3 Tyler                       270.     62.0
## 4 Wichita Falls               116.     22.2

Questo tipo di analisi è fondamentale per comprendere la performance delle vendite in diverse città. La media delle vendite ci fornisce un’indicazione del livello di attività in ciascuna città, mentre la deviazione standard ci aiuta a capire quanto sono stabili o volatili le vendite.

La stessa tipologia di analisi è stata effettuata anche raggruppando per le variabili year e month:

library(dplyr)
summarise_year_sales <- dati%>%
  group_by(year) %>%
  summarise(mean_sales = mean(sales),
            sd_sales = sd(sales))
summarise_year_sales
## # A tibble: 5 × 3
##    year mean_sales sd_sales
##   <int>      <dbl>    <dbl>
## 1  2010       169.     60.5
## 2  2011       164.     63.9
## 3  2012       186.     70.9
## 4  2013       212.     84.0
## 5  2014       231.     95.5
summarise_month_sales <- dati%>%
  group_by(month) %>%
  summarise(mean_sales = mean(sales),
            sd_sales = sd(sales))
summarise_month_sales
## # A tibble: 12 × 3
##    month mean_sales sd_sales
##    <int>      <dbl>    <dbl>
##  1     1       127.     43.4
##  2     2       141.     51.1
##  3     3       189.     59.2
##  4     4       212.     65.4
##  5     5       239.     83.1
##  6     6       244.     95.0
##  7     7       236.     96.3
##  8     8       231.     79.2
##  9     9       182.     72.5
## 10    10       180.     75.0
## 11    11       157.     55.5
## 12    12       169.     60.7

12. Confronto della Distribuzione dei Prezzi Mediani e del Volume delle Vendite

Obiettivo: Visualizzare e confrontare la distribuzione del prezzo mediano e del volume delle vendite per città e anno.

Diversi boxplot sono stati creati per confrontare le distribuzioni del prezzo mediano e del volume delle vendite tra le città e nel tempo. Questi grafici evidenziano differenze significative tra le città e tendenze di crescita del volume nel tempo.

Il primo grafico confronta il prezzo mediano delle case tra le città.

library(ggplot2)
library(dplyr)

statistiche <- dati%>%
  group_by(city) %>%
  summarise(
    min = min(median_price),
    max = max(median_price),
    mean = mean(median_price)
  )

ggplot(dati, aes(x = city, y = median_price)) +
  geom_boxplot(fill = "lightblue") +
  geom_text(data = statistiche, aes(x = city, y = min, label = round(min, 2)), vjust = 1.5, color = "black", size = 3.5) +
  geom_text(data = statistiche, aes(x = city, y = max, label = round(max, 2)), vjust = -0.5, color = "black", size = 3.5) +
  geom_text(data = statistiche, aes(x = city, y = mean, label = round(mean, 2)), vjust = -0.5, color = "blue", size = 3.5) +
  labs(x = "Città", y = "Prezzo Mediano", title = "Boxplot del Prezzo Mediano per Città") +
  theme_minimal()

Risultati principali:

Il secondo grafico a boxplot multivariato mostra, invece, la distribuzione del volume delle vendite tra diverse città (Beaumont, Bryan-College Station, Tyler, e Wichita Falls) nel periodo compreso tra il 2010 e il 2014. Di seguito sono riportate alcune considerazioni chiave:

Variazione tra le città: Distribuzione interna delle città: Tendenza temporale:
library(ggplot2)

ggplot(dati, aes(x = factor(year), y = volume, fill = city)) +
  geom_boxplot() +
  labs(title = "Confronto del Volume delle Vendite tra Città e Anni",
       x = "Anno",
       y = "Volume delle Vendite (milioni di dollari)",
       fill = "Città") +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 16),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 12)
  )

  1. Analisi del Totale delle Vendite per Mese e Città

Obiettivo: Esaminare l’andamento stagionale delle vendite per città nel corso degli anni.

library(ggplot2)
ggplot(data = dati, aes(x = factor(month), y = sales, fill = city)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(
    title = "Totale delle Vendite nei Vari Mesi per Città e Anno",
    x = "Mese",
    y = "Totale Vendite",
    fill = "Città"
  ) +
  scale_fill_brewer(palette = "Set3") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)) +
  facet_wrap(~ year)

Il grafico a barre sovrapposte rappresenta il totale delle vendite nei vari mesi, suddiviso per città e organizzato per anno tramite il faceting. Questa visualizzazione permette di analizzare simultaneamente le variazioni stagionali delle vendite e le differenze tra le città nel corso di diversi anni.

Andamento Stagionale:

Confronto tra Anni:

Contributo delle Città:

Grafico a Barre Normalizzato per Percentuale delle Vendite nei Vari Mesi per Città e Anno

È stato creato un grafico a barre normalizzato per visualizzare la percentuale delle vendite nei diversi mesi e anni, suddiviso per città. In questo grafico, ogni barra rappresenta la distribuzione percentuale delle vendite tra le diverse città in ogni mese, per ciascun anno dal 2010 al 2014.

Dettagli del grafico:


library(ggplot2)
ggplot(data = dati, aes(x = factor(month), y = sales, fill = city)) +
  geom_bar(stat = "identity", position = "fill") +
  labs(
    title = "Percentuale delle Vendite nei Vari Mesi per Città e Anno",
    x = "Mese",
    y = "Percentuale di Vendite",
    fill = "Città"
  ) +
  scale_fill_brewer(palette = "Set3") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)) +
  facet_wrap(~ year) 

ll grafico rappresenta le proporzioni delle vendite mensili per ciascuna città, con i dati suddivisi per anno. Le barre sono normalizzate per ogni mese, quindi l’altezza di ciascuna barra rappresenta il 100% delle vendite totali, e ogni sezione colorata all’interno delle barre rappresenta la proporzione delle vendite attribuite a ciascuna città.

  1. Analisi del Volume Totale delle Vendite nel Tempo per Città

Obiettivo: Valutare la crescita del volume totale delle vendite nel tempo per ciascuna città.

library(ggplot2)
ggplot(data = dati, aes(x = factor(month), y = volume, color = city, group = city)) +
  geom_line(size = 1) +
  geom_point(size = 1) +
  labs(
    title = "Volume delle Vendite per Mese e Città nei Vari Anni",
    x = "Mese",
    y = "Volume delle Vendite (in milioni di $)",
    color = "Città"
  ) +
  scale_y_continuous(labels = scales::dollar_format(prefix = "$")) +
  theme_minimal() +
  facet_wrap(~ year)

Il grafico mostra il volume delle vendite per ciascun mese e città dal 2010 al 2014, suddiviso in 5 pannelli distinti (uno per ogni anno), permettendo un’analisi dettagliata dell’andamento delle vendite nel tempo per ogni città.

Osservazioni

1. Andamento Stagionale: 2. Variazione tra le città: 3. Confronto tra gli anni:

Conclusioni

Il report ha evidenziato significative differenze tra le città del Texas in termini di attività di mercato immobiliare. Tyler e Bryan-College Station emergono come i mercati più dinamici, con volumi di vendita e prezzi medi superiori rispetto a Beaumont e Wichita Falls. Le tendenze nel tempo indicano una crescita generale del mercato, con picchi di attività durante i mesi estivi. L’analisi descrittiva e le visualizzazioni forniscono una base solida per prendere decisioni strategiche in merito alle operazioni immobiliari e alla pianificazione delle risorse.