CARICAMENTO E PRIMA ANALISI DEI DATI GREZZI
Installazione del pacchetto “data.table” per leggere in maniera
efficiente il file csv
(la funzione 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))
Conversione delle colonne ai tipi di dati appropriati
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)
Riepilogo dei dati
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
Quartili
quartili_sales = quantile(sales, probs = c(0.25, 0.5, 0.75))
Range
range_sales <- range(sales)
Deviazione Standard
sd_sales = sd(sales)
Differenza Interquartile
iqr_sales = IQR(sales)
Asimmetria
asimmetria_sales = skewness(sales)
Curtosi
kurtosis_sales = kurtosis(sales) - 3
Variabile volume
Quartili
quartili_volume = quantile(volume, probs = c(0.25, 0.5, 0.75))
Range
range_volume <- range(volume)
Deviazione Standard
sd_volume = sd(volume)
Differenza Interquartile
iqr_volume = IQR(volume)
Asimmetria
asimmetria_volume = skewness(volume)
Curtosi
kurtosis_volume = kurtosis(volume) - 3
Variabile median_price
Quartili
quartili_median_price = quantile(median_price, probs = c(0.25, 0.5, 0.75))
Range
range_median_price <- range(median_price)
Deviazione Standard
sd_median_price = sd(median_price)
Differenza Interquartile
iqr_median_price = IQR(median_price)
Asimmetria
asimmetria_median_price = skewness(median_price)
Curtosi
kurtosis_median_price = kurtosis(median_price) - 3
Variabile listings
Quartili
quartili_listings = quantile(listings, probs = c(0.25, 0.5, 0.75))
Range
range_listings <- range(listings)
Deviazione Standard
sd_listings = sd(listings)
Differenza Interquartile
iqr_listings = IQR(listings)
Asimmetria
asimmetria_listings = skewness(listings)
Curtosi
kurtosis_listings = kurtosis(listings) - 3
Variabile months_inventory
Quartili
quartili_months_inventory = quantile(months_inventory, probs = c(0.25, 0.5, 0.75))
Range
range_months_inventory = range(months_inventory)
Deviazione Standard
sd_months_inventory = sd(months_inventory)
Differenza Interquartile
iqr_months_inventory = IQR(months_inventory)
Asimmetria
asimmetria_months_inventory = skewness(months_inventory)
Curtosi
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 strategie 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)
Considerazioni
La variabile con la maggiore variabilità relativa è volume, con un
coefficiente di variazione del 53.71%.
Questo suggerisce che il volume totale delle vendite tra città, anni
e mesi presenta una variabilità significativa
rispetto alla sua media, evidenziando possibili discrepanze tra
periodi o luoghi di vendita.
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
Creazione di classi e distribuzione di frequenza per la variabile
“sales”
min(sales) # Valore minimo di sales
max(sales) # Valore massimo di sales
sales_CL = cut(dati$sales, breaks = c(50, 150, 250, 350, 450)) # Creazione delle classi
Calcolo delle frequenze
ni = table(sales_CL) # Frequenza assoluta
fi = table(sales_CL) / N # Frequenza relativa
Ni = cumsum(ni) # Frequenza assoluta cumulata
Fi = Ni / N # Frequenza relativa cumulata
Tabella riassuntiva
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 classi 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.normalizzato = gini / ((J - 1) / J)
return(gini.normalizzato)
}
Calcolo dell’indice di Gini per “sales_CL”
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 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 # Calcolo della probabilità per la città Beaumont
Probabilità mese di “Luglio” (mese 7)
Prob_Luglio = sum(month == 7) / N # Calcolo della probabilità per il mese di Luglio
Probabilità mese “Dicembre 2012”
Prob_Dicembre2012 = sum(month == 12 & year == 2012) / N # Calcolo della probabilità per Dicembre 2012
Stampa delle probabilità
Prob_Beaumont
Prob_Luglio
Prob_Dicembre2012
Analisi delle probabilità
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
Creazione della nuova colonna per il prezzo medio di vendita
prezzo_medio_vendita = volume / sales # Prezzo medio per vendita
Creazione della nuova colonna per l’efficacia degli annunci
efficacia_annunci = sales / listings # Numero di vendite per annuncio
Visualizzazione delle nuove variabili
head(dati[, c("prezzo_medio_vendita", "efficacia_annunci")])
Valori minimi e massimi per le nuove variabili
min(prezzo_medio_vendita) # Minimo del prezzo medio di vendita
max(prezzo_medio_vendita) # Massimo del prezzo medio di vendita
min(efficacia_annunci) # Minimo dell'efficacia degli annunci
max(efficacia_annunci) # Massimo dell'efficacia degli annunci
Analisi dei risultati
Prezzo medio di vendita:
○ 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 degli 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.
Installazione e caricamento del pacchetto dplyr
install.packages("dplyr") # Installazione del pacchetto (se non già installato)
library(dplyr) # Caricamento del pacchetto
Statistiche condizionate per città
summary_citta = dati %>%
group_by(city) %>%
summarise(
media_sales = mean(sales), # Media delle vendite
sd_sales = sd(sales), # Deviazione standard delle vendite
media_volume = mean(volume), # Media del volume
sd_volume = sd(volume), # Deviazione standard del volume
media_median_price = mean(median_price), # Media del prezzo mediano
sd_median_price = sd(median_price) # Deviazione standard del prezzo mediano
)
Statistiche condizionate per anno
summary_anno = dati %>%
group_by(year) %>%
summarise(
media_sales = mean(sales), # Media delle vendite
sd_sales = sd(sales), # Deviazione standard delle vendite
media_volume = mean(volume), # Media del volume
sd_volume = sd(volume), # Deviazione standard del volume
media_median_price = mean(median_price), # Media del prezzo mediano
sd_median_price = sd(median_price) # Deviazione standard del prezzo mediano
)
Statistiche condizionate per mese
summary_mese = dati %>%
group_by(month) %>%
summarise(
media_sales = mean(sales), # Media delle vendite
sd_sales = sd(sales), # Deviazione standard delle vendite
media_volume = mean(volume), # Media del volume
sd_volume = sd(volume), # Deviazione standard del volume
media_median_price = mean(median_price), # Media del prezzo mediano
sd_median_price = sd(median_price) # Deviazione standard del prezzo mediano
)
Visualizzazione delle tabelle riassuntive
summary_citta # Statistiche per città
summary_anno # Statistiche per anno
summary_mese # Statistiche per mese
8. Creazione di visualizzazioni con ggplot2
Grafico per le vendite per città
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()
Grafico per le vendite per anno
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()
Grafico per le vendite per mese
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()
Somma delle vendite per mese e città
sales_by_city_month = aggregate(sales ~ city + month, data = dati, sum)
Grafico a barre per confrontare le vendite totali per mese e
città
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()
Somma delle vendite per anno, mese e città
sales_by_year_month = aggregate(sales ~ year + month + city, data = dati, sum)
Creazione di una nuova colonna ‘anno_mese’ che combina ‘year’ e
‘month’
sales_by_year_month$anno_mese = as.Date(paste(sales_by_year_month$year, sales_by_year_month$month, "01", sep = "-"))
Grafico a linee per l’andamento delle vendite nel tempo
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") +
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: La città si distingue per le migliori
performance in termini di media delle vendite e prezzo mediano delle
case.
- Wichita Falls: 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 potrebbe rappresentare un’opportunità per
acquirenti interessati a mercati più prevedibili.
Stagionalità del Mercato
- Il mercato immobiliare analizzato presenta una chiara stagionalità:
- Primavera/Estate (aprile-agosto): Picchi di
vendite, probabilmente legati a una maggiore mobilità e a condizioni
climatiche favorevoli.
- Inverno (gennaio, dicembre): Calo significativo
delle vendite, coerente con la stagionalità tipica del settore
immobiliare.
- Strategie suggerite:
- Pianificare le campagne di marketing e le attività promozionali nei
mesi primaverili ed estivi.
- Adottare strategie per mitigare il calo nei mesi invernali, come
sconti o incentivi.
Crescita Annuale
- 2014: L’anno con le migliori performance,
registrando una media delle vendite significativamente più alta rispetto
agli anni precedenti.
- Tendenza dal 2011 al 2014:
- Crescita costante delle vendite con un incremento medio annuo del
25%.
- 2011: Il calo 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], che rappresenta quasi il 39% del
totale.
- Le fasce di vendita più alte ([250, 450]) sono meno
rappresentate, suggerendo:
- 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. Questi dati
suggeriscono 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.