knitr::opts_chunk$set(echo = TRUE)
options(repos = c(CRAN = "https://cloud.r-project.org/"))
library(pander)
## Warning: il pacchetto 'pander' è stato creato con R versione 4.4.2
#Punto 1-Analisi delle variabili
##La variabile:
##"city": è qualitativa nominale
##"year": è quantitativa continua(da trattare come qualitativa ordinale)
##"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 quantitative continue sono tutte su scala di rapporti
##Per la stessa "city", viene indicato l'anno di riferimento dei dati "year"
##Potremmo fare uso di indici di posizione e variabilità e forma delle variabili quantitative
#Punto 2-Indice di posizione,variabilità, forma
#2.1-Indici di Posizione
realestate_texas <- read.csv("C:/Users/Dario/Desktop/File R/Statistica Descrittiva/realestate_texas.csv",header= TRUE)
head(realestate_texas,5)#Rappresenta le prime righe del dataset
## 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
## Identificare le colonne numeriche
numeric_columns <- c("sales","volume","median_price","listings","months_inventory")
## Identificare le colonne categoriche
categorical_columns <- c("city", "year", "month")
moda <- function(v) {##definisco funzione moda
tmp <- unique(v)
tmp[which.max(tabulate(match(v, tmp)))]
}
## Calcolare gli indici di posizione per ciascuna colonna numerica
indici_di_posizione_numerici <- lapply(realestate_texas[numeric_columns], function(x) {
if (all(is.na(x))) {
return(NA)
}
list(
media = mean(x),
mediana = median(x),
minimo = min(x),
massimo = max(x),
varianza = var(x),
deviazione_standard = sd(x)
#na.rm = TRUE
)
})
## Calcolare gli indici di posizione per ciascuna colonna numerica
indici_di_posizione_moda <- lapply(realestate_texas[categorical_columns], function(x) {
if (all(is.na(x))) {
return(NA)
}
moda = moda(x)
})
## Calcolare la frequenza delle categorie per le colonne categoriche
frequenze_categoriche <- lapply(realestate_texas[categorical_columns], function(x) {
table(x)
})
## Stampare i risultati
print("Indici di posizione per colonne numeriche:")
## [1] "Indici di posizione per colonne numeriche:"
pander(indici_di_posizione_numerici, format )
sales:
volume:
median_price:
listings:
months_inventory:
## Stampare i risultati
print("Frequenze per colonne categoriche:")
## [1] "Frequenze per colonne categoriche:"
pander(frequenze_categoriche)
city:
| Beaumont | Bryan-College Station | Tyler | Wichita Falls |
|---|---|---|---|
| 60 | 60 | 60 | 60 |
year:
| 2010 | 2011 | 2012 | 2013 | 2014 |
|---|---|---|---|---|
| 48 | 48 | 48 | 48 | 48 |
month:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 |
##La frequenza per le variabili categoriche è equidistribuita sia per le città(60), che anni(48), che mesi(20).
## Genera una tabella formattata
##e Stampare i risultati
print("Indici di moda per colonne categoriche:")
## [1] "Indici di moda per colonne categoriche:"
pander(indici_di_posizione_moda)
##La Moda di "city" è Beaumont, di "year" è 2010, di "month" è 1. Non è calcolata invece
#per variabili quantitative e discrete con tanti valori, poichè privo di senso.
##Non esiste invece moda nei dati categorici poichè le frequenze sono ugualmente distribuite fra loro.
#2.2-INDICI DI VARIABILITA-----------------------------------------------------------------------------
##Calcolare gli indici di variabilità per ciascuna colonna numerica
## Crea una lista che mappa i nomi delle colonne alle loro unità di misura
unita_di_misura <- list(
"sales" = "Number",
"volume" = "Millions of dollars",
"median_price" = "Dollars",
"listings" = "Number",
"months_inventory" = "Number of months"
)
## Definizione della funzione per calcolare indici di variabilità
calcola_variabilita <- function(x) {
## Rimuovi i valori NA per evitare errori nei calcoli
x <- na.omit(x)
## Calcola gli indici di variabilità
range_val <- range(x)
varianza <- var(x)
deviazione_standard <- sd(x)
coeff_variazione <- (deviazione_standard / mean(x)) * 100
iqr <- IQR(x)
## Restituisci un elenco con gli indici calcolati
return(list(
range_val = range_val,
varianza = varianza,
deviazione_standard = deviazione_standard,
coeff_variazione = coeff_variazione,
iqr = iqr
))
}
indici_di_variabilita_numerici <- lapply(realestate_texas[numeric_columns], function(x) {
if (all(is.na(x))) {
return(NA)
}
## Calcola gli indici di variabilità
return(calcola_variabilita(x))
})
## Stampa i risultati
print("Indici di variabilità:")
## [1] "Indici di variabilità:"
## Generare una tabella formattata
pander(indici_di_variabilita_numerici)
sales:
volume:
median_price:
listings:
months_inventory:
##Grafico
## caricato il pacchetto ggplot2
library(ggplot2)
## Definizione della funzione per calcolare il grafico
calcola_grafico <- function(x, x_label, y_label) {
x <- na.omit(x) ## Rimuovi i valori NA
df <- data.frame(Index = seq_along(x), Value = sort(x))
quantiles <- quantile(x, na.rm = TRUE)
quantile_labels <- data.frame(
x = rep(max(df$Index), length(quantiles)),
y = quantiles,
label = round(quantiles, 2)
)
## Crea il boxplot utilizzando ggplot2
p <- ggplot(df, aes(x = factor(1), y = Value)) +
geom_boxplot(width = 0.5) +
geom_text(data = quantile_labels, aes(x = x, y = y, label = label),
color = "red", hjust = -0.5, vjust = -0.5) +
ggtitle("Grafico di Variabilità") +
xlab(x_label) + ## parametro x_label per l'asse X
ylab(y_label) + ## parametro y_label per l'asse Y
theme_minimal() +
theme(axis.text.x = element_blank())+
coord_cartesian(xlim = c(0.5, 1.5)) ## Limita l'asse X
return(p)
}
## Carica i pacchetti necessari
library(gridExtra)
## Warning: il pacchetto 'gridExtra' è stato creato con R versione 4.4.2
grafici <- lapply(seq_along(numeric_columns), function(i) {
column_name <- numeric_columns[i]
x <- realestate_texas[[column_name]]
if (all(is.na(x))) {
return(NULL)
}
##Ottieni l'unità di misura per il nome della colonna
y_label <- unita_di_misura[[column_name]]
##Calcola il grafico con etichette personalizzate
return(calcola_grafico(x, paste("Index of", column_name), y_label))
})
## Rimuovi eventuali elementi NULL dalla lista
grafici <- grafici[!sapply(grafici, is.null)]
## Mostra tutti i boxplot in una finestra
grid.arrange(grobs = grafici, ncol = 2)
#2.3##################INDICI DI FORMA------------------------------------------------------------------
library("moments")
## Definizione della funzione per calcolare indici di forma
calcola_forma <- function(x) {
##Rimuovi i valori NA per evitare errori nei calcoli
x <- na.omit(x)
##Calcola gli indici di asimmetria
mu <- mean(x)
sigma <- sd(x)
n <- length(x)
m3 <- sum((x-mu)^3)/n
Asim.Index <- m3/sigma^3
##curtosi
m4 <- sum((x-mu)^4)/n
kurtosi.index <- m4/sigma^4 -3 ##per centrare indice a 0
skewness_val = skewness(x)
curtosis_val = kurtosis(x)
##Restituisci un elenco con gli indici calcolati
return(list(
mu = mu,
sigma = sigma,
n = n,
m3 = m3,
Asim.Index = Asim.Index,
m4 = m4,
kurtosi.index = kurtosi.index, ##per centrare indice a 0
skewness_val = skewness_val,
curtosis_val = curtosis_val
))
}
## Calcolare gli indici di forma per ciascuna colonna numerica
indici_di_forma_numerici <- lapply(realestate_texas[numeric_columns], function(x) {
if (all(is.na(x))) {
return(NA)
}
## Calcola gli indici di variabilità
return(calcola_forma(x))
})
## Stampa i risultati
print("Indici di forma:")
## [1] "Indici di forma:"
pander(indici_di_forma_numerici)#crea tabella ordinata
sales:
volume:
median_price:
listings:
months_inventory:
#PUNTO 3----------------------------------------------
## Installazione e caricamento del pacchetto necessario
library(moments)
calcola_indici_simmetria_curtosi <- function(x) {
x <- na.omit(x)
skewness_val <- skewness(x)
curtosis_val <- kurtosis(x) - 3 # Centrare la curtosi a zero
return(list(
skewness_val = skewness_val,
curtosis_val = curtosis_val
))
}
## Calcolare gli indici di simmetria e curtosi per ogni colonna numerica
indici_simmetria_curtosi <- lapply(realestate_texas[numeric_columns], function(x) {
calcola_indici_simmetria_curtosi(x)
})
## Creazione di un dataframe per visualizzare i risultati
df_simmetria_curtosi <- do.call(rbind, lapply(seq_along(numeric_columns), function(i) {
data.frame(
colonna = numeric_columns[i],
skewness = indici_simmetria_curtosi[[i]]$skewness,
curtosi = indici_simmetria_curtosi[[i]]$curtosis
)
}))
## Visualizzazione dei risultati
pander(df_simmetria_curtosi)
| colonna | skewness | curtosi |
|---|---|---|
| sales | 0.7181 | -0.3132 |
| volume | 0.8847 | 0.177 |
| median_price | -0.3646 | -0.623 |
| listings | 0.6495 | -0.7918 |
| months_inventory | 0.04098 | -0.1744 |
## Creazione dei grafici di simmetria e curtosi per ogni colonna
grafico_simmetria <- ggplot(df_simmetria_curtosi, aes(x = colonna)) +
geom_bar(aes(y = skewness, fill = "Simmetria"), stat = "identity", position = "dodge") +
labs(
title = "Indici di Simmetria e Curtosi per ciascuna colonna numerica",
x = "Colonne numeriche",
y = "Valore dell'indice"
) +
scale_y_continuous(labels = scales::comma,
breaks = seq(floor(min(df_simmetria_curtosi$skewness, 0)), ceiling(max(df_simmetria_curtosi$skewness, 0)), by = 0.10)) +
scale_fill_manual(name = "Indice", values = c("Simmetria" = "blue")) +
theme_minimal()
## Creazione dei grafici di simmetria e curtosi per ogni colonna
grafico_curtosi <- ggplot(df_simmetria_curtosi, aes(x = colonna)) +
geom_bar(aes(y = curtosi, fill = "Curtosi"), stat = "identity", position = "dodge") +
labs(
title = "Indici di Simmetria e Curtosi per ciascuna colonna numerica",
x = "Colonne numeriche",
y = "Valore dell'indice"
) +
scale_y_continuous(labels = scales::comma ,
breaks = seq(floor(min(df_simmetria_curtosi$skewness, 0)), ceiling(max(df_simmetria_curtosi$skewness, 0)), by = 0.10))+
scale_fill_manual(name = "Indice", values = c("Curtosi" = "green")) +
theme_minimal()
## Mostrare il grafico
print(grafico_simmetria)
print(grafico_curtosi)
##La variabile con più alta variabilità è "volume" con coefficiente di variazione
##più alto, dal momento che quest'ultimo è la misura più appropriata fra variabili con unità di misura diversa
##La variabile con più alta asimmetria in base all'indice di Asimmetria di Fisher è "volume",
##con indice > 0.80 come è possibile visionare dal grafico
##Essa presenta una forma di leptocurtosi in quanto con curtosi > 0
##"listings" ha un valore di curtosi rilevante minore di -0.75, nettamente platicurtica
#---PUNTO 4-----Creazioni di classi per una variabile quantitativa-----------------------------------------------------------
N = nrow(realestate_texas["sales"])#scelgo la variabile sales per l'analisi
realestate_texas$sales_classi <- cut(realestate_texas[["sales"]], breaks = c(0,100,200,300,400,500))
## Calcolare la frequenza per ciascuna classe
freq_classi <- table(realestate_texas$sales_classi)
pander(freq_classi)
| (0,100] | (100,200] | (200,300] | (300,400] | (400,500] |
|---|---|---|---|---|
| 21 | 128 | 66 | 22 | 3 |
grafico_classi <- ggplot(as.data.frame(freq_classi), aes(x = Var1, y = Freq)) +
geom_bar(stat = "identity", fill = "blue") +
labs(
title = "Istogramma delle frequenze assolute in classi",
x = "Classi di Sales",
y = "Frequenza Assoluta"
) +
theme_minimal()
## Mostrare il grafico
print(grafico_classi)
#La classe con frequenza più alta è quella (100,200]
## Costruisco funzione indice di Gini
gini.index <- function(freq_table){
ni <- as.numeric(freq_table)
# Calcolare le frequenze relative
fi <- ni / sum(ni)
# Calcolare il quadrato delle frequenze relative
fi2 <- fi^2
J = length(ni)
gini = 1- sum(fi2)
gini_normalizzato = gini/((J-1)/J)
return(gini_normalizzato)
}
gini_value = gini.index(freq_classi)
print(gini_value)
## [1] 0.7796441
##Indice di Gini calcolato per le freq assolute che mostra una buona eterogeneità 0.78, la distribuzione è abbastanza differenziata tra le varie classi.
#-5.-CALCOLO DELLE PROBABILITA------------------------------------------
table(realestate_texas$city)
##
## Beaumont Bryan-College Station Tyler
## 60 60 60
## Wichita Falls
## 60
##La probabilità che presa una riga a caso del dataset essa abbia come città
##di Beaumont è di 60/240
p = 60/240 # = 0.25 quindi 25%
##La probabilità che presa una riga a caso del dataset essa abbia come mese Luglio
##che abbia quindi come valore di "month" 7
table(realestate_texas$month)##visualizzo freq assolute
##
## 1 2 3 4 5 6 7 8 9 10 11 12
## 20 20 20 20 20 20 20 20 20 20 20 20
p2 = 20/240 ## = 0.08 quindi 8%
p2
## [1] 0.08333333
##La probabilità che presa una riga a caso del dataset
##che abbia quindi come valore "dicembre" "2012"
table(realestate_texas$month)#visualizzo freq assolute
##
## 1 2 3 4 5 6 7 8 9 10 11 12
## 20 20 20 20 20 20 20 20 20 20 20 20
table(realestate_texas$year)#visualizzo freq assolute
##
## 2010 2011 2012 2013 2014
## 48 48 48 48 48
##probabilità 1 di dicembre 20/240
##probabilità 2 di 2012 48/240
p_month = 20/240
p_year = 48/240
p_month
## [1] 0.08333333
##probabilità condizionata fra variabili indipendenti
p_cumulata = p_month * p_year
p_cumulata
## [1] 0.01666667
1/60
## [1] 0.01666667
#PUNTO 6
#PUNTO-6.1-----Crea una nuova colonna che calcoli il prezzo medio degli immobili utilizzando le variabili disponibili.
options(max.print = 1000) # Sostituisco il massimo righe stampabili con un numero abbastanza grande per le mie esigenze
##Prezzo medio ponderato
##(sales x median_price) / (volume)
realestate_texas$prezzo_medio_ponderato = (realestate_texas$sales * realestate_texas$median_price)/realestate_texas$volume
summary(realestate_texas$prezzo_medio_ponderato)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 688546 827478 858546 861508 894608 1248412
#(valori compresi fra 688546 e 1248412)
#PUNTO-6.2-Prova a creare una colonna che misuri l’efficacia degli annunci di vendita. Commenta e discuti i risultati.
#### Rapporto vendita / inserzioni . Calcolata utilizzando il rapporto tra vendite effettive e annunci presenti,
##si vuole calcolare l'efficacia degli annunci.
realestate_texas$efficacia_vendite = (realestate_texas$sales / realestate_texas$listings)
summary(realestate_texas$efficacia_vendite)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.05014 0.08980 0.10963 0.11874 0.13492 0.38713
#(valori compresi fra 0.05 e e 0.39)
## Trova l'indice del massimo valore
max_index = which.max(realestate_texas$efficacia_vendite)
## Stampa l'indice e il valore massimo
print(max_index)
## [1] 115
cat("Massimo elemento alla posizione:", max_index, "\n")
## Massimo elemento alla posizione: 115
#cat("Valore massimo:", m, "\n")
index <- max_index
## Ottieni tutte le feature della riga con l'indice specificato
features <- realestate_texas[max_index, ]
## Stampa le feature
pander(features)
| city | year | month | sales | volume | median_price | |
|---|---|---|---|---|---|---|
| 115 | Bryan-College Station | 2014 | 7 | 403 | 83.55 | 172600 |
| listings | months_inventory | sales_classi | prezzo_medio_ponderato | |
|---|---|---|---|---|
| 115 | 1041 | 4.1 | (400,500] | 832559 |
| efficacia_vendite | |
|---|---|
| 115 | 0.3871 |
##La maggiore efficacia di vendita si è avuta per Bryan COllege nel Luglio(7) del 2014!
## , con un tasso di efficacia_vendite di 0.3871, dato da 403 vendite effettive e 1041 annunci presenti
#Punto 7-Analisi Condizionata----------------------------------------------------
#Installare e caricare i pacchetti necessari
library(dplyr)
##
## Caricamento pacchetto: 'dplyr'
## Il seguente oggetto è mascherato da 'package:gridExtra':
##
## combine
## I seguenti oggetti sono mascherati da 'package:stats':
##
## filter, lag
## I seguenti oggetti sono mascherati da 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
##Funzione per calcolare statistiche riassuntive (mean e standard deviation di tutte le variabili)
summary_stats <- function(df, group_var){
df %>%
group_by(!!sym(group_var)) %>%
summarise(
mean_sales = mean(sales, na.rm = TRUE),
sd_sales = sd(sales, na.rm = TRUE),
mean_volume = mean(volume, na.rm = TRUE),
sd_volume = sd(volume, na.rm = TRUE),
mean_median_price = mean(median_price, na.rm = TRUE),
sd_median_price = sd(median_price, na.rm = TRUE),
mean_listings = mean(listings, na.rm = TRUE),
sd_listings = sd(listings, na.rm = TRUE),
mean_months_inventory = mean(months_inventory, na.rm = TRUE),
sd_months_inventory = sd(months_inventory, na.rm = TRUE)
)
}
## Funzione per selezionare la scala x appropriata
choose_scale_x <- function(summary_df, group_var) {
if (is.numeric(summary_df[[group_var]])) {
return(scale_x_continuous(breaks = seq(min(summary_df[[group_var]], na.rm = TRUE),
max(summary_df[[group_var]], na.rm = TRUE), by = 1)))
} else {
return(scale_x_discrete())
}
}
## Funzione per creare grafici di media con barre di errore (qest'ultrime rappresentanti la deviazione standard)
create_plots <- function(summary_df, group_var) {
## Grafico delle medie con deviazione standard come barre di errore
p1 <- ggplot(summary_df, aes(x = !!sym(group_var), y = mean_sales, fill = as.factor(!!sym(group_var)))) +
geom_bar(stat = "identity") +
geom_errorbar(aes(ymin = mean_sales - sd_sales, ymax = mean_sales + sd_sales), width = 0.2) +
choose_scale_x(summary_df, group_var) +
labs(title = paste("Media Sales per", group_var), x = group_var, y = "N. Sales") +
guides(fill = "none") +
theme_minimal()+
if (group_var == "city"){
theme(axis.text.x = element_text(angle = 0, hjust = 0.5, size = 6))}
else{
}
p2 <- ggplot(summary_df, aes(x = !!sym(group_var), y = mean_volume, fill = as.factor(!!sym(group_var)))) +
geom_bar(stat = "identity") +
geom_errorbar(aes(ymin = mean_volume - sd_volume, ymax = mean_volume + sd_volume), width = 0.2) +
choose_scale_x(summary_df, group_var) +
labs(title = paste("Media Volume per", group_var), x = group_var, y = "Millions of dollars") +
guides(fill = "none") +
theme_minimal()+
if (group_var == "city"){
theme(axis.text.x = element_text(angle = 0, hjust = 0.5, size = 6))}
else{ }
p3 <- ggplot(summary_df, aes(x = !!sym(group_var), y = mean_median_price, fill = as.factor(!!sym(group_var)))) +
geom_bar(stat = "identity") +
geom_errorbar(aes(ymin = mean_median_price - sd_median_price, ymax = mean_median_price + sd_median_price), width = 0.2) +
choose_scale_x(summary_df, group_var) +
labs(title = paste("Media Median Price per", group_var), x = group_var, y = "Dollars") +
guides(fill = "none") +
theme_minimal()+
if (group_var == "city"){
theme(axis.text.x = element_text(angle = 0, hjust = 0.5, size = 6))}
else{ }
p4 <- ggplot(summary_df, aes(x = !!sym(group_var), y = mean_listings, fill = as.factor(!!sym(group_var)))) +
geom_bar(stat = "identity") +
geom_errorbar(aes(ymin = mean_listings - sd_listings, ymax = mean_listings + sd_listings), width = 0.2) +
choose_scale_x(summary_df, group_var) +
labs(title = paste("Media Listings per", group_var), x = group_var, y = "Number of listings ") +
guides(fill = "none") +
theme_minimal()+
if (group_var == "city"){
theme(axis.text.x = element_text(angle =0, hjust = 0.5, size = 6))}
else{ }
p5 <- ggplot(summary_df, aes(x = !!sym(group_var), y = mean_months_inventory, fill = as.factor(!!sym(group_var)))) +
geom_bar(stat = "identity") +
geom_errorbar(aes(ymin = mean_months_inventory - sd_months_inventory, ymax = mean_months_inventory + sd_months_inventory), width = 0.2) +
choose_scale_x(summary_df, group_var) +
labs(title = paste("Media Months Inventory per", group_var), x = group_var, y = "Number of months") +
guides(fill = "none") +
theme_minimal()+
if (group_var == "city"){
theme(axis.text.x = element_text(angle = 0, hjust = 0.5, size = 6))}
else{ }
## Disporre i grafici in un'unica finestra
grid.arrange(p1, p2, p3, p4, p5, ncol = 2)
}
## Analisi per città
city_summary <- summary_stats(realestate_texas, "city")
pander(city_summary)
| city | mean_sales | sd_sales | mean_volume | sd_volume |
|---|---|---|---|---|
| Beaumont | 177.4 | 41.48 | 26.13 | 6.97 |
| Bryan-College Station | 206 | 84.98 | 38.19 | 17.25 |
| Tyler | 269.8 | 61.96 | 45.77 | 13.11 |
| Wichita Falls | 116.1 | 22.15 | 13.93 | 3.24 |
| mean_median_price | sd_median_price | mean_listings | sd_listings |
|---|---|---|---|
| 129988 | 10105 | 1679 | 91.13 |
| 157488 | 8852 | 1458 | 252.5 |
| 141442 | 9337 | 2905 | 226.8 |
| 101743 | 11320 | 909.6 | 73.76 |
| mean_months_inventory | sd_months_inventory |
|---|---|
| 9.97 | 1.65 |
| 7.658 | 2.247 |
| 11.32 | 1.886 |
| 7.817 | 0.781 |
## Analisi per anno
year_summary <- summary_stats(realestate_texas, "year")
pander(year_summary)
| year | mean_sales | sd_sales | mean_volume | sd_volume | mean_median_price |
|---|---|---|---|---|---|
| 2010 | 168.7 | 60.54 | 25.68 | 10.8 | 130192 |
| 2011 | 164.1 | 63.87 | 25.16 | 12.2 | 127854 |
| 2012 | 186.1 | 70.91 | 29.27 | 14.52 | 130077 |
| 2013 | 211.9 | 84 | 35.15 | 17.93 | 135723 |
| 2014 | 230.6 | 95.51 | 39.77 | 21.19 | 139481 |
| sd_median_price | mean_listings | sd_listings | mean_months_inventory |
|---|---|---|---|
| 21822 | 1826 | 785 | 9.973 |
| 21318 | 1850 | 780.4 | 10.9 |
| 21432 | 1777 | 738.4 | 9.879 |
| 21708 | 1678 | 743.5 | 8.15 |
| 25625 | 1560 | 706.7 | 7.056 |
| sd_months_inventory |
|---|
| 2.08 |
| 2.069 |
| 1.612 |
| 1.688 |
| 1.75 |
## Analisi per mese
month_summary <- summary_stats(realestate_texas, "month")
pander(month_summary)
| month | mean_sales | sd_sales | mean_volume | sd_volume | mean_median_price |
|---|---|---|---|---|---|
| 1 | 127.4 | 43.38 | 19 | 8.372 | 124250 |
| 2 | 140.8 | 51.07 | 21.65 | 10.09 | 130075 |
| 3 | 189.4 | 59.18 | 29.38 | 12.02 | 127415 |
| 4 | 211.7 | 65.4 | 33.3 | 14.52 | 131490 |
| 5 | 238.8 | 83.12 | 39.7 | 19.02 | 134485 |
| 6 | 243.6 | 95 | 41.3 | 21.08 | 137620 |
| 7 | 235.8 | 96.27 | 39.12 | 21.41 | 134750 |
| 8 | 231.4 | 79.23 | 38.01 | 18.05 | 136675 |
| 9 | 182.3 | 72.52 | 29.6 | 15.22 | 134040 |
| 10 | 179.9 | 74.95 | 29.08 | 15.13 | 133480 |
| 11 | 156.8 | 55.47 | 24.81 | 11.15 | 134305 |
| 12 | 169.4 | 60.75 | 27.09 | 12.57 | 133400 |
| sd_median_price | mean_listings | sd_listings | mean_months_inventory |
|---|---|---|---|
| 25151 | 1647 | 704.6 | 8.84 |
| 22823 | 1692 | 711.2 | 9.06 |
| 23442 | 1757 | 727.4 | 9.405 |
| 21458 | 1826 | 770.4 | 9.72 |
| 18796 | 1824 | 790.2 | 9.675 |
| 19231 | 1833 | 811.6 | 9.705 |
| 21945 | 1821 | 826.7 | 9.615 |
| 22488 | 1786 | 815.9 | 9.39 |
| 24344 | 1749 | 802.7 | 9.185 |
| 26358 | 1710 | 779.2 | 8.94 |
| 24691 | 1653 | 741.3 | 8.66 |
| 22810 | 1558 | 692.6 | 8.115 |
| sd_months_inventory |
|---|
| 1.975 |
| 1.978 |
| 2.061 |
| 2.243 |
| 2.385 |
| 2.407 |
| 2.505 |
| 2.454 |
| 2.518 |
| 2.439 |
| 2.373 |
| 2.267 |
## Creare e mostrare i grafici per città, anno e mese
create_plots(city_summary, "city")
##La città con media vendite e media volume vendite complessive è "Tyler"
create_plots(year_summary, "year")
##Il maggior numero di media numero vendite e media volume di vendite si è registrato nel 2014
create_plots(month_summary, "month")
#I mesi più favorevoli dovuti sia alla media vendite che alla media di volume di vendite sono stati maggio, giugno e luglio.
#Punto 8-Creazioni di visualizzazioni con ggplot2---------------------------------
## Crea il boxplot utilizzando ggplot2
ggplot(realestate_texas, aes(x = city, y = median_price)) +
geom_boxplot() +
labs(title = "Distribuzione del Prezzo Mediano tra le Città",
x = "Città",
y = "Mediana del Prezzo ($)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
##OSSERVAZIONE OPERATIVA N.1
##La città di Bryan-College ha il prezzo mediano più alto, Wichita Falls il più basso
##Osservazioni Operativa N.2
## Crea il boxplot utilizzando ggplot2
ggplot(realestate_texas, aes(x = city, y = volume)) +
geom_boxplot() +
labs(title = "Distribuzione Totale vendite tra le Città",
x = "Città",
y = "Valore totale delle vendite (milioni di $)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
##La distribuzione del valore totale delle vendite per Città, vede la città di Tyler come
##città con valore volume vendite più alto
##OSSERVAZIONE OPERATIVA n2 .2
## Calcolo della mediana per ciascun anno
mediana_per_anno <- realestate_texas %>%
group_by(year) %>%
summarize(mediana_volume = median(volume))
## Visualizza il risultato
print(mediana_per_anno)
## # A tibble: 5 × 2
## year mediana_volume
## <int> <dbl>
## 1 2010 23.7
## 2 2011 23.2
## 3 2012 25.8
## 4 2013 32.7
## 5 2014 36.8
ggplot(realestate_texas, aes(x = factor(year), y = volume)) +
geom_boxplot() +
geom_text(data = mediana_per_anno, aes(x = as.factor(year), y = mediana_volume, label = round(mediana_volume, 2)),
vjust = -0.5, color = "red") +
labs(title = "Distribuzione della Mediana del valore totale vendite tra i vari anni",
x = "Anno",
y = "Valore totale delle vendite (milioni di $)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
##Il volume totale delle vendite ha mediana maggiore per l'anno 2014 con valore di 36.83 in mil/dollari
##Osservazioni operative 3-Crea un grafico a barre sovrapposte per confrontare il totale vendite nei vari mesi
##in base alle varie città
ggplot(realestate_texas, aes(x = factor(month), y = volume, fill = city)) +
geom_bar(stat = "identity", col = "NA") +
labs(title = "Totale volume vendite nei vari mesi",
x = "Mesi",
y = "Volume delle vendite(milioni di $)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),legend.position = "bottom")
#I mesi con volume vendite più alto sono Maggio, Giugno e Luglio, con città favorita Bryan-College Station e Tyler
ggplot(realestate_texas, aes(x = factor(month), y = volume, fill = city)) +
geom_bar(stat = "identity", position = "fill", col = "NA") +
labs(title = "Totale volume vendite nei vari mesi",
x = "Mesi",
y = "Volume vendite mil $ normalizzato") +
scale_y_continuous(breaks = seq(0, 1)) + #grafico a barre normalizzato
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),legend.position = "bottom")
#Dal grafico a barre normalizzato si arriva alle medesime conclusioni del grafico precendente
## Crea una nuova colonna che combina mese e anno
realestate_texas$month_year <- interaction(realestate_texas$month, realestate_texas$year, sep = "-")
## Crea il grafico a barre sovrapposte per mese e anno
ggplot(realestate_texas, aes(x = factor(month_year), y = volume, fill = city )) +
geom_col(position = "stack", col = "black") +
labs(title = "Totale volume vendite nei vari mesi/anni",
x = "Mesi e Anni",
y = "Volume delle vendite (milioni di $") +
scale_y_continuous(labels = scales::comma)+
scale_x_discrete(breaks = levels(factor(realestate_texas$month_year))[seq(1,length(levels(factor(realestate_texas$month_year))), by = 3)]) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),legend.position = "bottom")
#Il primato nelle vendite si è registrato a Luglio 2014, in generale il 2013 e 2014
# sono stati gli anni con vendite più numerose
## Crea il grafico con facettatura per anno
ggplot(realestate_texas, aes(x = factor(year), y = volume, fill = city)) +
geom_col(position = "dodge", col = "black") +
labs(title = "Totale volume vendite per anno",
x = "Anno",
y = "Volume delle vendite milioni di $") +
facet_wrap(~ month, ncol = 3) + # Facettatura per mese con 3 colonne
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),legend.position = "bottom")
##Osservazione Operativa n.5 LINE-CHART
library(scales)
library(lubridate)
## Warning: il pacchetto 'lubridate' è stato creato con R versione 4.4.2
##
## Caricamento pacchetto: 'lubridate'
## I seguenti oggetti sono mascherati da 'package:base':
##
## date, intersect, setdiff, union
## Supponiamo che il tuo dataframe originale si chiami realestate_texas
realestate_texas_selected <- realestate_texas %>%
select(year, month, volume)
## Crea una colonna 'date' combinando 'year' e 'month'
realestate_texas_selected <- realestate_texas_selected %>%
mutate(date = make_date(year, month, 1))
## Verifica se ci sono dati NA nella colonna 'date'
if (any(is.na(realestate_texas_selected$date))) {
stop("Ci sono valori mancanti nella colonna 'date'.")
}
## Aggregare i dati per mese e anno
monthly_sales <- realestate_texas_selected %>%
group_by(date) %>%
summarise(total_volume = sum(volume, na.rm = TRUE)) #
## Verifica il risultato dell'aggregazione
#print(head(monthly_sales)) # Assicurati che ci siano righe
## Creare il grafico
ggplot(data = monthly_sales) +
geom_line(aes(x = date, y = total_volume), col = "blue", lwd = 1.5) +
geom_point(aes(x = date, y = total_volume), col = "red", size = 3) +
labs(title = "Totale vendite nei vari mesi e anni",
x = "Mese/Anno",
y = "Vendite in milioni di $") +
scale_x_date(date_breaks = "3 month", date_labels = "%b %Y") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 60, hjust = 1))
## per il dataset realestate_texas consideriamo "year","month","city", "volume"
##
realestate_texas_selected <- realestate_texas %>%
select(year, month, city, volume)
## Crea una colonna 'date' combinando 'year' e 'month'
realestate_texas_selected <- realestate_texas_selected %>%
mutate(date = make_date(year, month, 1))
## Verifica se ci sono dati NA nella colonna 'date'
if (any(is.na(realestate_texas_selected$date))) {
stop("Ci sono valori mancanti nella colonna 'date'.")
}
## Aggregare i dati per mese, anno e città
monthly_sales <- realestate_texas_selected %>%
group_by(date, city) %>%
summarise(total_volume = sum(volume, na.rm = TRUE))
## `summarise()` has grouped output by 'date'. You can override using the
## `.groups` argument.
## Verifica il risultato dell'aggregazione
print(head(monthly_sales)) # Assicurati che ci siano righe
## # A tibble: 6 × 3
## # Groups: date [2]
## date city total_volume
## <date> <chr> <dbl>
## 1 2010-01-01 Beaumont 14.2
## 2 2010-01-01 Bryan-College Station 15.2
## 3 2010-01-01 Tyler 25.5
## 4 2010-01-01 Wichita Falls 8.95
## 5 2010-02-01 Beaumont 17.7
## 6 2010-02-01 Bryan-College Station 19.7
## Creare il grafico
ggplot(data = monthly_sales, aes(x = date, y = total_volume, color = city)) +
geom_line(lwd = 1.5) +
geom_point(size = 3) +
labs(title = "Totale vendite nei vari mesi e anni per città",
x = "Mese/Anno",
y = "Vendite in milioni di $") +
scale_x_date(date_breaks = "3 months", date_labels = "%b %Y") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 60, hjust = 1),legend.position = "bottom")
##Secondo il grafico le città con più vendite sono state per tutti gli anni considerati Bryan-College Station e Tyler
#Punto 9-OSSERVAZIONI FINALI-
## Sono state prima identificate le tipologie di variabili e sulle quelle
## quantitative sono state calcolati indici di posizione, variabilità e forma.
## La variabile con più alta variabilità è "volume" con l'indice di variabilità
## più alto, dal momento che quest'ultimo è la misura più appropriata
## per il confronto tra variabili con diversa unità di misura.
## L'indice di asimmetria più alto si è verificato con "volume".
## Si ha una buona eterogeneità dei dati, con un indice di Gini > 0.50
## La migliore efficacia degli annunci pubblicitari si è avuta nel Luglio del 2014
## per la città di Bryan-College Station, con un tasso di efficacia_vendite di 0.38
## Dai grafici si evince che in generale il totale volume vendite maggiore per le
## città si è registrato a giugno/luglio del 2014 e le città con più vendite sono state per tutti gli anni considerati Bryan-College Station e Tyler con una differenza vendite dalle altre città abbastanza costante nel tempo.
#```{r}
#```