Commento ai feedback: 1) Ok per la definizione delle variabili, 2) Ok anche se non sono perfettamente d’accordo, 3) Ok; Ok per i grafici. Eliminati i copia e incolla e adottato ciclo for, usato alcune volte (dove possibile) il table. Usato l’arrotondamento a 2 cifre. Ho migliorato e completato i grafici.
Parere molto personale: R non mi piace, preferisco sviluppare un’analisi dati in Python che lo trovo più semplice e meno farraginoso di R.
setwd("C:/Users/RICCIG/OneDrive - Links S.p.A/Master_professionAI/Modulo_statistica/Progetto")
df <- read.csv("realestate_texas.csv")
city: qualitativa nominale
year: quantitativa continua da trattare come qualitativa ordinale in questo caso
month: qualitativa nominale (ciclica) ma codificata in numeri
sales: quantitativa discreta
volume: quantitativa continua
median_price: quantitativa continua
listings: quantitativa discreta
months_inventory: quantitativa continua.
Le variabili quantitative continue sono tutte su scala di rapporti.
Si possono condurre sul dataset svariate analisi di una variabile in funzione del tempo. Un possibile elenco di analisi è:
Fissata la city è possibile vedere come al variare della variabile year cambia il valore di sales (numero di vendite per una città in funzione dell’anno)
Fissata la città e l’anno vedere come varia il numero di vendite (sales) in funzione del mese
Fissata la città e l’anno è possibile valutare come cambia il volume nel corso dei mesi dell’anno
Fissata la città è possibile valutare come varia il volume nel corso degli anni
Fissata la città è possibile valutare come nel corso degli anni è cambiato il median price
Fissata la città e l’anno è possibile valutare come nel corso dei month è variato il median price
Fissata la città è possibile valutare l’andamento dei listings attivi nel corso degli anni
Fissata la città e l’anno è possibile valutare come variano i listing nel corso dei mesi dell’anno prefissato
Fissata la città si valuta come varia nel corso degli anni il month inventory
Fissata la città e l’anno si valuta come varia il month inventory nel corso dei mesi dell’anno prefissato.
E’ possibile effettuare delle analisi globali, senza fissare la città. Alcune analisi possiili sono:
Al variare dell’anno e dei months si può vedere come variano le sales
Al variare di anno e mese è possibile vedere come varia il volume
Al variare di anno e mese si valuta l’andamento di median price
Al variare di anno e mese si valutano i listings attivi
Al variare di anno e mese si valuta l’andamento dei month inventory.
Gli indici vengono calcolati su tutte le variabili tranne per la moda, la media geometrica e la media armonica che vengono calcolate solo per le variabili quantiative continue.
n <- length(df$sales) #lunghezza dei dati
# definizione di un array di stringhe e relativo ai nomi delle variabili quantiative
quant_variables <- list("volume", "median_price", "months_inventory")
# definzione di un array di stringhe con i nomi di tutte le variabili
all_variables <- list("sales", "volume", "median_price", "listings", "months_inventory")
## Functions ##
#moda
moda_function <-function (col){
mode<-function(x){which.max(tabulate(x))}
modahouse <- mode(col)
return (modahouse)
}
#min e max
min_max <- function(col){
min_house <- min(col)
max_house <- max(col)
values <- list(min_house, max_house)
return(values)
}
# mediana
for (i in seq_along(all_variables)) {
value <- all_variables[[i]]
m <- median(df[[value]])
}
# percentili
percentiles_house <- function(col){
q <- quantile(col, probs = c(0.25, 0.5, 0.75))
return (q)
}
# media (aritmetica)
mean_house <- function(col){
mean_house <- mean(col)
return(mean_house)
}
# media ponderata
mean_pon_house <- function(col, n){
mp <- sum(col * n)/sum(n)
return (mp)
}
# media armonica
mean_arm_house <- function(col){
ma_house <- 1/mean(1/col)
return(ma_house)
}
# media geometrica
mean_geo_house <- function(col, n){
mg_house <- prod(col)^(1/n)
return(mg_house) # viene infinito!!!! capire perchè!!!
}
# Creo un dataframe per inscatolare i risultati
result1 <- data.frame() #dataframe per i dati delle var quantiative
result1 <- data.frame(matrix(ncol = 3, nrow = 3))
colnames(result1) <- c("volume", "median_price", "months_inventory")
## Call functions ##
# Call functions on quantitave variables
for (i in seq_along(quant_variables)) {
value <- quant_variables[[i]]
md <- moda_function(df[[value]])
ma <- mean_arm_house(df[[value]])
mg <- mean_geo_house(df[[value]], n)
result1[[value]] <- c(md, ma, mg)
}
# Creo un dataframe per inscatolare i risultati
result2 <- data.frame() #dataframe per i dati di tutte le variabili
result2 <- data.frame(matrix(ncol = 5, nrow = 9))
colnames(result2) <- c("sales", "volume", "median_price", "listings", "months_inventory")
# Call functions on ALL variables
for (i in seq_along(all_variables)) {
value <- all_variables[[i]]
mm <- min_max(df[[value]])
me <- median(df[[value]])
pc <-percentiles_house(df[[value]])
mn <- mean_house(df[[value]])
mp <- mean_pon_house(df[[value]], n)
mgg <- mean_geo_house(df[[value]], n)
result2[[value]] <- c(mm, me, pc, mn, mp, mgg)
}
print(cvv)
# Functions #
# Sigma varianza
sigmas_house <-function(col, media, n){
s2_house = sum((col-media)^2)/n #sigma
cv <- (s2_house/media)*100
return (cv)
}
# indice di Gini
gini.index <- function(x){
ni = table(x)
fi = ni/length(x)
fi2 = fi^2
J = length(table(x))
gini = 1-sum(fi2)
gini.norm = gini/((J-1)/J)
return(gini.norm)
}
# definizione di 2 array vuoti permemorizzare le medie (dai dati già calcolati) e il CV
medie_house <- result2[7, ]
cv_house <- c()
# Call functions #
for (i in seq_along(all_variables)) {
value <- all_variables[[i]]
m <- as.numeric(medie_house[[value]])
gi <- gini.index(df[[value]])
cvv <- sigmas_house(df[[value]], m, n)
cvv <- round(cvv, digits=1)
cv_house <- append(cv_house, cvv)
}
table(cv_house)
## cv_house
## 57.5 890.5 3285.6 32462.7 385506
## 1 1 1 1 1
#install.packages("moments")
library(moments)
# definizione di due array vuoti per memorizzare i dati
sk_house <- c()
ku_house <- c()
for (i in seq_along(all_variables)) {
value <- all_variables[[i]]
sk <- skewness(df[[value]])
ku <- kurtosis(df[[value]])
sk_house <- append(sk_house, sk)
ku_house <- append(ku_house, ku)
}
table(round(sk_house, digits=2))
##
## -0.36 0.04 0.65 0.72 0.88
## 1 1 1 1 1
table(round(ku_house, digits=2))
##
## 2.21 2.38 2.69 2.83 3.18
## 1 1 1 1 1
Identificazione delle variabili con maggiore variabilità e asimmetria: utilizzando il coefficiente CV sulle 5 colonne del dataframe si può vedere che la variabile con la più alta variabilità è il median price. Un CV elevato indica una maggiore variabilità delle vendite rispetto alla media. Questo perchè ci sono prezzi di vendita delle case alti, prezzi bassi e prezzi medi quindi è normale che sia la variabile con la più alta variabilità.
La variabile con la più alta skewness è il volume, questa variabile ha una skewness di 0.88, la variabile è sbilanciata a sinistra essendo la skewness positiva. skewness(df.sales)=0.71, skewness(df.volume)=0.88, skewness(df.median price)=-0.36, skewness(df.listings)=0.64, skewness(df.months inventory)=0.04.
library(ggplot2)
# faccio i boxplot per il median price in funzione della città
ggplot(data = df)+
geom_boxplot(aes(
x=city,
y=volume),
fill="lightblue")
# Faccio i boxplot per il median price in funzione della città e dell'anno
ggplot(data = df)+
geom_boxplot(aes(
x=city,
y=median_price,
fill = year), # utilizzato il suggerimento dato
fill="lightblue")
I dati sono abbastanza variabili visto che la mediana non è mai al centro del boxplot. Sicuramente si può dire che il prezzo medio nella città di Beaumont è sbilanciato verso l’alto, quindi i prezzi in questa città sono mediamente più alti. I prezzi medi nella città di Bryan-college station risultano esssere i più alti in assoluto e il prezzo medio è posizionato più o meno al centro del boxplot.
Il boxplot delle vendite per città mostra la distribuzione dei valori per ciascuna città. Le linee orizzontali all’interno di ogni box rappresentano la mediana, mentre i box stessi mostrano l’intervallo interquartile (IQR), evidenziando la dispersione centrale dei dati. Un confronto visivo permette di notare quale città presenta una maggiore variabilità e quali città tendono a mantenere vendite più stabili. Nei boxplot del volume delle vendite per città si vede che i boxplot hanno la mediana posizionata al centro tranne che per la città di Bryan-college station dove la mediana si posizione poco sopra del primo percentile. Considerando il boxplot precedente si può dedurre che nella città di Bryan i prezzi sono più alti e quindi mediamente il numero di vendite è più basso rispetto alle altre città.
# Genera il boxplot del volume delle vendite per anno, si è trasformata la variabile anni in una variabile di tipo factor.
# Dal boxplot si vede che il numero di vendite è aumentato nel corso degli anni ma è anche aumentata la variabilità.
# Usando un nuovo codice e aggiungendo l'opzione fill=year risulta evidente l'anno
ggplot(data=df, aes(x = factor(year), y = volume, fill = year)) +
geom_boxplot(fill = "skyblue", color = "black") +
labs(title = "Distribuzione del volume delle Vendite per anno",
x = "Anno",
y = "Volume delle Vendite") +
theme_minimal()
Sintesi dell’analisi grafica: il boxplot per le vendite per anno consente di confrontare la distribuzione delle vendite tra i diversi anni. Anche qui, la mediana e l’IQR sono evidenti. Se uno degli anni presenta un box significativamente più ampio o una mediana più alta o più bassa, ciò può indicare un cambiamento nelle vendite che merita ulteriori indagini. Questo confronto è utile per identificare trend temporali e per capire se ci sono stati miglioramenti o cali nelle vendite in determinati anni. Dal grafico si deduce che c’è un trend di vendite in aumento nel corso degli anni. Il coefficiente di variazione, insieme ai boxplot, fornisce un’analisi chiara della variabilità delle vendite tra città e anni. Attraverso questa analisi, è possibile identificare opportunità per ottimizzare le strategie di vendita e migliorare le performance commerciali.
Questo grafico a barre sovrapposte permette di visualizzare il totale delle vendite nei vari mesi per ciascuna città. Le barre sono colorate in modo diverso per ogni città, e si possono osservare le differenze stagionali e regionali nel numero di vendite. Dal grafico emerge che si ha un picco di vendite nella parte centrale dell’anno (maggio-luglio), per la città di Wichita falls il totale delle vendite si mantiene pressochè costante durante l’anno, mentre per le altre città c’è un aumento che segue in un certo modo una curva a campana.
ggplot(data = df, aes(x = factor(month), y = sales, fill = city)) +
geom_bar(stat = "identity") + # Posizione affiancata per le barre
facet_wrap(~year) +
labs(title = "Totale delle vendite nei mesi per città",
x = "Mese",
y = "Totale delle vendite",
fill= "Città") +
scale_x_discrete(labels = month.abb) + # Mostra i mesi con abbreviazioni
theme_minimal() +
theme(
legend.position = "bottom", # Posiziona la legenda in basso
plot.title = element_text(hjust = 0.5, size = 13, face = "bold"), # Centra e ingrandisce il titolo
axis.title.x = element_text(size = 10), # Ingrandisce l'etichetta dell'asse x
axis.title.y = element_text(size = 14), # Ingrandisce l'etichetta dell'asse y
axis.text.x = element_text(angle = 45, hjust = 1), # Ruota le etichette dei mesi
panel.grid.major = element_line(color = "grey80"), # Colore della griglia maggiore
panel.grid.minor = element_blank(), # Rimuove la griglia minore
panel.spacing = unit(5, "pt") # Aumenta la distanza tra i pannelli
) +
scale_fill_brewer(palette = "Set3") # Colori distintivi per le città
Il grafico a barre normalizzato trasforma i valori delle vendite in percentuali rispetto al totale delle vendite in ciascun mese. Questo tipo di visualizzazione è utile per confrontare il contributo relativo di ciascuna città, indipendentemente dal volume complessivo delle vendite. Ogni barra rappresenta il 100% delle vendite in quel mese e mostra la quota di ciascuna città. Questo diagramma permette di vedere come varia la quota di mercato delle città nei diversi mesi, ignorando le differenze assolute di vendita. La quota di mercato maggiore è quella della città di Beaumont e la maggiore variabilità nel corso del tempo è relativa alla città di Bryan college station. Normalizzo le vendite in modo da ottenere percentuali per ciascun mese.
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
data_normalized <- df %>%
group_by(month) %>%
mutate(percentage_sales = sales / sum(sales))
ggplot(data_normalized, aes(x = factor(month), y = percentage_sales, fill = city)) +
geom_bar(stat = "identity") +
labs(title = "Distribuzione percentuale delle vendite nei mesi per città",
x = "Mese",
y = "Percentuale delle Vendite",
fill="Città") +
scale_y_continuous(labels = scales::percent) + # Visualizza percentuali
scale_x_discrete(labels = month.abb) + # Mostra i mesi con abbreviazioni
theme_minimal() +
theme(legend.position = "bottom") # Posiziona la legenda in basso
library(dplyr)
# Genera un grafico a barre sovrapposte normalizzate
ggplot(data_normalized, aes(x = factor(month), y = percentage_sales, fill = city)) +
facet_wrap(~year) +
geom_bar(stat = "identity") +
labs(title = "Distribuzione percentuale delle vendite nei mesi per città e per anno",
x = "Mese",
y = "Percentuale delle vendite") +
scale_y_continuous(labels = scales::percent) + # Visualizza percentuali
scale_x_discrete(labels = month.abb) +
theme_minimal() +
theme(
legend.position = "bottom", # Posiziona la legenda in basso
plot.title = element_text(hjust = 0.5, size = 13, face = "bold"), # Centra e ingrandisce il titolo
axis.title.x = element_text(size = 10), # Ingrandisce l'etichetta dell'asse x
axis.title.y = element_text(size = 14), # Ingrandisce l'etichetta dell'asse y
axis.text.x = element_text(angle = 45, hjust = 1), # Ruota le etichette dei mesi
panel.grid.major = element_line(color = "grey80") # Colore della griglia maggiore
)
Genero un grafico a barre sovrapposte regolari, usando l’anno.
Per ogni anno viene riportato il relativo diagramma suddiviso per mesi (asse x) mentre sull’asse y viene riportata la percentuale delle vendite.
Ogni città è rappresentata da una linea colorata diversa, questo permette di confrontare le vendite tra città. Le linee mostrano chiaramente la differenza nelle attività di vendita tra città. Le città più grandi o più dinamiche economicamente tendono ad avere volumi di vendita molto maggiori rispetto alle città più piccole.
Ad esempio, alcune città potrebbero avere linee costantemente più alte, indicando un numero di vendite mensili superiore.
Altre città potrebbero avere picchi sporadici di attività. Il grafico consente di individuare periodi di crescita o di diminuzione delle vendite immobiliari. Un aumento costante delle vendite potrebbe indicare una fase di espansione economica, mentre un calo drastico potrebbe indicare crisi economiche o stagioni di bassa domanda. È anche possibile osservare periodi di ciclicità stagionale: in molti mercati immobiliari, ci sono spesso picchi in primavera e estate, seguiti da un calo durante l’autunno e l’inverno. Se il grafico mostra un drastico aumento o diminuzione delle vendite in un periodo specifico per una o più città, questo potrebbe essere correlato a eventi storici o economici particolari, come l’introduzione di politiche immobiliari, crisi finanziarie o boom economici locali. Confrontando gli stessi mesi di anni diversi, si può identificare come la domanda immobiliare sia cambiata nel tempo per ogni città. Ad esempio, un calo prolungato delle vendite potrebbe indicare una crisi del mercato immobiliare in quella città, mentre un aumento costante potrebbe indicare una forte domanda sostenuta.
# Passo 1: Suddivisione in classi della variabile median_price
# Si suddivide il median_price in 5 classi
df$price_class <- cut(df$median_price, breaks = 5, labels = c("Molto Basso", "Basso", "Medio", "Alto", "Molto Alto"))
# Passo 2: Creazione della distribuzione di frequenze
freq_table <- table(df$price_class)
table(freq_table)
## freq_table
## 18 25 40 73 84
## 1 1 1 1 1
# Passo 3: Creazione del grafico a barre per la distribuzione di frequenze
ggplot(df, aes(x = price_class)) +
geom_bar(fill = "skyblue", color = "black") +
labs(title = "Distribuzione delle classi di prezzo mediano",
x = "Classi di prezzo mediano",
y = "Frequenza") +
theme_minimal()
gn_house <- gini.index(df$median_price)
La funzione cut() viene usata per suddividere la variabile median_price in 5 classi (Molto Basso, Basso, Medio, Alto, Molto Alto) in base ai prezzi medi degli immobili.
Si crea una tabella di frequenza con table(), che mostra quante osservazioni appartengono a ciascuna classe di prezzo.
Il grafico a barre rappresenta la distribuzione delle classi di prezzo mediano.
L’indice di Gini viene calcolato con la function opportunamente definita in precedenza.
Il grafico a barre mostra la distribuzione delle case tra le classi di prezzo mediano. Si può vedere se il mercato è dominato da abitazioni con prezzi “Bassi” o “Alti”, o se è distribuito in modo più uniforme.
L’indice di Gini offre una misura quantitativa della disuguaglianza nella distribuzione dei prezzi medi.
Il valore di Gini ottenuto (0.99) indica una forte disuguaglianza, dove poche case hanno prezzi molto alti rispetto alla maggior parte.
# 5. Calcolo della probabilità
# 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?
# 1. Probabilità che la città sia "Beaumont"
beaumont_rows <- nrow(df[df$city == "Beaumont", ])
prob_beaumont <- beaumont_rows / n
print(paste("Probabilità che la città sia Beaumont:", round(prob_beaumont, 2)))
## [1] "Probabilità che la città sia Beaumont: 0.25"
# 2. Probabilità che il mese sia Luglio
july_rows <- nrow(df[df$month == 7, ]) # Supponendo che i mesi siano numerati 1-12
prob_july <- july_rows / n
print(paste("Probabilità che il mese sia Luglio:", round(prob_july, 2)))
## [1] "Probabilità che il mese sia Luglio: 0.08"
# 3. Probabilità che il mese sia Dicembre 2012
dec_2012_rows <- nrow(df[df$month == 12 & df$year == 2012, ])
prob_dec_2012 <- dec_2012_rows / n
print(paste("Probabilità che il mese sia Dicembre 2012:", round(prob_dec_2012, 2)))
## [1] "Probabilità che il mese sia Dicembre 2012: 0.02"
# 6. Creazione di nuove variabili
# Crea una nuova colonna che calcoli il prezzo medio degli immobili utilizzando le variabili disponibili.
# Prova a creare una colonna che misuri l’efficacia degli annunci di vendita. Commenta e discuti i risultati.
total_value <- sum(df$median_price)
# Passo 1: creazione di una nuova colonna "prezzo_medio"
# Creiamo una colonna "total_value" dal median proce e le sales
# Passo 2: creazione di una nuova colonna "efficacia_annuncio"
# Supponiamo che il dataset abbia una colonna "total_listings" per il numero totale # di annunci
data <- df %>%
mutate(prezzo_medio = total_value / sales, efficacia_annuncio = (sales / n) * 100)
# Visualizza le prime righe per verificare le nuove colonne
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
## price_class prezzo_medio efficacia_annuncio
## 1 Molto Alto 383610.8 34.58333
## 2 Alto 294812.0 45.00000
## 3 Medio 174943.4 75.83333
## 4 Medio 159198.5 83.33333
## 5 Medio 157622.3 84.16667
## 6 Medio 168464.0 78.75000
# Distribuzione del prezzo medio e dell'efficacia degli annunci
summary(data$median_price)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 73800 117300 134500 132665 150050 180000
summary(data$efficacia_annuncio)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 32.92 52.92 73.12 80.12 102.92 176.25
# Facciamo un grafico per visualizzare l'efficacia degli annunci per città
ggplot(data, aes(x = city, y = efficacia_annuncio)) +
geom_boxplot(fill = "lightblue") +
labs(title = "Efficacia degli annunci di vendita per città",
x = "Città",
y = "Efficacia (%)") +
theme_minimal()
# Facciamo un grafico per visualizzare la distribuzione del prezzo medio
ggplot(data, aes(x = prezzo_medio)) +
geom_histogram(binwidth = 50000, fill = "skyblue", color = "black") +
labs(title = "Distribuzione del prezzo medio degli immobili",
x = "Prezzo medio ($)",
y = "Frequenza") +
theme_minimal()
Si crea una colonna chiamata prezzo_medio che calcola il rapporto tra total_value (valore totale degli immobili venduti) e sales (numero di vendite). Questo dà il prezzo medio per immobile venduto.
Per l’efficacia degli annunci di vendita si crea una colonna chiamata efficacia_annuncio che calcola il rapporto tra il numero di vendite (sales) e il numero totale di annunci (total_listings), moltiplicato per 100, per ottenere una percentuale.
Questa misura l’efficacia degli annunci di vendita, ossia quanto bene performano gli annunci in termini di conversione delle visualizzazioni in vendite.
Il boxplot mostra la variazione dell’efficacia degli annunci per ciascuna città, permettendo di confrontare come gli annunci performano in base alla località. Il boxplot dell’efficacia degli annunci per città permette di confrontare le prestazioni dei mercati immobiliari nelle diverse località.
Alcune città hanno un’elevata efficacia (molti annunci che portano a vendite), mentre altre hanno un’efficacia inferiore, suggerendo un possibile eccesso di offerta o un basso interesse degli acquirenti.
Se l’efficacia degli annunci è generalmente alta, significa che molti annunci portano effettivamente a una vendita, il che potrebbe indicare un mercato attivo e ben funzionante.
Valori di efficacia bassi indicano che molti annunci non si traducono in vendite, il che potrebbe suggerire un mercato immobiliare stagnante o con troppa offerta.
L’istogramma della distribuzione del prezzo medio mostra come i prezzi medi si distribuiscono nel dataset.
Questo può aiutare a individuare la presenza di mercati immobiliari più costosi o più economici.
L’istogramma del prezzo medio offre una panoramica della distribuzione dei prezzi immobiliari nel dataset.
La distribuzione è sbilanciata verso sinistra, questo indica che la presenza di case a basso prezzo fa si che
il prezzo medio complessivo degli immobili si abbassa.
# 7. Analisi condizionata
#Usa il pacchetto dplyr o il linguaggio base di R per effettuare analisi statistiche condizionate per città, anno e mese.
# Genera dei summary (media, deviazione standard) e rappresenta graficamente i risultati.
# Calcolare la media e la deviazione standard per città, anno e mese
# Step 1: Raggruppare i dati per città, anno e mese, e calcolare le statistiche
# Analisi condizionata per città, anno e mese
analysis <- data %>%
group_by(city, year, month) %>%
summarize(
mean_sales = mean(sales),
sd_sales = sd(sales),
mean_volume = mean(volume),
sd_volume = sd(volume),
mean_median_price = mean(median_price),
sd_median_price = sd(median_price)
)
## `summarise()` has grouped output by 'city', 'year'. You can override using the
## `.groups` argument.
# Visualizzazione
ggplot(analysis, aes(x = month, y = mean_sales, color = as.factor(year))) +
geom_line() +
facet_wrap(~ city) +
labs(
title = "Andamento delle vendite per città",
x = "Mese",
y = "Media vendite",
color = "Anno"
) +
scale_x_discrete(labels = month.abb) + # Applicare le etichette dei mesi qui
theme_minimal()
ggplot(analysis, aes(x = month, y = mean_volume, color = as.factor(year))) +
geom_line() +
facet_wrap(~ city) +
labs(
title = "Andamento del volume di vendite per città",
x = "Mese",
y = "Media volume",
color = "Anno") +
scale_x_discrete(labels = month.abb) + # Applicare le etichette dei mesi qui
theme_minimal()
ggplot(analysis, aes(x = month, y = mean_median_price, color = as.factor(year))) +
geom_line() +
facet_wrap(~ city) +
labs(
title = "Andamento del prezzo mediano per città",
x = "Mese",
y = "Media prezzo mediano",
color = "Anno") +
scale_x_discrete(labels = month.abb) + # Applicare le etichette dei mesi qui
theme_minimal()
Utilizza ggplot2 per creare grafici personalizzati. Assicurati di esplorare:
- Boxplot per confrontare la distribuzione del prezzo mediano tra le città.
- Grafici a barre per confrontare il totale delle vendite per mese e città.
- Line charts per confrontare l’andamento delle vendite in periodi storici differenti.
I dati indicano che ci sono variazioni significative nei prezzi medi degli immobili tra i mesi. Le città presentano trend diversi, con alcune che vedono aumenti dei prezzi e altre che subiscono cali.
L’analisi visiva suggerisce la possibilità di stagionalità: i prezzi salgono durante certi periodi dell’anno, probabilmente durante i mesi più caldi (primavera/estate), quando è comune acquistare casa.
I dati sugli annunci mostrano un trend crescente nel tempo, ma il numero di vendite non sembra correlato strettamente al numero di annunci.
Questo potrebbe indicare che il mercato immobiliare potrebbe essere più influenzato da fattori esterni
(economia, domanda di case, tassi di interesse) piuttosto che dal semplice aumento delle inserzioni.
Più annunci non equivalgono necessariamente a più vendite. Potrebbero esserci tante case in vendita senza un aumento della domanda.
I prezzi mediani crescono in maniera sostenuta in alcune città e stagnino o calino in altre, riflettendo
le differenze tra i mercati immobiliari locali.
È interessante notare che le città che presentano troppe case in vendita sono a rischio di un surplus di case invendute, il che potrebbe portare a un calo dei prezzi nel tempo.