#carica i dati del csv
df <- read.csv("Real Estate Texas.csv", sep = ",", header = TRUE)
# Crea una nuova colonna chiamata month_label
df$month_label <- factor(df$month,
levels = 1:12,
labels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"),
ordered = TRUE)
# 6. Creazione di nuove variabili
# Calcola il prezzo medio, Volume è in milioni di dollari quindi va
# moltiplicato per 1000000
df$mean_price <- (df$volume * 1000000) / df$sales
# Crea una nuova colonna volume_dollari con il valore reale
# per coerenza delle unità: altre variabili come median_price e mean_price
#sono in dollari.
df$volume_dollars <- df$volume * 1000000
#nuovo pacchetto dplyr -> manipolare facilmente i dati
#nuovo pacchetto e1071 -> per skewness e kurtosis
# install.packages("dplyr")
# install.packages("e1071")
# install.packages("purrr") #funzioni potenti ed evita for loop
# install.packages("kableExtra") #kableExtra per la gestione delle tabelle nel #documento markdown
# install.packages("ineq") #per le ditribuzioni GINI
# install.packages("ggplot2") # per i grafici
#se i pacchetti non sono installati li installa
if (!require("dplyr")) {
install.packages("dplyr")
}
## Loading required package: 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
if (!require("e1071")) {
install.packages("e1071")
}
## Loading required package: e1071
if (!require("purrr")) {
install.packages("purrr")
}
## Loading required package: purrr
if (!require("ineq")) {
install.packages("ineq")
}
## Loading required package: ineq
if (!require("kableExtra")) {
install.packages("kableExtra")
}
## Loading required package: kableExtra
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
if (!require("ggplot2")) {
install.packages("ggplot2")
}
## Loading required package: ggplot2
#carica i pachetti
library(ggplot2)
library(ineq)
library(kableExtra)
library(purrr)
library(dplyr)
library(e1071)
# Funzione per il calcolo della moda
get_mode <- function(v) {
uniqv <- unique(v)
uniqv[which.max(tabulate(match(v, uniqv)))]
}
#aggiunta variabile per le stagioni
df <- df %>%
mutate(season = case_when(
month %in% c(12, 1, 2) ~ "Winter",
month %in% c(3, 4, 5) ~ "Spring",
month %in% c(6, 7, 8) ~ "Summer",
month %in% c(9, 10, 11) ~ "Autumn"
))
#2. Indici di posizione, variabilità e forma
# Funzione per calcolare tutti gli indici su un singolo vettore
calcola_indici <- function(x) {
data.frame(
media = mean(x, na.rm = TRUE),
mediana = median(x, na.rm = TRUE),
moda = get_mode(x),
minimo = min(x, na.rm = TRUE),
massimo = max(x, na.rm = TRUE),
Q1 = quantile(x, 0.25, na.rm = TRUE),
Q3 = quantile(x, 0.75, na.rm = TRUE),
varianza = var(x, na.rm = TRUE),
deviazione_std = sd(x, na.rm = TRUE),
coeff_var = sd(x, na.rm = TRUE) / mean(x, na.rm = TRUE),
skewness = skewness(x, na.rm = TRUE),
kurtosis = kurtosis(x, na.rm = TRUE)
)
}
#efficacia annuci valore assoluto, immobili venduti (sales) / immobili in listino (listings)
df <- df %>%
mutate(efficacia_annunci = round(sales / listings, 2))
#max(df$efficacia_annunci)
#min(df$efficacia_annunci)
#efficacia annunci in percentuale
df <- df %>%
mutate(efficacia_percentuale = round((sales / listings) * 100, 2))
riassunto_statistico <- df %>%
select(where(is.numeric)) %>%
map_dfr(calcola_indici, .id = "variabile")
#tolgo le variabili non interessate dagli indici
riassunto_statistico <- riassunto_statistico %>%
filter(!variabile %in% c("year", "month","sales_class","efficacia_livello","volume_dollars","volume","median_price"))
options(scipen = 999) #toglie la notazione scientica
riassunto_statistico <- riassunto_statistico %>%
mutate(across(where(is.numeric), ~round(., 2)))
(1. Analisi delle variabili)
Di seguito una panoramica delle variabili contenute nel dataset e la loro tipologia statistica:
| Variabile | Descrizione | Tipo di Variabile |
| city | Nome della città (es. Beaumont, Wichita Falls, etc.) | Qualitativa nominale |
| year | Anno di riferimento (es. 2010, 2011, …) | Quantitativa continua da trattare come qualitativa ordinale in questo caso |
| month | Mese di riferimento (es. 1,2, …) | Qualitativa nominale |
| sales | Numero di vendite immobiliari | Quantitativa discreta |
| volume | Valore totale delle vendite (in milioni di dollari, con decimali) | Quantitativa continua |
| median_price | Prezzo mediano delle case vendute (in dollari) | Quantitativa continua |
| listings | Numero totale di annunci immobiliari attivi | Quantitativa discreta |
| months_inventory | Tempo stimato per esaurire le case in vendita (in mesi, es. 2.1, 4.7, …) | Quantitativa continua |
Al dataset iniziale sono state aggiunte le seguenti variabili, con l’obiettivo di migliorare la leggibilità dei grafici e l’analisi statistica del progetto:
month_label: contiene i nomi dei mesi (Jan, Feb, …, Dec) corrispondenti al valore numerico della variabile month (esempio: 1 = Jan).
mean_price: rappresenta il prezzo medio di vendita, calcolato come rapporto tra il volume totale delle vendite in dollari (Volume) e il numero di vendite (Sales) (6. Creazione di nuove variabili)
volume_dollars: riporta il volume delle vendite espresso in valore unitario anziché in milioni, per uniformare le variabili utilizzando un’unica unità di misura.
Season: riporta le stagioni (6. Creazione di nuove variabili).
Sales_Class: suddivisione in classi con passo di 100 della variabile Sales per facilitare l’analisi statistica.
Efficacia_annunci: è il rapporto tra le vendite (sales) e il numero di annunci attivi (listings) (6. Creazione di nuove variabili).
Valori vicini a 1 indicano una efficacia alta viceversa valori vicini a 0 una efficacia bassa.
È un indicatore utile per valutare l’efficienza del mercato immobiliare locale.
#2. Indici di posizione, variabilità e forma
riassunto_statistico %>%
kbl(caption = "Riepilogo statistico delle variabili numeriche",
align = "c",
booktabs = TRUE) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
font_size = 14)
| variabile | media | mediana | moda | minimo | massimo | Q1 | Q3 | varianza | deviazione_std | coeff_var | skewness | kurtosis | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 25%…1 | sales | 192.29 | 175.50 | 124.00 | 79.00 | 423.00 | 127.00 | 247.00 | 6344.30 | 79.65 | 0.41 | 0.71 | -0.34 |
| 25%…2 | listings | 1738.02 | 1618.50 | 1581.00 | 743.00 | 3296.00 | 1026.50 | 2056.00 | 566568.97 | 752.71 | 0.43 | 0.65 | -0.81 |
| 25%…3 | months_inventory | 9.19 | 8.95 | 8.10 | 3.40 | 14.90 | 7.80 | 10.95 | 5.31 | 2.30 | 0.25 | 0.04 | -0.20 |
| 25%…4 | mean_price | 154320.37 | 156588.48 | 170626.51 | 97010.20 | 213233.94 | 132938.94 | 173915.15 | 736984385.27 | 27147.46 | 0.18 | -0.07 | -0.80 |
| 25%…5 | efficacia_annunci | 0.12 | 0.11 | 0.10 | 0.05 | 0.39 | 0.09 | 0.13 | 0.00 | 0.05 | 0.40 | 2.09 | 6.93 |
| 25%…6 | efficacia_percentuale | 11.87 | 10.96 | 10.48 | 5.01 | 38.71 | 8.98 | 13.50 | 22.00 | 4.69 | 0.39 | 2.08 | 6.80 |
(2. Indici di posizione, variabilità e forma)
Distribuzione dei dati
La maggior parte delle variabili hanno una distribuzione leggermente asimmetrica positiva (skewness > 0)
L’efficacia degli annunci mostra una forte asimmetria positiva (skewness > 2) e una curtosi molto elevata (6.93). La maggior parte degli annunci ha bassa efficacia, ma ci sono alcuni annunci molto efficaci, che creano una lunga coda nella parte alta del grafico.
Variabilità
Caratteristiche del mercato
In media, le case restano sul mercato per circa 9 mesi.
L’efficacia degli annunci è piuttosto bassa: in media solo il 12% degli annunci porta a una vendita,
#2. Indici di posizione, variabilità e forma)
#frequenze_city <- df %>%
# count(city, name = "Frequenza") %>%
# mutate(Frequenza_percentuale = round(Frequenza / sum(Frequenza) * 100, 2))
# Funzione per creare tabella con frequenze assolute e relative
get_frequenze <- function(var) {
df %>%
count({{var}}, name = "Frequenza") %>%
mutate(Frequenza_percentuale = round(Frequenza / sum(Frequenza) * 100, 2))
}
frequenze_city <- get_frequenze(city)
frequenze_year <- get_frequenze(year)
frequenze_month <- get_frequenze(month)
frequenze_month_label <- get_frequenze(month_label)
frequenze_season <- get_frequenze(season)
#indice di GINI per variabili categoriche
gini.index <- function(x){
ni = table(x)
fi = ni/length(x)
fi2 = fi^2
j = length(table(x))
gini = 1-sum(fi2)
gini.normalizzato = gini/((j-1)/j)
return(gini.normalizzato)
}
indice_gini_city <- gini.index(df$city) # valore 1
#ineq(df$sales, type = "Gini")
# Calcolo dell'indice di Gini per le frequenze delle classi
sales_class_freq <- table(df$sales_class)
frequenze_city %>%
kbl(caption = "Distribuzione di frequenza per la variabile City",
align = "c",
booktabs = TRUE) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
font_size = 14)
| city | Frequenza | Frequenza_percentuale |
|---|---|---|
| Beaumont | 60 | 25 |
| Bryan-College Station | 60 | 25 |
| Tyler | 60 | 25 |
| Wichita Falls | 60 | 25 |
Cosa si evince:
L’indice di Gini per la variabile Città è 1, cioè equamente
distribuita.
#2. Indici di posizione, variabilità e forma)
frequenze_month %>%
kbl(caption = "Distribuzione di frequenza per la variabile Month",
align = "c",
booktabs = TRUE) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
font_size = 14)
| month | Frequenza | Frequenza_percentuale |
|---|---|---|
| 1 | 20 | 8.33 |
| 2 | 20 | 8.33 |
| 3 | 20 | 8.33 |
| 4 | 20 | 8.33 |
| 5 | 20 | 8.33 |
| 6 | 20 | 8.33 |
| 7 | 20 | 8.33 |
| 8 | 20 | 8.33 |
| 9 | 20 | 8.33 |
| 10 | 20 | 8.33 |
| 11 | 20 | 8.33 |
| 12 | 20 | 8.33 |
#5. Calcolo della probabilità
p_beaumont <- round((sum(df$city == "Beaumont") / nrow(df)) * 100,2)
p_luglio <- round((sum(df$month == 7) / nrow(df))* 100,2)
p_dicembre_2012 <- round((sum(df$month == 12 & df$year == 2012) / nrow(df))* 100,2)
La probabilità che preso un record a caso del dataset esso riporti: (5. Calcolo della probabilità)
la città di Beaumont è del 25%
Il mese di Luglio è dell’8.33%
Il mese di dicembre dell’anno 2012 è dell’1.67%
#4. Creazione di classi per una variabile quantitativa
# 4. Creazione di classi per una variabile quantitativa
#classi
breaks <- seq(0, 500, by = 100)
df <- df %>%
mutate(sales_class = cut(
sales,
breaks = breaks, # numero di classi
include.lowest = TRUE,
right = FALSE, # intervalli chiusi a sinistra, aperti a destra
dig.lab = 10 # evita notazione scientifica
))
frequenze_sales_class <- df %>%
count(sales_class, name = "Frequenza") %>%
mutate(Frequenza_percentuale = round(Frequenza / sum(Frequenza) * 100, 2))
gini_sales_class <- ineq(as.numeric(sales_class_freq), type = "Gini")
frequenze_sales_class %>%
kbl(caption = "Distribuzione di frequenza delle Classi della variabile Sales (4. Creazione di classi per una variabile quantitativa)",
align = "c",
booktabs = TRUE) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = TRUE,
font_size = 14)
| sales_class | Frequenza | Frequenza_percentuale |
|---|---|---|
| [0,100) | 20 | 8.33 |
| [100,200) | 127 | 52.92 |
| [200,300) | 67 | 27.92 |
| [300,400) | 23 | 9.58 |
| [400,500] | 3 | 1.25 |
df %>%
count(sales_class) %>%
mutate(perc = round(n / sum(n) * 100, 1)) %>%
ggplot(aes(x = sales_class, y = perc)) +
geom_col(fill = "#4C9F70") +
geom_text(aes(label = paste0(perc, "%")), vjust = -0.5) +
theme_minimal() +
labs(
title = "Distribuzione % delle Classi di Sales",
x = "Classi di Sales",
y = "Percentuale"
) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Cosa si evince:
La distribuzione è asimmetrica a destra: ci sono poche osservazioni con Sales elevate.
Le Sales più comuni rientrano tra 100 e 300 unità, che coprono oltre l’80% del totale.
Le classi estreme (molto basse e molto alte) sono poco frequenti, suggerendo che valori estremi sono eccezioni.
L’indice di Gini per la classe di vendita (Classe Sales) è NaN. Questo indica che alcune fasce di Sales, come quella tra 100 e 200, compaiono molto più spesso rispetto ad altre, come quella tra 400 e 500.
# 7. Analisi condizionata
riassunto_statistico_per_Beaumont <- df %>%
filter(city == "Beaumont") %>%
select(where(is.numeric)) %>%
map_dfr(calcola_indici, .id = "variabile")
riassunto_statistico_per_Beaumont <- riassunto_statistico_per_Beaumont %>%
filter(!variabile %in% c("year", "month","sales_class","efficacia_livello","volume_dollars","volume","median_price"))
options(scipen = 999) #toglie la notazione scientica
riassunto_statistico_per_Beaumont <- riassunto_statistico_per_Beaumont %>%
mutate(across(where(is.numeric), ~round(., 2)))
riassunto_statistico_per_Beaumont %>%
kbl(caption = "Riassunto Statistico per la città di Beaumont (7. Analisi condizionata)",
align = "c",
booktabs = TRUE) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
# full_width = TRUE,
font_size = 14)
| variabile | media | mediana | moda | minimo | massimo | Q1 | Q3 | varianza | deviazione_std | coeff_var | skewness | kurtosis | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 25%…1 | sales | 177.38 | 176.5 | 182.00 | 83.00 | 273.00 | 150.00 | 202.00 | 1720.92 | 41.48 | 0.23 | 0.18 | -0.26 |
| 25%…2 | listings | 1679.32 | 1676.0 | 1708.00 | 1500.00 | 1857.00 | 1619.25 | 1743.75 | 8305.37 | 91.13 | 0.05 | 0.02 | -0.79 |
| 25%…3 | months_inventory | 9.97 | 10.4 | 11.60 | 7.00 | 12.60 | 8.57 | 11.40 | 2.72 | 1.65 | 0.17 | -0.21 | -1.35 |
| 25%…4 | mean_price | 146640.41 | 145808.6 | 170626.51 | 120713.33 | 174723.93 | 141631.15 | 153598.03 | 126160695.61 | 11232.13 | 0.08 | -0.14 | 0.13 |
| 25%…5 | efficacia_annunci | 0.11 | 0.1 | 0.10 | 0.05 | 0.17 | 0.09 | 0.12 | 0.00 | 0.03 | 0.26 | 0.30 | -0.47 |
| 25%…6 | efficacia_percentuale | 10.61 | 10.3 | 15.19 | 5.41 | 16.51 | 8.91 | 11.89 | 7.12 | 2.67 | 0.25 | 0.36 | -0.48 |
riassunto_statistico_per_Beaumont_estate_2014 <- df %>%
filter(city == "Beaumont" & season == "Summer" & year == 2014) %>%
select(where(is.numeric)) %>%
map_dfr(calcola_indici, .id = "variabile")
riassunto_statistico_per_Beaumont_estate_2014 <- riassunto_statistico_per_Beaumont_estate_2014 %>%
filter(!variabile %in% c("year", "month","sales_class","efficacia_livello","volume_dollars","volume","median_price"))
options(scipen = 999) #toglie la notazione scientica
riassunto_statistico_per_Beaumont_estate_2014 <- riassunto_statistico_per_Beaumont_estate_2014 %>%
mutate(across(where(is.numeric), ~round(., 2)))
riassunto_statistico_per_Beaumont_estate_2014 %>%
kbl(caption = "Riassunto Statistico per la città di Beaumont Estate 2014(7. Analisi condizionata)",
align = "c",
booktabs = TRUE) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
# full_width = TRUE,
font_size = 14)
| variabile | media | mediana | moda | minimo | massimo | Q1 | Q3 | varianza | deviazione_std | coeff_var | skewness | kurtosis | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 25%…1 | sales | 242.67 | 254.00 | 254.00 | 212.00 | 262.00 | 233.00 | 258.00 | 721.33 | 26.86 | 0.11 | -0.35 | -2.33 |
| 25%…2 | listings | 1648.67 | 1657.00 | 1672.00 | 1617.00 | 1672.00 | 1637.00 | 1664.50 | 808.33 | 28.43 | 0.02 | -0.27 | -2.33 |
| 25%…3 | months_inventory | 7.93 | 8.00 | 8.00 | 7.80 | 8.00 | 7.90 | 8.00 | 0.01 | 0.12 | 0.01 | -0.38 | -2.33 |
| 25%…4 | mean_price | 157335.54 | 157217.56 | 150350.39 | 150350.39 | 164438.68 | 153783.98 | 160828.12 | 49630387.94 | 7044.88 | 0.04 | 0.02 | -2.33 |
| 25%…5 | efficacia_annunci | 0.15 | 0.15 | 0.15 | 0.13 | 0.16 | 0.14 | 0.16 | 0.00 | 0.02 | 0.10 | -0.21 | -2.33 |
| 25%…6 | efficacia_percentuale | 14.73 | 15.19 | 15.19 | 12.79 | 16.20 | 13.99 | 15.70 | 3.07 | 1.75 | 0.12 | -0.25 | -2.33 |
# 1 boxplot per confrontare la distribuzione del prezzo mediano tra le varie città , fill = city
ggplot(df, aes(x = city, y = median_price)) +
geom_boxplot() +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(
# title = "Distribuzione del prezzo mediano per città",
x = "Città",
y = "Prezzo Mediano",
fill = "Città"
)
Prezzi più alti: Bryan-College Station ha i prezzi mediani più elevati, con valori che si aggirano intorno ai 150.000-160.000 $.
Prezzi intermedi: Tyler mostra prezzi leggermente inferiori rispetto a Bryan-College Station, con una mediana intorno ai 140.000 $ e una distribuzione abbastanza ampia.
Prezzi più bassi: Beaumont ha prezzi poco più bassi, con una mediana di circa 130.000 $. Wichita Falls presenta i prezzi più bassi del gruppo, con una mediana intorno ai 100.000 $.
Variabilità: Bryan-College Station e Tyler mostrano una maggiore variabilità nei prezzi (box più ampie), mentre Beaumont e Wichita Falls hanno delle distribuzioni più concentrate.
Outliers: Si possono notare alcuni valori anomali a Bryan-College Station e a Wichita Falls.
Il grafico suggerisce la presenza di differenze importanti nel mercato immobiliare tra le città prese in esame.
Distribuzione del valore totale delle vendite tra le varie città
# 2 distribuzione delle vendite tra le varie città e anni
# 2-1 Boxplot per confronto tra città , fill = city
ggplot(df, aes(x = city, y = sales)) +
geom_boxplot(alpha = 0.7) +
labs(#title = "Distribuzione valore vendite per città",
x = "Città",
y = "Sales") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "none")
Tyler al top: ha la mediana più alta (intorno a 275) e la seconda distribuzione più ampia. È il mercato più forte, con vendite che possono arrivare oltre 400.
Bryan-College Station interessante: ha una mediana più bassa di Tyler (circa 190), ma una distribuzione più ampia.
Beaumont stabile: ha una mediana intorno a 175 con una distribuzione meno ampia rispetto alle precedenti.
Wichita Falls ultima: ha una mediana bassa (circa 120) ed una distribuzione ristretta. È chiaramente il mercato più piccolo.
Variabilità: Tyler e Bryan-College Station hanno molta più variabilità nelle vendite rispetto a Beaumont e Wichita Falls
Distribuzione valore vendite per anno e città
# 2-4 anni per ogni città
ggplot(df, aes(x = as.factor(year), y = sales)) +
geom_boxplot(alpha = 0.7) +
facet_wrap(~city, ncol = 2) +
labs(title = "Distribuzione valore vendite per anno e città",
x = "Anno",
y = "Sales") +
theme_minimal() +
theme(legend.position = "none")
Beaumont: rappresenta il mercato più stabile, con una mediana che, nel corso degli anni, resta sempre con valori intorno a 175-200.
Bryan-College Station: nel 2010-2011 ha un mercato stabile; nel 2012, pur con una mediana stabile rispetto agli anni precedenti si osserva un’ampia distribuzione verso l’alto che culmina nel 2014 con un notevole aumento anche della mediana.
Tyler: Cresce costantemente dal 2010 al 2014, raggiungendo il picco nel 2014 con mediana intorno a 340.
Wichita Falls: è sicuramente il mercato più piccolo, con valori di mediana sempre inferiori a 150 con il minimo raggiunto nel 2014.
Totale delle vendite mensili per città
# 3 grafico a barre sovrapposte per confrontare il totale delle vendite nei vari mesi,
# per città. Grafico a barre normalizzato. prova ad inserire la variabile YEAR
df %>%
group_by(month_label, city) %>% # Raggruppa per mese e città
summarise(total_sales = sum(sales, na.rm = TRUE), .groups = 'drop') %>%
ggplot(aes(x = factor(month_label), y = total_sales, fill = city)) +
geom_bar(stat = "identity") +
labs(
#title = "Totale Sales per mese",
x = "Mese",
y = "Totale vendite",
fill = "Città"
) +
theme_minimal()
Il boom della primavera-estate: i mesi di maggio, giugno, luglio e agosto sono chiaramente i migliori, con vendite totali che superano le 4.500 unità, con giugno che rappresenta l’apice della crescita.
Autunno in calo: a partire dal mese di settembre si ha un calo progressivo delle vendite che culmina a novembre.
L’inverno è duro: i mesi invernali, in particolare gennaio e febbraio, sono i mesi più deboli, con vendite sotto le 3.000 unità.
È interessante vedere come tutte le città seguano lo stesso pattern stagionale, ma Tyler e Bryan-College Station amplificano molto di più l’effetto estate-inverno.
Distribuzione percentuale delle vendite per mese e città
df %>%
group_by(month_label, city,year) %>%
summarise(total_sales = sum(sales, na.rm = TRUE), .groups = 'drop') %>%
group_by(month_label,year) %>%
mutate(perc_sales = total_sales / sum(total_sales)) %>%
ggplot(aes(x = factor(month_label), y = perc_sales, fill = city)) +
geom_bar(stat = "identity", position = "fill") +
labs(
#title = "Distribuzione percentuale delle vendite per mese e città",
x = "Mese",
y = "Percentuale vendite",
fill = "Città"
) +
scale_y_continuous(labels = scales::percent) +
theme_minimal()
Beaumont costante: La fascia rossa è rappresentata in modo stabile nel corso dell’anno.
Bryan-College Station tiene bene: La fascia verde è ben rappresentata particolarmente nei mesi estivi, indice che questa città contribuisce notevolmente al totale delle vendite.
Tyler domina sempre: La fascia azzurra è la più ampia ogni mese, confermando che è il mercato più forte durante tutto l’anno.
Wichita Falls sempre piccola: La fascia viola è la meno rappresentata, confermando che è il mercato più piccolo.
Andamento dell’Efficacia degli annunci per città nel tempo
# 4 line chart di una variabile per fare confronti fra città e periodi #storici
# df %>%
# group_by(year, city) %>%
# summarise(media_eff = mean(efficacia_percentuale, na.rm = TRUE), .groups = 'drop') %>%
# ggplot(aes(x = year, y = media_eff, color = city)) +
# geom_line(linewidth = 1) +
# labs(
# #title = "Andamento dell'efficacia percentuale per città",
# x = "Anno",
# y = "Efficacia (%)",
# color = "Città"
# ) +
# theme_minimal()
# df %>%
# group_by(year, month, city) %>%
# summarise(media_eff = mean(efficacia_percentuale, na.rm = TRUE), .groups = 'drop') %>%
# ggplot(aes(x = paste(year, month, sep = "-"), y = media_eff, color = city)) +
# geom_line(linewidth = 1) +
# labs(
# #title = "Andamento dell'efficacia percentuale per città",
# x = "Anno-Mese",
# y = "Efficacia (%)",
# color = "Città"
# ) +
# theme_minimal()
# df %>%
# mutate(
# date = as.Date(paste(year, month, "01", sep = "-")),
# month_label = factor(month_label, levels = unique(month_label[order(year, month)]))
# ) %>%
# group_by(month_label, date, city) %>%
# summarise(media_eff = mean(efficacia_percentuale, na.rm = TRUE), .groups = 'drop') %>%
# ggplot(aes(x = month_label, y = media_eff, group = city, color = city)) +
# geom_line(linewidth = 1) +
# labs(
# x = "Mese",
# y = "Efficacia (%)",
# color = "Città"
# ) +
# theme_minimal()
# df %>%
# mutate(
# date = as.Date(paste(year, month, "01", sep = "-")),
# month_label = factor(month_label, levels = month.abb) # ordina correttamente i mesi
# ) %>%
# group_by(date, city) %>%
# summarise(media_eff = mean(efficacia_percentuale, na.rm = TRUE), .groups = 'drop') %>%
# arrange(date) %>%
# ggplot(aes(x = date, y = media_eff, color = city)) +
# geom_line(linewidth = 1) +
# scale_x_date(
# date_labels = "%b %Y", # etichette tipo "Jan 2024"
# date_breaks = "1 month"
# ) +
# labs(
# x = "Mese",
# y = "Efficacia (%)",
# color = "Città"
# ) +
# theme_minimal() +
# theme(axis.text.x = element_text(angle = 45, hjust = 1))
?mutate
df %>%
mutate(date = as.Date(paste(year, month, "01", sep = "-"))) %>%
group_by(date, city) %>%
summarise(media_eff = mean(efficacia_percentuale, na.rm = TRUE), .groups = 'drop') %>%
ggplot(aes(x = date, y = media_eff, color = city)) +
geom_line(linewidth = 1) +
scale_x_date(
date_labels = "%b %Y",
date_breaks = "6 months" # una label ogni sei mesi
) +
labs(
x = "Mese - Anno",
y = "Efficacia (%)",
color = "Città"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Beaumont mostra una lieve flessione nell’efficacia nel 2011 per poi cresce costantemente fino al 2014;
Bryan-College Station ha avuto un picco di crescita a partire dal 2012 arrivando a superare il 20% nel 2014, rappresentando la città con l’efficacia migliore;
Tyler rappresenta una crescita dell’efficacia costante pur rimanendo con la percentuale di efficacia minore;
Wichita Falls ha un andamento altalenante, tuttavia i valori iniziali e finali sono simili mostrando una buona efficacia.
Considerazioni sulle vendite
Autunno e primavera le mezze stagioni: queste due stagioni hanno vendite simili, con la primavera che presenta vendite leggermente più alte.
Estate al primo posto: l’estate è chiaramente la stagione con più vendite, raggiungendo i picchi più alti soprattutto nel 2013 e 2014.
Inverno fanalino di coda: l’inverno è la stagione con vendite minori in tutti gli anni considerati.
Nel tempo: analizzando l’andamento delle vendite nel corso degliannisi nota una progressiva crescita dal 2011 con culmine nel 2014 in tutte le stagioni.
Dall’analisi dei grafici emerge un quadro interessante del mercato immobiliare delle quattro città studiate.
Bryan-College Station è il mercato più promettente: mostra un netto miglioramento nell’efficacia delle vendite con i prezzi più elevati.
Tyler conferma la promessa iniziale con una crescita costante con elevati valori di vendite.
Beaumont si posiziona in una fascia intermedia, con una crescita più lenta ma costante.
Wichita Falls presenta i valori più contenuti sia in termini di vendite che di prezzi.
Il dato più rilevante riguarda l’efficacia commerciale: anche se i tassi di conversione da annuncio a vendita sono generalmente bassi in tutte le città, si osservano miglioramenti per Beaumont e Tyler e un boom per quanto riguarda Bryan-College Station.
Investire in Bryan-College Station: l’aumento di efficacia suggerisce una dinamica favorevole.
Rafforzare le strategie di marketing per i mesi invernali su tutte le città.
Sfruttare i mesi estivi con campagne mirate, poiché è il periodo di picco per tutte le città.