tx <- read.csv(“/Users/filomena/Desktop/1 esercizio con r/Texax.csv”)
str(tx) names(tx)
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_numeriche <- c(“sales”, “volume”, “median_price”, “listings”)
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) )
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.
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_numeriche <- c(“sales”, “volume”, “median_price”, “listings”)
risultati_variabilita <- lapply(variabili_numeriche, function(var) calcola_variabilita(tx[[var]]))
names(risultati_variabilita) <- variabili_numeriche
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 ) }))
print(risultati_df)
library(knitr) kable(risultati_df, caption = “Risultati di Deviazione Standard, Varianza e CV per ogni Variabile”)
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)) }
variabili_numeriche <- c(“sales”, “volume”, “median_price”, “listings”) risultati_forma <- lapply(variabili_numeriche, function(var) calcola_forma(tx[[var]]))
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) )
print(risultati_forma_df)
library(knitr) kable(risultati_forma_df, caption = “Risultati di Curtosi e Asimmetria per ogni Variabile”)
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()
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()
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
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) }
indice_gini_sales <- calcola_gini(tx$sales)
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()
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à
n_totale <- nrow(tx)
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) ))
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) ))
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)
head(tx[, c(“volume”, “sales”, “prezzo_medio”)])
tx\(efficacia_annunci <- ifelse(tx\)listings > 0, (tx\(sales / tx\)listings) * 100, NA)
head(tx[, c(“sales”, “listings”, “efficacia_annunci”)])
library(dplyr) library(ggplot2)
sales_over_time <- tx %>% group_by(year, month) %>% summarise(total_sales = sum(sales, na.rm = TRUE), .groups = “drop”)
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 )
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
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à
sales_by_city_month <- tx %>% group_by(city, month) %>% summarise(total_sales = sum(sales, na.rm = TRUE), .groups = “drop”)
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” ) )
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à
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à
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.
#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.