INTRODUZIONE
In questo progetto svolgo un analisi esplorativa del mercato immobiliare del Texas.
ANALISI
library(ggplot2)
library(moments)
library(dplyr)
##
## Caricamento pacchetto: 'dplyr'
## I seguenti oggetti sono mascherati da 'package:stats':
##
## filter, lag
## I seguenti oggetti sono mascherati da 'package:base':
##
## intersect, setdiff, setequal, union
library(zoo)
##
## Caricamento pacchetto: 'zoo'
## I seguenti oggetti sono mascherati da 'package:base':
##
## as.Date, as.Date.numeric
setwd("C:/Users/Utente/OneDrive/Desktop")
## Caricare il dataset in R
dati <- read.csv("realestate_texas.csv", sep=",")
DESCRIZIONE VARIABILI
Le variabili presenti nel dataset sono: “year” è una variabile quantitativa continua ma da trattare come qualitativa ordinale mentre “month” è una variabilequalitativa nominale codificata in numeri ed identificano rispettivamente l’anno e il mese di vendita della proprietà. Nella maggior parte dei casi serviranno a confrontare tra loro periodi di tempo diversi o le stesse variabili ma confrontate nello stesso periodo di tempo per rendere il confronto significativo. La variabile “city” identifica la città dove si trova la proprietà e perciò dove è stata venduta; è una variabile qualitativa nominale. Con questa informazione si possono fare analisi riguardanti tutte le altre variabili permettendoci così di confrontare ad esempio il tempo necessario per la vendita di tutte le proprietà (o la quantità di proprietà in vendita) in diverse città a parità di periodo, idem per il numero totale o il volume totale delle vendite, ed anche per confrontare il prezzo mediano delle proprietà tra diverse città. Queste altre variabili sono contenute in “sales” (numero totale di vendite), “volume” (valore totale in milioni di dollari delle vendite), “median_price” (prezzo mediano di vendita in dollari), “listings” (numero totale di annunci attivi) e “months_inventory” (quantità di tempo necessaria per vendere tutte le inserzioni correnti, espresso in mesi). Tutte queste sono variabili quantitative di cui “sales” e “listings” sono discrete e su scali di intervalli mentre le altre sono continue e su scala di rapporti. Su quest’ultime si possono studiare, tramite l’analisi statistica, le varie dipendenze tra loro; per fare un esempio semplice si potrebbe voler vedere se la velocità di vendita varia con il prezzo mediano.
INDICI DI POSIZIONE, VARIABILITà E FORMA
summary(dati)
## 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
Vediamo un veloce riassunto dei vari indici di posizione ed eventuali distribuzioni di frequenza.
Nel caso della variabile “city” i risultati della funzione summary non sono significativi.
freq_ass_city <- table(dati["city"])
Infatti le frequenze assolute sono tutte pari ma perchè la chiava del data frame è la coppia anno-mese e perciò riferendosi allo stesso perdiodo di 60 mesi ci saranno 60 righe di dati per ogni località.
Riguardo la variabile “year” ci interessa solo il minimo e il massimo perchè ci dà un idea del periodo a cui si riferiscono i dati cioè dal 2010 al 2014. La stessa info dalla variabile “month” potrebbe sviare, è necessario controllare il dateframe per assicurarsi che il periodo sia da gennaio 2010 a dicembre 2014 (questo perchè come detto prima queste due variabili vanno lette in coppia anno-mese).
Per tutte le altre variabili gli indici di posizione sono significativi, è possibile farsi un idea dei range che contangono tutti i valori e notando le differenze tra media e mediana vediamo che nel caso delle variabili “median_price”, “listings” e ” months_inventory” i valori sono molto simili e ciò suggerisce che non ci sono valori troppo alti o troppo bassi rispetto agli altri (outliers) o comunque che i valori sono distribuiti in maniera omogenea (poi andremo più a fondo stufiando la variabilità); mentre per la variabile “volume” e “sales” i due valori si discostano, anche se non di molto, ma potrebbe suggerire la presenza di outliers di valore alto visto che la media è maggiore alla mediana.
In ogni caso sarebbe utili dividere quest’ultime variabili in classe e vederne la distribuzione di frequenza in funzione della località (lo faremo più avanti).
VARIABILITà E ASIMMETRIA
Funzione per coefficiente di variazione
CV <- function(x){
return(sd(x)/mean(x)*100)
}
variables <- c("sales", "volume", "median_price", "listings", "months_inventory")
for (i in variables) {
var <- assign(paste0("var_", i), var(dati[[i]]))
print(paste0("Varianza di ", i, " = ", var))
dev_std <- assign(paste0("dev_std_", i), sd(dati[[i]]))
print(paste0("Deviazione Standard di ", i, " = ", dev_std))
coeff_var <- assign(paste0("coeff_var_", i), CV(dati[[i]]))
print(paste0("Coefficiente di Variazione di ", i, " = ", coeff_var))
as_index <- assign(paste0("as_index_", i), skewness(dati[[i]]))
print(paste0("Indice di Asimmetria di ", i, " = ", as_index))
}
## [1] "Varianza di sales = 6344.29951185495"
## [1] "Deviazione Standard di sales = 79.6511111777793"
## [1] "Coefficiente di Variazione di sales = 41.4220296482492"
## [1] "Indice di Asimmetria di sales = 0.718104024884959"
## [1] "Varianza di volume = 277.270692404027"
## [1] "Deviazione Standard di volume = 16.6514471564494"
## [1] "Coefficiente di Variazione di volume = 53.7053586805415"
## [1] "Indice di Asimmetria di volume = 0.884742026325995"
## [1] "Varianza di median_price = 513572983.089261"
## [1] "Deviazione Standard di median_price = 22662.148686505"
## [1] "Coefficiente di Variazione di median_price = 17.0821825732064"
## [1] "Indice di Asimmetria di median_price = -0.364552878177372"
## [1] "Varianza di listings = 566568.966091353"
## [1] "Deviazione Standard di listings = 752.707756098841"
## [1] "Coefficiente di Variazione di listings = 43.3083275909432"
## [1] "Indice di Asimmetria di listings = 0.649498226273971"
## [1] "Varianza di months_inventory = 5.30688912133891"
## [1] "Deviazione Standard di months_inventory = 2.30366862229334"
## [1] "Coefficiente di Variazione di months_inventory = 25.0603059264982"
## [1] "Indice di Asimmetria di months_inventory = 0.040975265871081"
La variabile con la più alta variabilità è “volume” perchè calcolando il coeffieciente di variazione di tutte le variabili (escluse “city”; “year” e “month” per ovvi motivi) risulta quella ad averlo maggiore. Questo significa che la variabile “volume” è quella che ha valori più sparsi rispetto alle altre e perciò è caratterizzata da una minore omogeneità. La variapibile con maggior asimmetria è sempre “volume” poichè è quella con il coefficienti di asimmetria che si discosta di più da 0 (condizione di simmetria), “volume è asimmetrica positiva (l’unica asimmetrica negativa invece è”median_price”). Questo significa che nella variabile “volume” la maggior parte dei dati tenderà ad essere a sinistra della media perciò di valore minore alla media; poichè è una distribuzione “sbilanciata” a sinistra.
CLASSI VARIABILE QUANTITATIVA
## Divido median_price che va da 73500 a 180000 in classi da 70000 a 180000 con
## un passo da 10000 e lo aggiungo come colonna al dataset
dati$median_price_cl <- cut(dati$median_price, breaks = seq(70000,180000,10000))
median_price_cl <- table(dati$median_price_cl)
## Per etichetta asse x
labels_x = seq(70000,180000,10000)
labels <- paste0("(", labels_x[-length(labels_x)]/1000, "k-", labels_x[-1]/1000, "k]")
g1 <- ggplot(data = dati)+
geom_bar(aes(x = median_price_cl),
stat = "count",
col = "black",
fill = "gold")+
labs(title = "Distribuzione della mediana dei prezzi di vendita per classi",
x = "Suddivisione in classi mediana dei prezzi di vendita delle proprietà",
y = "Numero di proprietà vendute appartenenti alla suddivisone")+
scale_y_continuous(breaks = seq(0,50,5))+
scale_x_discrete(labels = labels)+
theme_classic()
print(g1)
## Funzione per calcolo dell'indice di eterogeneità di Gini
gini.index <- function(x){
ni = table(x)
fi = ni/length(x)
fi2 = fi^2
j = length(table(x))
gini = 1-sum(fi2)
gini.normalized = gini/((j-1)/j)
return(gini.normalized)
}
## Calcolo Gini
gini_index_median_price <- gini.index(dati$median_price)
L’indice di Gini della variabile “median_price” risulta 1 perciò praticamente la variabile è caratterizzata da variabilità massima cioè equidistribuzione.
Probabilità: le calcolo facendo il numero in cui la variabile compare nella rispettiva colonna fratto la lunghezza (numero di elementi) della colonna.
prob_city <- sum(dati$city == "Beaumont")/length(dati$city)
prob_month <- sum(dati$month == 7)/length(dati$month)
prob_year <- sum(dati$year == 2012)/length(dati$year)
## Colonna prezzo medio degli immobili
dati$mean_price <- (dati$volume/dati$sales)*1000000
## Colonna efficacia annunci di vendita
dati$ad_effectiveness <- (dati$sales/dati$listings)
E’ stata creata la variabile “ad_effectiveness” calcolata come rapporto dei campi “sales” (= numero totale di vendite) e “listings” (= numero totale di annunci attivi). Questo fattore perciò è adimensionale e mostra quante sono le vendite in rapporto agli annunci attivi, cioè una sorta di percentuale di vendita. Maggiore sarà “ad_effectiveness” maggiore sarà l’efficacia degli annunci di vendita.
g2 <- ggplot(dati, aes(x = city, y = ad_effectiveness))+
geom_boxplot()+
labs(x = "Città", y = "Efficcacia degli annunci di vendita", title = "Efficacia annunci di vendita per città")
print(g2)
Come si può notare dai boxplot accostati le città dove in media gli annunci sono più efficaci sono Bryan-College Station e Wichita Falls con una media simile intorno al 12.5% (0.125). La differenza tra la due e la variabilità maggiore nella prima, infatti il boxplot in questa risulta più “largo”.
# Variabili di riferimento
group_vars <- c("city", "year", "month")
# Variabili da analizzare
measure_vars <- c("median_price", "sales", "volume")
# Creo delle liste per salvare risultati e grafici
summary_list <- list()
plot_list <- list()
for (i in measure_vars) {
summary_list[[i]] <- list()
plot_list[[i]] <- list()
for (j in group_vars) {
# Summary
summary_df <- dati %>%
group_by(.data[[j]]) %>%
summarize(
media = mean(.data[[i]]),
dev_st = sd(.data[[i]]))
summary_list[[i]][[j]] <- summary_df
# Grafici
graphs <- ggplot(summary_df, aes_string(x = j, y = "media")) +
geom_point(size = 3, color = "steelblue") +
geom_errorbar(aes(ymin = media - dev_st, ymax = media + dev_st),
width = 0.2, color = "steelblue") +
theme_minimal() +
labs(
title = paste("Media e Deviazione Standard di", i, "per", j),
x = j,
y = paste("Media", i, "± SD")
)
# Correzione asse x per i mesi
if (j == "month") {
graphs <- graphs + scale_x_discrete(limits = as.character(1:12), labels = 1:12)
}
plot_list[[i]][[j]] <- graphs
print(graphs)
}
}
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Graficamente ho rappresentato media e deviazione standard tramite gli interval plot.
La città con il prezzo medio di vendita maggiore è Bryan-College Station, mentre la città col prezzo medio di vendita minore è Wichita Falls, questa è anche caratterizzata dalla maggiore variabilità del prezzo. Il 2014 è l’anno caratterizzato da una media prezzi maggiore ed anche da una variabilità dei prezzi maggiore. Mentre in media i prezzi maggiori si sono registrati nel mese di giugno con il mese di ottobre come mese con prezzi più variabili.
La città in cui in media si vendono più proprietà è Tyler mentre la città in cui la variabilità del numero di vendite è maggiore è Bryan-College Station. L’andamento delle vendite medie negli anni sembra mostrare un trend di crescita con il 2014 con il maggior numero di vendite e la maggiore variabilità. Il periodo dell’anno in cui si registrano più vendite è quello estivo da maggio ad agosto.
E’ stato poco fa notato che in media la maggior parte delle vendite è registratto nella città di Tyler, come si poteva ipotizzare detiene anche il primato di entrate dovute alle vendite. Si nota anche qui l’andamento in crescita delle entrate negli anni riconfermando il 2014 come anno con più entrate e maggiore variabilità. E infine come ci aspettavamo si riconferma il periodo estivo come periodo in cui in media ci sono più entrate dovute alla vendita di case.
Creazione di visualizzazioni con ggplot2
Boxplot per confrontare la distribuzione del prezzo mediano per città:
g3 <- ggplot(dati, aes(x = city, y = median_price))+
geom_boxplot()+
labs(x = "Città",
y = "Prezzo mediano",
title = "Prezzo mediano per città")
print(g3)
Il grafico riconferma le info ottenute dai summary, infatti si nota che la città Bryan-College Station è dove il prezzo di vendita delle case è maggiore mentre la città dove è più economico è Wichita Falls. Quest’ultima è anche la città dove il prezzo mediano è più variabile.
Grafici a barre per confrontare il totale delle vendite per mese e città.
sum_month_sales<-dati%>%
group_by(month, city)%>%
summarize(total_sales=sum(sales))
## `summarise()` has grouped output by 'month'. You can override using the
## `.groups` argument.
sum_month_sales
## # A tibble: 48 × 3
## # Groups: month [12]
## month city total_sales
## <int> <chr> <int>
## 1 1 Beaumont 608
## 2 1 Bryan-College Station 591
## 3 1 Tyler 907
## 4 1 Wichita Falls 442
## 5 2 Beaumont 677
## 6 2 Bryan-College Station 628
## 7 2 Tyler 1058
## 8 2 Wichita Falls 454
## 9 3 Beaumont 855
## 10 3 Bryan-College Station 949
## # ℹ 38 more rows
g4 <- ggplot(sum_month_sales, aes(x = factor(month), y = total_sales, fill = city)) +
geom_bar(stat = "identity", color = "black") +
scale_x_discrete(limits = as.character(1:12), labels = 1:12) +
labs(
title = "Numero Totale di Vendite per Mese",
x = "Mese",
y = "Numero Totale di Vendite"
) +
theme_minimal()
print(g4)
Il grafico ottenuto riconferma che i mesi del periodo estivo (maggio-agosto) sono quelli con più altro numero di vendite. Inoltre sembra che a differenza delle altre città, in quella di Wichita Falls, il numero di vendite siano più costanti durante l’anno.
sum_month_sales<-dati%>%
group_by(city)%>%
summarize(total_sales=sum(sales))
g5 <- ggplot(sum_month_sales, aes(x = factor(city), y = total_sales)) +
geom_bar(stat = "identity", fill = "skyblue", color = "black") +
labs(
title = "Numero Totale di Vendite per Mese",
x = "Mese",
y = "Numero Totale di Vendite"
) +
theme_minimal()
print(g5)
Il grafico riconferma che la città in cui si vendono più proprietà è Tyler.
Line charts per confrontare l’andamento delle vendite in periodi storici differenti.
## Concateno "year" e "month"
dati$year_month <- paste0(dati$year, "_", dati$month)
## Line charts
sum_year_month_sales<-dati%>%
group_by(year_month)%>%
summarize(total_sales=sum(sales))
## Converto "2010_01" in oggetti yearmon (anno+mese)
sum_year_month_sales$year_month <- as.yearmon(sum_year_month_sales$year_month, "%Y_%m")
g5 <- ggplot(sum_year_month_sales) +
geom_line(aes(x = year_month, y = total_sales), col = "red", linewidth = 1) +
geom_point(aes(x = year_month, y = total_sales), col = "black", size = 3) +
labs(
x = "Anno_Mese",
y = "Numero Totale di Vendite",
title = "Andamento del Numero Totale di Vendite dal 2010 al 2014"
) +
theme_minimal()
print(g5)
Dal line chart si vedono in ogni anno i picchi di vendite nei periodi estivi e si può notare un trend di crescita nel numero di vendite dal 2010 al 2014.
Conclusioni
Visto l’efficacia degli annunci nelle due città di Bryan-Station College e Wichita Falls consiglierei di prendere da modello per le altre città le inserzioni di queste zone ma spingere di più nella vendita o nella ricerca di proprietà da vendere nella zona di Wichita Falls vista l’efficacia appunto delle inserzioni ma il basso numero di vendite rispetto le altre città. Ricordando il grafico in cui si nota che le vendite a Wichita Falls sono costanti durante tutto l’anno, e ciò conferma l’efficacia degli annunci in quella zona, utilizzandolo come modello per gli annunci punterei ad aumentare le vendite anche nel periodo invernale nelle altre città. Consiglierei inoltre uno studio sul perchè le vendite si concentrino nei mesi caldi nelle altre zone in modo da capire se c’è possibilità di alzarle nei mesi freddi ed in caso questa possibilità non ci sia consiglierei una campagna pubblicitaria qualche mese prima del periodo estivo per poi intensificare gli annunci nel periodo estivo. In generale comunque il mercato è in crescita perciò investimenti per l’ottimizzazione delle vendite o per aumentare il numero di proprietà da da vendere hanno alta probabilità di ritorno e darebbero la possibilità di prendersi una fetta “più grande” del mercato che si sta allargando. ```