Carico il dataset

tx <- read.csv(“/Users/filomena/Desktop/1 esercizio con r/Texax.csv”)

1. Analisi delle variabili

str(tx) names(tx)

city: qualitativa nominale

year: quantitativa continua (trattata come qualitativa ordinale in questo caso)

month: qualitativa nominale (ciclica)

sales: quantitativa discreta

volume: quantitativa continua

median_price: quantitativa continua

listings: quantitativa discreta

months_inventory: quantitativa continua

2. Indici di posizione

Funzione per calcolare media e mediana (rimuovendo la moda per variabili inappropriate)

calcola_indici <- function(x, calcola_moda = FALSE) { media <- mean(x, na.rm = TRUE) mediana <- median(x, na.rm = TRUE) indici <- list(media = media, mediana = mediana)

# Aggiungi la moda solo se necessario (per variabili discrete/categoriche) if (calcola_moda) { moda <- as.numeric(names(sort(table(x), decreasing = TRUE)[1])) indici$moda <- moda }

return(indici) }

Variabili su cui calcolare gli indici

variabili_numeriche <- c(“sales”, “volume”, “median_price”, “listings”)

Calcolo indici per variabili per le variabili numeriche

risultati_indici <- list( sales = calcola_indici(tx\(sales, calcola_moda = TRUE), volume = calcola_indici(tx\)volume), median_price = calcola_indici(tx\(median_price), listings = calcola_indici(tx\)listings, calcola_moda = TRUE) )

Stampa dei risultati degli indici

for (var in names(risultati_indici)) { cat(“Indici per”, var, “:”) print(risultati_indici[[var]]) cat(“”) }

#La moda è stata calcolata solo per le variabili discrete #con un numero limitato di valori distinti, come sales e listings. #Per le altre variabili continue, come volume e median_price, #ho preferito utilizzare altre misure di tendenza centrale più appropriate, #come la media e la mediana.

Calcoliamo la variabilità con una funzione per ciascuna variabile

calcola_variabilita <- function(x) { dev_standard <- sd(x, na.rm = TRUE) varianza <- var(x, na.rm = TRUE) cv <- (dev_standard / mean(x, na.rm = TRUE)) * 100 # CV in percentuale return(list( dev_standard = dev_standard, varianza = varianza, cv = cv )) }

Variabili su cui calcolare la variabilità

variabili_numeriche <- c(“sales”, “volume”, “median_price”, “listings”)

Creiamo una lista con i risultati di ciascuna variabile

risultati_variabilita <- lapply(variabili_numeriche, function(var) calcola_variabilita(tx[[var]]))

Aggiungiamo i nomi delle variabili al risultato

names(risultati_variabilita) <- variabili_numeriche

Creiamo un dataframe per visualizzare i risultati

risultati_df <- do.call(rbind, lapply(names(risultati_variabilita), function(var) { data.frame( Variabile = var, Deviazione_Standard = risultati_variabilita[[var]]\(dev_standard, Varianza = risultati_variabilita[[var]]\)varianza, CV = risultati_variabilita[[var]]$cv ) }))

Visualizziamo i risultati

print(risultati_df)

uso kable() per una visualizzazione tabellare migliore

library(knitr) kable(risultati_df, caption = “Risultati di Deviazione Standard, Varianza e CV per ogni Variabile”)

Funzione per calcolare curtosi e asimmetria

calcola_forma <- function(x) { n <- sum(!is.na(x)) # Conta solo i valori non NA media <- mean(x, na.rm = TRUE) dev_standard <- sd(x, na.rm = TRUE)

# Calcolo della curtosi curtosi <- (n * (n + 1) / ((n - 1) * (n - 2) * (n - 3))) sum(((x - media) / dev_standard) ^ 4, na.rm = TRUE) - (3 (n - 1) ^ 2) / ((n - 2) * (n - 3))

# Calcolo dell’asimmetria asimmetria <- (n / ((n - 1) * (n - 2))) * sum(((x - media) / dev_standard) ^ 3, na.rm = TRUE)

return(list(curtosi = curtosi, asimmetria = asimmetria)) }

Calcoliamo forma (curtosi e asimmetria) per le variabili

variabili_numeriche <- c(“sales”, “volume”, “median_price”, “listings”) risultati_forma <- lapply(variabili_numeriche, function(var) calcola_forma(tx[[var]]))

Creiamo il dataframe dei risultati

risultati_forma_df <- data.frame( Variabile = c(“sales”, “volume”, “median_price”, “listings”), Curtosi = c(-0.294, 0.206, -0.611, -0.783), Asimmetria = c(0.723, 0.89, -0.367, 0.654) )

Stampiamo i risultati in forma di tabella per rendere il tutto più chiaro

print(risultati_forma_df)

per formattare meglio il risultato uso kable

library(knitr) kable(risultati_forma_df, caption = “Risultati di Curtosi e Asimmetria per ogni Variabile”)

Grafico a linee per la curtosi

install.packages(“ggplot”) #installo il pacchetto library(ggplot2) ggplot(risultati_forma_df, aes(x = Variabile, y = Curtosi, group = 1)) + geom_line(color = “blue”, size = 1) + # Linea blu per la curtosi geom_point(color = “blue”, size = 3) + # Punti sui valori della curtosi labs(title = “Curva della Curtosi”, x = “Variabile”, y = “Valore della Curtosi”) + theme_minimal()

Grafico a linee per l’asimmetria

ggplot(risultati_forma_df, aes(x = Variabile, y = Asimmetria, group = 1)) + geom_line(color = “red”, size = 1) + # Linea rossa per l’asimmetria geom_point(color = “red”, size = 3) + # Punti sui valori dell’asimmetria labs(title = “Curva dell’Asimmetria”, x = “Variabile”, y = “Valore dell’Asimmetria”) + theme_minimal()

Grafico sovrapposto per curtosi e asimmetria

ggplot(risultati_forma_df, aes(x = Variabile)) + geom_line(aes(y = Curtosi, color = “Curtosi”), size = 1) + # Linea per la curtosi geom_point(aes(y = Curtosi, color = “Curtosi”), size = 3) + # Punti sui valori della curtosi geom_line(aes(y = Asimmetria, color = “Asimmetria”), size = 1) + # Linea per l’asimmetria geom_point(aes(y = Asimmetria, color = “Asimmetria”), size = 3) + # Punti sui valori dell’asimmetria labs(title = “Curva Sovrapposta di Curtosi e Asimmetria”, x = “Variabile”, y = “Valore”) + scale_color_manual(name = “Metriche”, values = c(“Curtosi” = “blue”, “Asimmetria” = “red”)) + # Definiamo i colori theme_minimal()

#Asimmetria ti dice se la distribuzione è sbilanciata a sinistra o a destra: #L’asimmetria positiva riscontrata in alcune variabili (sales e volume) indica #che la distribuzione è sbilanciata verso destra, con valori più elevati che si #verificano meno frequentemente. #la kurtosi muisura quante volte si verificano eventi estremi: #La curtosi: inferiore a 3 per tutte le variabili suggerisce che la distribuzione #ha code meno pesanti rispetto alla distribuzione normale #ho soprapposto il grafico della kurtosi e Asimmetrica per varie ragioni: Confronto simultaneo delle forme delle distribuzioni #Efficienza visiva, interpretazione integrata

Funzione per calcolare l’indice di Gini

calcola_gini <- function(x) { x <- x[!is.na(x)] x <- sort(x) n <- length(x) if (n < 2) return(NA)

numeratore <- 2 * sum((1:n) * x) denominatore <- n * sum(x) if (denominatore == 0) return(NA)

gini <- (numeratore / denominatore) - (n + 1) / n return(gini) }

L’indice di Gini lo calcoliamo per misurare il grado di disuguaglianza nella distribuzione

delle vendite immobiliari in questo caso, tra le diverse città.

Il suo valore ci permette di comprendere se le vendite sono equa distribuite o meno

in questo caso specifico abbiamo una disuguaglianza

nella distribuzione delle vendite immobiliari tra le città,

suggerendo che alcune città concentrano un numero maggiore di vendite rispetto ad altre.

Questo risultato offre spunti importanti per individuare le città con maggiori opportunità di

crescita nel mercato immobiliare

calcoliamo l’indice di Gini per “sales”

indice_gini_sales <- calcola_gini(tx$sales)

Grafico a barre per la distribuzione di “sales” per classi

breaks_sales <- seq(0, max(tx$sales, na.rm = TRUE) + 50, by = 50) ggplot(tx, aes(x = cut(sales, breaks = breaks_sales))) + geom_bar() + labs(title = “Distribuzione delle Vendite per Classi”, x = “Classi di Vendite”, y = “Frequenza”) + theme_minimal()

Boxplot per la distribuzione del prezzo mediano tra le città e anni

ggplot(tx, aes(x = city, y = median_price, fill = factor(year))) + geom_boxplot() + labs(title = “Distribuzione del Prezzo Mediano tra le Città e Anni”, x = “Città”, y = “Prezzo Mediano”) + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))

#5 Calcolo della probabilità

Numero totale di osservazioni nel dataset

n_totale <- nrow(tx)

Probabilità che la riga riporti la città “Beaumont”

n_beaumont <- sum(tx$city == “Beaumont”, na.rm = TRUE) p_beaumont <- n_beaumont / n_totale print(paste( “La probabilità che una riga riporti la città Beaumont è:”, round(p_beaumont, 3) ))

Probabilità che la riga riporti il mese di Luglio

n_luglio <- sum(tx$month == 7, na.rm = TRUE) p_luglio <- n_luglio / n_totale print(paste( “La probabilità che una riga riporti il mese di Luglio è:”, round(p_luglio, 3) ))

Probabilità che la riga riporti il mese di Dicembre 2012

n_dicembre_2012 <- sum(tx\(month == 12 & tx\)year == 2012, na.rm = TRUE) p_dicembre_2012 <- n_dicembre_2012 / n_totale print(paste( “La probabilità che una riga riporti il mese di Dicembre 2012 è:”, round(p_dicembre_2012, 3) ))

#6. Creazione di nuove variabili # Creazione della nuova colonna per il prezzo medio degli immobili # Evitiamo la divisione per zero controllando se ‘sales’ > 0

tx\(prezzo_medio <- ifelse(tx\)sales > 0, tx\(volume / tx\)sales, NA)

Visualizziamo i primi risultati per verificare

head(tx[, c(“volume”, “sales”, “prezzo_medio”)])

Creazione della nuova colonna per misurare l’efficacia degli annunci di vendita

L’efficacia è data da (sales / listings) * 100, evitamo divisioni per zero

tx\(efficacia_annunci <- ifelse(tx\)listings > 0, (tx\(sales / tx\)listings) * 100, NA)

Visualizziamo i primi risultati per verificare

head(tx[, c(“sales”, “listings”, “efficacia_annunci”)])

La nuova colonna “prezzo medio” è stata formata da :Volume Totale delle Vendite/Numero di vendite(sales)

I risultati della nuova colonna “efficacia_annunci” L’efficacia degli annunci varia dal 5% all’11%,

suggerendo che in alcune città o mesi le campagne pubblicitarie sono più efficaci nel convertire le inserzioni in vendite.

Questa informazione è cruciale per ottimizzare le strategie di marketing dell’azienda

punto 7 e 8

Carichiamo le librerie necessarie

library(dplyr) library(ggplot2)

1. Raggruppiamo i dati per anno e mese e sommiamo le vendite totali

In questo passaggio, raggruppiamo i dati per anno e mese e calcoliamo le vendite totali per ogni gruppo.

sales_over_time <- tx %>% group_by(year, month) %>% summarise(total_sales = sum(sales, na.rm = TRUE), .groups = “drop”)

2. Convertiamo ‘month’ da numerico a fattore con i nomi dei mesi

Questo passaggio trasforma i numeri da 1 a 12 (che rappresentano i mesi) nei nomi corrispondenti (Gen, Feb, etc.)

sales_over_time\(month <- factor( sales_over_time\)month, levels = 1:12, # Definiamo i livelli da 1 a 12 labels = c( “Gen”, “Feb”, “Mar”, “Apr”, “Mag”, “Giu”, “Lug”, “Ago”, “Set”, “Ott”, “Nov”, “Dic” ) # Convertiamo in etichette testuali )

3. Creiamo un grafico a linee per l’andamento delle vendite nel tempo

Questo grafico mostra le vendite totali per ciascun mese, raggruppate per anno. Utilizziamo colori diversi per distinguere gli anni.

ggplot(sales_over_time, aes( x = month, y = total_sales, color = factor(year), group = year )) + geom_line(size = 1.2) + # Aggiunge una linea per ciascun anno, con spessore di 1.2 geom_point(size = 3) + # Aggiunge punti per rappresentare i valori totali di vendite labs( title = “Andamento delle Vendite in Periodi Storici Differenti”, x = “Mese”, y = “Totale Vendite”, color = “Anno” ) + # Aggiungiamo i titoli e le etichette sugli assi theme_minimal() # Usiamo un tema minimalista per un aspetto pulito

4. Creazione di un boxplot per la distribuzione del prezzo mediano tra le città

Il boxplot mostra come varia il prezzo mediano degli immobili tra diverse città.

ggplot(tx, aes(x = city, y = median_price, fill = city)) + geom_boxplot() + # Aggiungiamo un boxplot per ciascuna città labs(title = “Distribuzione del Prezzo Mediano tra le Città”, x = “Città”, y = “Prezzo Mediano”) + # Titoli e etichette theme_minimal() + # Tema minimalista per pulizia grafica theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Ruotiamo i nomi delle città di 45° per leggibilità

5. Raggruppiamo i dati per città e mese e sommiamo le vendite

Creiamo un dataset aggregato per ciascuna città e mese, in modo da confrontare le vendite totali per ogni città e mese.

sales_by_city_month <- tx %>% group_by(city, month) %>% summarise(total_sales = sum(sales, na.rm = TRUE), .groups = “drop”)

6. Convertiamo ‘month’ da numerico a fattore con i nomi dei mesi

Simile a quanto fatto prima, convertiamo i numeri dei mesi in nomi per leggibilità.

sales_by_city_month\(month <- factor( sales_by_city_month\)month, levels = 1:12, labels = c( “Gen”, “Feb”, “Mar”, “Apr”, “Mag”, “Giu”, “Lug”, “Ago”, “Set”, “Ott”, “Nov”, “Dic” ) )

7. Creiamo un grafico a barre per confrontare il totale delle vendite per mese e città

Questo grafico confronta le vendite mensili tra le città, usando un grafico a barre.

ggplot(sales_by_city_month, aes(x = month, y = total_sales, fill = city)) + geom_bar(stat = “identity”, position = “dodge”) + # Le barre sono affiancate (position = “dodge”) labs(title = “Totale delle Vendite per Mese e Città”, x = “Mese”, y = “Totale Vendite”) + # Titoli e etichette theme_minimal() + # Tema minimalista per pulizia grafica theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Ruotiamo i mesi per leggibilità

8. Creiamo un grafico a barre sovrapposte per confrontare le vendite tra le città e i mesi

A differenza del precedente grafico, qui sovrapponiamo le barre per mostrare il confronto tra città all’interno di ogni mese.

ggplot(sales_by_city_month, aes(x = month, y = total_sales, fill = city)) + geom_bar(stat = “identity”, position = “stack”) + # Le barre sono sovrapposte (position = “stack”) labs(title = “Totale delle Vendite per Mese e Città (Barre Sovrapposte)”, x = “Mese”, y = “Totale Vendite”) + # Titoli e etichette theme_minimal() + # Tema minimalista theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Ruotiamo i mesi per leggibilità

9. Creiamo il grafico a linee per l’andamento delle vendite in periodi storici differenti

Rappresentiamo l’andamento delle vendite totali per mese e anno con un grafico a linee, usando colori per distinguere gli anni.

ggplot(sales_over_time, aes( x = month, y = total_sales, color = factor(year), group = year )) + geom_line(size = 1.2) + # Aggiungiamo linee per ciascun anno geom_point(size = 3) + # Aggiungiamo punti per ciascun valore di vendita mensile labs( title = “Andamento delle Vendite in Periodi Storici Differenti”, x = “Mese”, y = “Totale Vendite”, color = “Anno” ) + # Titoli e etichette theme_minimal() + # Tema minimalista per un aspetto pulito scale_x_discrete(labels = month.abb) # Usiamo abbreviazioni per i mesi

#Analisi condizionata: #Il codice analizza le vendite medie e la deviazione standard per città, mese e anno. #Vengono usati i grafici a barre e con barre affiancate (dodge) per rappresentare graficamente i #risultati.

Creazione delle visualizzazioni:

Boxplot: viene utilizzato per confrontare il prezzo mediano degli immobili tra diverse città.

Grafici a barre: confrontano le vendite mensili per città, utilizzando sia grafici con barre affiancate che sovrapposte.

Line chart: mostra l’andamento storico delle vendite, con una linea per ogni anno e i mesi rappresentati sull’asse x.

L’analisi statistica ha rivelato diverse tendenze interessanti:

Le vendite immobiliari tendono a concentrarsi in determinate città, come dimostrato dall’indice di Gini.

Ciò suggerisce che esistono opportunità di crescita in altre città.

L’efficacia degli annunci varia significativamente, con alcuni annunci che generano più vendite rispetto ad altri.

Questa informazione può aiutare a ottimizzare le campagne pubblicitarie.

#La forma delle distribuzioni delle variabili come sales e volume mostra una leggera asimmetria, con code più leggere o più pesanti in alcune città. #Questi risultati forniscono indicazioni importanti sulle dinamiche di mercato.