## ============================================================================
##  DATA ANALYSIS — Lezione 1
##  Dati, popolazioni e tipi di variabili
## ============================================================================

# 1. CARICARE E ISPEZIONARE UN DATASET ----

library(insuranceData)
data("AutoBi")

str(AutoBi)        # struttura: tipo di ogni variabile
head(AutoBi)       # prime 6 righe
head(AutoBi, 10)   # prime 10 righe
summary(AutoBi)    # statistiche di sintesi (adattive al tipo)

# Accesso a una colonna
AutoBi$LOSS
AutoBi[, "LOSS"]   # equivalente

# Numero di righe e colonne
nrow(AutoBi)
ncol(AutoBi)
dim(AutoBi)


# 2. TIPI DI VARIABILI ----

# AutoBi contiene variabili di tipo diverso:
#  ATTORNEY, CLMSEX, MARITAL, CLMINSUR, SEATBELT → qualitative (ma codificate come int)
#  CLMAGE → quantitativa discreta
#  LOSS   → quantitativa continua

# Verificare il tipo di una colonna
class(AutoBi$LOSS)
class(AutoBi$ATTORNEY)
is.numeric(AutoBi$ATTORNEY)   # TRUE, ma è concettualmente qualitativa
is.factor(AutoBi$ATTORNEY)    # FALSE → occorre trasformarla

# MAtrici dei dati e data frame
neo <- read.csv("neonati.csv", sep = ";", header = TRUE)
head(neo)
str(neo)

# 3. TRASFORMARE IN FATTORE ----

# factor() converte in fattore; i NA rimangono NA
AutoBi$ATTORNEY <- factor(AutoBi$ATTORNEY)
levels(AutoBi$ATTORNEY)                          # livelli attuali: "1" "2"
levels(AutoBi$ATTORNEY) <- c("yes", "no")        # rinomina i livelli
str(AutoBi$ATTORNEY)
summary(AutoBi$ATTORNEY)

# Stesso schema per CLMSEX
AutoBi$CLMSEX <- factor(AutoBi$CLMSEX)
levels(AutoBi$CLMSEX) <- c("M", "F")

# Stesso schema per MARITAL (4 modalità)
AutoBi$MARITAL <- factor(AutoBi$MARITAL)
levels(AutoBi$MARITAL)                                          # "1" "2" "3" "4"
levels(AutoBi$MARITAL) <- c("married", "single",
                             "widowed", "divorced")
str(AutoBi$MARITAL)
nlevels(AutoBi$MARITAL)   # numero di livelli


# 4. ACCORPARE CATEGORIE ----

# Assegnando la stessa etichetta a due livelli, essi vengono accorpati
levels(AutoBi$MARITAL) <- c("married", "single",
                             "previouslymarried", "previouslymarried")
levels(AutoBi$MARITAL)
table(AutoBi$MARITAL)    # ora ci sono 3 livelli


# 5. CLASSI DI VALORI: cut() ----

# cut() converte una variabile numerica in un fattore ordinato
# Notazione (a, b]: aperto a sinistra, chiuso a destra

range(AutoBi$CLMAGE, na.rm = TRUE)    # range prima di scegliere i breaks

# 5a. Classi di uguale ampiezza (R sceglie gli estremi)
CLMAGEclass <- cut(AutoBi$CLMAGE, breaks = 6)
levels(CLMAGEclass)
table(CLMAGEclass)

# 5b. Classi di ampiezza personalizzata
CLMAGEclass <- cut(AutoBi$CLMAGE,
                   breaks = c(-1, 15, 24, 36, 50, 95))
levels(CLMAGEclass)
table(CLMAGEclass)

# Attenzione: valori fuori dagli estremi → NA
sum(is.na(CLMAGEclass))

# include.lowest = TRUE: include il valore minimo nella prima classe
cut(AutoBi$CLMAGE, breaks = c(0, 15, 24, 36, 50, 95),
    include.lowest = TRUE)

# Si può usare Inf/-Inf per includere tutti i valori
cut(AutoBi$CLMAGE, breaks = c(-Inf, 15, 36, Inf))

# 5c. Classi ai quartili
LOSSclass_q <- cut(AutoBi$LOSS,
                   breaks = quantile(AutoBi$LOSS),
                   include.lowest = TRUE)
table(LOSSclass_q)   # ~stesso numero di osservazioni per classe


# 6. DATASET Cars93 ----

library(MASS)
data("Cars93")
str(Cars93)
?Cars93    # descrizione delle variabili


# ESERCIZI ----

## Esercizio 1 ─ Classificazione variabili
# Classifica le seguenti variabili di Cars93:
# Type, Price, MPG.city, Cylinders, Origin, AirBags

str(Cars93[, c("Type","Price","MPG.city","Cylinders","Origin","AirBags")])

# Type      qualitativa nominale 
# Price     quantitativa continua
# MPG.city  quantitativa discreta
# Cylinders quantitativa discreta
# Origin    qualitativa sconnessa 
# AirBags   qualitativa ordinale 


## Esercizio 2 ─ Fattori e ricodifica
# Trasforma CLMINSUR e SEATBELT in fattori con etichette leggibili
# (dalla documentazione: 1 = sì, 2 = no per entrambe)

AutoBi$CLMINSUR <- factor(AutoBi$CLMINSUR)
levels(AutoBi$CLMINSUR) <- c("yes", "no")

AutoBi$SEATBELT <- factor(AutoBi$SEATBELT)
levels(AutoBi$SEATBELT) <- c("yes", "no")

str(AutoBi[, c("CLMINSUR","SEATBELT")])


## Esercizio 3 ─ Classi di valori
# Crea una variabile LOSSclass_q usando i quartili di LOSS come breaks

AutoBi$LOSSclass_q <- cut(AutoBi$LOSS,
                          breaks = quantile(AutoBi$LOSS),
                          include.lowest = TRUE)
table(AutoBi$LOSSclass_q)
levels(AutoBi$LOSSclass_q)


## Esercizio 4
# Un codice postale (es. 34121) è qualitativo o quantitativo?

# Cosa succede se un valore cade fuori dai breaks di cut()?
x <- c(1, 5, 10, 15, 100)
cut(x, breaks = c(0, 5, 10, 20))
