##CARICAMENTO E PRIMA ANALISI DEI DATI GREZZI #Installazione del pacchetto “data.table” per leggere in maniera efficiente il file csv (la fuzione read.csv restituiva diversi errori) e del pacchetto “moments” per le analisi statistiche
install.packages(“data.table”) library(data.table) dati <- fread(“realestate_texas.csv”, sep = “;”, header = TRUE, quote = “"”) dati[] <- lapply(dati, function(x) gsub(‘"’, ’’, x)) dati\(year <- as.integer(dati\)year) dati\(month <- as.integer(dati\)month) dati\(sales <- as.integer(dati\)sales) dati\(volume <- as.numeric(dati\)volume) dati\(median_price <- as.numeric(dati\)median_price) dati\(listings <- as.integer(dati\)listings) dati\(months_inventory <- as.numeric(dati\)months_inventory)
summary(dati) N = dim(dati) [1] attach(dati) install.packages(“moments”) library(moments)
##1. PRIME CONSIDERAZIONI SUI DATI GREZZI E SULLE SUE VARIABILI # 1. city: ○ Tipo: Variabile qualitativa nominale; ○ Descrizione: Indica la città di riferimento; ○ Analisi Applicabili: Distribuzione di frequenze per città, confronto tra città su altre variabili; 2. year: ○ Tipo: Variabile quantitativa discreta; ○ Descrizione: Indica l’anno di riferimento (2010-2014); ○ Analisi Applicabili: Analisi di trend temporali (anno per anno), confronto di medie e variazioni nel tempo; 3. month: ○ Tipo: Variabile quantitativa discreta; ○ Descrizione: Mese dell’anno (1-12); ○ Analisi Applicabili: Identificazione di stagionalità o pattern mensili nelle vendite, prezzi o altri indicatori; 4. sales: ○ Tipo: Variabile quantitativa continua; ○ Descrizione: Numero totale di vendite in un mese; ○ Analisi Applicabili: Calcolo di medie, variazioni, distribuzione delle vendite per città, mese o anno; 5. volume: ○ Tipo: Variabile quantitativa continua; ○ Descrizione: Valore totale delle vendite; ○ Analisi Applicabili: Confronto con il numero di vendite (sales) e calcolo del prezzo medio per unità; 6. median_price: ○ Tipo: Variabile quantitativa continua; ○ Descrizione: Prezzo mediano delle vendite; ○ Analisi Applicabili: Distribuzione dei prezzi mediani per città, mese, anno; 7. listings: ○ Tipo: Variabile quantitativa continua; ○ Descrizione: Numero totale di annunci attivi in un dato mese; ○ Analisi Applicabili: Relazione con sales e months_inventory; analisi della disponibilità di mercato; 8. months_inventory: ○ Tipo: Variabile quantitativa continua; ○ Descrizione: Tempo necessario per vendere tutte le inserzioni correnti (in mesi); ○ Analisi Applicabili: Indicatore di mercato (tempo medio di vendita), relazione con listings e sales;
Note: year e month possono essere trattati come dimensioni temporali. • Analisi di trend: Confronto dei valori di variabili come sales, volume, e median_price su base annuale; • Stagionalità: Analisi delle variazioni mensili (ad esempio, mesi più attivi in termini di vendite o di aumento dei prezzi);
##2. Indici di posizione, variabilità e forma
#Variabile sales
media_sales = mean(sales) mediana_sales = median(sales)
quartili_sales = quantile(sales, probs = c(0.25, 0.5, 0.75))
range_sales <- range(sales)
sd_sales = sd(sales)
iqr_sales = IQR(sales)
asimettria_sales = skewness(sales)
kurtosis_sales = kurtosis(sales)-3
#Variabile volume
media_volume = mean(volume) mediana_volume = median(volume)
quartili_volume = quantile(volume, probs = c(0.25, 0.5, 0.75))
range_volume <- range(volume)
sd_volume = sd(volume)
iqr_sales = IQR(volume)
asimettria_volume = skewness(volume)
kurtosis_volume = kurtosis(volume)-3
media_median_price = mean(median_price) mediana_median_price = median(median_price)
quartili_median_price = quantile(median_price, probs = c(0.25, 0.5, 0.75))
range_median_price <- range(median_price)
sd_median_price = sd(median_price)
iqr_median_price = IQR(median_price)
asimettria_median_price = skewness(median_price)
kurtosis_median_price = kurtosis(median_price)-3
media_listings = mean(listings) mediana_listings = median(listings)
quartili_listings = quantile(listings, probs = c(0.25, 0.5, 0.75))
range_listings <- range(listings)
sd_listings = sd(listings)
iqr_listings = IQR(listings)
asimettria_listings = skewness(listings)
kurtosis_listings = kurtosis(listings)-3
media_months_inventory = mean(months_inventory) mediana_months_inventory = median(months_inventory)
quartili_months_inventory = quantile(months_inventory, probs = c(0.25, 0.5, 0.75))
range_months_inventory = range(months_inventory)
sd_months_inventory = sd(months_inventory)
iqr_months_inventory = IQR(months_inventory)
asimettria_months_inventory = skewness(months_inventory)
kurtosis_months_inventory = kurtosis(months_inventory)-3
#CONSIDERAZIONI # months_inventory: - Le variabili mostrano una variazione significativa tra le diverse città e periodi. In particolare, ci sono forti differenze nelle vendite e nel volume delle vendite tra le città, con alcune città che registrano risultati molto più alti rispetto ad altre; - Le asimmetrie positive in molte delle variabili suggeriscono che ci sono città o periodi con performance particolarmente forti (ad esempio, un numero molto elevato di vendite o di volume di vendite), mentre la maggior parte delle altre città ha valori più modesti; - La deviazione standard relativamente alta per molte variabili indica una grande variabilità tra le città, suggerendo che alcune località potrebbero beneficiare di strategia di marketing diversificate rispetto ad altre;
##3. Identificazione delle variabili con maggiore variabilità e asimmetria
#Calcolo del Coefficiente di Variazione per verificare la variabile con la maggiore variabilità
CV = function(sd, mean){ return(sd/mean*100) }
CV_listings = CV(sd_listings, media_listings) CV_median_price = CV(sd_median_price, media_median_price) CV_months_inventory = CV(sd_months_inventory, media_months_inventory) CV_sales = CV(sd_sales, media_sales) CV_volume = CV(sd_volume, media_volume)
La variabile con la distribuzione più asimmetrica è volume, con un valore di asimmetria pari a 0.88, indicando una distribuzione inclinata verso destra. Questo implica che alcune città o mesi raggiungono livelli di vendita particolarmente elevati rispetto alla maggior parte degli altri; Considerazioni statistiche: L’elevata variabilità e l’asimmetria positiva del volume delle vendite potrebbero indicare la presenza di fattori esterni che influenzano il successo delle vendite in determinate città o periodi. Ad esempio, eventi stagionali o promozioni potrebbero giocare un ruolo significativo.
##4. Creazione di classi per una variabile quantitativa
#Creazione di classi e distribuzione di frequenza per la variabile “sales”
min(sales) max(sales)
sales_CL = cut(dati$sales, breaks= c(50,150,250,350,450)) ni = table(sales_CL) #frequenza relativa fi = table(sales_CL)/N #frequenza assoluta Ni = cumsum(ni) #frequenza relativa cumulata Fi = Ni/N #frequenza assoluta cumulata
cbind(ni,fi,Ni,Fi)
#Grafico a barre
library(ggplot2) ggplot(data = dati)+ geom_bar(aes(x = sales_CL), stat = “count”, col = “black”, fill = “red”)+ labs(title = “distribuzione delle cassi di sales”, x = “ampiezza delle classi”, y = “frequenze assolute”)+ scale_y_continuous(breaks = seq(0,100,5))
#indice di eterogeneità di Gini
gini.index = function(x){ ni = table(x) fi = ni/N fi2 = fi^2 J = length(table(x)) gini = 1-sum(fi2) gini.nomralizzato = gini/((J-1)/J) return(gini.nomralizzato)
}
gini.index(sales_CL)
Considerazioni: • La maggior parte delle osservazioni (circa il 75%) si concentra nelle prime due classi; • Solo il 5% dei dati si trova nella classe più alta, indicando un fenomeno con valori estremi meno frequenti; Interpretazione: Un valore di Gini vicino a 1 indica una forte concentrazione delle vendite in poche classi; Il mercato immobiliare analizzato presenta quindi una struttura di distribuzione non uniforme, con la maggioranza dei dati distribuiti su valori più bassi rispetto al massimo
##5. Calcolo della probabilità # Probabilità città “Beaumont” Prob_Beaumont = sum(city == “Beaumont”) / N
Prob_Luglio = sum(month == 7) / N
Prob_Dicembre2012 = sum(month == 12 & year == 2012) / N
Prob_Beaumont Prob_Luglio Prob_Dicembre2012
#Probabilità che una riga riporti la città “Beaumont”: ○ La probabilità è 0.25, ossia il 25%. ○ Questo è coerente con il fatto che il dataset ha 4 città, ciascuna rappresentata in egual misura. #Probabilità che una riga riporti il mese di “Luglio” ○ La probabilità è 0.0833, ossia l’8.33%. ○ Poiché il dataset copre 12 mesi per 5 anni #Probabilità che una riga riporti “Dicembre 2012” ○ La probabilità è 0.0167, ossia l’1.67%. ○ Questo si spiega considerando che il dataset copre 5 anni (dal 2010 al 2014) #Queste probabilità evidenziano la regolarità del dataset e confermano la sua struttura simmetrica e uniforme nei dati temporali e geografici.
##6. Creazione di nuove variabili
prezzo_medio_vendita = volume/sales
efficacia_annunci = sales/listings
head(dati[, c(“prezzo_medio_vendita”, “efficacia_annunci”)]) min(prezzo_medio_vendita) max(prezzo_medio_vendita)
min(efficacia_annunci) max(efficacia_annunci)
○ Minimo: 0.097
○ Massimo: 0.213
○ Questi valori indicano che, mediamente, i ricavi per vendita non scendono mai sotto 0.097 né superano 0.213. Questo suggerisce una certa stabilità nel rapporto tra volume e numero di vendite;
○ Differenze nei valori potrebbero derivare da fattori come localizzazione o stagionalità;
#efficacia_annunci ○ Minimo: 0.050 ○ Massimo: 0.387 ○ Il range è ampio, suggerendo una maggiore variabilità nell’efficacia degli annunci. Alcuni annunci sembrano molto più efficaci di altri. ○ L’efficacia più bassa potrebbe indicare città, mesi o tipi di annunci meno performanti
##7. Analisi condizionata
install.packages(“dplyr”) library(dplyr)
summary_citta = dati %>% group_by(city) %>% summarise( media_sales = mean(sales), sd_sales = sd(sales), media_volume = mean(volume), sd_volume = sd(volume), media_median_price = mean(median_price), sd_median_price = sd(median_price) )
summary_anno = dati %>% group_by(year) %>% summarise( media_sales = mean(sales), sd_sales = sd(sales), media_volume = mean(volume), sd_volume = sd(volume), media_median_price = mean(median_price), sd_median_price = sd(median_price) )
summary_mese = dati %>% group_by(month) %>% summarise( media_sales = mean(sales), sd_sales = sd(sales), media_volume = mean(volume), sd_volume = sd(volume), media_median_price = mean(median_price), sd_median_price = sd(median_price) )
##8. Creazione di visualizzazioni con ggplot2
ggplot(summary_citta, aes(x = city, y = media_sales, fill = city)) + geom_bar(stat = “identity”) + labs(title = “Media delle Vendite per Città”, x = “Città”, y = “Media Vendite”) + theme_minimal()
ggplot(summary_anno, aes(x = year, y = media_sales, fill = factor(year))) + geom_bar(stat = “identity”) + labs(title = “Media delle Vendite per Anno”, x = “Anno”, y = “Media Vendite”) + theme_minimal()
ggplot(summary_mese, aes(x = factor(month), y = media_sales, fill = factor(month))) + geom_bar(stat = “identity”) + labs(title = “Media delle Vendite per Mese”, x = “Mese”, y = “Media Vendite”) + theme_minimal()
ggplot(dati, aes(x = city, y = median_price, fill = city)) + geom_boxplot() + labs(title = “Distribuzione del Prezzo Mediano per Città”, x = “Città”, y = “Prezzo Mediano”) + theme_minimal() + scale_fill_brewer(palette = “Set3”)
sales_by_city_month = aggregate(sales ~ city + month, data = dati, sum)
ggplot(sales_by_city_month, aes(x = factor(month), y = sales, fill = city)) + geom_bar(stat = “identity”, position = “dodge”) + labs(title = “Vendite Totali per Mese e Città”, x = “Mese”, y = “Totale Vendite”) + scale_fill_brewer(palette = “Set2”) + theme_minimal()
sales_by_year_month = aggregate(sales ~ year + month + city, data = dati, sum)
sales_by_year_month\(anno_mese = as.Date(paste(sales_by_year_month\)year, sales_by_year_month$month, “01”, sep = “-”))
ggplot(sales_by_year_month, aes(x = anno_mese, y = sales, color = city)) + geom_line(size = 1) + labs(title = “Andamento delle Vendite nel Tempo”, x = “Anno-Mese”, y = “Vendite Totali”) + scale_x_date(date_labels = “%y-%m”, date_breaks = “1 month”) + # Formato YY-MM theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
#Confronto del valore totale delle vendite tra le città e gli anni
ggplot(dati, aes(x = factor(year), y = sales, fill = city)) + geom_boxplot() + labs(title = “Distribuzione del Totale Vendite per Città e Anno”, x = “Anno”, y = “Totale Vendite”) + theme_minimal()
#Vendite nei mesi per città
#grafico sovrapposto ggplot(dati, aes(x = factor(month), y = sales, fill = city)) + geom_col(position = “stack”) + labs(title = “Totale Vendite nei Mesi (Sovrapposte)”, x = “Mese”, y = “Totale Vendite”) + theme_minimal()
#grafico normalizzato ggplot(dati, aes(x = factor(month), y = sales, fill = city)) + geom_col(position = “fill”) + labs(title = “Distribuzione Percentuale delle Vendite nei Mesi (Normalizzato)”, x = “Mese”, y = “Percentuale”) + scale_y_continuous(labels = scales::percent) + theme_minimal()
#Aggiunta Year
ggplot(dati, aes(x = factor(month), y = sales, fill = city)) + geom_col(position = “fill”) + facet_wrap(~ year, ncol = 2) + labs(title = “Distribuzione Percentuale delle Vendite nei Mesi, per Anno e Città”, x = “Mese”, y = “Percentuale”) + scale_y_continuous(labels = scales::percent) + theme_minimal()
#Line chart per analizzare i trend storici delle vendite
anno_mese = as.Date(paste(dati\(year, dati\)month, “01”, sep = “-”), format = “%Y-%m-%d”) ggplot(dati, aes(x = anno_mese, y = sales, color = city)) + geom_line(size = 1) + labs(title = “Trend Storico delle Vendite per Città”, x = “Anno-Mese”, y = “Totale Vendite”) + scale_x_date(date_labels = “%y-%m”, date_breaks = “6 months”) + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
##Conclusioni
Prestazioni delle Città Tyler si distingue come la città con le migliori performance in termini di media delle vendite e prezzo mediano delle case. Wichita Falls, invece, mostra performance più basse, sia in termini di vendite che di prezzi mediani, evidenziando un mercato meno competitivo o con una domanda più limitata. La stabilità dei prezzi a Wichita Falls potrebbe rappresentare un’opportunità per acquirenti interessati a mercati più prevedibili.
Stagionalità del Mercato Il mercato immobiliare analizzato presenta una chiara stagionalità: - Mesi primaverili ed estivi (aprile-agosto): Picchi di vendite, probabilmente legati a una maggiore mobilità e a condizioni climatiche favorevoli. - Mesi invernali (gennaio, dicembre): Calo significativo delle vendite, coerente con la stagionalità tipica del settore immobiliare. Questi dati suggeriscono che l’azienda dovrebbe pianificare le campagne di marketing e le attività promozionali seguendo questa stagionalità, massimizzando gli sforzi nei mesi primaverili e adottando strategie per mitigare il calo nei mesi invernali.
Crescita Annuale Il 2014 è l’anno con le migliori performance, registrando una media delle vendite significativamente più alta rispetto agli anni precedenti. Dal 2011 al 2014, si osserva una crescita costante delle vendite con un incremento medio annuo del 25%, indicando un mercato in espansione e una domanda crescente. Il calo del 2011 rispetto al 2010 potrebbe essere attribuito a fattori economici o locali che hanno temporaneamente rallentato il mercato.
Distribuzione delle Vendite La maggior parte delle transazioni si concentra nella fascia [50, 150], rappresentando quasi il 39% del totale. Questo suggerisce che il mercato è dominato da transazioni di fascia bassa. Le fasce di vendita più alte ([250, 450]) sono meno rappresentate, evidenziando un’opportunità per espandere l’offerta di immobili di fascia alta attraverso strategie di marketing mirate o promozioni su proprietà di lusso.
Tendenze Temporali Tyler e Bryan-College Station mostrano vendite in crescita nel tempo, con picchi stagionali marcati, suggerendo mercati vivaci e dinamici. Beaumont e Wichita Falls presentano vendite più stabili ma con minori fluttuazioni, indicando una domanda meno sensibile a fattori stagionali o promozionali.
Raccomandazioni Strategiche Espansione dell’offerta nei mercati forti: - Focalizzarsi su Tyler e Bryan-College Station per massimizzare le vendite e attrarre investitori interessati a mercati immobiliari dinamici e redditizi.
Incremento della domanda nei mercati deboli: - Introdurre incentivi o promozioni specifiche a Wichita Falls per attrarre acquirenti e stimolare il mercato locale.
Sfruttare la stagionalità: - Rafforzare le campagne di marketing e le attività promozionali nei mesi primaverili ed estivi per capitalizzare i picchi di domanda. - Introdurre strategie per mantenere un livello minimo di attività nei mesi invernali, ad esempio tramite sconti o incentivi per i potenziali acquirenti.
Valorizzare le fasce alte di vendita: - Promuovere immobili di fascia alta nelle città più forti (Tyler, Bryan-College Station) per aumentare la rappresentatività delle fasce di vendita più alte.