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