options(repos = c(CRAN = "https://cloud.r-project.org/"))
install.packages("dplyr")
## 
## The downloaded binary packages are in
##  /var/folders/k2/891pwnls4rz4rj0_1gk71nww0000gn/T//Rtmp5gSBf1/downloaded_packages
# Carico il dataset
tx <- read.csv("/Users/filomena/Desktop/1 esercizio con r/Texax.csv")

# 1. Analisi delle variabili

str(tx)  # Controlla la struttura del dataset
## '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 ...
names(tx)  # Visualizza i nomi delle colonne
## [1] "city"             "year"             "month"            "sales"           
## [5] "volume"           "median_price"     "listings"         "months_inventory"
#city:categorica nominale.

#median_price :variabile quantitativa continua=> posso calcolare:#Media/ Mediana/Moda

#volume: variabile quantitativa continua => assumono valore infinito,ci aiutano a comprednere la distribuzione, la variabilità

# month -year: variabile categorica ordinale.

#listings:variabile quantitativa discreta





#punto 2.1  indice di posizione 

# Funzione per calcolare media, mediana, e moda
calcola_indici <- function(x) {
  media <- mean(x, na.rm = TRUE)
  mediana <- median(x, na.rm = TRUE)
  moda <- as.numeric(names(sort(table(x), decreasing = TRUE)[1]))  # Calcolo della moda
  return(list(media = media, mediana = mediana, moda = moda))
}

# Variabili numeriche da analizzare
variabili_numeriche <- c("sales", "volume", "median_price", "listings")

# Inizializziamo una lista per salvare i risultati
risultati_indici <- list()

# Calcoliamo gli indici per ogni variabile numerica
for (var in variabili_numeriche) {
  risultati_indici[[var]] <- calcola_indici(tx[[var]])
}

# Stampa dei risultati per ogni variabile
print(risultati_indici)
## $sales
## $sales$media
## [1] 192.2917
## 
## $sales$mediana
## [1] 175.5
## 
## $sales$moda
## [1] 124
## 
## 
## $volume
## $volume$media
## [1] 31.00519
## 
## $volume$mediana
## [1] 27.0625
## 
## $volume$moda
## [1] 14.003
## 
## 
## $median_price
## $median_price$media
## [1] 132665.4
## 
## $median_price$mediana
## [1] 134500
## 
## $median_price$moda
## [1] 130000
## 
## 
## $listings
## $listings$media
## [1] 1738.021
## 
## $listings$mediana
## [1] 1618.5
## 
## $listings$moda
## [1] 1581
# Commento sulla scelta delle statistiche
cat("Commento sulla scelta delle statistiche:\n")
## Commento sulla scelta delle statistiche:
cat("1. Media: La media è utile per avere un'idea generale del valore centrale di un dataset. Tuttavia, può essere influenzata da valori estremi (outliers).\n")
## 1. Media: La media è utile per avere un'idea generale del valore centrale di un dataset. Tuttavia, può essere influenzata da valori estremi (outliers).
cat("2. Mediana: La mediana rappresenta il valore centrale che divide il dataset in due parti uguali, rendendola più robusta rispetto agli outliers. È particolarmente utile quando i dati non seguono una distribuzione normale.\n")
## 2. Mediana: La mediana rappresenta il valore centrale che divide il dataset in due parti uguali, rendendola più robusta rispetto agli outliers. È particolarmente utile quando i dati non seguono una distribuzione normale.
cat("3. Moda: La moda indica il valore più frequente in un dataset. È importante in contesti dove è utile sapere quali valori sono più comuni, come nel caso di vendite o prezzi.\n")
## 3. Moda: La moda indica il valore più frequente in un dataset. È importante in contesti dove è utile sapere quali valori sono più comuni, come nel caso di vendite o prezzi.
cat("Ho scelto di calcolare solo queste tre statistiche per ottenere una comprensione rapida e chiara della distribuzione dei dati, in particolare nei contesti delle vendite e dei prezzi, dove il valore centrale e la frequenza dei dati possono fornire informazioni preziose per l'analisi delle tendenze.\n")
## Ho scelto di calcolare solo queste tre statistiche per ottenere una comprensione rapida e chiara della distribuzione dei dati, in particolare nei contesti delle vendite e dei prezzi, dove il valore centrale e la frequenza dei dati possono fornire informazioni preziose per l'analisi delle tendenze.
#punto 2.2 indice di variabiltà

# Funzione per calcolare devianza standard e varianza
calcola_variabilita <- function(x) {
  dev_standard <- sd(x, na.rm = TRUE)  # Calcolo della deviazione standard
  varianza <- var(x, na.rm = TRUE)      # Calcolo della varianza
  return(list(dev_standard = dev_standard, varianza = varianza))
}

# Variabili numeriche da analizzare
variabili_numeriche <- c("sales", "volume", "median_price", "listings")

# Inizializziamo una lista per salvare i risultati
risultati_variabilita <- list()

# Calcoliamo gli indici di variabilità per ogni variabile
for (var in variabili_numeriche) {
  risultati_variabilita[[var]] <- calcola_variabilita(tx[[var]])
}

# Stampa dei risultati per ogni variabile
print(risultati_variabilita)
## $sales
## $sales$dev_standard
## [1] 79.65111
## 
## $sales$varianza
## [1] 6344.3
## 
## 
## $volume
## $volume$dev_standard
## [1] 16.65145
## 
## $volume$varianza
## [1] 277.2707
## 
## 
## $median_price
## $median_price$dev_standard
## [1] 22662.15
## 
## $median_price$varianza
## [1] 513572983
## 
## 
## $listings
## $listings$dev_standard
## [1] 752.7078
## 
## $listings$varianza
## [1] 566569
# Commento sulla scelta delle variabili
cat("Commento sulla scelta delle variabili:\n")
## Commento sulla scelta delle variabili:
cat("Ho scelto di calcolare gli indici di variabilità per le seguenti variabili:\n")
## Ho scelto di calcolare gli indici di variabilità per le seguenti variabili:
cat("1. Sales: Questo dato rappresenta il numero di vendite effettuate e ci aiuta a comprendere quanto le vendite possono variare nel tempo. Un'alta variabilità nelle vendite può indicare fluttuazioni stagionali o influenze di mercato.\n")
## 1. Sales: Questo dato rappresenta il numero di vendite effettuate e ci aiuta a comprendere quanto le vendite possono variare nel tempo. Un'alta variabilità nelle vendite può indicare fluttuazioni stagionali o influenze di mercato.
cat("2. Volume: Rappresenta il volume totale delle vendite e la sua variabilità è importante per analizzare l'andamento del mercato. Un volume molto variabile può segnalare cambiamenti significativi nella domanda o nell'offerta.\n")
## 2. Volume: Rappresenta il volume totale delle vendite e la sua variabilità è importante per analizzare l'andamento del mercato. Un volume molto variabile può segnalare cambiamenti significativi nella domanda o nell'offerta.
cat("3. Median Price: Indica il prezzo mediano delle proprietà e la sua variabilità è cruciale per comprendere l'andamento del mercato immobiliare. Prezzi variabili possono riflettere cambiamenti nel valore delle proprietà in diverse aree.\n")
## 3. Median Price: Indica il prezzo mediano delle proprietà e la sua variabilità è cruciale per comprendere l'andamento del mercato immobiliare. Prezzi variabili possono riflettere cambiamenti nel valore delle proprietà in diverse aree.
cat("4. Listings: Rappresenta il numero di annunci di vendita e la sua variabilità è importante per capire la disponibilità delle proprietà. Una grande variabilità può indicare condizioni di mercato dinamiche, come un eccesso o una scarsità di offerta.\n")
## 4. Listings: Rappresenta il numero di annunci di vendita e la sua variabilità è importante per capire la disponibilità delle proprietà. Una grande variabilità può indicare condizioni di mercato dinamiche, come un eccesso o una scarsità di offerta.
cat("Queste variabili sono state selezionate perché forniscono una panoramica delle dinamiche di vendita e del mercato immobiliare, e la loro variabilità offre informazioni preziose per prendere decisioni informate.\n")
## Queste variabili sono state selezionate perché forniscono una panoramica delle dinamiche di vendita e del mercato immobiliare, e la loro variabilità offre informazioni preziose per prendere decisioni informate.
#puto 2.3 forma 

# Funzione per calcolare curtosi e asimmetria
calcola_forma <- function(x) {
  n <- sum(!is.na(x))  # Conta solo i valori non NA
  media <- mean(x, na.rm = TRUE)
  dev_standard <- sd(x, na.rm = TRUE)
  
  # Calcolo della curtosi
  curtosi <- (n * (n + 1) / ((n - 1) * (n - 2) * (n - 3))) * 
    sum(((x - media) / dev_standard)^4, na.rm = TRUE) - 
    (3 * (n - 1)^2) / ((n - 2) * (n - 3))
  
  # Calcolo dell'asimmetria
  asimmetria <- (n / ((n - 1) * (n - 2))) * 
    sum(((x - media) / dev_standard)^3, na.rm = TRUE)
  
  return(list(curtosi = curtosi, asimmetria = asimmetria))
}

# Variabili numeriche da analizzare
variabili_numeriche <- c("sales", "volume", "median_price", "listings")

# Inizializziamo una lista per salvare i risultati
risultati_forma <- list()

# Calcoliamo gli indici di forma per ogni variabile
for (var in variabili_numeriche) {
  risultati_forma[[var]] <- calcola_forma(tx[[var]])
}

# Stampa dei risultati per ogni variabile
print(risultati_forma)
## $sales
## $sales$curtosi
## [1] -0.2943773
## 
## $sales$asimmetria
## [1] 0.7226283
## 
## 
## $volume
## $volume$curtosi
## [1] 0.2061531
## 
## $volume$asimmetria
## [1] 0.8903162
## 
## 
## $median_price
## $median_price$curtosi
## [1] -0.6107148
## 
## $median_price$asimmetria
## [1] -0.3668497
## 
## 
## $listings
## $listings$curtosi
## [1] -0.7831137
## 
## $listings$asimmetria
## [1] 0.6535903
# Commento sulla scelta delle variabili
cat("Commento sulla scelta delle variabili:\n")
## Commento sulla scelta delle variabili:
cat("Ho scelto di calcolare curtosi e asimmetria per analizzare la forma della distribuzione delle seguenti variabili:\n")
## Ho scelto di calcolare curtosi e asimmetria per analizzare la forma della distribuzione delle seguenti variabili:
cat("1. Sales: Importante per identificare picchi e fluttuazioni nelle vendite.\n")
## 1. Sales: Importante per identificare picchi e fluttuazioni nelle vendite.
cat("2. Volume: Rilevante per capire l'attività di mercato.\n")
## 2. Volume: Rilevante per capire l'attività di mercato.
cat("3. Median Price: Essenziale per comprendere le dinamiche dei prezzi immobiliari.\n")
## 3. Median Price: Essenziale per comprendere le dinamiche dei prezzi immobiliari.
cat("4. Listings: Utile per analizzare la disponibilità di proprietà nel mercato.\n")
## 4. Listings: Utile per analizzare la disponibilità di proprietà nel mercato.
#punto 3.4 distribuzioni di frequenze 

# Funzione per calcolare la distribuzione di frequenza
calcola_frequenza <- function(x, breaks) {
  freq_table <- table(cut(x, breaks, include.lowest = TRUE))  # Tabella di frequenza
  return(freq_table)
}

# Numero di intervalli (breaks) da utilizzare per la distribuzione
breaks_sales <- seq(0, max(tx$sales, na.rm = TRUE), by = 50)
breaks_volume <- seq(0, max(tx$volume, na.rm = TRUE), by = 5)
breaks_median_price <- seq(0, max(tx$median_price, na.rm = TRUE), by = 10000)
breaks_listings <- seq(0, max(tx$listings, na.rm = TRUE), by = 100)

# Calcoliamo la distribuzione di frequenza per ogni variabile
frequenze <- list(
  Sales = calcola_frequenza(tx$sales, breaks_sales),
  Volume = calcola_frequenza(tx$volume, breaks_volume),
  Median_Price = calcola_frequenza(tx$median_price, breaks_median_price),
  Listings = calcola_frequenza(tx$listings, breaks_listings)
)

# Stampa dei risultati della distribuzione di frequenza
print(frequenze)
## $Sales
## 
##    [0,50]  (50,100] (100,150] (150,200] (200,250] (250,300] (300,350] (350,400] 
##         0        21        72        56        32        34        13         9 
## 
## $Volume
## 
##   [0,5]  (5,10] (10,15] (15,20] (20,25] (25,30] (30,35] (35,40] (40,45] (45,50] 
##       0       9      32      37      26      30      25      18      14      13 
## (50,55] (55,60] (60,65] (65,70] (70,75] (75,80] 
##      13       4       7       6       2       2 
## 
## $Median_Price
## 
##         [0,1e+04]     (1e+04,2e+04]     (2e+04,3e+04]     (3e+04,4e+04] 
##                 0                 0                 0                 0 
##     (4e+04,5e+04]     (5e+04,6e+04]     (6e+04,7e+04]     (7e+04,8e+04] 
##                 0                 0                 0                 1 
##     (8e+04,9e+04]     (9e+04,1e+05]   (1e+05,1.1e+05] (1.1e+05,1.2e+05] 
##                10                15                23                17 
## (1.2e+05,1.3e+05] (1.3e+05,1.4e+05] (1.4e+05,1.5e+05] (1.5e+05,1.6e+05] 
##                29                46                39                39 
## (1.6e+05,1.7e+05] (1.7e+05,1.8e+05] 
##                15                 6 
## 
## $Listings
## 
##           [0,100]         (100,200]         (200,300]         (300,400] 
##                 0                 0                 0                 0 
##         (400,500]         (500,600]         (600,700]         (700,800] 
##                 0                 0                 0                 5 
##         (800,900]       (900,1e+03]   (1e+03,1.1e+03] (1.1e+03,1.2e+03] 
##                20                29                13                 4 
## (1.2e+03,1.3e+03] (1.3e+03,1.4e+03] (1.4e+03,1.5e+03] (1.5e+03,1.6e+03] 
##                 6                 3                13                24 
## (1.6e+03,1.7e+03] (1.7e+03,1.8e+03] (1.8e+03,1.9e+03]   (1.9e+03,2e+03] 
##                30                21                11                 1 
##   (2e+03,2.1e+03] (2.1e+03,2.2e+03] (2.2e+03,2.3e+03] (2.3e+03,2.4e+03] 
##                 0                 0                 1                 0 
## (2.4e+03,2.5e+03] (2.5e+03,2.6e+03] (2.6e+03,2.7e+03] (2.7e+03,2.8e+03] 
##                 2                 0                 7                10 
## (2.8e+03,2.9e+03]   (2.9e+03,3e+03]   (3e+03,3.1e+03] (3.1e+03,3.2e+03] 
##                11                10                 7                 4
# Identificazione della variabile con maggiore variabilità

variabilita <- sapply(variabili_numeriche, function(var) sd(tx[[var]], na.rm = TRUE))

variabile_magg_variabilita <- variabili_numeriche[which.max(variabilita)]
variabile_magg_variabilita
## [1] "median_price"
#creare classi per una variabile quantitativa : prendiamo sales :) 

# Definiamo i breaks con un intervallo più ampio che copra l'intera gamma di 'sales'
breaks_sales <- seq(0, max(tx$sales, na.rm = TRUE) + 50, by = 50)  # Aggiungi un margine al massimo

# Creiamo l'istogramma per 'sales' utilizzando i breaks corretti
hist(tx$sales, breaks = breaks_sales, main = "Distribuzione di Frequenza di Sales",
     xlab = "Numero di Vendite", ylab = "Frequenza", col = "blue", border = "yellow")

#3. Rappresentazione Grafica della Distribuzione di "sales"

# Creiamo l'istogramma per sales
hist(tx$sales, breaks = breaks_sales, main = "Distribuzione di Frequenza di Sales",
     xlab = "Numero di Vendite", ylab = "Frequenza", col = "blue", border = "yellow")


#Calcolo dell'Indice di Gini per "sales"

# Calcoliamo l'indice di Gini per sales

calcola_gini <- function(x) {
  # Rimuovi i valori NA
  x <- x[!is.na(x)]
  
  # Ordina i valori
  x <- sort(x)
  
  # Calcola la lunghezza di x
  n <- length(x)
  
  # Se la lunghezza di x è minore di 2, l'indice di Gini non ha senso
  if (n < 2) return(NA)
  
  # Calcola il numeratore e il denominatore dell'indice di Gini
  numeratore <- 2 * sum((1:n) * x)
  denominatore <- n * sum(x)
  
  # Indice di Gini
  gini <- (numeratore / denominatore) - (n + 1) / n
  
  return(gini)
}


#ok


#calcolo della probabilità

#città "Beaumont

# Numero totale di osservazioni
n_totale <- nrow(tx)

# Numero di righe con "Beaumont"
n_beaumont <- sum(tx$city == "Beaumont", na.rm = TRUE)

# Probabilità di selezionare una riga con "Beaumont"
p_beaumont <- n_beaumont / n_totale

cat("La probabilità che una riga a caso riporti la città Beaumont è:", p_beaumont, "\n")
## La probabilità che una riga a caso riporti la città Beaumont è: 0.25
#mese di luglio 

# Numero di righe con mese = luglio (7)
n_luglio <- sum(tx$month == 7, na.rm = TRUE)

# Probabilità di selezionare una riga con luglio
p_luglio <- n_luglio / n_totale

cat("La probabilità che una riga a caso riporti il mese di luglio è:", p_luglio, "\n")
## La probabilità che una riga a caso riporti il mese di luglio è: 0.08333333
#dicembre del 2012

# Numero di righe con dicembre del 2012
n_dicembre_2012 <- sum(tx$month == 12 & tx$year == 2012, na.rm = TRUE)

# Probabilità di selezionare una riga con luglio
p_dicembre_2012 <- n_dicembre_2012 / n_totale

p_dicembre_2012
## [1] 0.01666667
#ok


#creazioni delle variabili 
# Evitiamo la divisione per zero
tx$prezzo_medio <- ifelse(tx$sales > 0, tx$volume / tx$sales, NA)

# Visualizziamo i primi risultati per verificare
head(tx[, c("volume", "sales", "prezzo_medio")])
##   volume sales prezzo_medio
## 1 14.162    83    0.1706265
## 2 17.690   108    0.1637963
## 3 28.701   182    0.1576978
## 4 26.819   200    0.1340950
## 5 28.833   202    0.1427376
## 6 27.219   189    0.1440159
# misuriamo lefficacia degli annunci di vendite 

# Evitiamo la divisione per zero
tx$efficacia_annunci <- ifelse(tx$listings > 0, (tx$sales / tx$listings) * 100, NA)

# Visualizziamo i primi risultati per verificare
head(tx[, c("sales", "listings", "efficacia_annunci")])
##   sales listings efficacia_annunci
## 1    83     1533          5.414220
## 2   108     1586          6.809584
## 3   182     1689         10.775607
## 4   200     1708         11.709602
## 5   202     1771         11.405985
## 6   189     1803         10.482529
#Interpretazioneosservo che: il prezzo medio varia in base al volume e al numero di vendite.Se il prezzo medio è in calo mentre il volume delle vendite aumenta, potrebbe indicare una strategia di prezzo aggressiva per stimolare le vendite.


#Interpretazione:L'efficacia degli annunci fornisce un'indicazione di quanto ogni annuncio stia contribuendo alle vendite. Valori più alti indicano che ci sono più vendite per ogni annuncio, suggerendo una maggiore efficacia.

#in buona sostanza : L'analisi del prezzo medio degli immobili e dell'efficacia degli annunci offre importanti informazioni sul mercato immobiliare. Queste variabili aiutano a comprendere l'impatto delle strategie di vendita e dei prezzi, fornendo indicazioni utili per ottimizzare le decisioni strategiche e migliorare le performance di vendita.


#7 analisi condizionata 
install.packages("dplyr")
## 
## The downloaded binary packages are in
##  /var/folders/k2/891pwnls4rz4rj0_1gk71nww0000gn/T//Rtmp5gSBf1/downloaded_packages
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
# Raggruppamento per città, anno e mese e calcolo della media e deviazione standard per sales e volume
summary_stats <- tx %>%
  group_by(city, year, 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)
  )
## `summarise()` has grouped output by 'city', 'year'. You can override using the
## `.groups` argument.
#visualizzo i grafici 

install.packages("ggplot2")
## 
## The downloaded binary packages are in
##  /var/folders/k2/891pwnls4rz4rj0_1gk71nww0000gn/T//Rtmp5gSBf1/downloaded_packages
library(ggplot2)

# Grafico della media delle vendite per città
ggplot(summary_stats, aes(x = city, y = mean_sales, fill = city)) +
  geom_bar(stat = "identity") +
  labs(title = "Media delle Vendite per Città", x = "Città", y = "Media delle Vendite") +
  theme_minimal()

# Grafico della deviazione standard delle vendite per città
library(ggplot2)

# Grafico a barre con barre di errore per la deviazione standard delle vendite
ggplot(summary_stats, aes(x = city, y = mean_sales, fill = city)) +
  geom_bar(stat = "identity", position = "dodge", width = 0.7) +
  geom_errorbar(aes(ymin = mean_sales - sd_sales, ymax = mean_sales + sd_sales),
                width = 0.2, position = position_dodge(0.7)) +
  labs(title = "Media delle Vendite con Deviazione Standard per Città", 
       x = "Città", 
       y = "Media delle Vendite") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

#ok

#punto 8-creazione boxplot

#1. Boxplot per la distribuzione del prezzo mediano tra le città:

library(ggplot2)

# Boxplot per la distribuzione del prezzo mediano tra le città
ggplot(tx, aes(x = city, y = median_price, fill = city)) +
  geom_boxplot() +
  labs(title = "Distribuzione del Prezzo Mediano tra le Città", 
       x = "Città", 
       y = "Prezzo Mediano") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

#2. Grafico a barre per il totale delle vendite per mese e città:


# Raggruppare i dati per città e mese e sommare le vendite
sales_by_city_month <- tx %>%
  group_by(city, month) %>%
  summarise(total_sales = sum(sales, na.rm = TRUE))
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
# Grafico a barre per il totale delle vendite per mese e città
ggplot(sales_by_city_month, 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_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

#Line chart per confrontare l'andamento delle vendite in periodi storici differenti:

# Filtra i dati per i periodi storici che vuoi confrontare (es. 2010 e 2020)
sales_over_time <- tx %>%
  filter(year %in% c(2010, 2020)) %>%  # Sostituisci con gli anni desiderati
  group_by(year, month) %>%
  summarise(total_sales = sum(sales, na.rm = TRUE))
## `summarise()` has grouped output by 'year'. You can override using the
## `.groups` argument.
# Line chart per confrontare l'andamento delle vendite in anni differenti
ggplot(sales_over_time, aes(x = month, y = total_sales, color = factor(year), group = year)) +
  geom_line(size = 1.2) +
  geom_point(size = 3) +
  labs(title = "Andamento delle Vendite in Periodi Storici Differenti",
       x = "Mese",
       y = "Totale Vendite",
       color = "Anno") +
  theme_minimal()
## 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.