# Carichiamo i pacchetti necessari
library(ggplot2)
library(dplyr)
##
## Caricamento pacchetto: 'dplyr'
## I seguenti oggetti sono mascherati da 'package:stats':
##
## filter, lag
## I seguenti oggetti sono mascherati da 'package:base':
##
## intersect, setdiff, setequal, union
library(moments)
# 1. Importazione del dataset
data <- read.csv("realestate_texas.csv")
# Visualizziamo le prime righe del dataset per capire la sua struttura
head(data)
## 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
## 6 Beaumont 2010 6 189 27.219 122800 1803 11.1
# Esaminiamo la struttura del dataset per identificare i tipi di variabili contenute
str(data)
## 'data.frame': 240 obs. of 8 variables:
## $ city : chr "Beaumont" "Beaumont" "Beaumont" "Beaumont" ...
## $ year : int 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
## $ month : int 1 2 3 4 5 6 7 8 9 10 ...
## $ sales : int 83 108 182 200 202 189 164 174 124 150 ...
## $ volume : num 14.2 17.7 28.7 26.8 28.8 ...
## $ median_price : num 163800 138200 122400 123200 123100 ...
## $ listings : int 1533 1586 1689 1708 1771 1803 1857 1830 1829 1779 ...
## $ months_inventory: num 9.5 10 10.6 10.6 10.9 11.1 11.7 11.6 11.7 11.5 ...
# La variabile 'city' è una variabile categorica, mentre le altre variabili sono numeriche.
# 'year' e 'month' sono variabili numeriche, ma possono essere trattate come variabili categoriche.
# 2.Calcolo dei principali indici di posizione (media), di variabilità (deviazione standard),
# e di forma (skewness e kurtosis) per le variabili quantitative.
summary_stats <- data.frame(
Media = sapply(data[c("sales", "volume", "median_price", "listings", "months_inventory")], mean),
Deviazione_Standard = sapply(data[c("sales", "volume", "median_price", "listings", "months_inventory")], sd),
Skewness = sapply(data[c("sales", "volume", "median_price", "listings", "months_inventory")], skewness),
Kurtosis = sapply(data[c("sales", "volume", "median_price", "listings", "months_inventory")], kurtosis)
)
# Mostriamo le statistiche calcolate
summary_stats
## Media Deviazione_Standard Skewness Kurtosis
## sales 192.29167 79.651111 0.71810402 2.686824
## volume 31.00519 16.651447 0.88474203 3.176987
## median_price 132665.41667 22662.148687 -0.36455288 2.377038
## listings 1738.02083 752.707756 0.64949823 2.208210
## months_inventory 9.19250 2.303669 0.04097527 2.825552
# Calcolo della distribuzione di frequenza per le variabili categoriche.
table(data['city'])
## city
## Beaumont Bryan-College Station Tyler
## 60 60 60
## Wichita Falls
## 60
cv = function(x){
return(sd(x)/mean(x)*100)
}
# 3. Variabilità e asimmetria delle variabili
Coefficiente_Variazione = sapply(data[c("sales", "volume", "median_price", "listings", "months_inventory")], cv)
Coefficiente_Variazione
## sales volume median_price listings
## 41.42203 53.70536 17.08218 43.30833
## months_inventory
## 25.06031
# La variabile con la maggiore variabilità è `volume`, con un coefficiente di variazione più elevato.
# La variabile più asimmetrica è `volume` con un alto valore di skewness positivo.
ggplot(data, aes(x = volume)) +
geom_histogram(binwidth = 1, fill = "blue", color = "black", alpha = 0.7) +
labs(title = "Distribuzione del valore totale delle vendite in milioni di dollari",
x = "Valore totale (in milioni di dollari)",
y = "Frequenza") +
theme_minimal()

# 4. Creazione di classi per una variabile quantitativa
ggplot(data, aes(x = median_price)) +
geom_histogram(binwidth = 2000, fill = "blue", color = "black", alpha = 0.7) +
labs(title = "Distribuzione del prezzo mediano dollari",
x = "Prezzo mediano (in dollari)",
y = "Frequenza") +
theme_minimal()

# Ora dividiamo la variabile `median_price` in classi per creare una distribuzione di frequenze.
# Creiamo classi per la variabile `median_price`
data$price_class <- cut(data$median_price, breaks = 5, labels = c("Molto Basso", "Basso", "Medio", "Alto", "Molto Alto"))
# Distribuzione di frequenze delle classi di prezzo
table(data$price_class)
##
## Molto Basso Basso Medio Alto Molto Alto
## 18 40 73 84 25
# Creazione del grafico a barre per le classi di prezzo
ggplot(data, aes(x = price_class)) +
geom_bar(fill = "skyblue") +
labs(title = "Distribuzione delle Classi di Prezzo Mediano", x = "Classi di Prezzo", y = "Frequenza") +
theme_minimal()

# Il grafico mostra la distribuzione delle classi di prezzo mediano.
# Possiamo vedere che la maggior parte degli immobili rientra nelle classi `Medio` e `Alto`.
# Funzione per calcolare l'indice di Gini
gini <- function(x) {
ni = table(x)
fi = ni/length(x)
fi2 = fi^2
J = length(table(x))
gini = 1-sum(fi2)
G = gini/((J-1)/J)
return(G)
}
gini((data$price_class))
## [1] 0.9259115
# 5. Indice di Gini per la variabile 'city'
city_freq <- (data$city)
gini(city_freq)
## [1] 1
# L'indice di Gini per `city` mostra un valore pari a 1, indicando una distribuzione equa tra le città.
# 6. Probabilità per 'Beaumont', 'Luglio' e 'Dicembre 2012'
# Probabilità di 'Beaumont'
prob_beaumont <- mean(data$city == "Beaumont")
prob_beaumont
## [1] 0.25
#La probabilità è pari a 1/4 = 0.25, dato che sono presenti 4 città equamente presenti nel dataset.
# Probabilità di 'Luglio'
prob_july <- mean(data$month == 7)
prob_july
## [1] 0.08333333
#La probabilità è pari a 1/12 = 0.083, dato che sono presenti 12 mesi equamente presenti nel dataset.
# Probabilità di 'Dicembre 2012'
prob_dec_2012 <- mean(data$year == 2012 & data$month == 12)
prob_dec_2012
## [1] 0.01666667
#La probabilità è pari a 1/(12*5) = 0.016, dato che sono presenti 12 mesi e 5 anni equamente presenti nel dataset.
# 7. Creazione della colonna per il prezzo medio
# Usiamo la variabile `volume` e `sales` per creare una nuova colonna con il prezzo medio di vendita.
data$mean_price <- (data$volume * 10^6) / data$sales # Il volume è in milioni
# Visualizziamo le prime righe per controllare
head(data)
## 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
## 6 Beaumont 2010 6 189 27.219 122800 1803 11.1
## price_class mean_price
## 1 Molto Alto 170626.5
## 2 Alto 163796.3
## 3 Medio 157697.8
## 4 Medio 134095.0
## 5 Medio 142737.6
## 6 Medio 144015.9
# 8. Creazione di una colonna per l'efficacia degli annunci come rapporto tra vendite e annunci attivi.
data$ad_effectiveness <- data$sales / data$listings
head(data)
## 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
## 6 Beaumont 2010 6 189 27.219 122800 1803 11.1
## price_class mean_price ad_effectiveness
## 1 Molto Alto 170626.5 0.05414220
## 2 Alto 163796.3 0.06809584
## 3 Medio 157697.8 0.10775607
## 4 Medio 134095.0 0.11709602
## 5 Medio 142737.6 0.11405985
## 6 Medio 144015.9 0.10482529
summary_by_city <- data %>%
group_by(city) %>%
summarise(
media_ad_effectiveness = mean(ad_effectiveness),
)
summary_by_city
## # A tibble: 4 × 2
## city media_ad_effectiveness
## <chr> <dbl>
## 1 Beaumont 0.106
## 2 Bryan-College Station 0.147
## 3 Tyler 0.0935
## 4 Wichita Falls 0.128
#Bryan-College Station è la città con l'efficacia degli annunci più alta.
# 9. Riassunto delle vendite per città e anno
summary_by_city_year <- data %>%
group_by(city, year) %>%
summarise(
media_sales = mean(sales),
sd_sales = sd(sales)
)
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
summary_by_city_year
## # A tibble: 20 × 4
## # Groups: city [4]
## city year media_sales sd_sales
## <chr> <int> <dbl> <dbl>
## 1 Beaumont 2010 156. 36.9
## 2 Beaumont 2011 144 22.7
## 3 Beaumont 2012 172. 28.4
## 4 Beaumont 2013 201. 37.7
## 5 Beaumont 2014 214. 36.5
## 6 Bryan-College Station 2010 168. 70.8
## 7 Bryan-College Station 2011 167. 62.2
## 8 Bryan-College Station 2012 197. 74.3
## 9 Bryan-College Station 2013 238. 95.8
## 10 Bryan-College Station 2014 260. 86.7
## 11 Tyler 2010 228. 49.0
## 12 Tyler 2011 239. 49.6
## 13 Tyler 2012 264. 46.4
## 14 Tyler 2013 287. 53.0
## 15 Tyler 2014 332. 56.9
## 16 Wichita Falls 2010 123. 26.6
## 17 Wichita Falls 2011 106. 19.8
## 18 Wichita Falls 2012 112. 14.2
## 19 Wichita Falls 2013 121. 26.0
## 20 Wichita Falls 2014 117 21.1
####ggplot
# 1. Boxplot per confrontare il prezzo mediano tra le città
ggplot(data, aes(x = city, y = median_price)) +
geom_boxplot(fill = "lightblue", color = "black") +
labs(title = "Confronto del Prezzo Mediano delle Case tra le Città",
x = "Città",
y = "Prezzo Mediano (in dollari)") +
theme_minimal()

#Bryan-College Station è la città con il prezzo mediano più alto.
# 2. Boxplot per la distribuzione del valore totale delle vendite tra città e anni
ggplot(data, aes(x = city, y = volume, fill = factor(year))) +
geom_boxplot() +
labs(title = "Distribuzione del Volume delle Vendite tra Città e Anni",
x = "Città",
y = "Volume delle Vendite (Milioni di $)") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))

# Il boxplot mostra una notevole variabilità del volume delle vendite tra le città e negli anni,
# con alcune città come Bryan-College Station e Tyler che mostrano una maggiore crescita negli ultimi anni.
# 3. Grafico a barre sovrapposte per le vendite nei vari mesi e città
# Calcolo il totale delle vendite per mese e città
sales_by_month <- data %>%
group_by(city, month, year) %>%
summarise(total_sales = sum(sales, na.rm = TRUE), .groups = 'drop')
# Grafico a barre sovrapposte
ggplot(sales_by_month, aes(x = factor(month), y = total_sales, fill = city)) +
geom_col() +
labs(title = "Totale Vendite per Mese e Città",
x = "Mese",
y = "Totale Vendite") +
theme_minimal() +
facet_wrap(~ year) + # Aggiunta della variabile Year
theme_minimal()

# Grafico a barre normalizzato
sales_normalized <- sales_by_month %>%
group_by(city, year) %>%
mutate(percentage_sales = total_sales / sum(total_sales) * 100)
ggplot(sales_normalized, aes(x = factor(month), y = percentage_sales, fill = city)) +
geom_col() +
labs(title = "Distribuzione Percentuale delle Vendite per Mese e Città",
x = "Mese",
y = "Percentuale Vendite") +
theme_minimal() +
facet_wrap(~ year) + # Aggiunta della variabile Year
theme_minimal()

#Il grafico rivela una crescita di vendita totale negli anni. Inoltre, i mesi centrali
#registrano un numero maggiore di vendite.
# 4. Line chart per confrontare il prezzo mediano tra città e periodi storici
data$date_column <- as.Date(paste(data$year, data$month, 1, sep = "-"), format = "%Y-%m-%d")
ggplot(data, aes(x = date_column, y = median_price, group = city, color = city)) +
geom_line(size = 2) +
scale_x_date(date_labels = "%b %Y", date_breaks = "1 month") +
labs(title = "Andamento del valore mediano per Città nel Tempo",
x = "Mese e Anno",
y = "Prezzo mediano (in dollari)") +
theme_minimal()+
theme(axis.text.x = element_text(angle = 45, hjust = 1, size =5)) # Rotate x-axis labels
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

ggplot(data, aes(x = date_column, y = volume, group = city, color = city)) +
geom_line(size = 2) +
scale_x_date(date_labels = "%b %Y", date_breaks = "1 month") +
labs(title = "Andamento del valore totale di vendite per Città nel Tempo",
x = "Mese e Anno",
y = "Valore totale di vendite (in milioni di dollari)") +
theme_minimal()+
theme(axis.text.x = element_text(angle = 45, hjust = 1, size =5)) # Rotate x-axis labels

ggplot(data, aes(x = date_column, y = sales, group = city, color = city)) +
geom_line(size = 2) +
scale_x_date(date_labels = "%b %Y", date_breaks = "1 month") +
labs(title = "Andamento del numero totale di vendite per Città nel Tempo",
x = "Mese e Anno",
y = "Numero totale di vendite") +
theme_minimal()+
theme(axis.text.x = element_text(angle = 45, hjust = 1, size =5)) # Rotate x-axis labels

#Come riportato precedentemente dai boxplot, si registra un numero maggiore di
#vendite nei mesi centrali dell'anno.
#Inoltre le città di Bryan-College Station e Tyler registrano un prezzo e numero di vendite maggiore
#rispetto alle altre città.