#Commento al progetto: #https://docs.google.com/document/d/1BTG-z2JVJBzUXnY6IKjZKSZVDbXPAWcAroNiFtnXHPM/edit?usp=sharing # Caricamento delle librerie necessarie

# install.packages("lubridate")
# install.packages("ggplot2")
# install.packages("moments")
# install.packages("dplyr")
# install.packages("ineq")
# install.packages("knitr")

library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(ggplot2)
library(moments)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ineq)
library(knitr)

Importazione del dataset

data <- read.csv("/Users/rugg/Documents/GitHub/Statistica1/realestate_texas.csv")

1. Analisi delle variabili

Analisi preliminare della struttura del dataset

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 ...

Conversione delle variabili temporali per analisi temporali adeguate

data$date <- as.Date(paste(data$year, data$month, "01", sep = "-"))

2. Indici di posizione, variabilità e forma per variabili numeriche

Calcolo degli indici statistici

numeric_vars <- c("sales", "volume", "median_price", "listings", "months_inventory")

summary_stats <- data %>%
  summarise(across(all_of(numeric_vars), 
                   list(mean = ~mean(.x, na.rm = TRUE), 
                        median = ~median(.x, na.rm = TRUE), 
                        sd = ~sd(.x, na.rm = TRUE), 
                        var = ~var(.x, na.rm = TRUE), 
                        skewness = ~skewness(.x, na.rm = TRUE), 
                        kurtosis = ~kurtosis(.x, na.rm = TRUE))))

kable(summary_stats, caption = "Statistiche descrittive per variabili numeriche")
Statistiche descrittive per variabili numeriche
sales_mean sales_median sales_sd sales_var sales_skewness sales_kurtosis volume_mean volume_median volume_sd volume_var volume_skewness volume_kurtosis median_price_mean median_price_median median_price_sd median_price_var median_price_skewness median_price_kurtosis listings_mean listings_median listings_sd listings_var listings_skewness listings_kurtosis months_inventory_mean months_inventory_median months_inventory_sd months_inventory_var months_inventory_skewness months_inventory_kurtosis
192.2917 175.5 79.65111 6344.3 0.718104 2.686824 31.00519 27.0625 16.65145 277.2707 0.884742 3.176987 132665.4 134500 22662.15 513572983 -0.3645529 2.377038 1738.021 1618.5 752.7078 566569 0.6494982 2.20821 9.1925 8.95 2.303669 5.306889 0.0409753 2.825553

Distribuzione di frequenza per variabili categoriche

city_freq <- table(data$city)
month_freq <- table(data$month)

kable(as.data.frame(city_freq), caption = "Distribuzione di frequenza per città")
Distribuzione di frequenza per città
Var1 Freq
Beaumont 60
Bryan-College Station 60
Tyler 60
Wichita Falls 60
kable(as.data.frame(month_freq), caption = "Distribuzione di frequenza per mese")
Distribuzione di frequenza per mese
Var1 Freq
1 20
2 20
3 20
4 20
5 20
6 20
7 20
8 20
9 20
10 20
11 20
12 20

3. Identificazione delle variabili con maggiore variabilità e asimmetria

Calcolo delle variabili con maggiore variabilità e asimmetria

cv <- sapply(data[numeric_vars], function(x) sd(x, na.rm = TRUE) / mean(x, na.rm = TRUE))
max_cv_var <- names(which.max(cv))

skewness_values <- sapply(data[numeric_vars], function(x) skewness(x, na.rm = TRUE))
max_skew_var <- names(which.max(abs(skewness_values)))

cat("Variabile con maggiore variabilità relativa:", max_cv_var, "\n")
## Variabile con maggiore variabilità relativa: volume
cat("Variabile con maggiore asimmetria:", max_skew_var, "\n")
## Variabile con maggiore asimmetria: volume

4. Creazione di classi per una variabile quantitativa

Creazione delle classi per ‘median_price’

price_breaks <- seq(min(data$median_price, na.rm = TRUE), max(data$median_price, na.rm = TRUE), length.out = 6)
data$price_class <- cut(data$median_price, breaks = price_breaks, include.lowest = TRUE,
                        labels = c("Molto basso", "Basso", "Medio", "Alto", "Molto alto"))

price_freq <- table(data$price_class)
price_rel_freq <- prop.table(price_freq)

kable(as.data.frame(price_freq), caption = "Distribuzione di frequenza per classi di prezzo")
Distribuzione di frequenza per classi di prezzo
Var1 Freq
Molto basso 18
Basso 40
Medio 73
Alto 84
Molto alto 25

Grafico a barre per la distribuzione delle classi di prezzo

ggplot(data, aes(x = price_class)) +
  geom_bar(fill = "lightblue", color = "blue4") +
  geom_text(stat = 'count', aes(label = after_stat(count)), vjust = -0.5) +
  labs(title = "Distribuzione dei prezzi mediani", 
       x = "Classi di prezzo", 
       y = "Frequenza") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Calcolo dell’indice di Gini su ‘median_price’

gini_index <- Gini(data$median_price, na.rm = TRUE)
cat("Indice di Gini per median_price:", gini_index, "\n")
## Indice di Gini per median_price: 0.09678765

5. Calcolo delle probabilità

Probabilità per determinate condizioni

prob_beaumont <- mean(data$city == "Beaumont", na.rm = TRUE)
prob_july <- mean(data$month == 7, na.rm = TRUE)
prob_dec_2012 <- mean(data$year == 2012 & data$month == 12, na.rm = TRUE)

cat("Probabilità che un immobile si trovi a Beaumont:", prob_beaumont, "\n")
## Probabilità che un immobile si trovi a Beaumont: 0.25
cat("Probabilità che un immobile sia stato venduto a Luglio:", prob_july, "\n")
## Probabilità che un immobile sia stato venduto a Luglio: 0.08333333
cat("Probabilità che un immobile sia stato venduto a Dicembre 2012:", prob_dec_2012, "\n")
## Probabilità che un immobile sia stato venduto a Dicembre 2012: 0.01666667

6. Creazione di nuove variabili

Creazione e visualizzazione delle nuove variabili

data <- data %>%
  mutate(
    avg_price = volume * 1e6 / sales,
    listing_efficiency = sales / listings
  )

avg_price_summary <- data.frame(Statistiche = names(summary(data$avg_price)), Valore = as.numeric(summary(data$avg_price)))
listing_efficiency_summary <- data.frame(Statistiche = names(summary(data$listing_efficiency)), Valore = as.numeric(summary(data$listing_efficiency)))

kable(avg_price_summary, caption = "Statistiche descrittive per avg_price")
Statistiche descrittive per avg_price
Statistiche Valore
Min. 97010.2
1st Qu. 132938.9
Median 156588.5
Mean 154320.4
3rd Qu. 173915.2
Max. 213233.9
kable(listing_efficiency_summary, caption = "Statistiche descrittive per listing_efficiency")
Statistiche descrittive per listing_efficiency
Statistiche Valore
Min. 0.0501403
1st Qu. 0.0898017
Median 0.1096268
Mean 0.1187449
3rd Qu. 0.1349225
Max. 0.3871278

Grafico boxplot per l’efficacia degli annunci per città

ggplot(data, aes(x = city, y = listing_efficiency)) +
  geom_boxplot() +
  labs(title = "Efficacia degli annunci per città", x = "Città", y = "Efficacia degli annunci (vendite/annunci)")

7. Analisi condizionata

Analisi dei dati condizionata su base città, anno e mese

city_summary <- data %>%
  group_by(city) %>%
  summarise(
    avg_sales = mean(sales, na.rm = TRUE),
    sd_sales = sd(sales, na.rm = TRUE),
    avg_price = mean(median_price, na.rm = TRUE),
    sd_price = sd(median_price, na.rm = TRUE)
  )

kable(city_summary, caption = "Analisi condizionata per città")
Analisi condizionata per città
city avg_sales sd_sales avg_price sd_price
Beaumont 177.3833 41.48395 129988.3 10104.993
Bryan-College Station 205.9667 84.98374 157488.3 8852.235
Tyler 269.7500 61.96380 141441.7 9336.538
Wichita Falls 116.0667 22.15192 101743.3 11320.034
year_summary <- data %>%
  group_by(year) %>%
  summarise(
    avg_sales = mean(sales, na.rm = TRUE),
    sd_sales = sd(sales, na.rm = TRUE),
    avg_price = mean(median_price, na.rm = TRUE),
    sd_price = sd(median_price, na.rm = TRUE)
  )

kable(year_summary, caption = "Analisi condizionata per anno")
Analisi condizionata per anno
year avg_sales sd_sales avg_price sd_price
2010 168.6667 60.53708 130191.7 21821.76
2011 164.1250 63.87042 127854.2 21317.80
2012 186.1458 70.90509 130077.1 21431.52
2013 211.9167 83.99641 135722.9 21708.08
2014 230.6042 95.51490 139481.2 25625.41
month_summary <- data %>%
  mutate(month = factor(month, levels = 1:12, labels = month.name)) %>%
  group_by(month) %>%
  summarise(
    avg_sales = mean(sales, na.rm = TRUE),
    sd_sales = sd(sales, na.rm = TRUE),
    avg_price = mean(median_price, na.rm = TRUE),
    sd_price = sd(median_price, na.rm = TRUE)
  )

kable(month_summary, caption = "Analisi condizionata per mese")
Analisi condizionata per mese
month avg_sales sd_sales avg_price sd_price
January 127.40 43.38372 124250 25151.28
February 140.85 51.06783 130075 22822.59
March 189.45 59.17812 127415 23442.03
April 211.70 65.40489 131490 21458.40
May 238.85 83.11582 134485 18796.26
June 243.55 94.99832 137620 19231.02
July 235.75 96.27421 134750 21944.78
August 231.45 79.22883 136675 22488.38
September 182.35 72.51807 134040 24344.10
October 179.90 74.95395 133480 26358.07
November 156.85 55.46670 134305 24691.47
December 169.40 60.74658 133400 22809.76

8. Creazione di visualizzazioni con ggplot2

Boxplot per confrontare la distribuzione del prezzo mediano tra le città

ggplot(data, aes(x = city, y = median_price)) +
  geom_boxplot() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(title = "Distribuzione del prezzo mediano per città",
       x = "Città",
       y = "Prezzo mediano ($)")

Grafico a barre per confrontare il totale delle vendite per mese e città

data %>%
  group_by(city, month) %>%
  summarise(total_sales = sum(sales, na.rm = TRUE)) %>%
  mutate(month = factor(month, levels = 1:12, labels = month.name)) %>%
  ggplot(aes(x = factor(month), y = total_sales, fill = city)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Totale delle vendite per mese e città",
       x = "Mese",
       y = "Totale vendite") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.

Line chart per confrontare l’andamento delle vendite nel tempo per città

ggplot(data, aes(x = date, y = sales, color = city)) +
  geom_line() +
  labs(title = "Andamento delle vendite nel tempo per città",
       x = "Data",
       y = "Numero di vendite") +
  theme(legend.position = "bottom")