Il dataset descrive l’andamento del mercato immobiliare del texas nel tempo.
data<-read.csv("realestate_texas.csv")
colnames(data)
## [1] "city" "year" "month" "sales"
## [5] "volume" "median_price" "listings" "months_inventory"
Il dataset raccoglie dati riferiti a quattro località in Texas, Beaumont, Bryan-College Station, Tyler e Wichita Falls.
unique(data$city)
## [1] "Beaumont" "Bryan-College Station" "Tyler"
## [4] "Wichita Falls"
unique(data$year)
## [1] 2010 2011 2012 2013 2014
Tipo di variabili:
city: Variabile categoriale che rappresenta una di quattro località riguardo alla quale sono stati raccolti i dati
year: Variabile quantitativa che sottintende il tempo (discretizzata in anni)
month: Variabile quantitativa che sottintende tempo (discretizzata in mesi)
sales: Variabile quantitativa su scala discreta che rappresenta il numero di vendite
volume: Variabile quantitativa su scala continua che rappresenta il valore totale di vendite in milioni di dollari
median_price: Variabile quantitativa su scala continua che rappresenta il prezzo mediano di vendita in dollari
listings: Variabile quantitativa su scala discreta che rappresenta il numero di annunci attivi
months_inventory: Variabile quantitativa continua che rappresenta il tempo necessario (in mesi) per la vendita dell’intero inventario
#Tipo di analisi che possono essere condotte
La variabile city può essere utilizzata per raggruppare il dataframe ed effettuare un confronto fra il mercato immobilare in diverse aree, confrontando le distribuzioni delle altre feature in diverse località . Le variabili temporali year/month possono essere utilizzate per costruire serie storiche su base annua o mensile delle altre variabili, al fine di riconoscere trend sul lungo periodo o eventuali ciclicità annuali.
Essendo una la variabile city categoriale, potremmo calcolarne la moda. Tuttavia, visto che i dati sul mercato immobiliare sono stati raccolti nello stesso arco temporale e con la stessa frequenza, ogni città presenta la stessa frequenza assoluta e la moda non è informativa.
table(data$city)
##
## Beaumont Bryan-College Station Tyler
## 60 60 60
## Wichita Falls
## 60
Per le variabili quantitative sales, volume, median price, listings e months_inventory ha senso calcolare indici di posizione come media, mediana e quantili. Questo può essere fatto attraverso la funzione ‘summary’
cols_quant <- c("sales", "volume", "median_price", "listings", "months_inventory")
summary(data[ , cols_quant])
## sales volume median_price listings
## Min. : 79.0 Min. : 8.166 Min. : 73800 Min. : 743
## 1st Qu.:127.0 1st Qu.:17.660 1st Qu.:117300 1st Qu.:1026
## Median :175.5 Median :27.062 Median :134500 Median :1618
## Mean :192.3 Mean :31.005 Mean :132665 Mean :1738
## 3rd Qu.:247.0 3rd Qu.:40.893 3rd Qu.:150050 3rd Qu.:2056
## Max. :423.0 Max. :83.547 Max. :180000 Max. :3296
## months_inventory
## Min. : 3.400
## 1st Qu.: 7.800
## Median : 8.950
## Mean : 9.193
## 3rd Qu.:10.950
## Max. :14.900
Per le variabili quantitative che hanno una dispersione statistica ha senso anche calcolare gli indici di variabilitÃ
cols_quant <- c("sales", "volume", "median_price", "listings", "months_inventory")
data_quant <- data[ , cols_quant]
indici_variabilita <- data.frame(
Range = apply(data_quant, 2, function(x) max(x) - min(x)),
Varianza = apply(data_quant, 2, var),
DevStd = apply(data_quant, 2, sd),
IQR = apply(data_quant, 2, IQR),
CoeffVar = apply(data_quant, 2, function(x) sd(x) / mean(x))
)
indici_variabilita
## Range Varianza DevStd IQR CoeffVar
## sales 344.000 6.344300e+03 79.651111 120.0000 0.4142203
## volume 75.381 2.772707e+02 16.651447 23.2335 0.5370536
## median_price 106200.000 5.135730e+08 22662.148687 32750.0000 0.1708218
## listings 2553.000 5.665690e+05 752.707756 1029.5000 0.4330833
## months_inventory 11.500 5.306889e+00 2.303669 3.1500 0.2506031
Gli indici di forma possono essere calcolati solo per variabili quantitative. Di conseguenza, non sono applicabili alla variabile city, che è categorica, né alle variabili temporali year e month, poiché queste descrivono unicamente la struttura temporale dei dati e non una distribuzione statistica interpretabile.
library(moments)
indici_forma <- data.frame(
Skewness = c(
sales = skewness(data$sales),
volume = skewness(data$volume),
median_price = skewness(data$median_price),
listings = skewness(data$listings),
months_inventory = skewness(data$months_inventory)
),
Kurtosis = c(
sales = kurtosis(data$sales) - 3,
volume = kurtosis(data$volume) - 3,
median_price = kurtosis(data$median_price) - 3,
listings = kurtosis(data$listings) - 3,
months_inventory = kurtosis(data$months_inventory) - 3
)
)
indici_forma
## Skewness Kurtosis
## sales 0.71810402 -0.3131764
## volume 0.88474203 0.1769870
## median_price -0.36455288 -0.6229618
## listings 0.64949823 -0.7917900
## months_inventory 0.04097527 -0.1744475
Il coefficiente di variazione permette di confrontare la variabilità fra variabili che hanno scale diverse. In questo caso volume, listings e sales (variabili legate al volume del mercato totale) presentano una variabilità più elevata rispetto a median_price e months_inventory. Le variabili sales, volume e listings presentano asimmetria positiva, che indica la presenza di mesi con mercato molto attivo. la variabile median_price presenta una più lieve asimmetria negativa. I valori della curtosi suggeriscono delle distribuzioni più piatte rispetto alla normale.
Visto che le variabili sales, volume e listings presentano distribuzione asimmetrica, la mediana risulta più indicativa della media per descrivere queste variabili, essendo più stabile rispetto alla presenza di estremi.
Per calcolare la variabile con maggiore valore si variabilità si utilizza il coefficiente di variabilità . La variabile con maggiore asimmetria si può calcolare confrontando i valori di skewness. Risulta che il volume totale delle transazioni è la feature più variabile e più asimmetrica del dataset. Per questo motivo la mediana e i quantili forniscono una descrizione più robusta della sua variabilità rispetto a indici come la media che sono più influenzate da code asimmetriche.
rownames(indici_variabilita)[
which.max(indici_variabilita$CoeffVar)]
## [1] "volume"
rownames(indici_forma)[
which.max(indici_forma$Skewness)]
## [1] "volume"
Per dividere in classe una variabile quantitativa si può utilizzare la funzione cut di R.
sales_cl<-cut(data$sales, breaks = 8, include.lowest = TRUE)
table(sales_cl)
## sales_cl
## [78.7,122] (122,165] (165,208] (208,251] (251,294] (294,337] (337,380]
## 50 60 46 25 29 16 10
## (380,423]
## 4
n<-sum(c(table(sales_cl)))
#Costruiamo la distribuzione di frequenze
distr_freq<-as.data.frame(
cbind(
ni=table(sales_cl),
fi=table(sales_cl)/n,
Ni=cumsum(table(sales_cl)),
Fi=cumsum(table(sales_cl)/n)
)
)
distr_freq
## ni fi Ni Fi
## [78.7,122] 50 0.20833333 50 0.2083333
## (122,165] 60 0.25000000 110 0.4583333
## (165,208] 46 0.19166667 156 0.6500000
## (208,251] 25 0.10416667 181 0.7541667
## (251,294] 29 0.12083333 210 0.8750000
## (294,337] 16 0.06666667 226 0.9416667
## (337,380] 10 0.04166667 236 0.9833333
## (380,423] 4 0.01666667 240 1.0000000
Grafico a barre della distribuzione di frequenze
library(ggplot2)
ggplot(data=data)+
geom_bar(aes(x=sales_cl),
stat="count",
col="blue",
fill="blue"
)+
labs(title="Distribuzione delle classi di numero di vendite",
x="Numero di vendite",
y="Frequenze assolute",
)
l’indice di eterogeneità di Gini può essere calcolato utilizzando il
dataframe di distribuzione delle frequenze che è stato calcolato in
precedenza.
gini <- 1 - sum(distr_freq$fi^2)
gini
## [1] 0.8254514
Il grafico a barre che rappresenta la distribuzione per classi del numero di vendite evidenzia un andamento asimmetrico, come indicato dalla skewness. Le classi più popolate sono quelle con valori più bassi (meno di circa 200 vendite al mese), mentre la distribuzione presenta una coda a destra, dovuta a un numero limitato di osservazioni con un numero elevato di vendite mensili. L’indice di Gini assume un valore pari a circa 0.83, che riflette questo andamento. Le tre classi con i valori più bassi infatti contengono circa il 65% delle osservazioni, con il restante 35% che si distribuisce fra le restanti 5 classi.
prezzo medio: Si può reare una variabile avg_price dividendo le variabili volume/sales e aggiungendo una colonna al dataset.
efficacia degli annunci di vendita: Per stimare l’efficacia degli annunci di vendita è possibile creare una variabile sales per listing che sintetizzi il numero di vendite effettuate per annuncio.
data$average_price <- data$volume / data$sales
data$sales_per_listing <- data$sales / data$listings
colnames(data)
## [1] "city" "year" "month"
## [4] "sales" "volume" "median_price"
## [7] "listings" "months_inventory" "average_price"
## [10] "sales_per_listing"
sales_per_listing_cl<-cut(data$sales_per_listing, breaks = 5, include.lowest = TRUE)
avg_price_cl<-cut(data$average_price, breaks = 5, include.lowest = TRUE)
p1<-ggplot(data=data)+
geom_bar(aes(x=avg_price_cl),
stat="count",
col="green",
fill="green"
)+
labs(title="Distribuzione del prezzo medio di vendita",
x="Prezzo medio (dollari)",
y="Frequenze assolute",
)
p2<-ggplot(data=data)+
geom_bar(aes(x=sales_per_listing_cl),
stat="count",
col="blue",
fill="blue"
)+
labs(title="Distribuzione del numero di vendite per annuncio",
x="Numero di vendite per annuncio",
y="Frequenze assolute",
)
p1
p2
Il tasso di conversione in vendita degli annunci immobiliari è per la maggior parte inferiore al 10%. Sono presenti classi con tasso di conversione più elevato. Sarebbe interessante controllare se c’è un correlazione con l’andamento temporale di months_inventory.
In questa sezione si valuterà il valore totale delle vendite in diverse città e al variare del tempo. Per fare questo occorre suddividere il dataset in città utilizzando la funzione group_by(). La funzione summarise() calcola poi, per ciascuna città , la media e la deviazione standard del volume delle vendite, che fornisce una stima del valore totale mensile medio delle vendite. Il grafico a barre che rappresenta il volume medio mensile per città evidenzia differenze significative nel volume medio mensile delle vendite tra le città : Tyler e Bryan–College Station presentano i livelli più elevati, mentre Wichita Falls si distingue per un mercato molto più ridotto.
Analogamente si può utilizzare la funzione group_by() per valutare l’andamento nel tempo del valore delle vendite. Il line chart che rappresenta il volume mensile medio per anno (rappresentato dal 2010 al 2014), mostra ch eil emrcato immobiliare del texas è in espansione. L’ampiezza dell’area ombreggiata, che rappresenta la deviazione standard, suggerisce che negli anni la variabilità del mercato aumenta, con periodi in cui il valore o il numero di vendite cambia significativamente.
Infine, si può utilizzare group_by() per valutare l’andamento mensile del valore totale delle vendite. Il grafico conferma che il volume delle vendite non è distribuito uniformemente durante l’anno, ma segue un ciclo stagionale. La dispersione risulta più elevata nei mesi di alta attività .
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
per_citta<-data %>%
group_by(city) %>%
summarise(
media = mean(volume),
sd = sd(volume),
.groups = "drop"
)
per_anno<-data %>%
group_by(year) %>%
summarise(
media = mean(volume),
sd = sd(volume),
.groups = "drop"
)
per_mese<-data %>%
group_by(month) %>%
summarise(
media = mean(volume),
sd = sd(volume),
.groups = "drop"
)
ggplot(per_citta, aes(x = city, media, y = media)) +
geom_col(fill = "steelblue") +
theme_minimal() +
labs(
title = "Volume medio mensile per città ",
x = "Città ",
y = "Volume (milioni di dollari)"
)
ggplot(per_anno, aes(x = year, y = media)) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
geom_ribbon(
aes(ymin = media - sd, ymax = media + sd),
alpha = 0.2
) +
theme_minimal() +
labs(
title = "Volume medio mensile (± deviazione standard)",
x = "Anno",
y = "Volume medio mensile (milioni di dollari)"
)
ggplot(per_mese, aes(x = month, y = media)) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
geom_ribbon(
aes(ymin = media - sd, ymax = media + sd),
alpha = 0.2
) +
theme_minimal() +
labs(
title = "Andamendo stagionale delle vendite (media su 4 anni)",
x = "Anno",
y = "Volume mensile (milioni di dollari)"
)
Infine, è interessante confrontare l’andamento del volume totale di vendite nelle 4 città sotto esame con 4 line charts sovrapposti. Questo grafico conferma quello che é emerso dalle analisi precedenti, mostrando una forte variabilità stagionale e una tendenza crescente del mercato per due delle quattro città (Bryan-College Station e Tyler). Le restanti due (Beaumont e Wichita Falls) presentano delle variazioni minori e un mercato più contenuto.
library(dplyr)
library(ggplot2)
serie_mensile <- data %>%
mutate(date = as.Date(paste(year, month, "01", sep = "-")))
serie_mensile$date
## [1] "2010-01-01" "2010-02-01" "2010-03-01" "2010-04-01" "2010-05-01"
## [6] "2010-06-01" "2010-07-01" "2010-08-01" "2010-09-01" "2010-10-01"
## [11] "2010-11-01" "2010-12-01" "2011-01-01" "2011-02-01" "2011-03-01"
## [16] "2011-04-01" "2011-05-01" "2011-06-01" "2011-07-01" "2011-08-01"
## [21] "2011-09-01" "2011-10-01" "2011-11-01" "2011-12-01" "2012-01-01"
## [26] "2012-02-01" "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01"
## [31] "2012-07-01" "2012-08-01" "2012-09-01" "2012-10-01" "2012-11-01"
## [36] "2012-12-01" "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01"
## [41] "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01"
## [46] "2013-10-01" "2013-11-01" "2013-12-01" "2014-01-01" "2014-02-01"
## [51] "2014-03-01" "2014-04-01" "2014-05-01" "2014-06-01" "2014-07-01"
## [56] "2014-08-01" "2014-09-01" "2014-10-01" "2014-11-01" "2014-12-01"
## [61] "2010-01-01" "2010-02-01" "2010-03-01" "2010-04-01" "2010-05-01"
## [66] "2010-06-01" "2010-07-01" "2010-08-01" "2010-09-01" "2010-10-01"
## [71] "2010-11-01" "2010-12-01" "2011-01-01" "2011-02-01" "2011-03-01"
## [76] "2011-04-01" "2011-05-01" "2011-06-01" "2011-07-01" "2011-08-01"
## [81] "2011-09-01" "2011-10-01" "2011-11-01" "2011-12-01" "2012-01-01"
## [86] "2012-02-01" "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01"
## [91] "2012-07-01" "2012-08-01" "2012-09-01" "2012-10-01" "2012-11-01"
## [96] "2012-12-01" "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01"
## [101] "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01"
## [106] "2013-10-01" "2013-11-01" "2013-12-01" "2014-01-01" "2014-02-01"
## [111] "2014-03-01" "2014-04-01" "2014-05-01" "2014-06-01" "2014-07-01"
## [116] "2014-08-01" "2014-09-01" "2014-10-01" "2014-11-01" "2014-12-01"
## [121] "2010-01-01" "2010-02-01" "2010-03-01" "2010-04-01" "2010-05-01"
## [126] "2010-06-01" "2010-07-01" "2010-08-01" "2010-09-01" "2010-10-01"
## [131] "2010-11-01" "2010-12-01" "2011-01-01" "2011-02-01" "2011-03-01"
## [136] "2011-04-01" "2011-05-01" "2011-06-01" "2011-07-01" "2011-08-01"
## [141] "2011-09-01" "2011-10-01" "2011-11-01" "2011-12-01" "2012-01-01"
## [146] "2012-02-01" "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01"
## [151] "2012-07-01" "2012-08-01" "2012-09-01" "2012-10-01" "2012-11-01"
## [156] "2012-12-01" "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01"
## [161] "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01"
## [166] "2013-10-01" "2013-11-01" "2013-12-01" "2014-01-01" "2014-02-01"
## [171] "2014-03-01" "2014-04-01" "2014-05-01" "2014-06-01" "2014-07-01"
## [176] "2014-08-01" "2014-09-01" "2014-10-01" "2014-11-01" "2014-12-01"
## [181] "2010-01-01" "2010-02-01" "2010-03-01" "2010-04-01" "2010-05-01"
## [186] "2010-06-01" "2010-07-01" "2010-08-01" "2010-09-01" "2010-10-01"
## [191] "2010-11-01" "2010-12-01" "2011-01-01" "2011-02-01" "2011-03-01"
## [196] "2011-04-01" "2011-05-01" "2011-06-01" "2011-07-01" "2011-08-01"
## [201] "2011-09-01" "2011-10-01" "2011-11-01" "2011-12-01" "2012-01-01"
## [206] "2012-02-01" "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01"
## [211] "2012-07-01" "2012-08-01" "2012-09-01" "2012-10-01" "2012-11-01"
## [216] "2012-12-01" "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01"
## [221] "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01"
## [226] "2013-10-01" "2013-11-01" "2013-12-01" "2014-01-01" "2014-02-01"
## [231] "2014-03-01" "2014-04-01" "2014-05-01" "2014-06-01" "2014-07-01"
## [236] "2014-08-01" "2014-09-01" "2014-10-01" "2014-11-01" "2014-12-01"
serie_mensile <- data %>%
mutate(date = as.Date(paste(year, month, "01", sep = "-"))) %>%
group_by(city, date) %>%
summarise(
volume_totale = sum(volume, na.rm = TRUE),
.groups = "drop"
) %>%
arrange(city, date)
ggplot(serie_mensile,
aes(x = date, y = volume_totale, color = city)) +
geom_line(linewidth = 1) +
theme_minimal() +
labs(
title = "Volume totale mensile delle vendite per città ",
x = "Data",
y = "Volume totale (milioni di dollari)",
color = "Città "
)
Dal confronto emerge che Bryan-College Station ha il prezzo mediano più alto, seguita da Tyler e Beaumont. Whichita falls ha il prezzo mediano più basso. Come si è già potuto evincere dal calcolo degli indici di variabilità , il mercato è fortemente eterogeneo e presenta una grande differenza fra le quattro città incluse nello studio. Oltre a presentare un prezzo mediano più basso, Wichita Falls presenta anche una maggiore dispersione dei valori, che potrebbe indicare la presenza di immobili appartenenti a diverse fasce di prezzo sul mercato.
library(ggplot2)
ggplot(data, aes(x = city, y = median_price)) +
geom_boxplot(fill = "grey", alpha = 0.7)+
labs( title = "Prezzo mediano per città ",
x = "Città ",
y = "Prezzo mediano (Dollari)")
Il grafico seguente é stato prodotto per confrontare l’andamento stagionale delle vendite nelle quattro città sotto esame. Per questo è stato prima creato un dataframe apposito che raggruppa le entries del dataframe originale per città e mese e rappresetna in ogni riga il numero totale di vendite medio per quel mese nei 4 anni.
Il grafico a barre affiancate riporta numero medio di vendite per mese e per città . Questo permette di rappresentare sia l’andamento stagionale delle vendite che le differenze fra i mercat immobiliari delle città .
In tutte le città si osserva un picco delle vendite nei mesi estivi (tra maggio e luglio). L’andamento conferma i valori mostrati dai boxplot, con Tyler e Bryan–College Station che hanno i prezzi più elevati in tutti i periodi dell’anno, Beaumont si colloca su livelli intermedi e Wichita Falls registra i valori medi più bassi. Nei mesi estivi Tyler e Bryan-College Station presentano un aumento più marcato del numero medio di vendite rispetto a Beaumont e Wichita Falls, indicando un forte effetto della stagionalitá.
#Creo un dataframe vendite_mensili
vendite_mensili <- data %>%
group_by(city, month) %>%
summarise(
vendite_totali = mean(sales),
)
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
glimpse(vendite_mensili)
## Rows: 48
## Columns: 3
## Groups: city [4]
## $ city <chr> "Beaumont", "Beaumont", "Beaumont", "Beaumont", "Beaumo…
## $ month <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6…
## $ vendite_totali <dbl> 121.6, 135.4, 171.0, 189.6, 206.8, 205.0, 185.4, 217.4,…
ggplot(vendite_mensili,
aes(x = factor(month, levels = 1:12),
y = vendite_totali,
fill = city)) +
geom_col(position = "dodge") +
theme_minimal() +
theme(
legend.position = "bottom"
) +
labs(
title = "Numero di vendite medio per mese e città ",
x = "Mese",
y = "Numero medio di vendite",
fill = "Città "
)
### Line chart per confrontare l’andamento delle vendite in periodi
storici differenti. In tutte le città si osserva una chiara
stagionalità , con picchi nei mesi estivi. Emerge inoltre una tendenza
complessivamente crescente nel corso dei cinque anni analizzati,
evidente a Bryan-College Station, Tyler e Beaumont.
L’andamento delle vendite a Tyler e Bryan–College Station suggeriscono una maggiore sensibilità del mercato ai cicli stagionali. L’andamento delle vendie a Beaumont presenta una variabilità più contenuta ma un mercato complessivamente in crescita. L’andamento delle vendite a Wichita Falls presenta lo stesso schema stagionale ma ha un mercato molto più piccolo.
E anche interessante controllare l’andamento nel tempo del numero di annunci, che forniscono un’ulteriore indicazione di quanto il mercato sia dinamico. In tutte le città emerge una chiara stagionalità , con picchi ricorrenti e successive fasi di riduzione nel corso degli anni.
Tyler e Bryan–College Station evidenziano al contempo un aumento marcato di vendite e una riduzione del numero di annunci nel corso degli anni. Questo indica un mercato dinamico dove la domanda cresce nel corso del tempo. L’andamento della variabile months_inventory, che rappresenta la quantità di tempo necessaria per vendere tutte le inserzioni correnti (in mesi) sembra confermare questa ipotesi. La diminuzione del tempo di vendita dell’inventario mensile, particolarmente accentuata a Bryan-College Station e Tyler, indica che in queste località gli immobili tendono a essere venduti più rapidamente, suggerendo un aumento della domanda.
library(dplyr)
library(ggplot2)
serie_mensile <- data %>%
mutate(date = as.Date(paste(year, month, "01", sep = "-")))
sales_plot<-ggplot(serie_mensile,
aes(x = date, y = sales, color = city)) +
geom_line(linewidth = 1) +
theme_minimal() +
labs(
title = "Numero di vendite",
x = "Data",
y = "Numero di vendite",
color = "Città "
)
price_plot<-ggplot(serie_mensile,
aes(x = date, y = listings, color = city)) +
geom_line(linewidth = 1) +
theme_minimal() +
labs(
title = "Numero di Annunci",
x = "Anno",
y = "N",
color = "Città "
)
monthly_inventory_plot<-ggplot(serie_mensile,
aes(x = date, y = months_inventory, color = city)) +
geom_line(linewidth = 1) +
theme_minimal() +
labs(
title = "Tempo di Vendita Inserzioni",
x = "Anno",
y = "Mesi",
color = "Città "
)
sales_plot
price_plot
monthly_inventory_plot