library(dplyr) library(ggplot2) dati <- read.csv(“realestate_texas.csv”)

head(dati) str(dati)

#ci sono variabili qualitative nominali (es. city), variabili temporali es(year o month), e variabili quantitative sia discrete (sales e listings) sia continue(volume, median_price, months_inventory). Il dataset è composto da 240 osservazioni e descrive l’andamento del mercato immobiliare in alcune città del Texas nel periodo 2010–2014.

#SALES

sales <- dati$sales head(sales,5)

mean(sales) median(sales) min(sales) max(sales) quantile(sales)

sd(sales) var(sales) diff(range(sales)) #ho utilizzato diff per calcolare l’ampiezza del campo di variazione, cioè tra valore massimo e minimo della variabile

cv <- function(x){ return(sd(x)/mean(x)*100) } cv(sales) moments::skewness(sales) moments::kurtosis(sales)

#VOLUME volume <- dati$volume head(volume,5)

mean(volume) median(volume) min(volume) max(volume) quantile(volume)

sd(volume) var(volume) diff(range(volume)) cv(volume)

moments::skewness(volume) moments::kurtosis(volume)

#MEDIANPRICE median_price <- dati$median_price head(median_price,5)

mean(median_price) median(median_price) min(median_price) max(median_price) quantile(median_price)

sd(median_price) var(median_price) diff(range(median_price)) cv(median_price)

moments::skewness(median_price) moments::kurtosis(median_price)

#LISTINGS listings <- dati$listings head(listings,5)

mean(listings) median(listings) min(listings) max(listings) quantile(listings)

sd(listings) var(listings) diff(range(listings)) cv(listings)

moments::skewness(listings) moments::kurtosis(listings)

#MONTHS_INVENTORY months_inventory <- dati$months_inventory head(months_inventory,5)

mean(months_inventory) median(months_inventory) min(months_inventory) max(months_inventory) quantile(months_inventory)

sd(months_inventory) var(months_inventory) diff(range(months_inventory)) cv(months_inventory)

moments::skewness(months_inventory) moments::kurtosis(months_inventory)

#in generale, le variabili legate alle vendite mostrano una certa variabilità e una distribuzione asimmetrica, mentre i mesi di inventario risultano più stabili.

#VARIABILI QUALITATIVE

#per le variabili qualitative non ha senso calcolare media o varianza, quindi vengono analizzate tramite distribuzioni di frequenzaù

#CITY

N <- nrow(dati)

freq_ass_city <- table(dati\(city) freq_rel_city <- table(dati\)city) / N

distr_freq_city <- cbind(freq_ass_city, freq_rel_city) distr_freq_city

#MONTHS

freq_ass_month <- table(dati\(month) freq_rel_month <- table(dati\)month) / N

distr_freq_month <- cbind(freq_ass_month, freq_rel_month) distr_freq_month

#Le variabili quantitative mostrano differenze tra media e mediana, segnalando in alcuni casi la presenza di asimmetria. In particolare il prezzo mediano delle abitazioni risulta sbilanciato verso valori più alti, mentre il numero di mesi di inventario varia meno nel tempo. #Le variabili CITY e MONTHs sono entrambe qualitative. La distribuzione di frequenza mostra che il dataset è bilanciato: ciascuna città rappresenta il 25% delle osservazioni, mentre ciascun mese circa l’8,3%.

#Per determinare qual’è la variabile con più variabilità ho scelto di utilizzare il coefficiente di variazione perchè confronta variabili con unità diverse: il coefficiente di variazione mostra che la variabile con maggiore variabilità relativa è volume, indicando che il valore totale delle vendite cambia in modo significativo tra città e periodi diversi. cv(sales) cv(volume) cv(median_price) cv(listings) cv(months_inventory)

#per determinare invece qual è la variabile con più asimmetria utilizzo la funzione skewness moments::skewness(sales) moments::skewness(volume) moments::skewness(median_price) moments::skewness(listings) moments::skewness(months_inventory)

#sapendo che più il valore si allontana da zero e più c’è asimmetria: il volume delle vendite risulta la variabile più asimmetrica, mentre i mesi di inventario mostrano una distribuzione quasi simmetrica.

#divisione in classi della variabile sales, di ampiezza 50 sales <- dati$sales n <- length(sales)

sales_cl <- cut( sales, breaks = seq(min(sales), max(sales)+50, 50) )

table(sales_cl)

#distribuzione di frequenza distr_freq <- as.data.frame( cbind( ni = table(sales_cl), fi = table(sales_cl)/n, Ni = cumsum(table(sales_cl)), Fi = cumsum(table(sales_cl)/n) ) )

distr_freq

#effettuo un grafico a barre

ggplot(data=dati)+ geom_bar(aes(x=sales_cl), stat=“count”, col=“black”, fill=“#69b3a2”)+ labs(title=“Distribuzione delle vendite immobiliari”, x=“Classi di vendite”, y=“Frequenze assolute”)+ theme_classic()+ theme(panel.grid.major.y = element_line(color=“grey90”), panel.grid.minor.y = element_line(color=“grey95”))

fi <- distr_freq$fi gini <- 1 - sum(fi^2) gini

#La variabile sales è stata suddivisa in classi di ampiezza pari a 50. Dalla distribuzione di frequenza emerge che la maggior parte delle osservazioni si concentra nelle classi con valori di vendita più bassi. In particolare, oltre il 50% delle osservazioni rientra nelle prime due classi, comprese tra 79 e 179 vendite.All’aumentare delle classi, le frequenze diminuiscono progressivamente, mentre le classi con valori di vendita più elevati presentano un numero ridotto di osservazioni. Questo andamento suggerisce una distribuzione asimmetrica a destra, caratterizzata dalla presenza di una coda verso i valori più alti.L’indice di eterogeneità di Gini risulta pari a circa 0,81, valore elevato che indica una marcata eterogeneità nella distribuzione delle vendite tra le classi. Ciò significa che le osservazioni non sono distribuite in modo uniforme, ma risultano concentrate principalmente in alcune classi.

n <- nrow(dati)

P_beaumont <- sum(dati$city == “Beaumont”) / n P_beaumont

#la probabilità che un’osservazione riporti la città di Beaumont è stata calcolata come frequenza relativa delle righe corrispondenti a questa città sul totale del dataset

P_luglio <- sum(dati$month == 7) / n P_luglio

#la probabilità che un’osservazione riporti il mese di luglio è stata calcolata come frequenza relativa del mese 7 sul totale delle osservazioni

P_dic2012 <- sum(dati\(month == 12 & dati\)year == 2012) / n P_dic2012

#la probabilità che un’osservazione corrisponda a dicembre 2012 è stata calcolata considerando la combinazione del mese 12 e dell’anno 2012, divisa per il totale delle osservazioni.

dati\(avg_price <- dati\)volume * 1e6 / dati$sales #moltiplico per 1mln perchè è in milioni di dollari head(dati[, c(“sales”,“volume”,“avg_price”)])

dati\(efficacy <- dati\)sales / dati$listings head(dati[, c(“sales”,“listings”,“efficacy”)])

#prezzo medio min(dati\(avg_price) max(dati\)avg_price)

#efficacia min(dati\(efficacy) max(dati\)efficacy)

#la variabile avg_price mostra che il prezzo medio degli immobili varia tra circa 97.000 e 213.000 dollari #per quanto riguarda l’efficacia degli annunci (efficacy), i valori variano tra circa 5% e 39%, mostrando che nella maggior parte dei casi solo una piccola parte degli annunci porta a vendite effettive.

library(dplyr)

dati %>% group_by(city) %>% summarise( avg_price_mean = mean(avg_price), avg_price_sd = sd(avg_price), efficacy_mean = mean(efficacy), efficacy_sd = sd(efficacy) )

dati %>% group_by(year) %>% summarise( avg_price_mean = mean(avg_price), avg_price_sd = sd(avg_price), efficacy_mean = mean(efficacy), efficacy_sd = sd(efficacy) )

dati %>% group_by(month) %>% summarise( avg_price_mean = mean(avg_price), avg_price_sd = sd(avg_price), efficacy_mean = mean(efficacy), efficacy_sd = sd(efficacy) )

#avg_price_mean varia da circa 119.000 $ a 183.000 $, con Wichita Falls la città con prezzo medio più basso e Bryan-College Station la più alta. #efficacy_mean varia tra circa 9% e 15%, con Bryan-College Station che ha annunci più efficaci e Tyler quelli meno efficaci.

#Il prezzo medio cresce leggermente dal 2010 (150.000 $) al 2014 (163.000 $), mostrando un trend positivo. #anche l’efficacia degli annunci aumenta negli anni, da circa 10% nel 2010 a 16% nel 2014, suggerendo un miglioramento complessivo della performance degli annunci nel tempo.

#Il prezzo medio varia tra 145.000 $ e 161.000 $, con valori più alti nei mesi estivi (maggio-luglio).

#l’efficacia degli annunci è più alta nei mesi estivi (giugno-luglio, circa 14%), mentre nei primi mesi dell’anno è più bassa (gennaio-febbraio, circa 8-9%).

library(ggplot2)

#Boxplot del prezzo medio per città

ggplot(dati, aes(x = city, y = avg_price)) + geom_boxplot(fill = “#82c8d9”, color = “black”) + labs( title = “Distribuzione del prezzo medio degli immobili per città”, x = “Città”, y = “Prezzo medio ($)” ) + theme_minimal()+ theme( panel.grid.major.y = element_line(color=“grey90”), panel.grid.minor.y = element_line(color=“grey95”), axis.text.x = element_text(angle=45, hjust=1))

#Boxplot del volume totale delle vendite per città

ggplot(dati, aes(x = city, y = volume)) + geom_boxplot(fill = “#f4a261”, color = “black”) + labs( title = “Distribuzione del volume totale delle vendite per città”, x = “Città”, y = “Volume delle vendite (milioni $)” ) + theme_minimal()+ theme( panel.grid.major.y = element_line(color=“grey90”), panel.grid.minor.y = element_line(color=“grey95”), axis.text.x = element_text(angle=45, hjust=1))

#Vendite totali per mese e città (grafico a barre sovrapposte)

sales_tot <- aggregate(sales ~ city + month, data = dati, sum) ggplot(data = sales_tot, aes(x = factor(month), y = sales, fill = city)) + geom_col(color = “black”) + labs( title = “Vendite totali per mese e città”, x = “Mese”, y = “Vendite totali” ) + scale_fill_brewer(palette = “Set2”) + theme_classic() + theme( legend.position = “bottom”, axis.text.x = element_text(angle = 0, hjust = 0.5), panel.grid.major.y = element_line(color = “grey90”), panel.grid.minor.y = element_line(color = “grey95”) )

#Barre normalizzate (frequenze relative) ggplot(data = sales_tot, aes(x = factor(month), y = sales, fill = city)) + geom_col(position = “fill”, color = “black”) + labs( title = “Distribuzione relativa delle vendite per mese e città”, x = “Mese”, y = “Frequenze relative” ) + scale_y_continuous(breaks = seq(0, 1, 0.1)) + scale_fill_brewer(palette = “Set2”) + theme_classic() + theme( panel.grid.major.y = element_line(color = “grey90”), panel.grid.minor.y = element_line(color = “grey95”), axis.text.x = element_text(angle = 0, hjust = 0.5), legend.position = “bottom” )

#Line chart delle vendite nel tempo

sales_mean <- aggregate(sales ~ city + year, data = dati, mean)

ggplot(data = sales_mean, aes(x = year, y = sales, color = city, group = city)) + geom_line() + geom_point(size = 3) + labs( title = “Andamento medio delle vendite nel tempo per città”, x = “Anno”, y = “Vendite medie” ) + scale_color_brewer(palette = “Set2”) + theme_classic() + theme( legend.position = “bottom”, panel.grid.major.y = element_line(color = “grey90”), panel.grid.minor.y = element_line(color = “grey95”) )