data <- read.csv("realestate_texas.csv", stringsAsFactors = FALSE)

head(data)
##       city year month sales volume median_price listings months_inventory
## 1 Beaumont 2010     1    83 14.162       163800     1533              9.5
## 2 Beaumont 2010     2   108 17.690       138200     1586             10.0
## 3 Beaumont 2010     3   182 28.701       122400     1689             10.6
## 4 Beaumont 2010     4   200 26.819       123200     1708             10.6
## 5 Beaumont 2010     5   202 28.833       123100     1771             10.9
## 6 Beaumont 2010     6   189 27.219       122800     1803             11.1
str(data)
## 'data.frame':    240 obs. of  8 variables:
##  $ city            : chr  "Beaumont" "Beaumont" "Beaumont" "Beaumont" ...
##  $ year            : int  2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
##  $ month           : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ sales           : int  83 108 182 200 202 189 164 174 124 150 ...
##  $ volume          : num  14.2 17.7 28.7 26.8 28.8 ...
##  $ median_price    : num  163800 138200 122400 123200 123100 ...
##  $ listings        : int  1533 1586 1689 1708 1771 1803 1857 1830 1829 1779 ...
##  $ months_inventory: num  9.5 10 10.6 10.6 10.9 11.1 11.7 11.6 11.7 11.5 ...
summary(data)
##      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

Analisi delle variabili

Nel dataset fornito, le variabili sono suddivise in quantitative e qualitative, come di seguito descritto:

Variabili Qualitative

  • city
    • Tipo di variabile: Qualitativa (nominale)
    • Scala: Nominale
    • Descrizione: Rappresenta il nome della città. Non ha un ordine intrinseco e serve solo per identificare in quale città si trovano i dati.
    • Analisi possibile: Potremmo utilizzare questa variabile per fare un’analisi delle differenze tra le città, ad esempio confrontando il numero di vendite o il prezzo mediano delle abitazioni.

Variabili Quantitative

Discrete

  • year
    • Tipo di variabile: Quantitativa (discreta)
    • Scala: Ordinale (discreta)
    • Descrizione: Rappresenta l’anno in cui sono state effettuate le vendite. Poiché questa variabile è discreta (annuale), può essere utilizzata per analizzare come le metriche immobiliari sono cambiate nel tempo.
    • Analisi possibile: Questa variabile è utile per fare analisi di trend nel tempo. Ad esempio, possiamo analizzare come le vendite siano cambiate anno per anno.
  • month
    • Tipo di variabile: Quantitativa (discreta)
    • Scala: Ordinale (discreta)
    • Descrizione: Rappresenta il mese in cui sono state effettuate le vendite. Essendo un valore numerico che ripete ciclicamente ogni anno (da 1 a 12), possiamo considerarlo un dato discreto.
    • Analisi possibile: Questa variabile può essere usata per analizzare le variazioni stagionali nei dati. Ad esempio, possiamo esplorare se ci sono mesi con vendite più elevate o bassi prezzi mediani rispetto ad altri mesi.

Continue

  • sales
    • Tipo di variabile: Quantitativa (continua)
    • Scala: Rapporto
    • Descrizione: Rappresenta il numero di vendite effettuate in un dato mese. È una variabile continua che può assumere qualsiasi valore numerico, ma generalmente è un numero intero.
    • Analisi possibile: L’analisi di questa variabile potrebbe riguardare la distribuzione delle vendite, la correlazione con altre variabili come il volume o il prezzo mediano, o la stima delle tendenze di mercato.
  • volume
    • Tipo di variabile: Quantitativa (continua)
    • Scala: Rapporto
    • Descrizione: Indica il volume totale delle vendite in milioni di dollari. Questa è una variabile continua che può essere utilizzata per eseguire analisi simili a quelle fatte per la variabile delle vendite.
    • Analisi possibile: Potremmo analizzare il volume delle vendite in relazione ad altre variabili, ad esempio esplorando come il volume delle vendite si correli con le variazioni di prezzo o con la disponibilità di immobili.
  • median_price
    • Tipo di variabile: Quantitativa (continua)
    • Scala: Rapporto
    • Descrizione: Rappresenta il prezzo mediano delle case vendute. È una variabile continua ed è una misura importante per analizzare l’andamento del mercato immobiliare.
    • Analisi possibile: Può essere analizzata per esplorare le tendenze dei prezzi nel tempo, nonché le variazioni di prezzo a seconda delle città e dei mesi.
  • listings
    • Tipo di variabile: Quantitativa (continua)
    • Scala: Rapporto
    • Descrizione: Rappresenta il numero di immobili in vendita in un dato mese. Anche questa variabile è continua e può essere utilizzata per osservare come l’offerta di immobili influenza le vendite e i prezzi.
    • Analisi possibile: Questa variabile può essere utilizzata per analizzare la relazione tra l’offerta e la domanda di case.
  • months_inventory
    • Tipo di variabile: Quantitativa (continua)
    • Scala: Rapporto
    • Descrizione: Rappresenta il tempo, in mesi, necessario per vendere tutte le case attualmente in vendita. Indica la “liquidità” del mercato immobiliare.
    • Analisi possibile: Può essere utilizzata per analizzare la velocità di vendita delle abitazioni, utile per valutare se il mercato è più o meno saturo o competitivo in un dato periodo.

Conclusione

Le variabili quantitative e continue, come sales, volume, median_price, listings e months_inventory, sono tutte adatte per analisi numeriche e statistiche, mentre le variabili city, year e month saranno utilizzate per segmentare e fare analisi temporali o geografiche.

library(moments) 
library(knitr)    
## Warning: il pacchetto 'knitr' è stato creato con R versione 4.4.2
indici_posizione_variabilita_forma <- data.frame(
  Variabile = c("sales", "volume", "median_price", "listings", "months_inventory"),
  Media = c(mean(data$sales), mean(data$volume), mean(data$median_price), mean(data$listings), mean(data$months_inventory)),
  Mediana = c(median(data$sales), median(data$volume), median(data$median_price), median(data$listings), median(data$months_inventory)),
  Q1 = c(quantile(data$sales, 0.25), quantile(data$volume, 0.25), quantile(data$median_price, 0.25), quantile(data$listings, 0.25), quantile(data$months_inventory, 0.25)),
  Q3 = c(quantile(data$sales, 0.75), quantile(data$volume, 0.75), quantile(data$median_price, 0.75), quantile(data$listings, 0.75), quantile(data$months_inventory, 0.75)),
  Deviazione_Standard = c(sd(data$sales), sd(data$volume), sd(data$median_price), sd(data$listings), sd(data$months_inventory)),
  Asimmetria = c(skewness(data$sales), skewness(data$volume), skewness(data$median_price), skewness(data$listings), skewness(data$months_inventory)),
  Curtosi = c(kurtosis(data$sales), kurtosis(data$volume), kurtosis(data$median_price), kurtosis(data$listings), kurtosis(data$months_inventory))
)

kable(indici_posizione_variabilita_forma, 
      caption = "Indici di Posizione, Variabilità e Forma per le Variabili Quantitative", 
      align = c('l', 'r', 'r', 'r', 'r', 'r', 'r', 'r'))
Indici di Posizione, Variabilità e Forma per le Variabili Quantitative
Variabile Media Mediana Q1 Q3 Deviazione_Standard Asimmetria Curtosi
sales 192.29167 175.5000 127.0000 247.000 79.651111 0.7181040 2.686824
volume 31.00519 27.0625 17.6595 40.893 16.651447 0.8847420 3.176987
median_price 132665.41667 134500.0000 117300.0000 150050.000 22662.148687 -0.3645529 2.377038
listings 1738.02083 1618.5000 1026.5000 2056.000 752.707756 0.6494982 2.208210
months_inventory 9.19250 8.9500 7.8000 10.950 2.303669 0.0409753 2.825553

  • La media rappresenta il valore centrale per ogni variabile, mentre la mediana offre una misura robusta, meno influenzata dai valori estremi. Ad esempio, la variabile sales ha una media di 192.29, ma la mediana è più bassa (175.50), suggerendo che i dati siano leggermente inclinati verso valori più alti.

  • I quartili (Q1 e Q3) mostrano la distribuzione dei dati: per sales, il primo quartile è 127, mentre il terzo quartile è 247, indicando una distribuzione piuttosto ampia.

  • La deviazione standard misura la variabilità dei dati. Ad esempio, per sales, la deviazione standard è 79.65, indicando una certa variabilità attorno alla media.

  • L’asimmetria misura la simmetria della distribuzione dei dati. Un valore positivo indica una distribuzione inclinata verso destra. Ad esempio, la variabile volume ha un’asimmetria di 0.88, suggerendo una leggera inclinazione verso valori più alti.

  • La curtosi indica la “pesantezza” delle code della distribuzione. Un valore maggiore di 3 indica una distribuzione con code più pesanti rispetto a una normale. Ad esempio, volume ha una curtosi di 3.18, il che indica code più pesanti.

frequenza_city <- table(data$city)

kable(frequenza_city, 
      caption = "Distribuzione di Frequenza per la Variabile 'City'", 
      col.names = c("Città", "Frequenza"), 
      align = c('l', 'r'))
Distribuzione di Frequenza per la Variabile ‘City’
Città Frequenza
Beaumont 60
Bryan-College Station 60
Tyler 60
Wichita Falls 60

Per quanto riguarda la variabile city, che è qualitativa, abbiamo calcolato la distribuzione delle frequenze e possiamo notare come le osservazioni siano equamente distribuite con 60 a testa per ogni città.

cv_sales <- sd(data$sales) / mean(data$sales) * 100
cv_volume <- sd(data$volume) / mean(data$volume) * 100
cv_median_price <- sd(data$median_price) / mean(data$median_price) * 100
cv_listings <- sd(data$listings) / mean(data$listings) * 100
cv_months_inventory <- sd(data$months_inventory) / mean(data$months_inventory) * 100

asimmetria <- indici_posizione_variabilita_forma$Asimmetria

analisi_variabilita_asimmetria <- data.frame(
  Variabile = c("sales", "volume", "median_price", "listings", "months_inventory"),
  Coefficiente_Variazione = c(cv_sales, cv_volume, cv_median_price, cv_listings, cv_months_inventory),
  Asimmetria = asimmetria
)

variabili_ord_cv <- analisi_variabilita_asimmetria[order(-analisi_variabilita_asimmetria$Coefficiente_Variazione), ]
variabili_ord_asimmetria <- analisi_variabilita_asimmetria[order(-analisi_variabilita_asimmetria$Asimmetria), ]

variabili_ord_cv
##          Variabile Coefficiente_Variazione  Asimmetria
## 2           volume                53.70536  0.88474203
## 4         listings                43.30833  0.64949823
## 1            sales                41.42203  0.71810402
## 5 months_inventory                25.06031  0.04097527
## 3     median_price                17.08218 -0.36455288
variabili_ord_asimmetria
##          Variabile Coefficiente_Variazione  Asimmetria
## 2           volume                53.70536  0.88474203
## 1            sales                41.42203  0.71810402
## 4         listings                43.30833  0.64949823
## 5 months_inventory                25.06031  0.04097527
## 3     median_price                17.08218 -0.36455288

La variabile volume è quella che presenta sia il coefficiente di variazione più alto sia il valore di assimetria maggiore. Questo significa che la variabile ha una grande dispersione rispetto alla media e che i valori più alti tendono ad essere meno frequenti, ma con un influenza significativa sulla distribuzione allungadola verso destra.

library(ggplot2)  
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(ineq)     

classi_sales <- cut(data$sales, 
                    breaks = quantile(data$sales, probs = 0:20 / 20, na.rm = TRUE), 
                    include.lowest = TRUE, 
                    labels = paste("Class", 1:20))

frequenza_sales <- table(classi_sales)

frequenza_sales
## classi_sales
##  Class 1  Class 2  Class 3  Class 4  Class 5  Class 6  Class 7  Class 8 
##       13       11       13       11       13       13       10       13 
##  Class 9 Class 10 Class 11 Class 12 Class 13 Class 14 Class 15 Class 16 
##       12       11       14       11       11       12       12       13 
## Class 17 Class 18 Class 19 Class 20 
##       11       12       12       12
df_frequenza_sales <- as.data.frame(frequenza_sales)

colnames(df_frequenza_sales) <- c("Classi", "Frequenza")

ggplot(df_frequenza_sales, aes(x = Classi, y = Frequenza)) +
  geom_bar(stat = "identity", fill = "skyblue", color = "black") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(title = "Distribuzione di Frequenza per 'sales'",
       x = "Classi di 'sales'", y = "Frequenza")

gini_sales <- Gini(data$sales)

gini_sales
## [1] 0.2310975

L’indice di Gini per la variabile ‘sales’ è pari a 0.2311. Questo valore indica una distribuzione relativamente equa dei dati, ma con una certa disuguaglianza.

prob_beaumont <- sum(data$city == "Beaumont") / nrow(data)

cat(sprintf("La probabilità che, estratta una riga a caso, esca la città Beaumont è di %.2f%%\n", prob_beaumont * 100))
## La probabilità che, estratta una riga a caso, esca la città Beaumont è di 25.00%
prob_luglio <- sum(data$month == 7) / nrow(data)

cat(sprintf("La probabilità che, estratta una riga a caso, esca il mese di Luglio è di %.2f%%\n", prob_luglio * 100))
## La probabilità che, estratta una riga a caso, esca il mese di Luglio è di 8.33%
prob_dicembre_2012 <- sum(data$year == 2012 & data$month == 12) / nrow(data)

cat(sprintf("La probabilità che, estratta una riga a caso, esca il mese di Dicembre 2012 è di %.2f%%\n", prob_dicembre_2012 * 100))
## La probabilità che, estratta una riga a caso, esca il mese di Dicembre 2012 è di 1.67%
data$avg_price <- data$volume / data$sales

data$efficacy <- data$listings / data$sales

options(width = 1000)

head(data)
##       city year month sales volume median_price listings months_inventory avg_price  efficacy
## 1 Beaumont 2010     1    83 14.162       163800     1533              9.5 0.1706265 18.469880
## 2 Beaumont 2010     2   108 17.690       138200     1586             10.0 0.1637963 14.685185
## 3 Beaumont 2010     3   182 28.701       122400     1689             10.6 0.1576978  9.280220
## 4 Beaumont 2010     4   200 26.819       123200     1708             10.6 0.1340950  8.540000
## 5 Beaumont 2010     5   202 28.833       123100     1771             10.9 0.1427376  8.767327
## 6 Beaumont 2010     6   189 27.219       122800     1803             11.1 0.1440159  9.539683
max(data$avg_price)
## [1] 0.2132339
min(data$avg_price)
## [1] 0.0970102
max(data$efficacy)
## [1] 19.94406
min(data$efficacy)
## [1] 2.583127

Ho aggiunto 2 nuove colonne al dataset: Avg_price: calcoalta come il rapporto tra volume e sales. Indica il prezzo medio ponderato degli immobili in ciascun mese. Osservando il valore massimo (0.21) e il valore minimo (0.09) possiamo notare una variazione significativa. Grazie al prezzo medio possiamo ottenere varie informazioni, ad esempio: se il prezzo medio è più alto in mesi con un numero ridotto di vendite, potrebbe significare che sono state vendute delle case ad un prezzo molto alto; Efficacy: calcolata come il rapporto tra listenings e sales. Indica l’efficenza degli annunci di vendita. Valori alti di questa colonna indicano una bassa efficacia degli annunci, poiché indica un numero alto di annunci rispetto alle vendite effettuate. Anche questa colonna presenta una variazione significativa tra il valore massimo (19.9) e il valore minimo (2.58).

summary_by_year <- data %>%
  group_by(year) %>%
  summarise(
    mean_sales = mean(sales, na.rm = TRUE),
    sd_sales = sd(sales, na.rm = TRUE),
    mean_volume = mean(volume, na.rm = TRUE),
    sd_volume = sd(volume, na.rm = TRUE),
    mean_median_price = mean(median_price, na.rm = TRUE),
    sd_median_price = sd(median_price, na.rm = TRUE),
    .groups = "drop"
  )

summary_by_city <- data %>%
  group_by(city) %>%
  summarise(
    mean_sales = mean(sales, na.rm = TRUE),
    sd_sales = sd(sales, na.rm = TRUE),
    mean_volume = mean(volume, na.rm = TRUE),
    sd_volume = sd(volume, na.rm = TRUE),
    mean_median_price = mean(median_price, na.rm = TRUE),
    sd_median_price = sd(median_price, na.rm = TRUE),
    .groups = "drop"
  )

summary_by_month <- data %>%
  group_by(year, month) %>%
  summarise(
    mean_sales = mean(sales, na.rm = TRUE),
    sd_sales = sd(sales, na.rm = TRUE),
    mean_volume = mean(volume, na.rm = TRUE),
    sd_volume = sd(volume, na.rm = TRUE),
    mean_median_price = mean(median_price, na.rm = TRUE),
    sd_median_price = sd(median_price, na.rm = TRUE),
    .groups = "drop"
  )

summary_by_city
## # A tibble: 4 × 7
##   city                  mean_sales sd_sales mean_volume sd_volume mean_median_price sd_median_price
##   <chr>                      <dbl>    <dbl>       <dbl>     <dbl>             <dbl>           <dbl>
## 1 Beaumont                    177.     41.5        26.1      6.97           129988.          10105.
## 2 Bryan-College Station       206.     85.0        38.2     17.2            157488.           8852.
## 3 Tyler                       270.     62.0        45.8     13.1            141442.           9337.
## 4 Wichita Falls               116.     22.2        13.9      3.24           101743.          11320.
summary_by_year
## # A tibble: 5 × 7
##    year mean_sales sd_sales mean_volume sd_volume mean_median_price sd_median_price
##   <int>      <dbl>    <dbl>       <dbl>     <dbl>             <dbl>           <dbl>
## 1  2010       169.     60.5        25.7      10.8           130192.          21822.
## 2  2011       164.     63.9        25.2      12.2           127854.          21318.
## 3  2012       186.     70.9        29.3      14.5           130077.          21432.
## 4  2013       212.     84.0        35.2      17.9           135723.          21708.
## 5  2014       231.     95.5        39.8      21.2           139481.          25625.
summary_by_month
## # A tibble: 60 × 8
##     year month mean_sales sd_sales mean_volume sd_volume mean_median_price sd_median_price
##    <int> <int>      <dbl>    <dbl>       <dbl>     <dbl>             <dbl>           <dbl>
##  1  2010     1       105.     36.6        15.9      6.92            135450          33736.
##  2  2010     2       122.     40.3        19.2      8.54            131100          31406.
##  3  2010     3       189.     43.6        28.0      7.30            122325          24973.
##  4  2010     4       229      64.0        33.8     13.3             128300          18899.
##  5  2010     5       233.     58.8        35.9     13.2             130125          20122.
##  6  2010     6       216.     71.4        34.5     13.6             133275          15109.
##  7  2010     7       178      62.5        26.7     12.1             127225          23352.
##  8  2010     8       184.     45          28.6     10.7             131100          23883.
##  9  2010     9       150.     47.2        22.2      7.23            125825          20740.
## 10  2010    10       141.     45.7        21.8      8.07            134150          25059.
## # ℹ 50 more rows
ggplot(data, aes(x = city, y = median_price)) +
  geom_boxplot(fill = "lightblue", color = "blue") +
  labs(title = "Distribuzione del prezzo mediano tra le città", 
       x = "Città", y = "Prezzo mediano") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ggplot(data, aes(x = factor(month), y = sales, fill = city)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Totale delle vendite per mese e città", 
       x = "Mese", y = "Totale vendite") +
  scale_x_discrete(labels = c("Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic")) +
  theme_minimal()

data$date <- as.Date(paste(data$year, data$month, "01", sep = "-"))

ggplot(data, aes(x = date, y = volume, color = city, group = city)) +
  geom_line(size = 1) +
  labs(title = "Andamento del volume delle vendite per città (2010-2014)", 
       x = "Data", y = "Volume delle vendite") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_x_date(date_labels = "%Y", date_breaks = "12 months") +
  scale_color_discrete(name = "Città")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.

###

Conclusioni sull’analisi del mercato immobiliare in texas

Differenze tra città Le analisi hanno evidenziato variazioni sostanziali nei prezzi mediani delle abitazioni tra le città. Alcune città hanno mostrato una distribuzione dei prezzi significativamente più alta, indicando mercati più costosi o richiesti.

I volumi delle vendite hanno mostrato un andamento stabile ma con differenze nei picchi di vendita, legati a fattori locali o stagionali.

Tendenze temporali I dati hanno mostrato una crescita generale nel volume delle vendite tra il 2010 e il 2014, suggerendo un aumento dell’attività di mercato.

Le analisi mensili hanno rivelato una stagionalità delle vendite, con picchi in determinati mesi dell’anno.

Relazioni tra variabili Le relazioni tra prezzo mediano, volume delle vendite e città suggeriscono che i mercati con prezzi più alti non sempre presentano volumi di vendita maggiori.

L’analisi condizionata ha confermato che il prezzo mediano è più influenzato da fattori locali rispetto al volume delle vendite.

Raccomandazioni

Gli investitori dovrebbero considerare le differenze significative tra le città per ottimizzare i ritorni sugli investimenti. Le città con prezzi mediani più bassi ma con volumi di vendita in crescita potrebbero rappresentare mercati emergenti con potenziale di sviluppo.

La stagionalità delle vendite suggerisce che periodi specifici dell’anno, come la primavera, potrebbero essere ideali per pianificare campagne di vendita o acquisto.

Per comprendere meglio le dinamiche del mercato, sarebbe utile implementare un monitoraggio continuo delle variabili analizzate e integrare altre metriche, come i tassi di interesse o la crescita demografica delle città.