Analizzo le variabili presenti nel dataset Real Texas
Estate.csv
L’obiettivo è identificare il tipo di ciascuna variabile, descriverne la
natura statistica e commentare sul tipo di analisi applicabile.
# Carico il dataset
dati <- read.csv("realestate_texas.csv")
# Visualizzo le prime 5 righe per capire la struttura
head(dati,5)
## 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
Il data set contiene: 240 osservazioni di 8 variabili.
str(dati) #mostro la struttura dei dati
## '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 ...
dim(dati) #mostro la dimensione del dataset n.righe e n.colonne
## [1] 240 8
Nella seguente tabella sono riportate le variabili presenti nel dataset, la loro tipologia statistica e il tipo di analisi che si può eseguire.
Variabile CITY: (città di riferimento)
Eseguirò le frequenze assolute e relative per generare le tabelle di contingenza. Valuterò con la moda qual è la città che ha più osservazioni nel dataset.
Variabili YEAR:
Sarà utilizzata come time series per vedere come si comportano le altre
variabili nel tempo.
Variabile MONTH:
Userò frequenze assolute e relative per individuare la stagionalità e
analizzare pattern mensili nelle vendite e nei prezzi.
VARIABILI: SALES , VOLUME e MEDIAN_PRICE :
Valuterò tutti gli indici di posizione e dispersione. Controllerò il
numero totale di vendite per ogni anno, la media, la vendità
maggiore/minore, si potrà controllare con l’utilizzo di city anche dove
è stata registrata la vendita maggiore e minore e il numero di più alto
di vendite. Valutare l’utilizzo di media geometrica.
VARIABILI: LISTING E MONTHS_INVENTORY:
Valuterò gli indici di posizione e dispersione per identidicare le zone
dove ci sono più annunci attivi. Si può effettuare un calcolo di
probabilità per verificare qual è la probabilità che per una x città
tutte le inserzioni vengano vendute nell’arco di x mesi.
#dataframe con nomi e tipi di variabili
tabella_var <- data.frame(
Variabile = c("city","year","month","sales","volume","median_price","listings","months_inventory"),
Tipo = c("Qualitativa nominale",
"Quantitativa continua",
"Qualitativa nominale",
"Quantitativa discreta",
"Quantitativa continua (scala di rapporti)",
"Quantitativa continua(scala di rapporti)",
"Quantitativa discreta",
"Quantitativa continua (scala di rapporti)"),
Trattare_come = c("/",
"Qualitativa ordinale",
"Codifica in numeri",
"/","/","/","/","/"),
Indici_posizione = c("Moda",
"Mediana",
"Moda",
"Media, Mediana",
"Media, Mediana",
"Media, Mediana",
"Media, Mediana",
"Media, Mediana"),
Indici_dispersione = c("Frequenze, percentuali",
"Range, Quartili",
"Frequenze, percentuali",
"Varianza, Deviazione standard, Range",
"Varianza, Deviazione standard, Range",
"Varianza, Deviazione standard, Range",
"Varianza, Deviazione standard, Range",
"Varianza, Deviazione standard, Range"),
Analisi = c("Grafici a barre, tabelle di contingenza",
"Analisi temporali, trend, serie storiche",
"Analisi temporali, trend, serie stagionali",
"Analisi descrittive, regressione, correlazione",
"Analisi descrittive, regressione, correlazione",
"Analisi temporali, regressione, trend di prezzo",
"Analisi descrittive, correlazione con sales",
"Analisi temporali, domanda/offerta")
)
# Mostro la tabella
knitr::kable(tabella_var, caption = "Tabella 1: Tipologia, indici e analisi per ciascuna variabile")
| Variabile | Tipo | Trattare_come | Indici_posizione | Indici_dispersione | Analisi |
|---|---|---|---|---|---|
| city | Qualitativa nominale | / | Moda | Frequenze, percentuali | Grafici a barre, tabelle di contingenza |
| year | Quantitativa continua | Qualitativa ordinale | Mediana | Range, Quartili | Analisi temporali, trend, serie storiche |
| month | Qualitativa nominale | Codifica in numeri | Moda | Frequenze, percentuali | Analisi temporali, trend, serie stagionali |
| sales | Quantitativa discreta | / | Media, Mediana | Varianza, Deviazione standard, Range | Analisi descrittive, regressione, correlazione |
| volume | Quantitativa continua (scala di rapporti) | / | Media, Mediana | Varianza, Deviazione standard, Range | Analisi descrittive, regressione, correlazione |
| median_price | Quantitativa continua(scala di rapporti) | / | Media, Mediana | Varianza, Deviazione standard, Range | Analisi temporali, regressione, trend di prezzo |
| listings | Quantitativa discreta | / | Media, Mediana | Varianza, Deviazione standard, Range | Analisi descrittive, correlazione con sales |
| months_inventory | Quantitativa continua (scala di rapporti) | / | Media, Mediana | Varianza, Deviazione standard, Range | Analisi temporali, domanda/offerta |
Calcola Indici di posizione, variabilità e forma per tutte le variabili per le quali ha senso farlo, per le altre crea una distribuzione di frequenza. Infine, commenta tutto brevemente.
GLI INDICI DI POSIZIONE CALCOLATI PER LE VARIABILI
:
SALES, VOLUME , MEDIAN_PRICE, LISTING, MONTHS_INVENTORY
LA VARIABILITA’ CALCOLATA PER LE VARIABILI:
SALES, VOLUME, MEDIAN_PRICE, LISTING, MONTHS_INVENTORY E CITY
Per la variabile city ho calcolato l’Indice di Gini perchè è una
variabile categorica nominale
LA FORMA DI DISTRIBUZIONE CALCOLATA PER LE VARIABILI:
SALES, VOLUME, MEDIAN_PRICE, LISTING E MONTHS_INVENTORY
La forma di distribuzione ha senso svolgerla per variabili
quantitative (discrete o continue).
LA DISTRIBUZIONE DI FREQUENZA CALCOLATA PER LE VARIABILI:
CITY, YEAR. MONTHS.
Potrebbe essere svolta per tutte le variabili. Se le osservazioni
sono molte come nel nostro database la distribuzione di frequenze genera
tabelle molto lunghe e difficile lettura.
COMMENTO:
CITY
La variabilie city ha 4 città e tutte le modalità hanno la stessa frequenza assoluta 60 osservazioni per ogni città (tetramodale). Il valore dell’indice di Gini normalizzato è 1 , le unità statistiche sono perfettamente bilanciate tra le diverse città. GINI=1 significa eterogeneità’ , gruppo ben distribuito e senza prevalenza di una città sulle altre.
MONTH e YEAR
Le variabili possono essere analizzate tramite frequenze assolute e
relative per valutare come cambia il dataset nel tempo.
VARIABILI: SALES, VOLUME, MEDIAN_PRICE, LISTINGS, MONTH_INVENTORY
Sales: Gli indici di posizione mostrano che la MEDIA > MEDIANA. La media (192.3 )è maggiore della mediana(175.5) questo indica che nella parte destra della distribuzione ci sono pochi valori alti che spostano la media verso destra. Infatti la skewness è di 0.71 e indica una asimmetria positiva(a dx). La curtosi (gamma 4 = 0 ) è più vicino a zero. quindi la curva ha un ampiezza simile a quella di una distribuzione normale (mesocurtica).
Volume: La variabile volume (vendite totali) mostra una
variabilità alta( Coefficiente di Variazione del 53.7%).La distribuzione
è caratterizzata da una forte asimmetria positiva (a destra), Skewness
di 0.885. Infatti la media (31.01) è più alta della mediana (27.06) e
della moda (14.00).Questo significa che la maggior parte delle
osservazioni (il 75%, Q3) si concentra su valori inferiori a 40.89M, con
il valore più frequente (Moda) a soli 14M. I valori che stanno nella
porzione destra della curva (sopra il 75%,Q4,Q5) arrivano fino a 83.54M
(max) , questi valori spostano la media verso destra, distanziandola dal
centro. La curtosi (0.177) è molto vicina a 0, questo indica che la
punta della forma è simile a quella di una distribuzione normale
(mesocurtica).
Median_price: i prezzi medi sembrano stabili
La variabile median_price (quantitativa continua) mostra una variabilità
bassa (CV 17.1%), questo indica che i prezzi sono abbastanza concentrati
attorno alla media. La distribuzione ha una leggera asimmetria negativa,
la coda tende a sinistra. (infatti Skewness = -0.365; media <
mediana), la maggior parte dei prezzi si trova nella fascia alta
(intorno a 130ml-134ml), ma con una coda di pochi valori più bassi. La
forma è platicurtica (Kurtosis = -0.623), la curva è leggermente più
piatta rispetto a una distribuzione normale.
Listing: gli annunci sono disomogenei, non ben
equilibrati
In qeusta variabile i osserva una asimmetria positiva (a destra). Questo
è evidenziato sia dal valore di Skewness (0.649) sia dal fatto che la
media (1738.02) è > della mediana (1618.5). Ciò indica che la maggior
parte delle osservazioni si concentra nella parte sinistra della
distribuzione (valori più bassi), ma la presenza di pochi valori molto
elevati sposta la media verso destra. La variabilità è molto alta. il
coef di variabilità (cv) è al 43.3% (superiore al 30%), possiamo
concludere che i dati sono molto dispersi e poco concentrati attorno
alla media. Inoltre, la kurtosi indica una distribuzione platicurtica,
con una forma più schiacciata e piatta rispetto alla distribuzione
normale.
Month_inventory: con una skewness di 0.041 la distribuzione è quasi perfettamente simmetrica (distr. normale). le osservazioni sufficientemente ben distribuite.
Dall’analisi descrittiva di questa variabile possiamo notare che in media (mean = 9.19) le inserzioni attive vengono vendute in 9 mesi.La media è leggermente maggiore della mediana e della moda, questo dato indica che la maggior parte dei lavori è concentrata nella porzione sinistra della curva. quindi ci sono molte più osservazioni con valori più bassi ( min 3.4 = in 3 mesi sono state vendute tutte le inserzioni). Sembra che la distribuzione ha comunque un asimmetria positiva perchè ci sono pochi valori alti ( Q3 10,95 e Max 14.9) che spostano la media verso la parte destra della distribuzione (significa che in alcuni periodi o luoghi il totale delle inserzioni ci hanno messo quasi più di 1 anno per esser vendute tutte). Concludiamo che la distribuzione ha una leggerissima asimmetria positiva (0.041). Però 0.041 è un valore molto vicino a 0 quindi a una distribuzione normale (media=mediana=moda). Possiamo concludere che i dati sono omogenei e distrubuiti quasi perfettamente simmetrica .I n generale le inserzioni vengono vendute abbastanza rapidamente, possiamo notarlo dalla varianza e dal CV perchè è relativamente bassa (CV 25%, <30%). Similmente la deviazione standard, non è elevata e rispetto alla media i dati sembrano non essere molto dispersi. Infine la curtosi , con un valore vicino allo 0 ci indica che è leggermente platicurtica ma assomiglia molto alla distribuzione mesocurtica della tipica distribuzione normale. In conclusione, le inserzioni totali (in base al periodo o luogo) sono abbastanza distribuite e vengono vendute entro 1 anno dalla pubblicazione dell’annuncio.
# INDICI DI POSIZIONE per le varibili SALES, VOLUME , MEDIAN_PRICE, LISTING, MONTHS_INVENTORY
#lascio la funzione moda come commento ma non va calcolata in questo caso
# Funzione per calcolare la moda
#moda_fun <- function(x) {
#moda_value <- names(table(x))[which.max(table(x))]
#return(moda_value)}
# Funzione principale per gli indici di posizione
pos_index <- function(x) {
quant <- quantile(x,na.rm=T)
return(c(Media=round(mean(x, na.rm=T),2),
Mediana=round(median(x, na.rm=T),2),
#Moda= moda_fun(x), #uso la funzione precedentemente creata
Min=round(quant[1],2), #indicizzo dentro quant
Q1= round(quant[2],2),
Q3= round(quant[4],2), #ho tolto la moda- indice 4 corrisponde a Q3
Max=round(quant[5],2)))}
# Calcolo indici posizione usando la funzione pos_index e sapply
#Creo un vettore c con i nomi e i valori da usare con sapply
var_quanti <- c('sales','volume','median_price','listings','months_inventory')
indici_posizione_var <-sapply(dati[var_quanti],pos_index) #da "dati" prendo il vettore "c" e si applica la funz. pos_index
#Trasposizione delle righe con le colonne, posiziono le variabili sulle colonne
tab_index_pos <-as.data.frame(t(indici_posizione_var))
#uso kable
tab_index_pos %>%
knitr::kable(caption="Tabella indici di posizione per le variabili quantitative di interesse", digits=2, align='c')
| Media | Mediana | Min.0% | Q1.25% | Q3.75% | Max.100% | |
|---|---|---|---|---|---|---|
| sales | 192.29 | 175.50 | 79.00 | 127.00 | 247.00 | 423.00 |
| volume | 31.01 | 27.06 | 8.17 | 17.66 | 40.89 | 83.55 |
| median_price | 132665.42 | 134500.00 | 73800.00 | 117300.00 | 150050.00 | 180000.00 |
| listings | 1738.02 | 1618.50 | 743.00 | 1026.50 | 2056.00 | 3296.00 |
| months_inventory | 9.19 | 8.95 | 3.40 | 7.80 | 10.95 | 14.90 |
# variabilità per SALES, VOLUME , MEDIAN_PRICE, LISTING, MONTHS_INVENTORY + Gini index per variabile City.
#creo le funzioni per calcolare gli indici di variabilità - deviazione standard e interquartile range (IQR) - coefficiente di variabilità
#funzione per il coefficiente di variazione CV
cv_fun <- function(x) {
# Controlla per la divisione per zero e gestisce NA
mu <- mean(x, na.rm = TRUE)
sigma <- sd(x, na.rm = TRUE)
if (is.na(mu) || mu == 0) return(NA)
return(round((sigma / mu) * 100, 2))} # ritorna in percentuale
#funzione per indici di variabilità
var_index <-function(x){
dev_st <- sd(x,na.rm = T)
data_range <- max(x,na.rm=T) - min(x,na.rm = T)
iqr_range <-IQR(x, na.rm=T)
return(c( D_stand =round(sd(x,na.rm=T),2),
Range=round(max(x,na.rm=T) - min(x,na.rm=T),2),
IQR=round(IQR(x,na.rm=T),2),
CV=cv_fun(x) ))}
#Funzione per calcolare indice di Gini normalizzato
gini_normalized_fun <- function(x) {
frequenze_relative <- prop.table(table(x))
xx <- length(unique(x))
# Gestione se k <= 1 (Gini non è definito)
if (xx <= 1) return(NA)
# Calcolo
gini_non_norm <- 1 - sum(frequenze_relative^2)
gini_norm <- gini_non_norm / ((xx - 1) / xx)
return(round(gini_norm, 2))
}
### CALCOLO DELLA VARIABILITA' e TABELLE
#var_quanti <-c("sales", "volume", "median_price", "listings", "months_inventory") #giò definito prima riporto il vettore come commento
tab_Variability <- as.data.frame(t(sapply(dati[var_quanti],var_index)))
knitr::kable( tab_Variability,caption= " INDICI DI VARIABILITA'", digits = 2, align='c')
| D_stand | Range | IQR | CV | |
|---|---|---|---|---|
| sales | 79.65 | 344.00 | 120.00 | 41.42 |
| volume | 16.65 | 75.38 | 23.23 | 53.71 |
| median_price | 22662.15 | 106200.00 | 32750.00 | 17.08 |
| listings | 752.71 | 2553.00 | 1029.50 | 43.31 |
| months_inventory | 2.30 | 11.50 | 3.15 | 25.06 |
#BOXPLOT MOSTRATI NELL'ESERCIZIO 9
# Calcolo dell'indice di Gini solo per la variabile city
gini_city_val <- gini_normalized_fun(dati$city)
# tabella Gini per city
tab_gini <- data.frame(Variabile = "City", "Gini normalizzato" = gini_city_val)
knitr::kable(tab_gini, caption = "Indice di Gini Normalizzato per Variabile City",align = 'c')
| Variabile | Gini.normalizzato |
|---|---|
| City | 1 |
#FUNZIONI PER CALCOLARE LA FORMA DELLA DISTRIBUZIONE E RELATIVI CALCOLI E PLOT
# variabili utilizzate: SALES, VOLUME , MEDIAN_PRICE, LISTING, MONTHS_INVENTORY
#creo funzioni per calcolo della forma:(funziona solo con pacchetto Moments! runnato all'inizio dello script)
forma_index <-function(x) {
asimmetria <- skewness(x,na.rm=T)
curtosi <- kurtosis(x,na.rm=T) -3 # -3 per calcolare la cursoti in eccesso e calcolare il valore partendo dallo zero.
return(c( Asimmetria=round(asimmetria,3),
Curtosi=round(curtosi,3)))}
#CALCOLO DELLA FORMA E TABELLE
tab_forma <- as.data.frame(t(sapply(dati[var_quanti], forma_index)))
knitr::kable( tab_forma, caption= "Forma di distribuzione- asimmetria e curtosi",align="c")
| Asimmetria | Curtosi | |
|---|---|---|
| sales | 0.718 | -0.313 |
| volume | 0.885 | 0.177 |
| median_price | -0.365 | -0.623 |
| listings | 0.649 | -0.792 |
| months_inventory | 0.041 | -0.174 |
#PLOT CON CICLO FOR DELLE TABELLE PER LE VARIABILI QUANTITATIVE DI INTERESSE.
#vettore delle variabili quantitative riporato come commento, già definito negli script precedenti
#var_quanti <- c( "sales", "volume", "median_price", "listings", "months_inventory")
# Ciclo for per il plot densità per ogni variabile
for (var in var_quanti) {
#Calcolo della media e mediana per il plot
media_val <-mean(dati[[var]],na.rm=T)
mediana_val <-median(dati[[var]],na.rm=T)
asim_val <- round(skewness(dati[[var]], na.rm = TRUE), 2)
# crea il grafico
p<-ggplot(dati,aes(x=.data[[var]])) +
# Curva densità
geom_density(fill = "lightblue", alpha = 0.5,color = NA) +
# Linea della media rossa tratteggiata
geom_vline(aes(xintercept = media_val,
color = 'Media'),
linetype = 'dashed',
linewidth= 1) +
geom_vline(aes(xintercept = mediana_val,
color = "Mediana"),
linetype = "dotted", linewidth = 1)+
#assegno colori per la legenda
scale_color_manual(name = "Index",
values = c("Media" = "red", "Mediana" = "darkgreen")) +
# Titoli dei grafici
labs(
title = paste("Distribuzione:", var),
subtitle = paste("asimmetria:", asim_val), #contiene calcolo asimmetria
x = var,
y = "densità"
) +
theme_minimal()+
theme(legend.position = "bottom")
# Stampa i grafici
print(p)}
library(knitr)
#result="asis" per evitare i print grezzi
# Funzione per fare le tabelle di frequenza
distr_freq_fun<- function(df,var_nome){
x <- df[[var_nome]]
tab_complete <- table(x)
# Calcolo delle frequenze
assolute <- as.numeric(tab_complete)
relative <- round(prop.table(tab_complete), 3) #arro
# Crea il Data Frame base
tab_freq <- data.frame(Categoria = names(tab_complete),
Assolute = assolute, Relative = relative )
# Se la variabile non è uguale "city" allora aggiungo le cumulate
if (var_nome != "city") {
tab_freq$Cum_Asso <- cumsum(assolute)
tab_freq$Cum_Rel <- round(cumsum(relative), 3)}
# tabella formattata con kable
return(knitr::kable(
tab_freq, caption = paste("Distribuzione di frequenza:", var_nome),
align = "c", format = "markdown"))} # al posto di usare print grezzo
# Vettore con 3 variabili per la tabella
three_vars <- c("city", "year", "month")
# Genera una lista di tabelle e le visualizza
for (v in three_vars) {
print(distr_freq_fun(dati, v))
cat("\n\n")} # spazio tra le tabelle
| Categoria | Assolute | Relative.x | Relative.Freq |
|---|---|---|---|
| Beaumont | 60 | Beaumont | 0.25 |
| Bryan-College Station | 60 | Bryan-College Station | 0.25 |
| Tyler | 60 | Tyler | 0.25 |
| Wichita Falls | 60 | Wichita Falls | 0.25 |
| Categoria | Assolute | Relative.x | Relative.Freq | Cum_Asso | Cum_Rel |
|---|---|---|---|---|---|
| 2010 | 48 | 2010 | 0.2 | 48 | 0.2 |
| 2011 | 48 | 2011 | 0.2 | 96 | 0.4 |
| 2012 | 48 | 2012 | 0.2 | 144 | 0.6 |
| 2013 | 48 | 2013 | 0.2 | 192 | 0.8 |
| 2014 | 48 | 2014 | 0.2 | 240 | 1.0 |
| Categoria | Assolute | Relative.x | Relative.Freq | Cum_Asso | Cum_Rel |
|---|---|---|---|---|---|
| 1 | 20 | 1 | 0.083 | 20 | 0.083 |
| 2 | 20 | 2 | 0.083 | 40 | 0.166 |
| 3 | 20 | 3 | 0.083 | 60 | 0.249 |
| 4 | 20 | 4 | 0.083 | 80 | 0.332 |
| 5 | 20 | 5 | 0.083 | 100 | 0.415 |
| 6 | 20 | 6 | 0.083 | 120 | 0.498 |
| 7 | 20 | 7 | 0.083 | 140 | 0.581 |
| 8 | 20 | 8 | 0.083 | 160 | 0.664 |
| 9 | 20 | 9 | 0.083 | 180 | 0.747 |
| 10 | 20 | 10 | 0.083 | 200 | 0.830 |
| 11 | 20 | 11 | 0.083 | 220 | 0.913 |
| 12 | 20 | 12 | 0.083 | 240 | 0.996 |
La variabile con la più alta variabilità è Volume. Per confrontare la
variabilità tra variabili che hanno unità di misura diverse (es. milioni
di dollari, numero di annunci), ho osservato il coefficiente di
variazione.
Volume ha un CV di 53.7% , un valore alto che indica un’elevata
dispersione dei dati intorno alla media. Infatti, questa alta
dispersione è visibile anche negli altri indici. Se consideriamo IQR
(23.23) è un valore simile alla mediana (27.06), quindi il 50% dei dati
centrali è molto sparso.
Confronto con altre variabili: Listing ha un CV del 43.3% (moderatamente variabile) mentre Median_price (17.1%) e months_inventory(25.1%) sono molto più stabili.
La variabile con la distribuzione più asimmetrica è sempre
volume.
Per studiare l’asimmetria ho prima osservato gli indici di posizione
(media>mediana>moda) e successivamente ho osservato se il valore
di skewness fosse lontano da 0.Valori lontani da 0 indicano una forte
asimmetria.
Volume, rispetto alle altre variabili, mostra un’evidente asimmetria
positiva (a destra), con la media (31.01) più alta della mediana
(27.06). La Skewness è 0.885, ed è il valore più alto tra tutte le
variabili. Questi dati confermano che la distribuzione ha una marcata
pendenza a destra. Questo significa che la maggior parte dei volumi di
vendita è bassa, ma ci sono poche osservazioni con valori alti che
spostano la media verso l’alto, verso la parte destra della curva.
Infine ho carcato di capire anche la forma della punta della curca
attraverso l’analisi della Kurtosi (0.177), che, essendo vicina a 0,
indica una forma mesocurtica (simile quindi alla distribuzione
normale).
Ho selezionato la variabile quantitativa “sales” e l’ho suddivisa in 5 classi. Ho creato una distribuzione di frequenze e ho aggiunto una tabella con il calcolo dell’indice di Gini. Infine, ho rappresentato i dati con un barplot.
Discussione: la distribuzione di frequenza relativa mostra che in generale il campione di n tot vendite è fortemente sbilanciato. Infatti il maggior numero di vendite totali è distribuito nelle classi valori più bassi. Dalle frequenze relative possiamo osservare che quindi la prima e la seconda classe hanno un maggior numero di vendite. Infatti, se osserviamo le frequenze relative cumulate, la prima e la seconda classe rappresentano più del 50 % delle vendite (67%). Poi ancora, si nota che la prima classe è la classe modale (quella con la frequenza più alta, 35%).Dalle precedenti analisi abbiamo visto che la forma della distribuzione è asimmetrica con pendenza a destra (skewness positiva: 0.71).Questo dato è rafforzato dall’indice di gini che è vicino all’1( Gini= 0.91). ciò signfica che esiste una forte disuguaglianza tra le classi e che i dati si concentrano fortemente in poche classi. Infatti, I 67% delle unità statistiche sta nelle prime due classi (valori bassi) mentre poche unità( solo il 4.6%) sta nell’ultima classe (valori alti).
#result="asis" per evitare i print grezzi
# Divisione di SALES in 5 classi
dati$sales_classi <- cut(dati$sales,
breaks = 5,ordered_result = T,include.lowest = T) #riodino i valori
print (distr_freq_fun(dati, "sales_classi")) #richiamo la funzione distr_freq_fun definita precedentemente per calcolare la distribuzione di frequenze
| Categoria | Assolute | Relative.x | Relative.Freq | Cum_Asso | Cum_Rel |
|---|---|---|---|---|---|
| [78.7,148] | 84 | [78.7,148] | 0.350 | 84 | 0.350 |
| (148,217] | 77 | (148,217] | 0.321 | 161 | 0.671 |
| (217,285] | 41 | (217,285] | 0.171 | 202 | 0.842 |
| (285,354] | 27 | (285,354] | 0.112 | 229 | 0.954 |
| (354,423] | 11 | (354,423] | 0.046 | 240 | 1.000 |
# Calcola Gini su sales classi
gini_norm_sales <- gini_normalized_fun(dati$sales_classi)
tab_gini_sales <- data.frame(
Indice = "Gini Sales (Norm.)",
Valore = round(gini_norm_sales,4)) #arrotondato
print(knitr::kable(tab_gini_sales,caption = "Indice di Gini per le classi di vendita", align="c"))
| Indice | Valore |
|---|---|
| Gini Sales (Norm.) | 0.91 |
# BARPLOT (utilizzare ggplot2 già caricato all'inizio)
# dataframe
tab_plot <-as.data.frame(prop.table(table(dati$sales_classi)))
colnames(tab_plot)<-c("Classi","Freq_Relativa")
#BARPLOT
ggplot(tab_plot, aes(x = Classi, y = Freq_Relativa)) +
geom_bar(stat = "identity", fill = "lightblue",alpha=0.8) +
# visualizzare le percentuali sulle barre
geom_text(aes(label = scales::percent(Freq_Relativa, accuracy = 0.1)), vjust = -0.5, size = 1.5) +
scale_y_continuous(labels=scales::percent)+
labs(
title = "Barplot della Distribuzione vendite (sales)",
x = "classi di vendita",
y = "Frequenza relativa in % "
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Qual è la probabilità che, presa una riga a caso di questo dataset, essa riporti la città “Beaumont”? E la probabilità che riporti il mese di Luglio? E la probabilità che riporti il mese di dicembre 2012?
Estraggo i dati totali (240 osservazioni) e i casi favorevoli per le
condizioni richieste. Calcolo la probabilità come: Probabilità = Casi
Favorevoli / Casi Totali.
Nota: risultati arrotondati a 3 cifre decimali (digits=3).
#1) Probabilità Città di Beaumont
#casi favorevoli
casi_fav_Beaumont <- sum(dati$city == "Beaumont") #sono 60
casi_tot <- nrow(dati) # tot osservazioni dataset 240
P_Beaumont <- casi_fav_Beaumont/casi_tot
#2) Probabilità mese luglio estratto a caso
#conteggio casi favorevoli
casi_fav_luglio<-sum(dati$month==7)
P_luglio<-casi_fav_luglio/casi_tot
#3) Probabilità dicembre 2012
casi_fav_dic12 <- sum(dati$month ==12 & dati$year == 2012) # somma i casi con dicembre e 2012
prob_dic12 <- casi_fav_dic12/casi_tot
#tabella risultati probabilità
risultati_finali <- data.frame(
Evento = c("Prob Beaumont)", "Prob Luglio", "Prob Dic 2012"),
Probabilita = c(P_Beaumont, P_luglio, prob_dic12)
)
# Visualizzazione con Kable
knitr::kable(risultati_finali %>%
mutate(Probabilita = scales::percent(Probabilita, accuracy = 0.1)),
caption = "Tabella calcolo delle probabilità",
align = 'c')
| Evento | Probabilita |
|---|---|
| Prob Beaumont) | 25.0% |
| Prob Luglio | 8.3% |
| Prob Dic 2012 | 1.7% |
#BARPLOT
# Grafico a barre per le probabilità (frequenze relative)
ggplot(dati, aes(x = city)) +
#group = 1 serve per calcolare la proporzione sul totale
geom_bar(aes(y = after_stat(prop), group=1 ),
fill = "lightblue") +
# Aggiunge etichette in % sopra le barre
geom_text(aes(y = after_stat(prop),
label = percent(after_stat(prop), accuracy = 1)), group = 1,stat = "count", vjust = 0.5) +
labs(title="Probabilità (Frequenza Relativa) per Città", x= "Città", y= "Frequenza Relativa")+
theme_minimal()
# Grafico a barre per le probabilità (frequenze relative) dei mesi
ggplot(dati, aes(x = month)) +
geom_bar(aes(y = after_stat(prop), group = 1),
fill = "lightblue") +
scale_y_continuous(labels = percent) +
labs(title="Probabilità (Frequenza Relativa) per Mese", x="Mese", y= "Probabilità")+
theme_minimal()
nuove variabili: Mean_price e efficacy
Abbiamo già a disposizione la variabile median_price(prezzo mediano).
Ho deciso di aggiungere una nuova variabile chiamata mean_price che
calcola il prezzo medio delle case vendute per città e volendo anche per
mese.
Abbiamo a disposizione le variabili, “volume” che contiene il valore
totale delle vendite (in milioni di dollari) e “sales” che contiene il
numero totale di vendite. Se dividiamo “volume” valore totale delle
vendite per il n. totale di vendite (come se fosse il n. delle nostre
osservazioni) possiamo trovare il prezzo medio degli immobili per ogni
città. mean_price=volume/sales Ho notato che volume è in milioni
di dollari. Riportare il prezzo medio in
milioni può essere poco comprensibile o in generale
difficile da analizzare a colpo d’occhio. Per semplificare moltiplico
per 10^6 e ottengo il valore medio in dollari.
Calcolo dell’efficaciia: Per calcolare l’efficacia ho pensato di creare un indice da 0 a 1 che indica quante vendite vengono effettuate in base al numero di annunci (listing) e il tempo mensile che ci impiegano gli annunci ad essere completati ( month_inventory). Valori più elevati indicano città o mesi in cui gli immobili si vendono più rapidamente, espressione un mercato che è più attivo e vendite efficaci.
si può usare per confrontrare le città in cui ci sono più vendite (es. max(efficacy)). o per vedere se nel tempo gli immobili vengono venduti meglio o peggio. oppure per vedere se ci sono mesi in cui si vende di più o di meno. (es. quando il mercato è dinamico o saturo).
nel 2014 nella città di Bryan College c’è stato il maggior numero di efficienza nell vendite nel mese di luglio. 1041 annunci sono stati esauriti in 4 mesi circa (vedi: max(efficacy). il mercato sembra dinamico.
Andando più a fondo a questa analisi, ho creato un boxplot per vedere
qual è la città che effettivamente ha livelli di efficacy maggiori, e
che quindi ha un mercato più attivo. Senza questa analisi sarei potuto
andare andato incontro ad un errore. Ovvero: inizialmente non avevo
considerato gli outliers!. Infatti, come si può notare dal boxplot, è
verò che il valore massimo di efficacia è stato registrato nella città
di BC nel 2014, però questè è un valore unico e molto lontano dalla
media per la stessa città di BC!. Da notare inoltre che, in media anche
la città di Wichita Falls mostra di avere un mercato abbastanza
dinamico. Wichita Falls ha meno variabilità nelle vendite rispetto a
Brayan College e sono abbastanza efficaci nel tempo. Quindi rispetto a
tutte le altre città, a BC si registrano delle vendite efficaci da
record ( efficacy 0.23) , a Wichita Falls mediamente le vendite sono
comunque efficaci ( efficacy 0.16) e guadagna il secondo posto.
#Creo le 2 nuove variabili e uso "mutate"
dati <- dati%>%
mutate( mean_price=(volume*1e6)/sales,
efficacy=sales /(listings*months_inventory))
#mostro le nuove variabili: summary del prezzo medio generale(media della media per le 60 osservazioni + il valore max di efficacia)
nuo_var <- dati%>%
summarize(general_prezzo_medio= mean(mean_price,na.rm=T),
max_efficacy=max(efficacy,na.rm=T))
knitr::kable(nuo_var, caption= "summary delle nuove variabili", digits=3,align="c")
| general_prezzo_medio | max_efficacy |
|---|---|
| 154320.4 | 0.094 |
# esempio: riga dove efficacy ha il valore maggiore
best_efficacy <- dati %>% filter(efficacy == max(efficacy, na.rm = TRUE))
knitr::kable(best_efficacy, caption = "il valore massimo di efficacia:")
| city | year | month | sales | volume | median_price | listings | months_inventory | sales_classi | mean_price | efficacy |
|---|---|---|---|---|---|---|---|---|---|---|
| Bryan-College Station | 2014 | 7 | 403 | 83.547 | 172600 | 1041 | 4.1 | (354,423] | 207312.7 | 0.0944214 |
#GRAFICI:
#grafico 1: andamento del prezzo medio degli immobili nel tempo per città
ggplot(dati, aes(x = as.Date(paste(year, month, "01", sep="-")), y = mean_price, color = city)) +
geom_line(linewidth = 0.8) +
labs(title = "Andamento del prezzo medio degli immobili per città nel Texas",
x = "Data", y = "Prezzo medio ($)") +
theme_minimal() +
theme(legend.position = "bottom")
#grafico 2: Confronto efficacia per città
#media generale efficacia
media_gen_eff <- mean(dati$efficacy,na.rm=T)
medie_città_eff <-dati%>%
group_by(city)%>%
summarise(m_eff=mean(efficacy, na.rm=T))
ggplot(dati,aes(x= reorder(city,efficacy),y=efficacy, fill= city)) +
geom_boxplot(alpha=0.6,outlier.color = "red")+ #linea generale della media
geom_hline(yintercept=media_gen_eff,linetype="dashed",color="red",linewidth=1)+
#punti neri per la media specifica di ogni città
geom_point(data=medie_città_eff,aes(x=city,y=m_eff), color="black",size=2)+
labs(title = "Efficacia del mercato immobiliare per città",
subtitle=paste("linea rossa=media generale:", round(media_gen_eff,3)),
x= "città(ordinate per efficacia)", y="indice efficacia")+
theme_minimal() +
theme(legend.position = "none")
Ho iniziato raggruppando i dati nel mio nuovo dataset, e generando dei summary: summary city, season_summary).Questi summary contengono alcune nuove variabili (Price_mean, Vol_sales, Dev_st_prezzo, Listing_tot e Efficacy) rispetto al dataset originale.
city: città di riferimento
year: anno di riferimento
month: mese di riferimento
Vol_sales: numero totale di vendite
Listings_tot: numero totale di annunci attivi
Price_mean: media dei prezzi (mean(mean_price))
Dev_st_prezzo: deviazione standard
Summary_city è stato usato per creare una tabella riassuntiva
Grafici: Ho usato dei boxplot, lineplot unificati e barplot per analizzare e visualizzare l’anndamento nel tempo (mesi e anni) per valutare per le varie città il cambio del prezzo medio, il numero di vendite, le vendite stagionali e l’andamento del numero di annunci.
#_____SUMMARY per città___
summary_city <- dati %>%
group_by(city) %>% # Raggruppo per city ed eseguo i calcoli
summarise(
# media calcolata sui prezzi di tutti i mesi e anni x città
Price_mean = mean(mean_price, na.rm = T),
Dev_st_prezzo =sd(mean_price, na.rm=T), # Media e SDdei prezzi calcolata su tutti i mesi/anni
#somma di tutte le vendite e annunci nel periodo
Vol_sales= sum(sales, na.rm = T), #totale vendite
Listings_tot = sum(listings, na.rm = T), #totale annunci
Efficacy_mean = mean(efficacy, na.rm = T),
.groups = "drop"
) %>%
arrange(desc(Price_mean)) #dispone in ordine di prezzo medio
#creo la tabella
knitr::kable(summary_city, caption = "Sintesi delle performance medie per città", digits = 2)
| city | Price_mean | Dev_st_prezzo | Vol_sales | Listings_tot | Efficacy_mean |
|---|---|---|---|---|---|
| Bryan-College Station | 183534.3 | 15149.35 | 12358 | 87488 | 0.02 |
| Tyler | 167676.8 | 12350.51 | 16185 | 174303 | 0.01 |
| Beaumont | 146640.4 | 11232.13 | 10643 | 100759 | 0.01 |
| Wichita Falls | 119430.0 | 11398.48 | 6964 | 54575 | 0.02 |
#_________________
# GRAFICI
#1) PREZZO MEDIO con facet wrap
# dettaglio del confronto tra le città: come cambia il prezzo medio per città nei mesi tra il 2010 e il 2014. approfondimento rispetto al grafico di prima al punto 6.
ggplot(dati, aes(x = as.Date(paste(year, month, "01", sep="-")), y = mean_price)) +
geom_line(color = "darkblue", linewidth = 0.7) +
facet_wrap(~ city, ncol = 2) + #città divise
labs(title = "Dettaglio andamento Prezzo Medio per singola città",
subtitle = "Periodo 2010-2014",
x = "Anno", y = "Prezzo medio ($)") +
theme_minimal()
#BOXPLOT prezzi medii
# Calcolo media generale di tutte le città utile per il boxplot per le città
media_generale_texas <- mean(dati$mean_price, na.rm = TRUE)
# Grafico boxplot prezzi medi per città
ggplot(dati, aes(x = reorder(city,mean_price), y = mean_price, fill = city)) +
geom_boxplot(alpha = 0.6, outlier.color="red") +
# Linea rossa della media generale
geom_hline(yintercept = media_generale_texas, linetype = "dashed", color = "red", linewidth = 1) +
# Punti neri per la media di ciascuna città
geom_point(data = summary_city,
aes(x = city, y =Price_mean),
color = "black", size = 2.5) +
labs(
title = "Prezzo medio degli immobili per città",
subtitle = paste("Linea rossa = media generale (", round(media_generale_texas,2), ")"),
x = "Città",
y = "Prezzo medio ($)"
) +
theme_minimal() +
theme(legend.position = "none")
#2) VENDITE
# confronto tra le città: come cambia il numero di vendite per città nei mesi tra il 2010 e il 2014. in più la linea di tendenza per vedere il trend nel tempo.
ggplot(dati, aes(x = as.Date(paste(year, month, "01", sep="-")), y = sales, color=city)) +
geom_line(linewidth =0.8) +
geom_smooth(method = "lm", se = FALSE, linetype = "dotted", linewidth=0.5) +
labs(title="Trend delle vendite mensili per città",
subtitle = "linea: crescita nel tempo",
x= "anno", y="Num tot di vendite")+
theme_minimal() +
theme(legend.position="bottom")
# ANALISI VENDITE STAGIONALI
#barplot vendite nei mesi estivi vs mesi invernali
# creo la variabile "season" che contiene i mesi estivi o invernali
season_summary <- dati %>% #con mutate creo la nuova variab season
mutate(season = case_when(
month %in% c(6, 7, 8) ~ "Estate", # case_when come ifelse se in month c'è il vet. c allora
month %in% c(12, 1, 2) ~ "Inverno",TRUE ~ NA_character_)) %>% #gli altri sono NA.
# uso pipe e collego calcoli vendite totali per città e stagione
filter(!is.na(season)) %>% #rimuove i NA da season
group_by(city, season) %>% #raggruppa per città e stagione
summarise(total_sales_season = sum(sales, na.rm = TRUE), .groups = "drop") #nuova colonna che contiene sum di sales
# Crea il barplot, facet per città
ggplot(season_summary, aes(x = city, y = total_sales_season, fill = season)) +
geom_bar(stat="identity",position="dodge")+
scale_fill_manual(values=c("Estate"="orange","Inverno"="steelblue"))+
labs(title = "Confronto vendite tra mesi estivi e inve rnali (2010–2014)",
x = "Città",
y = "Totale vendite",
fill="season") +
theme_minimal()
#3 ANNUNCI
#confronto tra le città: come cambia il numero di annunci per città nei mesi tra il 2010 e il 2014
ggplot(dati, aes(x = as.Date(paste(year, month, "01", sep="-")), y =listings, color = city)) +
geom_line(linewidth=0.8,alpha=0.8) +
labs(title = "annunci per città (2010-2014)",
x = "anno", y = " numero totale di annunci", color="Città") +
theme_minimal()+
theme(legend.position = "bottom")
La città di Bryan-College Station ha una mediana più alta rispetto a tutte le altre. Se notiamo la grandezza dei box (IQR), la variabilità del 50% centrale dei dati per questa città è ridotta. I valori non sono molto dispersi attorno alla mediana (box IQR stretto) e possiamo immaginare un tipo di mercato piuttosto omogeneo; in generale i prezzi rimangono simili. Però allo stesso tempo i whiskers (baffi) allungati verso l’alto, e la media (pallino blu) posizionata sopra la mediana, ci informano che c’è una tendenza a prezzi più elevati. Questo dato è confermato anche dalla presenza di outliers, informandoci così che in questa città si registrano i prezzi più alti rispetto a tutte le altre. Deduco così che è l’area in cui le case sono mediamente più costose.
A seguire, in ordine dal più costoso al più economico, troviamo le città di Tyler e Beaumont. I loro prezzi mediani sono più bassi rispetto a Bryan-College Station. Nonostante qualche valore eccezionale a Beaumont (outlier alto), nella città di Tyler i prezzi mediani si mantengono più elevati. È importante notare che a Beaumont i prezzi hanno la maggiore variabilità centrale (la scatola IQR è visibilmente più larga delle altre), suggerendo un mercato più eterogeneo in quella fascia di prezzo.
Infine, la città che ha un prezzo mediano più economico di tutte è Wichita Falls. I valori degli immobili qui mostrano una chiara tendenza ad assumere prezzi più economici, come indicato dal baffo inferiore molto lungo (forte asimmetria negativa).
Riepilogo :Bryan-College Station ha la mediana più alta (prezzo mediano più alto) e una tendenza verso prezzi costosi (asimmetria positiva)
Beaumont ha la maggiore dispersione nella fascia centrale dei prezzi (IQR più largo), indicando un mercato eterogeneo
Wichita Falls ha il prezzo mediano più basso e una forte asimmetria verso prezzi economici (baffo inferiore lungo)
Tyler si posiziona come seconda città più costosa, con una distribuzione piuttosto simmetrica attorno alla sua mediana
#summary city
summary_median_city <- dati %>%
group_by(city) %>%
summarize(
median_prezzo = median(median_price, na.rm=TRUE),
#mean_price = mean((volume * 1e6) / sales, na.rm=TRUE),
#sd_price = sd((volume * 1e6) / sales, na.rm = TRUE),
.groups = "drop")
#summary_median_city
#boxplot confronto città
ggplot(dati, aes(x=reorder(city,median_price), y=median_price,fill=city))+
geom_boxplot(alpha= 0.5, outlier.color="red", outlier.shape=16) + #trasparenza
geom_point(data=summary_median_city, aes(x=city,y=median_prezzo),
color="blue",size=3)+
labs( title="Confronto della distribuzione del prezzo mediano tra le città",
x= "città",
y=" prezzo mediano ($)")+
theme_minimal()+
theme(axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "none")
Commento: Dall’analisi del confronto della distribuzione del valore totale delle vendite tra le varie città nel periodo di tempo compreso dal 2010 al 2014 si può osservare che tutte le cittè eccetto Wichita Falls,la quale rimane costante nel tempo, mostrano un aumento del numero delle vendite. In particolare, il valore mediano delle vendite come visto precedentemente aumenta anno dopo anno. Un esempio è la città di Bryan College che dal 2013 al 2014 registra un aumento notevole superando ampiamente Beaumont. Nella città di Tyler si registra un numero di vendite mediano costantemente più alto rispetto a tutte le altre città e in tutti i 5 anni. Anche la città di Bryan College Station mostra un numero elevato di vendite totali (raggiungendo quasi Tyler). però si distingue per avere una variabilità dei valori molto elevata (i suoi box e baffi sono spesso i più lunghi, ad esempio nel 2013 e 2014).
#boxplot confronto città e anno
ggplot(dati, aes(x=city, y=sales,fill= factor(year)))+ #factor discreta non continua
geom_boxplot(alpha= 0.6, position= position_dodge(width=0.8)) + #trasparenza e sovrapposizione boxplot
labs(
title="Distribuzione delle vendite mensili per città e anno",
x= "città",
y=" n vendite mensili",
fill="Anno")+
theme_minimal()+
theme(axis.text.x = element_text(angle = 45, hjust = 1))
1)barplot vendite totali per città e trend
2)barplot a barre sovraimposte
3)barplot a barre sovraimposte normalizzato
Commento:
1)il linechart 1 mostra il confronto delle vendite tra le città dell’arco di tempo dal 2010 al 2014. La città che mostra il numero di elevato di vendite è Tyler(max=423, mean=269). A seguire troviamo le città di Bryan College Station e Beaumont. Per la città di Bryan College le vendite sono molto fluttuanti durante i 5 anni e si può notare come aumentano e diminuiscono: all’inizio e alla fine di ogni anno si notano dei picchi positivi e negativi. Nonostante ciò, le vendite hanno avuto un trend in aumento, specialmente nell’ultimo anno (2014). Similmente possiamo osservare a Beaumont, dove la variabilità di vendite è più bassa e il trend di n.di vendite negli anni è in lieve ma costante aumento positivo. Infine all’ultimo posto troviamo Wichita Falls dove il numero di vendite è rimasto costante negli anni, senza variazioni trend di crescita e registra i valori di vendite più bassi rispetto alle altre città (max 167, mean 116). La linea nera tratteggiata mostra il trend medio, il mercato texano negli anni è in fase di espansione.
2)Il grafico 2 a barre sovrapposte mostra e conferma il contributo maggiore della città di Tyler nel n.totale di vendite nel tempo. Le vendite sembrano seguire un pattern stagionale, con picchi di vendite di mesi primaverili/estivi e un calo nei mesi autunnali/invernali, creando così un’onda sinusoidale che mostra l’andamento oscillatorio delle vendite durante l’anno. Questo andamento oscillatorio però è caratterizzato dall’ un trend di crescita positivo dal 2010 al 2014 per tuttè le cittè tranne che per Wichita Falls.
3) Il grafico 3 mostra le stesse informazioni del precedente, ma in forma percentuale. Si nota che Tyler e Bryan College Station sono le città che contribuiscono in modo più consistente alle vendite totali (ciascuna con circa il 30–35%), seguite da Beaumont e infine Wichita Falls, che mantiene una quota intorno al 10–15%. Le proporzioni restano abbastanza stabili nel tempo, indicando che la distribuzione delle vendite tra le città non è cambiata in modo significativo tra il 2010 e il 2014.
#grafico 1) LineChart vendite per città e trend
ggplot(dati,aes(x = as.Date(paste(year, month, "01", sep="-")), y = sales, color = city)) + #colore per distinguere le linee quando si sovrappongono
geom_line(linewidth= 0.8, alpha=0.7 )+
#trend line
geom_smooth(method = "lm", color = "black", se = FALSE, linewidth = 1, linetype="dashed") +
labs(title= "Andamento vendite a confronto tra le città", subtitle = "linea tratteggiata = trend medio delle vendite",
x= "Mesi/Anni",
y=" N. Vendite")+
theme_minimal() +
theme(
legend.position="bottom",
legend.title=element_blank(),
axis.text.x = element_text(angle = 45, hjust = 1))
#grafico 2)
# grafico a barre sovrapposte non normalizzato
ggplot(dati, aes(x = factor(month), y = sales, fill = city)) +
geom_col(position = "stack") +
#dati suddivisi in base all'anno utilizzando facet_wrap(~ year)
facet_wrap(~ year, scales="free_x",ncol=3)+
labs(
title = "Confronto totale vendite mensili tra città (2010–2014)",
subtitle = "Le barre sovrapposte mostrano il contributo di ogni città al totale mensile",
x = "Mese",
y = "Vendite totali",
fill = "Città"
) +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 45,hjust=1,size = 6),
legend.position = "bottom")
#grafico 3) grafico a barre normalizzato (per mostrare le percentuali)
ggplot(dati,aes(x= factor(month), y= sales, fill= city ))+
geom_col(position="fill")+
#suddivido i dati in base all'anno usando facet_wrap( year)
facet_wrap(~ year,ncol=3)+
scale_y_continuous(labels = scales::percent)+
#converte es. 0.50 in 50% , Mostra i numeri come percentuali asse y
labs(
title= "Vendite in percentuale per città (anno) ",
x= "Mese",
y="percentuale di vendite",
fill="Città")+
theme_minimal()+
theme( axis.text.x=element_text(angle=45, hjust = 1,size=6),
legend.position="bottom")
linechart per confrontare l’andamento delle vendite in periodi storici differenti.
Prova a creare un line chart di una variabile a tua scelta per fare confronti commentati fra città e periodi storici. Ho scelto la variabile listings: numero totale di annunci.
Commento:
Linechart 1) : Dall’analisi della linechart si può osservare che il numerodi vendite nel tempo è fluttuante. Però si può notare per ttutte le città tranne Wichita Falls, un trend di aumento delle vendite nei 5 anni. Il trend sembra crescere in maniera oscillatoria: ci sono periodi di basse vendite all’inizio dell’anno corrispondenti ai mesi invernali, i quali sono seguiti da picchi positivi nei mesi estivi. Questo pattern stagionale si ripete negli anni ed è accompagnato da un aumento del numero di vendite mediano i tutte le città tranne Wichita Falls.In quest’ultima città, questo trend di crescita non è visibile e al contrario si nota una situzione di stazionarietà (mercato fermo). Sebbene siano presenti anche qui delle oscillazioni stagionali come le altre città, queste avvengono attorno a un numero di vendite medio che rimane basso e costante nel tempo (linea di regressione piatta).
Linechart 2): come nel grafico precedente, possiamo assistere ad un pattern con andamento oscillatorio. il numero di annunci per città nel tempo è sottoposto a un incremento nei mesi estivi e un decremento nei mesi invernali. questo pattern si può sovrapporre a quello precedente del numero delle vendite e si potrebbe avanzare un ipotesi di correlazione: ” l’aumento del numero di vendite potrebbe essere correlato all’aumentare del numero di annunci”. Diversamente dall’altro grafico, però , è evidente un trend negativo negli anni. Anno dopo anno ,nelle varie città ,si registrano minori numeri di annunci. In particolare nelle città di Tyler e Bryan College station, le quali sono le città con il maggior numero di vendite. Questo dato potrebbe essere giustificato dall numero elevato di vendite, e quindi un mercato che sta andando incontro a saturazione ( poche vendite di immobili disponibili) e quindi minore inserimento di annunci. anche qui si potrebbe ipotizzare una possibile correlazione tra l’aumentare del numero di vendite e la riduzione del numero di annunci. Per una possibile conferma di queste ipotesi torna utile osservare l’andamento a Wichita Falls. il numero delle vendite è piatto e lo è anche quello degli annunci. Non c’è la dinamica “vendite in crescita vs. annunci in calo” delle altre città.
# 1) Linechart per confronto vendite in periodi storici differenti:
# confronto tra le città: come cambia il numero di vendite per città nei mesi tra il 2010 e il 2014. la linea di tendenza per vedere il trend nel tempo.
ggplot(dati, aes(x= as.Date(paste(year,month,"01",sep = "-")), y= sales))+
geom_line(color = "black", alpha = 0.7, size = 1) +
geom_point(size = 0.5, color="tomato") +
geom_smooth(method = "lm", color = "orange", se = FALSE, linewidth = 1) +
facet_wrap(~ city, ncol = 2) +
scale_x_date(date_breaks = "3 months",date_labels = "%b-%y") + #etichetta ogni 3 mese in formato mese/anno
labs(
title = "Andamento mensile delle vendite per città (2010–2014)",
subtitle = "Linea rossa = trend line (retta di regressione)",
x = "Mese e anno",
y = "Numero di vendite"
) +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 90, vjust = 0.5, size = 6))
#2)linechart variabile a scelta:
#confronto tra le città: come cambia il numero di annunci per città nei mesi tra il 2010 e il #2014
#grafico
ggplot(dati, aes(x= as.Date(paste(year,month,"01",sep = "-")), y=listings, color=city))+
geom_line(linewidth = 0.7)+
geom_smooth(method = "lm", color = "black", se = FALSE, linewidth = 0.5, linetype="dashed")+ #trend
facet_wrap(~ city, ncol = 2) +
scale_x_date(date_breaks = "1 year",date_labels = "%Y")+
labs(title="N. annunci per città dal 2010 al 2014",
x="anni", y=" n.tot annunci")+
theme_minimal()+
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, size = 6), legend.position="none", strip.text=element_text(face="bold"))