```{r #Carico tutte le librerie che userò library(dplyr) library(ggplot2) library(plotly) library(shiny) library(lubridate) library(tidyr) library(bslib) library(scales) library(magrittr) library(DescTools) library(tidyverse) library(moments)
#Restituisce la classe dell’oggetto. class(realestate_texas) #Indica il tipo di dato all’interno dell’oggetto e mi crea un dataframe che indica il tipo di dato per ogni #colonna del dataset di partenza. tipo_di_variabile <- realestate_texas %>% summarize(across(everything(), class)) print(tipo_di_variabile) #Year e month anche se sono esperesse in numeri rappresentano delle variabili di tipo qualitativo. #Per questo motivo si è scelto di considerarle come character. #Voglio unire la colonna mese e la colonna anno in modo da avere una colonna data da usare in seguito. #Sovrascrivo il dataframe originale aggiungendo la colonna ‘data’. realestate_texas <- realestate_texas %>% mutate(data = as.Date(paste(year, month, “01”, sep = “-”)) %>% format(“%d/%m/%Y”)) #formato data italiano #Statistiche di base per ogni variabile summary(realestate_texas)
#Analizzo i trend storici delle vendite immobiliari in Texa (1 PUNTO)
#Preparazione dei dati iniziali. sales_by_city_year <-
realestate_texas %>% group_by(city, year, month) %>% #Raggruppo i
dati per città, anno e mese. summarise(vendite_totali = sum(sales))
%>% #Calcolo il totale delle vendite per gruppo. mutate(data =
make_date(year, month, 1)) #Creo una colonna data combinando anno e
mese. #Definizione dell’interfaccia utente (UI) dell’applicazione Shiny.
ui <- fluidPage( titlePanel(“Trend Vendite Immobiliari Texas”),
#Titolo dell’applicazione. #Layout con barra laterale. sidebarLayout(
#Pannello laterale con controlli. sidebarPanel( selectInput(“citta”,
#Menu a tendina per selezionare la città. “Seleziona città:”, choices =
unique(sales_by_city_year\(city))
),
#Pannello principale con grafici e statistiche.
mainPanel(
plotlyOutput("plot_vendite"), #Area per il grafico
interattivo.
verbatimTextOutput("statistiche") #Area per le
statistiche testuali.
)
)
)
#Definisco la logica del server.
server <- function(input, output) {
#Creazione del grafico interattivo.
output\)plot_vendite <- renderPlotly({ #Filtro per i dati
per la città selezionata. dati_citta <- sales_by_city_year %>%
filter(city == input\(citta)
#Creazione del grafico con ggplot2.
p <- ggplot(dati_citta, aes(x = data, y = vendite_totali)) +
#Aggiunta linea delle vendite mensili con legenda.
geom_line(aes(color = "Vendite Mensili")) +
#Aggiunta linea di tendenza con intervallo di confidenza.
geom_smooth(method = "loess", se = TRUE,
aes(color = "Linea di Tendenza", fill =
"Intervallo di Confidenza")) +
#Definizione delle etichette del grafico.
labs(
title = paste("Trend Vendite Immobiliari -",
input\)citta), x = “Data”, y = “Numero Vendite Totali”, color =
“Legenda”,
fill = “Legenda”
) + #Definizione dei colori per le linee. scale_color_manual(values =
c(“Vendite Mensili” = “blue”, “Linea di Tendenza” = “red”)) +
#Definizione del colore per l’intervallo di confidenza.
scale_fill_manual(values = c(“Intervallo di Confidenza” = “grey80”)) +
#Applicazione del tema minimale. theme_minimal() + #Personalizzazione
dell’asse X delle date. scale_x_date(date_breaks = “3 months”, #Mostra
etichette ogni 3 mesi. date_labels = “%b %Y”, #Formato data italiano.
date_minor_breaks = “1 month”) + #Aggiunge tacche minori mensili.
#Rotazione delle etichette sull’asse X per migliorare la leggibilità.
theme(axis.text.x = element_text(angle = 45,
hjust = 1))
#Conversione del grafico ggplot in grafico interattivo plotly.
ggplotly(p)
})
#Creazione del riquadro statistiche. output\(statistiche <- renderPrint({ #Filtra i dati per la città selezionata. dati_citta <- sales_by_city_year %>% filter(city == input\)citta)
#Calcolo e visualizzazione delle statistiche principali.
cat("Statistiche per", input$citta, "\n",
"Vendite massime:", max(dati_citta$vendite_totali), "\n",
"Vendite minime:", min(dati_citta$vendite_totali), "\n",
"Media vendite:", round(mean(dati_citta$vendite_totali), 2))
}) } #Avvio dell’applicazione Shiny. shinyApp(ui = ui, server =
server) #Questi quattro grafici ci offrono una prima panoramica
sull’andamento del settore immobiliare.
#A Beaumont possiamo vedere un trend crescente nel numero di vendite di
case, #con una stagionalità piuttosto marcata: il picco di vendite si
registra quasi sempre tra luglio e ottobre, #mentre il minimo si
verifica generalmente a gennaio.
#A Bryan-College Station possiamo vedere un trend di crescita simile a
Beaumont, ma ancora più accentuato. #Questa forte oscillazione annuale
potrebbe essere influenzata dalla natura universitaria della
città,
#dove il ciclo accademico potrebbe accentuare la differenza tra il
mercato estivo e quello invernale.
#Anche a Tyler possiamo osservare un trend di crescita, inoltre il
numero medio di vendite è più elevato. #A Wichita Falls, invece, non
vediamo nessun trend definito.
#Grafico per confrontare le vendite nelle 4 città. ui <-
fluidPage( titlePanel(“Confronto Vendite Immobiliari tra Città”),
mainPanel( plotlyOutput(“plot_confronto”, height = “600px”),
verbatimTextOutput(“statistiche_comparative”) ) ) server <-
function(input, output) { output\(plot_confronto <- renderPlotly({
p <- ggplot(sales_by_city_year, aes(x = data, y = vendite_totali,
color = city)) +
geom_line() +
labs(
title = "Confronto Vendite Immobiliari tra Città",
x = "Data",
y = "Numero Vendite Totali",
color = "Città"
) +
scale_color_manual(values = c(
"Beaumont" = "#1f77b4",
"Bryan-College Station" = "#2ca02c",
"Tyler" = "#ff7f0e",
"Wichita Falls" = "#d62728"
)) +
theme_minimal() +
scale_x_date(date_breaks = "3 months",
date_labels = "%b %Y",
date_minor_breaks = "1 month") +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "right",
plot.title = element_text(hjust = 0.5)
)
ggplotly(p)
})
output\)statistiche_comparative <- renderPrint({
stats_by_city <- sales_by_city_year %>% group_by(city) %>%
summarise( Media_Vendite = round(mean(vendite_totali), 0), Max_Vendite =
max(vendite_totali), Min_Vendite = min(vendite_totali) )
cat(“Statistiche Comparative per Città:”) print(stats_by_city) }) }
#Lancia l’app shinyApp(ui = ui, server = server) #Wichita Falls sembra
essere la città più piccola, con una minore movimentazione del mercato
immobiliare.
# yler e Bryan-College Station, invece, sono le città più grandi,
caratterizzate da un mercato più dinamico.
#Valuto l’efficacia delle strategie di marketing delle inserzioni
immobiliari (2 PUNTO) #Per fare ciò ho usato il tasso di conversione =
(numero di vendite / numero di inserzioni) × 100 #e i mesi di
inventario, dato che è già presente nel dataset. #Aggiungiamo il tasso
di conversione al dataframe esistente. #Lettura del file CSV e
preparazione del dataset. realestate_texas <-
read.csv(“realestate_texas.csv”) %>% mutate( #Calcolo del tasso di
conversione (vendite/inserzioni in percentuale). conversion_rate =
(sales / listings) * 100, #Creazione di una colonna data combinando anno
e mese. data = as.Date(paste(year, month, “01”, sep = “-”)) ) #Definiamo
l’interfaccia utente. ui <- fluidPage( #Impostazione del tema. theme
= bslib::bs_theme(version = 4), #Titolo dell’applicazione
titlePanel(“Analisi Efficacia Marketing Immobiliare”), #Layout con barra
laterale. sidebarLayout( #Panel laterale con i controlli. sidebarPanel(
#Menu a tendina per la selezione della metrica. selectInput(“metric”,
“Seleziona Metrica:”, choices = c(“Tasso di Conversione” =
“conversion_rate”, “Mesi di Inventario” = “months_inventory”)), #Menu a
tendina per la selezione della città. selectInput(“citta”, “Seleziona
città:”, choices = unique(realestate_texas\(city))
),
#Panel principale con i grafici e le statistiche.
mainPanel(
#Grafico principale dei trend.
plotlyOutput("plot_marketing", height =
"400px"),
br(), #Spazio verticale.
#Output testuale delle statistiche.
verbatimTextOutput("stats_marketing"),
br(), #Spazio verticale.
#Grafico dell'analisi stagionale.
plotlyOutput("plot_seasonal", height =
"300px")
)
)
)
server <- function(input, output) {
#Reactive expression per filtrare i dati in base alla città
selezionata.
#Questo calcolo viene memorizzato nella cache e aggiornato solo quando
necessario.
filtered_data <- reactive({
realestate_texas %>% filter(city == input\)citta) })
output\(plot_marketing <- renderPlotly({
#Otteniamo dei dati filtrati.
df <- filtered_data()
#Scelta della colonna y e dell'etichetta in base alla metrica
scelta.
y_col <- if(input\)metric == “conversion_rate”)
“conversion_rate” else “months_inventory” y_label <- if(input\(metric == "conversion_rate") "Tasso
di Conversione (%)" else "Mesi di Inventario"
#Creazione del grafico base con ggplot2.
p <- ggplot(df, aes_string(x = "data", y = y_col)) +
#Linea del trend.
geom_line(aes(color = "Dati reali")) +
#Area di confidenza senza bordi.
geom_smooth(method = "loess", se = TRUE,
aes(fill = "Intervallo di confidenza"),
color = NA,
size = 0) +
#Linea di smoothing rossa.
geom_smooth(method = "loess", se = FALSE,
aes(color = "Linea di tendenza"),
size = 1) +
#Etichette del grafico.
labs(
title = paste("Trend", y_label, "-",
input\)citta), x = “Data”, y = y_label ) + #Imposta i colori
manualmente. scale_color_manual(values = c(“Dati reali” = “#1f77b4”,
“Linea di tendenza” = “red”)) + scale_fill_manual(values = c(“Intervallo
di confidenza” = “grey70”)) + #Tema e altre personalizzazioni.
theme_minimal() + theme( legend.position = “bottom”, legend.title =
element_blank(), axis.text.x = element_text(angle = 45, hjust = 1),
panel.grid.major = element_line(color = “gray90”), panel.grid.minor =
element_line(color = “gray95”) ) + #Formattazione dell’asse x per le
date. scale_x_date( date_breaks = “3 months”, date_labels = “%m/%Y”,
date_minor_breaks = “1 month” ) #Converti in plotly e modifica il
layout. fig <- ggplotly(p, tooltip = “y”) #Modifica il layout. fig
%>% layout( margin = list(b = 150), showlegend = TRUE, legend = list(
orientation = “h”, xanchor = “center”, x = 0.5, y = -0.3, yanchor =
“top” ) ) }) output\(stats_marketing <-
renderText({
#Otteniamo dei dati filtrati.
df <- filtered_data()
#Calcolo delle statistiche principali.
stats <- df %>%
summarise(
Media_Conversione = mean(conversion_rate, na.rm = TRUE),
Max_Conversione = max(conversion_rate, na.rm = TRUE),
Min_Conversione = min(conversion_rate, na.rm = TRUE),
Media_Inventario = mean(months_inventory, na.rm = TRUE),
Efficienza_Media = mean(sales/listings * 100, na.rm = TRUE)
)
#Formattazione del testo output.
paste0(
"\nStatistiche di Marketing per ", input\)citta,
“”, “—————————————-”, “Media Tasso di Conversione:”, round(stats\(Media_Conversione, 2), "%\n",
"Max Tasso di Conversione: ",
round(stats\)Max_Conversione, 2), “%”, “Min Tasso di
Conversione:”, round(stats\(Min_Conversione,
2), "%\n",
"Media Mesi di Inventario: ",
round(stats\)Media_Inventario, 2), ” mesi“,”Efficienza Media: “,
round(stats\(Efficienza_Media, 2),
"%\n"
)
})
output\)plot_seasonal <- renderPlotly({ #Otteniamo dei dati
filtrati. df <- filtered_data() #Calcolo delle medie mensili.
seasonal_data <- df %>% group_by(month) %>% summarise(
avg_conversion = mean(conversion_rate, na.rm = TRUE), avg_inventory =
mean(months_inventory, na.rm = TRUE) ) #Selezione della colonna y e
dell’etichetta in base alla metrica scelta. y_col <- if(input\(metric == "conversion_rate")
"avg_conversion" else "avg_inventory"
y_label <- if(input\)metric ==”conversion_rate”) “Tasso di
Conversione Medio (%)” else “Media Mesi di Inventario” #Creazione del
grafico a barre. p <- ggplot(seasonal_data, aes_string(x = “month”, y
= y_col)) + geom_bar(stat = “identity”, fill = “#2ca02c”) + labs( title
= paste(“Pattern Stagionale -”, y_label), x = “Mese”, y = y_label ) +
theme_minimal() + #Configurazione dell’asse x per mostrare le
abbreviazioni dei mesi. scale_x_continuous( breaks = 1:12, labels =
month.abb ) + theme( panel.grid.major = element_line(color = “gray90”),
panel.grid.minor = element_line(color = “gray95”) ) #Conversione in
grafico interattivo plotly. ggplotly(p) }) } #Creazione e avvio
dell’applicazione Shiny. shinyApp(ui = ui, server = server) ## Nelle
città di Beaumont, Bryan-College Station e Tyler si osserva una crescita
del tasso di conversione nel tempo,
#con una certa stagionalità che evidenzia mesi più favorevoli. #Questo
andamento è particolarmente evidente nel grafico ‘Pattern Stagionale -
Tasso di Conversione Medio’,
#dove i mesi estivi (maggio-agosto) mostrano i tassi di conversione più
alti, mentre quelli invernali registrano performance più basse.
#A Wichita Falls, invece, non si rileva un trend chiaro di crescita,
sebbene il tasso medio di conversione
#non sia il più basso tra le quattro città analizzate. # Per quanto
riguarda i mesi di inventario, nelle città di Beaumont, Bryan-College
Station e Tyler,
#si è osservato un iniziale aumento fino al picco del 2011, seguito da
un trend decrescente. #L’inventario segue un pattern stagionale inverso:
è più alto in primavera/inizio estate e più basso in inverno,
#suggerendo che un maggior numero di proprietà viene messo sul mercato
durante la stagione di punta.
#A Wichita Falls, dopo una diminuzione dei mesi di inventario nel
biennio 2012-2013, si è registrato un aumento nel 2014.
#In sintesi, le implicazioni per il marketing potrebbero includere la
concentrazione delle risorse nei mesi primaverili
#per preparare la stagione di punta estiva, in particolare nelle città
con un mercato più attivo come Bryan-College Station.
#Al contrario, per Wichita Falls potrebbe essere opportuno rivedere la
strategia di marketing per adattarsi
# alle dinamiche locali del mercato.
#Analisi della distribuzione dei prezzi (3 PUNTO) #UI con due grafici. ui <- fluidPage( titlePanel(“Analisi Mercato Immobiliare Texas”), sidebarLayout( sidebarPanel( selectInput(“citta”, “Seleziona città:”, choices = unique(realestate_texas\(city)) ), mainPanel( plotlyOutput("plot_combinato", height = "600px"), plotlyOutput("plot_yearly", height = "600px") ) ) ) #Server logic. server <- function(input, output) { #Grafico combinato: Vendite e Prezzi. output\)plot_combinato <- renderPlotly({ data_city <- realestate_texas %>% filter(city == input\(citta) fig <- plot_ly() %>% add_bars(data = data_city, x = ~data, y = ~sales, name = "Vendite", marker = list(color = "rgba(177, 156, 217, 0.4)")) %>% add_lines(data = data_city, x = ~data, y = ~median_price, name = "Prezzo Medio", yaxis = "y2", line = list(color = "#90EE90", width = 2)) %>% layout( margin = list(r = 100), title = paste("Trend Immobiliari -", input\)citta), xaxis = list(title = ““), yaxis = list( title =”Numero di Vendite”, range = c(0, 300), gridcolor = “rgba(0,0,0,0.1)”, showgrid = TRUE ), yaxis2 = list( title = list(text = “Prezzo Medio (\()", standoff = 40), overlaying = "y", side = "right", range = c(0, max(data_city\)median_price) * 1.2), showgrid = FALSE, tickformat =”$,.0f”, zeroline = FALSE ), showlegend = TRUE, legend = list(orientation = ‘h’, y = -0.2) )
fig
}) #Grafico trend annuale. output\(plot_yearly <- renderPlotly({
yearly_data <- realestate_texas %>%
filter(city == input\)citta) %>% group_by(year) %>%
summarize( avg_price = mean(median_price), total_sales = sum(sales),
avg_listings = mean(listings) ) %>% mutate(across(c(avg_price,
total_sales, avg_listings), ~(.-min(.))/(max(.)-min(.)) - 0.5))
plot_ly() %>% add_trace(data = yearly_data, x = ~year, y =
~avg_price, name = “Prezzo Medio”, type = ‘scatter’, mode = ‘lines’,
line = list(color = ‘#82ca9d’, shape = ‘spline’)) %>% add_trace(data
= yearly_data, x = ~year, y = ~total_sales, name = “Vendite Totali”,
type = ‘scatter’, mode = ‘lines’, line = list(color = ‘#8884d8’, shape =
‘spline’)) %>% add_trace(data = yearly_data, x = ~year, y =
~avg_listings, name = “Media Inserzioni”, type = ‘scatter’, mode =
‘lines’, line = list(color = ‘#ffc658’, shape = ‘spline’)) %>%
layout( title = paste(“Trend Annuale (Valori Normalizzati) -”,
input$citta), xaxis = list(title = “Anno”, tickmode = “linear”, dtick =
1), yaxis = list(title = “Valore Normalizzato”, gridcolor =
“rgba(0,0,0,0.1)”, range = c(-1, 1), #Imposta il range da -1 a 1.
tickmode = “array”, #Imposta tick personalizzati. tickvals = seq(-1, 1,
0.5), #Definisce i valori dei tick. zeroline = TRUE, #Mostra la linea
dello zero. zerolinecolor = “black”, #Colore della linea dello zero.
zerolinewidth = 1), #Spessore della linea dello zero. showlegend = TRUE,
legend = list(orientation = ‘h’, y = -0.2) ) }) } #Avvio app.
shinyApp(ui = ui, server = server) #Per ogni città, il primo grafico
mostra il numero di vendite mensili e il prezzo medio di vendita.
#Il secondo grafico,invece, rappresenta il trend annuale normalizzato
del numero di vendite, del prezzo medio
#e della media delle inserzioni disponibili.
#Si è scelto di utilizzare dati normalizzati poiché le tre variabili
hanno unità di misura diverse
#e,inoltre, questa scelta riduce l’influenza dell’inflazione sui dati
nel tempo.
#A Beaumont si osserva un aumento delle vendite totali e una diminuzione
delle inserzioni disponibili.
#Tuttavia, l’aumento delle vendite non è stato seguito in modo
proporzionale da un aumento del prezzo medio di vendita,
#anche se una crescita è comunque presente.
#Anche a Bryan-College Station si registra un notevole aumento del
numero di vendite totali, accompagnato
#da un incremento del prezzo medio e da un calo delle inserzioni
disponibili.
#Questo conferma che il mercato immobiliare della città è molto attivo e
in forte crescita.
#A Tyler si osserva un incremento progressivo delle vendite nel
tempo.
#A differenza delle città precedenti, però, il prezzo medio di vendita è
aumentato in modo più evidente,
#suggerendo che, dal 2012 in poi, le case vendute non solo sono state
più numerose,
#ma anche di valore uguale o superiore alla media degli anni
precedenti.
#Questo rappresenta un vantaggio per l’agenzia immobiliare, poiché le
provvigioni risultano più alte
#grazie alla vendita di immobili a prezzi medi.
#—————————————————————————————————————– #Calcolo delle probabilità. #Lettura del dataset. dati <- read.csv(“realestate_texas.csv”) #Numero totale di righe. n_totale <- nrow(dati) #Conteggio per Beaumont. n_beaumont <- sum(dati\(city == "Beaumont") prob_beaumont <- n_beaumont / n_totale #Conteggio per Luglio. n_luglio <- sum(dati\)month == 7) prob_luglio <- n_luglio / n_totale #Conteggio per Dicembre 2012. n_dic2012 <- sum(dati\(month == 12 & dati\)year == 2012) prob_dic2012 <- n_dic2012 / n_totale #Creazione di una funzione per formattare le percentuali. format_percentage <- function(x) { sprintf(“%.2f%%”, x * 100) } #Stampa i risultati. cat(“dell’analisi delle probabilità:”) cat(“================================================”) cat(sprintf(“Dimensione totale del dataset: %d righe”, n_totale)) cat(“1. Probabilità di selezionare una riga con città ‘Beaumont’:”) cat(sprintf(” - Probabilità: %s“, format_percentage(prob_beaumont))) cat(”2. Probabilità di selezionare una riga con mese ‘Luglio’:“) cat(sprintf(” - Probabilità: %s“, format_percentage(prob_luglio))) cat(”3. Probabilità di selezionare una riga di Dicembre 2012:“) cat(sprintf(” - Probabilità: %s“, format_percentage(prob_dic2012)))
#Creazione della colonna prezzo medio #Leggo il dataset. realestate_texas <- read.csv(“realestate_texas.csv”) #Aggiungi la colonna del prezzo medio con 3 decimali. realestate_texas <- realestate_texas %>% mutate( average_price = round((volume * 1000000) / sales, 3) ) #Visualizza le prime righe per controllare che funzioni. head(realestate_texas)
#Analisi condizionata. #Lettura del file CSV. realestate_texas <-
read.csv(“realestate_texas.csv”) #Creazione della colonna prezzo medio.
#Il volume è in milioni, quindi moltiplichiamo per 1000000 e #dividiamo
per il numero di vendite per ottenere il prezzo medio. realestate_texas
<- realestate_texas %>% mutate( average_price = round((volume *
1000000) / sales, 3) ) #Analisi per città. #Calcola statistiche
raggruppate per città. statistiche_citta <- realestate_texas %>%
group_by(city) %>% summarise( prezzo_medio = mean(average_price),
#Media dei prezzi. sd_prezzo = sd(average_price), #Deviazione standard
dei prezzi. vendite_medie = mean(sales), #Media delle vendite.
sd_vendite = sd(sales), #Deviazione standard delle vendite.
inventario_medio = mean(months_inventory), #Media dell’inventario.
sd_inventario = sd(months_inventory) #Deviazione standard
dell’inventario. ) #Analisi per anno. #Calcola le statistiche
raggruppate per anno. statistiche_anno <- realestate_texas %>%
group_by(year) %>% summarise( prezzo_medio = mean(average_price),
#Media dei prezzi per anno vendite_totali = sum(sales), #Totale vendite
per anno inventario_medio = mean(months_inventory) #Media inventario per
anno ) #Grafico a barre dei prezzi medi per città. grafico_prezzi_citta
<- ggplot(statistiche_citta, aes(x = reorder(city, prezzo_medio), y =
prezzo_medio)) + #Crea le barre. geom_bar(stat = “identity”, fill =
“steelblue”) + #Aggiungi barre di errore per la deviazione standard.
geom_errorbar(aes(ymin = prezzo_medio - sd_prezzo, ymax = prezzo_medio +
sd_prezzo), width = 0.2) + #Personalizzazione del tema e delle
etichette. theme_minimal() + labs(title = “Prezzo medio per città”, x =
“Città”, y = “Prezzo medio (\()") +
#Ruota le etichette dell'asse x per maggiore leggibilità.
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
#Formatta i valori dell'asse y come valuta.
scale_y_continuous(labels = scales::dollar_format())
#Grafico lineare dei trend dei prezzi medi annuali.
grafico_prezzi_annuali <- ggplot(realestate_texas %>%
group_by(year) %>%
summarise(prezzo_medio =
mean(average_price))) +
#Aggiungo la linea del trend.
geom_line(aes(x = year, y = prezzo_medio),
color = "steelblue",
linewidth = 1) + #Usa linewidth invece di size per le
linee.
#Aggiungo i punti per ogni anno.
geom_point(aes(x = year, y = prezzo_medio),
color = "steelblue",
size = 3) +
#Personalizzazione del tema e delle etichette.
theme_minimal() +
labs(title = "Trend dei prezzi medi annuali",
x = "Anno",
y = "Prezzo medio (\))”) + scale_y_continuous(labels
= scales::dollar_format()) #Box plot per la distribuzione dei prezzi
medi per città. grafico_boxplot_prezzi <- ggplot(realestate_texas,
aes(x = city, y = average_price)) + #Crea i box plot. geom_boxplot(fill
= “steelblue”, alpha = 0.5) + #Personalizzazione del tema e delle
etichette. theme_minimal() + labs(title = “Distribuzione dei prezzi medi
per città”, x = “Città”, y = “Prezzo medio ($)”) + #Ruota le etichette
dell’asse x per maggiore leggibilità. theme(axis.text.x =
element_text(angle = 45, hjust = 1)) + #Formatta i valori dell’asse y
come valuta. scale_y_continuous(labels = scales::dollar_format())
#Stampa delle statistiche riassuntive. print(“Statistiche per città:”)
print(statistiche_citta) print(“per anno:”) print(statistiche_anno)
#Salvataggio dei grafici in file PNG. ggsave(“prezzi_medi_citta.png”,
grafico_prezzi_citta, width = 10, height = 6)
ggsave(“trend_prezzi_annuali.png”, grafico_prezzi_annuali, width = 10,
height = 6) ggsave(“boxplot_prezzi_citta.png”, grafico_boxplot_prezzi,
width = 10, height = 6) #Anche questa analisi statistica conferma un
incremento dei prezzi.
#Inoltre, si osserva che Bryan-College Station è la città con il prezzo
medio più alto,
#seguita da Tyler, Beaumont e Wichita Falls.
#Creazione di classi per una variabile quantitativa (Num di Vendite)
#Calcolo del numero ottimale di classi usando la regola di Sturges.
#Formula usata: k = 1 + 3.322 * log10(n), dove n è il numero di
osservazioni. n_classi <- ceiling(1 + 3.322 * log10(nrow(dati)))
#Creazione degli intervalli per le classi. #Distribuisce uniformemente
le classi tra il valore minimo e massimo. breaks <- seq(min(dati\(sales), max(dati\)sales), length.out =
n_classi + 1) #Assegnazione delle osservazioni alle classi.
#include.lowest = TRUE include il valore minimo nella prima classe.
#right = FALSE indica che gli intervalli sono chiusi a sinistra.
dati\(sales_classe <-
cut(dati\)sales, breaks = breaks, include.lowest = TRUE, right =
FALSE) #Analisi delle frequenze. #Calcolo delle frequenze assolute.
freq_dist <- table(dati\(sales_classe)
#Calcolo delle frequenze relative in ppercentuali.
freq_rel <- prop.table(freq_dist)
#Creazione di un dataframe per il grafico.
df_freq <- data.frame(
classe = names(freq_dist),
frequenza = as.numeric(freq_dist)
)
#Visualizzazione grafica.
#Creazione del grafico a barre delle frequenze.
ggplot(df_freq, aes(x = classe, y = frequenza)) +
geom_bar(stat = "identity", fill = "steelblue")
+ #Barre verticali.
theme_minimal() + #Tema.
theme(axis.text.x = element_text(angle = 45, hjust = 1)) + #Rotazione
etichette asse x
labs(title = "Distribuzione delle Vendite Immobiliari in
Texas",
x = "Classi di Vendite",
y = "Frequenza")
#Calcolo dell'indice di eterogeneità di Gini.
#L'indice varia tra 0 (omogeneità perfetta) e 1 (massima
eterogeneità).
gini <- Gini(dati\)sales) #Stampa della distribuzione di
frequenze. print(“Distribuzione di frequenze:”) print(freq_dist) #Stampa
delle frequenze relative. print(“relative:”) print(freq_rel) #Stampa
dell’indice di Gini. print(“di Gini:”) print(gini) #Calcolo e stampa
delle principali statistiche descrittive. summary_stats <-
summary(dati$sales) print(“descrittive delle vendite:”)
print(summary_stats) #Creazione del box plot per analisi temporale.
#Mostra la distribuzione delle vendite per anno e città. ggplot(dati,
aes(x = as.factor(year), y = sales, fill = city)) + geom_boxplot() +
#Tipo di grafico: box plot. theme_minimal() + #Tema grafico. labs(title
= “Distribuzione delle Vendite per Anno e Città”, x = “Anno”, y =
“Numero di Vendite”, fill = “Città”) #Analizzando il grafico
‘Distribuzione delle Vendite per Anno e Città’.
#Si osserva che il numero di vendite è sempre stato maggiore nella città
di Tyler.
#Inoltre, si nota una crescita evidente per Bryan-College Station,
sebbene con una maggiore variabilità nei dati.
#Beaumont e Wichita Falls, invece, mostrano una tendenza più stabile,
con minori fluttuazioni nel numero di vendite nel tempo.
#Identificazione delle variabili con maggiore variabilità e asimmetria. # Caricamento librerie # Lettura dati dati <- read.csv(“realestate_texas.csv”) #Selezione variabili numeriche dati_numerici <- dati %>% select(sales, volume, median_price, listings, months_inventory) #Calcolo CV e asimmetria cv <- sapply(dati_numerici, function(x) sd(x)/mean(x)*100) asimmetria <- sapply(dati_numerici, skewness) #Visualizzazione risultati print(“Coefficienti di Variazione (%):”) print(sort(cv, decreasing = TRUE)) print(“di Asimmetria:”) print(sort(asimmetria, decreasing = TRUE)) #Visualizzazioni ggplot(gather(dati_numerici), aes(value)) + geom_histogram(bins = 30) + facet_wrap(~key, scales = “free”) + labs(title = “Distribuzione variabili numeriche”) ggplot(dati) + geom_boxplot(aes(x = city, y = median_price)) + theme(axis.text.x = element_text(angle = 45)) + labs(title = “Distribuzione prezzi per città”) #La variabile con la più alta variabilità è il volume, con un coefficiente di variazione (CV) del 53.70%. #Questo indica una grande dispersione dei valori rispetto alla media. #Il boxplot rivela anche che Bryan-College Station ha prezzi mediani significativamente più alti e minor variabilità rispetto alle altre città, #mentre Wichita Falls mostra i prezzi più bassi. #Le variabili volume, sales, listings e months inventory presentano asimmetrie positive, mentre #la variabile median price presenta asimmetria negativa lieve, quindi leggermente spostata verso valori più alti.
```