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

Media e Mediana

media_sales = mean(sales)
mediana_sales = median(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

Media e Mediana

media_volume = mean(volume)
mediana_volume = median(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

Media e Mediana

media_median_price = mean(median_price)
mediana_median_price = median(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

Media e Mediana

media_listings = mean(listings)
mediana_listings = median(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

Media e Mediana

media_months_inventory = mean(months_inventory)
mediana_months_inventory = median(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

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)  # 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

la sua struttura simmetrica e uniforme nei dati temporali e geografici.

6. Creazione di nuove variabili

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.

○ L’efficacia più bassa potrebbe indicare città, mesi o tipi di annunci meno performanti.

7. Analisi condizionata

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()

Boxplot per il confronto della distribuzione del prezzo mediano tra le città

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")

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

  1. 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.
  2. Incremento della domanda nei mercati deboli:
    • Introdurre incentivi o promozioni specifiche a Wichita Falls per attrarre acquirenti e stimolare il mercato locale.
  3. 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.
  4. 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.