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("/Users/matteocalzametre/Desktop/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 |
Obiettivo: Calcolare le statistiche descrittive per comprendere la distribuzione delle variabili numeriche principali.
install.packages("moments", repos = "https://cloud.r-project.org")
##
## The downloaded binary packages are in
## /var/folders/q1/xj3p1r6s4vj9kr11jz1v4pbh0000gn/T//RtmpazwFDA/downloaded_packages
library(moments)
sapply(dati[, c("sales","volume","median_price","listings", "months_inventory")], function(x){
c(Mean = mean(x),
Median = median(x),
SD = sd(x),
IQR = IQR(x),
percentil = quantile(x),
Skewness = skewness(x),
Kurtosis = kurtosis(x)-3)
})
## sales volume median_price listings
## Mean 192.2916667 31.005188 1.326654e+05 1738.0208333
## Median 175.5000000 27.062500 1.345000e+05 1618.5000000
## SD 79.6511112 16.651447 2.266215e+04 752.7077561
## IQR 120.0000000 23.233500 3.275000e+04 1029.5000000
## percentil.0% 79.0000000 8.166000 7.380000e+04 743.0000000
## percentil.25% 127.0000000 17.659500 1.173000e+05 1026.5000000
## percentil.50% 175.5000000 27.062500 1.345000e+05 1618.5000000
## percentil.75% 247.0000000 40.893000 1.500500e+05 2056.0000000
## percentil.100% 423.0000000 83.547000 1.800000e+05 3296.0000000
## Skewness 0.7181040 0.884742 -3.645529e-01 0.6494982
## Kurtosis -0.3131764 0.176987 -6.229618e-01 -0.7917900
## months_inventory
## Mean 9.19250000
## Median 8.95000000
## SD 2.30366862
## IQR 3.15000000
## percentil.0% 3.40000000
## percentil.25% 7.80000000
## percentil.50% 8.95000000
## percentil.75% 10.95000000
## percentil.100% 14.90000000
## Skewness 0.04097527
## Kurtosis -0.17444754
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à.
Obiettivo: Analizzare la distribuzione delle variabili qualitative e valutare la rappresentatività delle diverse modalità.
attach(dati)
N = dim(dati)[1]
freq_ass <- table(dati$city)
cum_freq_ass <- cumsum(freq_ass)
distr_freq_city<-as.data.frame(cbind(freq_ass,cum_freq_ass))
distr_freq_city
## freq_ass cum_freq_ass
## Beaumont 60 60
## Bryan-College Station 60 120
## Tyler 60 180
## Wichita Falls 60 240
È stata generata una distribuzione di frequenza per la variabile qualitativa nominale city. La tabella riporta la frequenza assoluta (freq_ass), che ci permette di valutare la rappresentatività delle diverse modalità.
L’output mostra la stessa frequenza assoluta per tutte e quattro le modalità della variabile city, indicando che ognuna di esse contribuisce in misura uguale al totale delle osservazioni. Si è scelto di non riportare nella tabella la frequenza relativa perché la variabile qualitativa in esame è nominale e non ordinale.
Per le variabili quantitative discrete year e month, visto il numero contenuto di valori distinti di entrambi e per il loro significato intrinseco nell’analisi, si è scelto di mostrare delle semplici tabelle con la frequenza assoluta per ogni valore distinto della variabile. Anche in questo caso, considerando il tipo variabili analizzate, si è deciso di escludere la frequenza relativa dalla tabella.
freq_ass <- table(dati$year)
cum_freq_ass <- cumsum(freq_ass)
distr_freq_year<-as.data.frame(cbind(freq_ass,cum_freq_ass))
distr_freq_year
## freq_ass cum_freq_ass
## 2010 48 48
## 2011 48 96
## 2012 48 144
## 2013 48 192
## 2014 48 240
freq_ass <- table(dati$month)
cum_freq_ass <- cumsum(freq_ass)
distr_freq_month<-as.data.frame(cbind(freq_ass,cum_freq_ass))
distr_freq_month
## freq_ass cum_freq_ass
## 1 20 20
## 2 20 40
## 3 20 60
## 4 20 80
## 5 20 100
## 6 20 120
## 7 20 140
## 8 20 160
## 9 20 180
## 10 20 200
## 11 20 220
## 12 20 240
Otteniamo lo stesso risultato di frequenza assoluta per ogni valore distinto delle variabili year e month. Conclusa l’analisi si può affermare con certezza che il dataset in esame è bilanciato in relazione alle diverse modalità della variabile city e ai diversi valori unici delle variabili year e month, non mostrando uno sbilanciamento di osservazioni tra di esse.
Obiettivo: Misurare e confrontare la variabilità relativa delle variabili numeriche attraverso il calcolo del coefficiente di variazione. Individuare la variabile con maggiore variabilità e quella più asimmetrica.
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.
Per identificare la variabile più asimmetrica, possiamo confrontare i valori di skewness (asimmetria) calcolati al punto 2 per le variabili quantitative. Dai risultati della skewness emerge che la variabile volume ha un valore di 0.884, la più asimmetrica tra quelle analizzate, suggerendo una asimmetria positiva con una coda più lunga verso i volumi più alti e una concentrazione della maggior parte dei dati su valori più bassi.
library(ggplot2)
mean_volume <- mean(dati$volume)
ggplot(dati, aes(x = volume)) +
geom_density(fill = "skyblue", alpha = 0.5) +
geom_vline(aes(xintercept = mean_volume), color = "red", linetype = "dashed", linewidth = 1) +
labs(title = "Distribuzione della Variabile Volume con Indicazione della Media",
x = "Volume",
y = "Densità") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))
Abbiamo deciso di plottare il grafico della distribuzione della variabile volume per visualizzare in modo chiaro e immediato l’asimmetria positiva della distribuzione. Questo grafico permette di evidenziare come la maggior parte dei valori si concentri verso il lato sinistro (valori più bassi), mentre la coda della distribuzione si estende verso il lato destro (valori più elevati), caratteristica tipica di una distribuzione con skewness positiva.
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.
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.
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.
L’indice di Gini per la variabile city può essere facilmente “indovinato” osservando la distribuzione di frequenze calcolata al punto 3, dove si osservavano frequenze assolute uguali per le quattro modalità della variabile. Il risultato precedente è coerente con un valore dell’indice di Gini pari a 1, dove nessuna modalità prevale sulle altre e tutte le città contribuiscono in misura uguale al totale delle osservazioni. Questo rappresenta una situazione di eterogeneità massima (equidistribuzione).
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.
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:
Obiettivo: Confrontare le vendite medie e la variabilità delle vendite tra le diverse città.
install.packages("dplyr", repos = "https://cloud.r-project.org")
##
## The downloaded binary packages are in
## /var/folders/q1/xj3p1r6s4vj9kr11jz1v4pbh0000gn/T//RtmpazwFDA/downloaded_packages
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
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.
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()
Il primo grafico confronta il prezzo mediano delle case tra le città.
Nel secondo grafico è stato utilizzato un boxplot multivariato per confrontare la distribuzione del volume totale delle vendite tra diverse città e nel corso di più anni (dal 2010 al 2014). Questo grafico consente di osservare come i volumi di vendita siano distribuiti tra le città e come si evolvano nel tempo.
library(ggplot2)
ggplot(dati, aes(x = city, y = volume, fill = factor(year))) +
geom_boxplot() +
labs(title = "Confronto del Volume di Vendite tra le Città e negli Anni",
x = "Città",
y = "Volume delle Vendite",
fill = "Anno") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))
Obiettivo: Esaminare l’andamento stagionale delle vendite per città nel corso degli anni.
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.
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)
È 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.
position =
“fill”, che scala le barre in modo che ciascuna sommi al
100% del totale delle vendite per ciascun mese.
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)
Obiettivo: Valutare la crescita del volume totale delle vendite nel tempo per ciascuna città.
In questa analisi, abbiamo generato un grafico a linee che rappresenta l’andamento del volume di vendite per ciascuna città nei vari mesi e anni. Oltre a tracciare le vendite per ogni città, abbiamo inserito una linea aggiuntiva che rappresenta il totale aggregato delle vendite (sommando le vendite di tutte le città) per ogni mese e anno, in modo da monitorare anche il volume complessivo del mercato.
library(dplyr)
dati_aggregati <- dati %>%
group_by(year, month) %>%
summarise(volume_totale = sum(volume)) %>%
mutate(city = "Totale")
## `summarise()` has grouped output by 'year'. You can override using the
## `.groups` argument.
dati_completo <- bind_rows(dati, dati_aggregati)
Aggregazione dei dati: Abbiamo raggruppato il dataset
originale per anno e mese utilizzando la funzione
group_by(). Successivamente, abbiamo sommato i valori della
variabile volume (che rappresenta il volume delle vendite) per ciascun
mese e anno, utilizzando la funzione summarise().
Creazione della metrica aggregata: Il risultato di questa operazione è un nuovo dataset che contiene il totale delle vendite mensili per tutte le città, per ciascun anno e mese. Abbiamo anche aggiunto una nuova variabile city con il valore “Totale” per indicare che questa riga rappresenta il volume totale di tutte le città sommate insieme.
Unione del dataset originale con quello aggregato:
Abbiamo poi unito il dataset contenente i dati originali con quello
aggregato, usando bind_rows(). Questo ci ha permesso di
includere sia i dati relativi alle singole città sia il totale aggregato
all’interno dello stesso grafico.
Visualizzazione del volume totale: Nel grafico risultante, la linea del volume totale (colorata di blu scuro) è stata visualizzata insieme alle linee delle singole città. La visualizzazione permette di confrontare il trend aggregato delle vendite con quello delle singole città.
library(ggplot2)
ggplot(data = dati_completo, aes(x = factor(month), y = ifelse(city == "Totale", volume_totale, volume),
group = city, color = city)) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
labs(
title = "Andamento del Volume di Vendite per Città e Totale Aggregato",
x = "Mese",
y = "Volume delle Vendite",
color = "Città"
) +
scale_x_discrete(breaks = 1:12) +
scale_color_manual(values = c("Beaumont" = "red", "Bryan-College Station" = "green",
"Tyler" = "blue", "Wichita Falls" = "purple", "Totale" = "darkblue")) +
facet_wrap(~ year) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5)
)
Trend per città: Le città mostrano andamenti piuttosto simili nel tempo, con picchi di vendite nei mesi centrali dell’anno (soprattutto tra maggio e agosto), che probabilmente riflettono stagionalità tipiche del mercato immobiliare, come evidenziato anche dalle analisi precedenti.
Totale aggregato: La linea del totale aggregato (in blu scuro) evidenzia chiaramente la tendenza generale del mercato. È evidente un aumento complessivo delle vendite anno dopo anno, con un incremento significativo nel 2013 e 2014.
Confronto tra città: Città come Tyler e Bryan-College Station presentano volumi di vendita mediamente più elevati rispetto a Beaumont e Wichita Falls, con un divario visibile nel corso degli anni. Questo potrebbe indicare mercati immobiliari più attivi in queste città.
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.