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 )
## Stampare i risultati
print("Frequenze per colonne categoriche:")
## [1] "Frequenze per colonne categoriche:"
pander(frequenze_categoriche)
##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)
##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
#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)
Table continues below
  city year month sales volume median_price
115 Bryan-College Station 2014 7 403 83.55 172600
Table continues below
  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)
Table continues below
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
Table continues below
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)
Table continues below
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
Table continues below
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)
Table continues below
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
Table continues below
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}

#```