1. Analisi delle variabili

<<Identifica e descrivi il tipo di variabili statistiche presenti nel dataset. Valuta come gestire le variabili che sottintendono una dimensione tempo e commenta sul tipo di analisi che può essere condotta su ciascuna variabile.>>

Per prima cosa carico il dataset e analizzo il tipo di variabili contenute nel file.

# Caricamento del dataset realestate_texas.csv e visualizzazione delle prime righe
data <- read.csv("C:/Users/giuli/OneDrive/Desktop/MasterAI/realestate_texas.csv")
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
#Analisi della struttura del dataset per identificare i tipi di variabili
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 ...

Il dataset contiene le seguenti variabili:

Gestione delle variabili temporali

Per quanto riguarda le variabili year e month possono essere utilizzate per creare una variabile temporale. Creo una nuova colonna date combinandole entrambe.

# Creazione di una nuova variabile temporale 'date' per analisi temporali
library(dplyr)
## Warning: il pacchetto 'dplyr' è stato creato con R versione 4.3.3
## 
## 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
data <- data %>%
  mutate(date = as.Date(paste(year, month, "01", sep = "-")))
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
##         date
## 1 2010-01-01
## 2 2010-02-01
## 3 2010-03-01
## 4 2010-04-01
## 5 2010-05-01
## 6 2010-06-01

Tipi di analisi possibili

  • city: distribuzione di frequenza
  • year, month: distribuzione di frequenza, analisi delle tendenze temporali
  • sales,volume,median_price,listings,months_inventory: distribuzione di frequenza, indici di posizione variabilità e forma

2. Indici di posizione, variabilità e forma

<<Calcola Indici di posizione, variabilità e forma per tutte le variabili per le quali ha senso farlo, per le altre crea una distribuzione di frequenza. Infine, commenta tutto brevemente.>>

Indici di posizione

Calcoliamo per le variabili city, month e year la distribuzione di frequenza:

N <- dim(data)[1]
attach(data)

# Calcolo della distribuzione di frequenza per la variabile "city"
freq_ass_city <- table(city)
freq_rel_city <- table(city)/N
distr_freq_city <- cbind(freq_ass_city, freq_rel_city)

# Calcolo della distribuzione di frequenza per la variabile "year"
freq_ass_year <- table(year)
freq_rel_year <- table(year)/N
distr_freq_year <- cbind(freq_ass_year, freq_rel_year)

# Calcolo della distribuzione di frequenza per la variabile "month"
freq_ass_month <- table(month)
freq_rel_month <- table(month)/N
distr_freq_month <- cbind(freq_ass_month, freq_rel_month)

distr_freq_city 
##                       freq_ass_city freq_rel_city
## Beaumont                         60          0.25
## Bryan-College Station            60          0.25
## Tyler                            60          0.25
## Wichita Falls                    60          0.25
distr_freq_year
##      freq_ass_year freq_rel_year
## 2010            48           0.2
## 2011            48           0.2
## 2012            48           0.2
## 2013            48           0.2
## 2014            48           0.2
distr_freq_month
##    freq_ass_month freq_rel_month
## 1              20     0.08333333
## 2              20     0.08333333
## 3              20     0.08333333
## 4              20     0.08333333
## 5              20     0.08333333
## 6              20     0.08333333
## 7              20     0.08333333
## 8              20     0.08333333
## 9              20     0.08333333
## 10             20     0.08333333
## 11             20     0.08333333
## 12             20     0.08333333

La distribuzione di frequenza per la variabile city mostra che i dati sono equamente distribuiti tra le quattro città: Beaumont, Bryan-College Station, Tyler e Wichita Falls, ognuna delle quali appare con la stessa frequenza assoluta (60 osservazioni) e relativa (25%). Ciò indica che non c’è una predominanza di una città rispetto alle altre nel dataset. Questo potrebbe essere utile per analizzare la variabilità o la distribuzione geografica dei dati. Per quanto riguarda le variabili month e year anche queste variabili mostrano una distribuzione omogenea con rispettivamente 20 e 48 osservazioni ed una frequenza relativa dell’8,3% e 20%.

indici di posizione per le variabili sales, volume, median_price, listings, months_inventory:

# Funzione per calcolare gli indici di posizione per una variabile numerica
calcola_indici_posizione <- function(x, nome_x) {
  min_x <- min(x)   # Calcolo del valore minimo
  max_x <- max(x)   # Calcolo del valore massimo
  quantiles_x <- quantile(x)   # Calcolo dei quantili
  mean_x <- mean(x)   # Calcolo della media
  median_x <- median(x)   # Calcolo della mediana
  
  cat(nome_x, "- Massimo:", max_x, "\n")
  cat(nome_x, "- Minimo:", min_x, "\n")
  cat(nome_x, "- Quantili:", quantiles_x, "\n")
  cat(nome_x, "- Media:", mean_x, "\n")
  cat(nome_x, "- Mediana:", median_x, "\n")
}

calcola_indici_posizione(sales, "sales")
## sales - Massimo: 423 
## sales - Minimo: 79 
## sales - Quantili: 79 127 175.5 247 423 
## sales - Media: 192.2917 
## sales - Mediana: 175.5
calcola_indici_posizione(volume, "volume")
## volume - Massimo: 83.547 
## volume - Minimo: 8.166 
## volume - Quantili: 8.166 17.6595 27.0625 40.893 83.547 
## volume - Media: 31.00519 
## volume - Mediana: 27.0625
calcola_indici_posizione(median_price, "median_price")
## median_price - Massimo: 180000 
## median_price - Minimo: 73800 
## median_price - Quantili: 73800 117300 134500 150050 180000 
## median_price - Media: 132665.4 
## median_price - Mediana: 134500
calcola_indici_posizione(listings, "listings")
## listings - Massimo: 3296 
## listings - Minimo: 743 
## listings - Quantili: 743 1026.5 1618.5 2056 3296 
## listings - Media: 1738.021 
## listings - Mediana: 1618.5
calcola_indici_posizione(months_inventory, "months_inventory")
## months_inventory - Massimo: 14.9 
## months_inventory - Minimo: 3.4 
## months_inventory - Quantili: 3.4 7.8 8.95 10.95 14.9 
## months_inventory - Media: 9.1925 
## months_inventory - Mediana: 8.95

Indici di veriabilità

summary(data)
##      city                year          month           sales      
##  Length:240         Min.   :2010   Min.   : 1.00   Min.   : 79.0  
##  Class :character   1st Qu.:2011   1st Qu.: 3.75   1st Qu.:127.0  
##  Mode  :character   Median :2012   Median : 6.50   Median :175.5  
##                     Mean   :2012   Mean   : 6.50   Mean   :192.3  
##                     3rd Qu.:2013   3rd Qu.: 9.25   3rd Qu.:247.0  
##                     Max.   :2014   Max.   :12.00   Max.   :423.0  
##      volume        median_price       listings    months_inventory
##  Min.   : 8.166   Min.   : 73800   Min.   : 743   Min.   : 3.400  
##  1st Qu.:17.660   1st Qu.:117300   1st Qu.:1026   1st Qu.: 7.800  
##  Median :27.062   Median :134500   Median :1618   Median : 8.950  
##  Mean   :31.005   Mean   :132665   Mean   :1738   Mean   : 9.193  
##  3rd Qu.:40.893   3rd Qu.:150050   3rd Qu.:2056   3rd Qu.:10.950  
##  Max.   :83.547   Max.   :180000   Max.   :3296   Max.   :14.900  
##       date           
##  Min.   :2010-01-01  
##  1st Qu.:2011-03-24  
##  Median :2012-06-16  
##  Mean   :2012-06-16  
##  3rd Qu.:2013-09-08  
##  Max.   :2014-12-01
attach(data)
## I seguenti oggetti sono mascherati da data (pos = 3):
## 
##     city, date, listings, median_price, month, months_inventory, sales,
##     volume, year
# Funzione per calcolare gli indici di variabilità per una variabile numerica
calcola_indici_variabilità <- function(x, nome_x) {
  range_x <- range(x)
  var_x <- var(x)
  sd_x <- sd(x)
  CV_x <- sd_x/mean(x)*100
  
  gini.index <- function(x){
    ni=table(x)
    fi=ni/length(x)
    fi2=fi^2
    J=length(table(x))
    
    gini=1-sum(fi2)
    gini.normalizzato=gini/((J-1)/J)
    
    return(gini.normalizzato)
  }
  
  gini_value <- gini.index(x)
  
  cat(nome_x, "- Range: Min:", range_x[1], "Max:", range_x[2], "\n")
  cat(nome_x, "- Varianza:", var_x, "\n")
  cat(nome_x, "- Deviazione Standard:", sd_x, "\n")
  cat(nome_x, "- Coeff. deviazione:", CV_x, "\n")
  cat(nome_x, "- Indice di Gini:", gini_value, "\n")
}

#Applichiamo la funzione a tutte le variabili:

calcola_indici_variabilità(data$sales, "sales")
## sales - Range: Min: 79 Max: 423 
## sales - Varianza: 6344.3 
## sales - Deviazione Standard: 79.65111 
## sales - Coeff. deviazione: 41.42203 
## sales - Indice di Gini: 0.998379
calcola_indici_variabilità(data$volume, "volume")
## volume - Range: Min: 8.166 Max: 83.547 
## volume - Varianza: 277.2707 
## volume - Deviazione Standard: 16.65145 
## volume - Coeff. deviazione: 53.70536 
## volume - Indice di Gini: 0.9999484
calcola_indici_variabilità(data$median_price, "median_price")
## median_price - Range: Min: 73800 Max: 180000 
## median_price - Varianza: 513572983 
## median_price - Deviazione Standard: 22662.15 
## median_price - Coeff. deviazione: 17.08218 
## median_price - Indice di Gini: 0.9992672
calcola_indici_variabilità(data$listings, "listings")
## listings - Range: Min: 743 Max: 3296 
## listings - Varianza: 566569 
## listings - Deviazione Standard: 752.7078 
## listings - Coeff. deviazione: 43.30833 
## listings - Indice di Gini: 0.9996201
calcola_indici_variabilità(data$months_inventory, "months_inventory")
## months_inventory - Range: Min: 3.4 Max: 14.9 
## months_inventory - Varianza: 5.306889 
## months_inventory - Deviazione Standard: 2.303669 
## months_inventory - Coeff. deviazione: 25.06031 
## months_inventory - Indice di Gini: 0.9944444

Indici di forma

install.packages("moments", repos = "https://cran.rstudio.com/")
## Installazione pacchetto in 'C:/Users/giuli/AppData/Local/R/win-library/4.3'
## (perché 'lib' non è specificato)
## pacchetto 'moments' aperto con successo con controllo somme MD5
## 
## I pacchetti binari scaricati sono in
##  C:\Users\giuli\AppData\Local\Temp\RtmpwtJhtq\downloaded_packages
library(moments)

calcola_indici_forma <- function (x, nome_x) {
  skewness_x <- skewness(x)
  kurtosis_x <- kurtosis(x)-3
  
  cat(nome_x, "- Asimmetria:", skewness_x, "\n")
  cat(nome_x, "- Curtosi:", kurtosis_x, "\n")
}


#Applichiamo la funzione a tutte le variabili:

calcola_indici_forma(sales, "sales")
## sales - Asimmetria: 0.718104 
## sales - Curtosi: -0.3131764
calcola_indici_forma(volume, "volume")
## volume - Asimmetria: 0.884742 
## volume - Curtosi: 0.176987
calcola_indici_forma(median_price, "median_price")
## median_price - Asimmetria: -0.3645529 
## median_price - Curtosi: -0.6229618
calcola_indici_forma(listings, "listings")
## listings - Asimmetria: 0.6494982 
## listings - Curtosi: -0.79179
calcola_indici_forma(months_inventory, "months_inventory")
## months_inventory - Asimmetria: 0.04097527 
## months_inventory - Curtosi: -0.1744475

3. Identificazione delle variabili con maggiore variabilità e asimmetria

<<Determina: - Qual è la variabile con la più alta variabilità - Qual è la variabile con la distribuzione più asimmetrica? Spiega come sei giunto a queste conclusioni e fornisci considerazioni statistiche.>>

Variabile con la più alta variabilità

Per determinare quale variabile ha maggiore variabilità possiamo osservare i valori di var, sd e CV:

  • sales: varianza = 6344.3, deviazione standard = 79.65, CV = 41.42%
  • volume: varianza = 277.27, deviazione standard = 16.65, CV = 53.70%
  • median_price: varianza = 513572983, deviazione standard = 22662.15, CV = 17.08%
  • listings: varianza = 566569, deviazione standard = 752.71, CV = 43.31%
  • months_inventory: varianza = 5.31, deviazione standard = 2.30, CV = 25.06%

La variabile volume ha il coefficiente di variazione (CV) più alto (53.70%), indicando che è la più variabile rispetto alla sua media.

Variabile con la distribuzione più asimmetrica

Per valutare l’asimmetria consideriamo la skewness: Se la skewness > 0, coda più lunga a destra. Se la skewness < 0, coda più lunga a sinistra.

  • sales: skewness= 0.718 asimmetria positiva
  • volume: skewness= 0.885 asimmetria positiva
  • median_price: skewness= -0.365 asimmetria negativa
  • listings:: skewness= 0.649 asimmetria positiva
  • months_inventory: skewness= 0.041 quasi simmetrica

La variabile con maggiore asimmetria è volume (skewness = 0.885), quindi ha una distribuzione con una coda più lunga a destra. Il valore di kurtosis (0.18) indica che la distribuzione è leggermente più pesante rispetto a una normale (leggermente leptocurtica, quasi mesocurtica).

4. Creazione di classi per una variabile quantitativa

<<Seleziona una variabile quantitativa (es. sales o median_price) e suddividila in classi. Crea una distribuzione di frequenze e rappresenta i dati con un grafico a barre. Calcola l’indice di eterogeneità Gini e discuti i risultati. >>

Divido la variabile sales in classi utilizzando i “breaks” che vanno da 0 a 450 con un passo di 75:

min(sales)
## [1] 79
max(sales)
## [1] 423
N
## [1] 240
data$sales_cl <- cut(data$sales,
                     breaks = seq(0,450,by=75))

Rappresento le classi in un istogramma:

library(ggplot2)
## Warning: il pacchetto 'ggplot2' è stato creato con R versione 4.3.2
ggplot(data, aes(x = sales_cl)) +
  geom_bar(fill = "steelblue", color = "black") +
  labs(title = "Distribuzione delle classi di Sales",
       x = "Classi di Sales",
       y = "Frequenza assoluta") +
  theme_minimal()

L’indice di eterogeneità di Gini della variabile sales era già stata calcolata con la funzione calcola_indici_variabilità. Vediamolo:

calcola_indici_variabilità(data$sales, "sales")
## sales - Range: Min: 79 Max: 423 
## sales - Varianza: 6344.3 
## sales - Deviazione Standard: 79.65111 
## sales - Coeff. deviazione: 41.42203 
## sales - Indice di Gini: 0.998379

La combinazione dell’istogramma con l’indice di Gini suggerisce che la variabile sales ha una distribuzione disomogenea e che alcune classi di sales sono molto più popolose di altre, creando una certa disuguaglianza nella distribuzione.

5. Calcolo della probabilità

<< Qual è la probabilità che, presa una riga a caso di questo dataset, essa riporti la città “Beaumont”? E la probabilità che riporti il mese di Luglio? E la probabilità che riporti il mese di dicembre 2012?>>

N <- dim(data)[1]

p_beaumont <- sum(data$city == "Beaumont")/N
p_luglio <- sum(data$month == 7)/N
p_dic_2012 <- sum(data$month == 12 & data$year == 2012)/N

cat("Probabilità che la città sia 'Beaumont':", p_beaumont, "\n")
## Probabilità che la città sia 'Beaumont': 0.25
cat("Probabilità che il mese sia Luglio:", p_luglio, "\n")
## Probabilità che il mese sia Luglio: 0.08333333
cat("Probabilità che il mese sia Dicembre 2012:", p_dic_2012, "\n")
## Probabilità che il mese sia Dicembre 2012: 0.01666667

Ho calcolato la probabilità che una riga del dataset riporti: -Beaumont: 25% -Mese di Luglio: 8.33% -Dicembre 2012: 4.17%

Questi dati suggeriscono che il dataset sia bilanciato tra le città, ma con alcune differenze stagionali.

6. Creazione di nuove variabili

<< Crea una nuova colonna che calcoli il prezzo medio degli immobili utilizzando le variabili disponibili. Prova a creare una colonna che misuri l’efficacia degli annunci di vendita. Commenta e discuti i risultati.>>

data$mean_price <- (data$volume*1e6)/data$sales #moltiplichiamo per 1.000.000 perchè è in milioni di dollari
summary(data$median_price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   73800  117300  134500  132665  150050  180000
data$effectiveness <- data$sales/data$listings #efficacia degli annunci
summary(data$effectiveness)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.05014 0.08980 0.10963 0.11874 0.13492 0.38713

La variabile mean_price è stata calcolata come il rapporto tra il valore totale delle vendite (volume) e il numero totale di vendite (sales). Questo prezzo medio può essere confrontato con il prezzo mediano (median_price) già presente nel dataset. La differenza tra prezzo medio e mediano ci dà informazioni sulla distribuzione dei prezzi. Se mean_price è maggiore di median_price, significa che ci sono alcune vendite molto costose che alzano la media, suggerendo una distribuzione con una coda a destra.

Per quanto riguarda l’efficacia degli annunci di vendità, ho definito una metrica basata sul rapporto tra il N di vendite (sales) e il numero di annunci (listings). Un valore vicino a 1 o superiore indica un alto tasso di conversione degli annunci in vendite, mentre un valore basso suggerisce che molti annunci rimangono invenduti.

7. Analisi condizionata

<< Usa il pacchetto dplyr o il linguaggio base di R per effettuare analisi statistiche condizionate per città, anno e mese. Genera dei summary (media, deviazione standard) e rappresenta graficamente i risultati.>>

Effetuiamo un’analisi condizionata raggruppando i dati per città, anno e mese.

library(dplyr)

summary_city <- data %>%
  group_by(city) %>%
  summarise(
    mean_sales = mean(sales),
    sd_sales = sd(sales),
    mean_volume = mean(volume),
    sd_volume = sd(volume),
    mean_median_price = mean(median_price),
    sd_price = sd(median_price),
    mean_effectiveness = mean(effectiveness),
    sd_effectiveness = sd(effectiveness),
  )

summary_city
## # A tibble: 4 × 9
##   city      mean_sales sd_sales mean_volume sd_volume mean_median_price sd_price
##   <chr>          <dbl>    <dbl>       <dbl>     <dbl>             <dbl>    <dbl>
## 1 Beaumont        177.     41.5        26.1      6.97           129988.   10105.
## 2 Bryan-Co…       206.     85.0        38.2     17.2            157488.    8852.
## 3 Tyler           270.     62.0        45.8     13.1            141442.    9337.
## 4 Wichita …       116.     22.2        13.9      3.24           101743.   11320.
## # ℹ 2 more variables: mean_effectiveness <dbl>, sd_effectiveness <dbl>
summary_year <- data %>%
  group_by(year) %>%
  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_effectiveness = sd(effectiveness)
  )

summary_year
## # A tibble: 5 × 7
##    year mean_sales sd_sales mean_volume sd_volume mean_median_price
##   <int>      <dbl>    <dbl>       <dbl>     <dbl>             <dbl>
## 1  2010       169.     60.5        25.7      10.8           130192.
## 2  2011       164.     63.9        25.2      12.2           127854.
## 3  2012       186.     70.9        29.3      14.5           130077.
## 4  2013       212.     84.0        35.2      17.9           135723.
## 5  2014       231.     95.5        39.8      21.2           139481.
## # ℹ 1 more variable: sd_effectiveness <dbl>
summary_month <- data %>%
  group_by(month) %>%
  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_effectiveness = sd(effectiveness)
  )

summary_month
## # A tibble: 12 × 7
##    month mean_sales sd_sales mean_volume sd_volume mean_median_price
##    <int>      <dbl>    <dbl>       <dbl>     <dbl>             <dbl>
##  1     1       127.     43.4        19.0      8.37            124250
##  2     2       141.     51.1        21.7     10.1             130075
##  3     3       189.     59.2        29.4     12.0             127415
##  4     4       212.     65.4        33.3     14.5             131490
##  5     5       239.     83.1        39.7     19.0             134485
##  6     6       244.     95.0        41.3     21.1             137620
##  7     7       236.     96.3        39.1     21.4             134750
##  8     8       231.     79.2        38.0     18.0             136675
##  9     9       182.     72.5        29.6     15.2             134040
## 10    10       180.     75.0        29.1     15.1             133480
## 11    11       157.     55.5        24.8     11.2             134305
## 12    12       169.     60.7        27.1     12.6             133400
## # ℹ 1 more variable: sd_effectiveness <dbl>

-Beaumont ha la variabilità più alta nelle vendite.

-Wichita Falls ha il prezzo mediano più basso.

-Le vendite sono più alte in estate, con un picco in luglio.

8. Creazione di visualizzazioni con ggplot2

<< Utilizza ggplot2 per creare grafici personalizzati. Assicurati di esplorare: - Boxplot per confrontare la distribuzione del prezzo mediano tra le città. - Grafici a barre per confrontare il totale delle vendite per mese e città. - Line charts per confrontare l’andamento delle vendite in periodi storici differenti.>>

#boxplot per la distribuzione del prezzo mediano tra le città
ggplot(data) +
  geom_boxplot(aes(x = city, 
                   y = median_price), 
               fill = "#69b3a2",
               color = "black") +
  labs(title = "Prezzo mediano per Città",
       x = "Città",
       y = "Prezzo mediano")

#grafico a barre sovrapposte per il totale di vendite per città
ggplot(data) +
  geom_col(aes(x = date,    
               y = sales,
               fill = city),
           color = "black") +
  theme_minimal() +
  labs(title = "Vendite per Mese e per Città",
       x = "Data",
       y = "Numero di Vendite") +
  scale_x_date(date_breaks = "3 months", date_labels = "%b %Y") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

#Line charts per confrontare l’andamento delle vendite in periodi storici differenti
ggplot(data)+
  geom_line(aes(x = date, 
                y = sales, 
                group = city, 
                color = city)) +
  labs(title = "Andamento delle Vendite nel Tempo per Città", 
       x = "Data", y = "Numero di Vendite") +
  theme_minimal() +
  scale_x_date(date_breaks = "3 month", date_labels = "%b %Y") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Ho usato un boxplot per confrontare i prezzi mediani nelle città. Il risultato mostra una grande variabilità tra le città, suggerendo mercati immobiliari molto diversi tra loro. L’andamento delle vendite nel tempo con un grafico a linee mostra stagionalità, con picchi nei mesi estivi e un calo invernale.

9. Conclusioni

L’analisi del mercato immobiliare in Texas ha portato a diverse osservazioni:

  1. Tendenze stagionali: le vendite sono più alte nei mesi estivi, suggerendo che le strategie di marketing dovrebbero concentrarsi su quel periodo.

  2. Differenze tra città: alcune città come Beaumont mostrano variazioni significative nelle vendite nel tempo, mentre altre come Wichita Falls hanno prezzi più stabili, ma più bassi.

  3. Efficacia degli annunci: Il tasso di conversione degli annunci varia tra le città. Potrebbe essere utile analizzare quali strategie portano a un miglior tasso di vendita.

Raccomandazioni

Srategie stagionali: Maggiori investimenti pubblicitari nei mesi di alta vendita. Focalizzazione sulle città in crescita: Beaumont e Tyler potrebbero offrire opportunità interessanti. Ottimizzazione degli annunci: Approfondire quali tipi di inserzioni generano più conversioni.

Questi insight permettono a Texas Realty Insights di ottimizzare la propria strategia di mercato e migliorare le performance di vendita.