PROVA INTERCORSO
1. Importare il dataset clienti_na.txt (NB il separatore è un punto e virgola).
# Carico la libreria tidyverse poichè è una libreria ricca di funzioni interessanti tra cui quella utile per caricare il dataset
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.0 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.1 ✔ tibble 3.2.0
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
# Carico la libreria ggplot2 per avere a portata di mano le funzioni relative ai grafici
library(ggplot2)
# Uso la funzione read.table per caricare il dataset clienti_na poichè è un dataset in formato .txt.
# NOTA BENE: il file contenente il dataset clienti_na.txt deve stare nella stessa cartella dove si sta svolgendo l'esercizio in R.
# read.table = Prende tre parametri: Nome del file dataset("clienti_na.txt"), impostazione del header = TRUE cioè la prima riga del file dataset clienti_na.txt contiene i nomi delle variabile( le colonne del dataset), il terzo parametro è il separatore dei dati usato nel file dataset clienti_na, in questo caso come citato dalla traccia i dati sono separati da un punto e virgola.
clienti_na <- read.table("clienti_na.txt",header=T,sep=";")
# La libreria tidyverse usa strutture dati chiamate tibble appartenenti ad un ononima classe tbl_dfl. Il dataset clienti_na cosi come non è una struttura dati di tipo tibble, quindi usiamo una funzione atta alla conversione del dataset in formato tibble. Tutto questo perchè vogliamo che il dataset clienti_na sia il più funzionale possibile con la libreria tidyverse.
clienti_na <- as_tibble(clienti_na)
2. Verificare che la natura delle variabili importate sia stata identificata correttamente. Eventualmente, trasformare nel formato opportuno le variabili.
# Visualizziamo il dataset clienti_na con la funzione glimpse cosi da verificare se il tipo delle variabili è corretto.
glimpse(clienti_na)
## Rows: 8,052
## Columns: 21
## $ clienteattivo <int> 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1,…
## $ mesicliente <int> 12, 5, 12, 12, 12, 12, 12, 12, 12, 6, 12,…
## $ mesi_dalla_prima_attivazione <int> 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1…
## $ n_utenze <int> 2, 2, 1, 4, 1, 1, 1, 3, 1, 2, 1, 1, 1, 3,…
## $ n_utenze_attive <int> 2, 0, 1, 1, 1, 1, 1, 3, 1, 0, 1, 1, 1, 3,…
## $ serviziattivaticliente <chr> "GA", "EG", "E", "EGAM", "E", "E", "M", "…
## $ serviziattivi <chr> "GA", "noservizi", "E", "A", "E", "E", "M…
## $ fattmedia <dbl> 141.48250, 170.26000, 54.79300, 140.27800…
## $ statoamministrativo <chr> "MOROSO", "REGOLARE", "MOROSO", "REGOLARE…
## $ ageingticketultimoreclamo <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ areanielsencliente <chr> "Nord O", "Centro", "Centro", "Sud", "Cen…
## $ sessoreferente <chr> "F", "M", "F", "M", "F", "F", "F", "M", "…
## $ etareferente <int> 42, 39, 40, 29, 97, 62, 23, 62, 39, 75, 5…
## $ canalemodale <chr> "Retediretta", "ReteIndiretta", "ReteIndi…
## $ ultimamodalita <chr> "BP", "BP", "BP", "BP", "BP", "SDD", "BP"…
## $ proxy_churn_strong <int> 2, 2, 0, 6, 0, 1, 1, 4, 0, 2, 1, 0, 0, 0,…
## $ bu_co <chr> "CONSUMER", "BUSINESS", "CONSUMER", "CONS…
## $ reclami <int> 0, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0,…
## $ casi_credito <int> 22, 3, 6, 4, 5, 0, 0, 0, 0, 9, 8, 1, 0, 0…
## $ casi_fattura <int> 4, 1, 3, 5, 2, 0, 4, 0, 0, 4, 0, 4, 0, 7,…
## $ tiposped <chr> "Elettronica", "Elettronica", "Cartacea",…
# Il tipo delle variabili importate è stato identificato correttamente.
3. Creare una nuova variabile categoriale (nome: n_utenze_cat) che abbia i seguenti livelli: mono utenza, 2-4 utenze, più di 4 utenze a partire dalla variabile n_utenze. Assicurarsi che la nuova variabile sia del giusto data type.
# Creo un nuovo dataset chiamato clienti_na2 che è la copia del dataset clienti_na, cosi da avere un dataset clienti_na2 con la nuova colonna n_utenze_cat e mantenere un dataset non modificato cioè clienti_na. Concateno l'operazione con una pipeline %>%, dopo uso una mutate per creare una nuova colonna. La nuova colonna si chiamerà n_utenze_cat. Uso case_when per raggruppare in tre gruppi i dati contenuti nella variabile n_utenze: Mono-Utenza, 2-4 Utenze e Più di 4 Utenze. Dopodichè uso una pipeline e richiamo una per modificare la colonna n_utenze_cat. Infatti trasformiamo con la funzione factor il tipo della variabile n_utenze cat in un ordered factor.
clienti_na2 <- clienti_na %>%
mutate(n_utenze_cat = case_when(n_utenze == 1 ~ "Mono-Utenza", n_utenze >= 2 & n_utenze <= 4 ~ "2-4 Utenze", n_utenze > 4 ~ "Più di 4 Utenze")) %>%
mutate(n_utenze_cat = factor(n_utenze_cat,levels=c("Mono-Utenza","2-4 Utenze","Più di 4 Utenze"),ordered=T))
# Uso la funzione table per vedere il contenuto n_utenze_cat
table(clienti_na2$n_utenze_cat)
##
## Mono-Utenza 2-4 Utenze Più di 4 Utenze
## 3588 4134 330
# Uso la funzione class per verificare che la classe di n_utenze_cat sia un factor. Infatti ci troviamo con un ordered factor. Segnale Positivo.
class(clienti_na2$n_utenze_cat)
## [1] "ordered" "factor"
4. Costruire una tabella delle frequenze assolute e percentuali per la nuova variabile.
# Uso il dataset clienti_na2 poichè è il dataset contenete la variabile n_utenze_cat. Uso una pipeline e raggruppo per la variabile n_utenze_cat poichè su quest'ultima dovrò calcolare le frequenze assolute e pecentuali. Per calcolare le frequenze assolute uso una summarize, funzione atta a calcolare operazioni di vario tipo sulle variabili raggruppate da group_by. Quindi in summarize creo una colonna denominata Frequenze_Assolute e al suo interno conterrà i dati dell'operazioni data dalla funzione n(), la quale conta lr righe totali per ogni gruppo di n_utenze_cat quindi per mono-utenza, 2-4 utenze, più di 4 utenze. Infine uso la mutate per aggiungere una colonna denominata Frequenze_Percentuali. Essa sarà il risultato delle Frequenze_Assolute per ogni gruppo di n_utenze_cat diviso la somma totale delle frequenze assolute per 100. Un calcolo di esempio è: 16 n_utenze totali di cui 4 sono mono_utenze, la frequenza percentuale di mono_utenze è data da 4/16 * 100. Ovviamente quest'ultimo calcolo è solamente un esempio e non rispecchia i dati dei dataset che abbiamo nel nostro programma. Però è un semplice esempio che fa capire cosa sono le frequenze assolute (4 mono-utenze totali) e le frequenze percentuali (la frequenza percentuale di mono-utenze è data dal calcolo = 16(le utenze totali)/4(le mono-utenze toali) *100). Cosi sarà per ogni gruppo di n_utenze_cat.
clienti_na2 %>%
group_by(n_utenze_cat) %>%
summarize(Frequenze_Assolute = n()) %>%
mutate(Frequenze_Percentuali = Frequenze_Assolute/sum(Frequenze_Assolute) * 100)
## # A tibble: 3 × 3
## n_utenze_cat Frequenze_Assolute Frequenze_Percentuali
## <ord> <int> <dbl>
## 1 Mono-Utenza 3588 44.6
## 2 2-4 Utenze 4134 51.3
## 3 Più di 4 Utenze 330 4.10
5. La distribuzione delle frequenze della nuova variabile è equilibrata? Dando un’occhiata rapida alla distribuzione della variabile originaria mediante un summary(), si sarebbe potuto optare per una scelta differente nella trasformazione della variabile?
# Da una prima analisi possiamo notare come la distribuzione delle frequenze nella variabile n_utenze_cat ricada maggiormente nei due casi mono-utenza e 2-4 utenze, lasciando una piccola fetta alla casistica più di 4 utenze. Quindi sicuramente la variabile n_utenze_cat non è perfettamente equilibrata nella sua distribuzione di frequenze. Valutiamo con la funzione summary se era possibile effettuare una distribuzione delle frequenze migliore per n_utenze_cat.
# Ricordiamo che summary è una funzione che prende un dataset come parametro e restituisce una sintesi statistica di tutte le sue variabiili. La sintesi statistica che a noi interessa è quella relativa alla variabile n_utenze.
summary(clienti_na2)
## clienteattivo mesicliente mesi_dalla_prima_attivazione
## Min. :0.0000 Min. : 1.000 Min. :12
## 1st Qu.:0.0000 1st Qu.: 8.000 1st Qu.:12
## Median :1.0000 Median :12.000 Median :12
## Mean :0.6023 Mean : 9.903 Mean :12
## 3rd Qu.:1.0000 3rd Qu.:12.000 3rd Qu.:12
## Max. :1.0000 Max. :12.000 Max. :12
##
## n_utenze n_utenze_attive serviziattivaticliente serviziattivi
## Min. : 1.000 Min. : 0.000 Length:8052 Length:8052
## 1st Qu.: 1.000 1st Qu.: 0.000 Class :character Class :character
## Median : 2.000 Median : 1.000 Mode :character Mode :character
## Mean : 1.917 Mean : 1.228
## 3rd Qu.: 2.000 3rd Qu.: 2.000
## Max. :21.000 Max. :21.000
##
## fattmedia statoamministrativo ageingticketultimoreclamo
## Min. : 10.70 Length:8052 Mode:logical
## 1st Qu.: 55.03 Class :character NA's:8052
## Median : 82.88 Mode :character
## Mean : 122.39
## 3rd Qu.: 124.85
## Max. :9305.23
## NA's :50
## areanielsencliente sessoreferente etareferente canalemodale
## Length:8052 Length:8052 Min. : 22.00 Length:8052
## Class :character Class :character 1st Qu.: 41.00 Class :character
## Mode :character Mode :character Median : 51.00 Mode :character
## Mean : 52.03
## 3rd Qu.: 61.00
## Max. :121.00
## NA's :37
## ultimamodalita proxy_churn_strong bu_co reclami
## Length:8052 Min. : 0.000 Length:8052 Min. : 0.00
## Class :character 1st Qu.: 0.000 Class :character 1st Qu.: 0.00
## Mode :character Median : 1.000 Mode :character Median : 0.00
## Mean : 1.273 Mean : 0.25
## 3rd Qu.: 2.000 3rd Qu.: 0.00
## Max. :26.000 Max. :13.00
##
## casi_credito casi_fattura tiposped n_utenze_cat
## Min. : 0.000 Min. : 0.000 Length:8052 Mono-Utenza :3588
## 1st Qu.: 0.000 1st Qu.: 0.000 Class :character 2-4 Utenze :4134
## Median : 0.000 Median : 1.000 Mode :character Più di 4 Utenze: 330
## Mean : 3.179 Mean : 1.958
## 3rd Qu.: 3.000 3rd Qu.: 3.000
## Max. :62.000 Max. :36.000
##
# Dall'analisi della variabile n_utenze. Possiamo evincere un primo quartile pari a uno e un terzo quartile pari a due. Con questi dati alla mano, si poteva optare per una distribuzione delle frequenze più equilibrata per la variabile n_utenze_cat. Si potevano creare tre gruppi: Mono-Utenza dove le n_utenze erano pari a uno, 2 Utenze con le n_utenze pari a due e più di due utenze con le n_utenze maggiori di due.
6. Rappresentare graficamente la variabile per i soli clienti attivi. Bonus: aggiungere etichette e titolo adeguato.
# Prendiamo il dataset non modificato cioè senza la variabile n_utenze_cat, quindi clienti_na. Sfruttiamo una pipeline e dopo richiamimao ggplot per indicare l'ascissa del nostro grafico nella funzione aes. In questo caso l'ascissa cioè la x è pari alla variabile n_utenze_attive. Usiamo un + per indicare un operazione successiva da effettuare sul grafico, in questo caso usiamo la funzione geom_bar per indicare che vogliamo un grafico a barre. Richiamo un altro + per indicare un altra operazione da effettuare sul grafico, in questo caso usiamo la funzione labs per indicare la modificare del titolo dell'asse x, dell'asse y e del titolo del grafico.
clienti_na %>%
ggplot(aes(x=n_utenze_attive)) +
geom_bar() +
labs(x="Tipi di Utenze Attive",y="Numero di Utenze Attive",title="Grafico Utenze Attive")
7. Creare un dataset che contenga tutte le variabili eccetto: ageingticketultimoreclamo, mesi_dalla_prima_attivazione e, proxy_churn_strong. Considerare inoltre i soli clienti business oppure quelli che hanno almeno 3 utenze (variabili bu_co e n_utenze).
# Creo un nuovo dataset chiamato clienti_na3 che è la copia del dataset clienti_na, cioè il dataset originale e non modificato. Uso la funzione filter per ottenere dalla variabile bu_co, tramite un confronto di dati con l'operatore ==, solamente i clienti BUSINESS, dopo uso un operatore OR con il simbolo | per indicare che devo ottenere un dataset con clienti solamente di tipo BUSINESS oppure clienti con almeno tre utenze. In poche parole con la funzione filter e l'operatore | impongo due condizioni: la prima se il cliente è di tipo BUSINESS e la seconda è relativa se l'utente ha almeno tre utenze attive. Cosi facendo possiamo avere anche clienti di tipo CONSUMER che hanno almeno tre utenze attive. Quindi se il dato verifica una delle due condizioni, sarà inglobato nel nuovo dataset clienti_na3. Infine per eliminare le tre variabili che non ci servono, si può usare la select. La select in questo caso prende come parametri le tre variabili da eliminare e si immette un - prima del nome delle variabili per indicarne l'eliminazione dal dataset.
clienti_na3 <- clienti_na %>%
filter(bu_co=="BUSINESS" | n_utenze>=3) %>%
select(-ageingticketultimoreclamo,-mesi_dalla_prima_attivazione,-proxy_churn_strong)
8. Creare una classifica dei 3 clienti con fattura media più elevata. Quante utenze hanno?
# Prendiamo il dataset appena creato clienti_na3. Uso una pipeline e richiamo la funzione arrange. Quest'ultima è utile perchè ordina gli elementi di una colonna. Di default la funzione arrnage ordina gli elementi di una colonna in maniera crescente, se volessimo ordinarli in maniera descresente usiamo la funzione desc sulla variabile da ordinare fattmedia. Quindi cosi facendo con la combinazione di arrange e desc sulla variabile fattmedia, possiamo ottenere la colonna fattmedia ordinata in maniera descrescente e poter visualizare i clienti con un fattmedia più alto. A noi, però, interessano solamente i primi tre clienti con fattmedia più alta. Possiamo usare la funzione head per indicare il massimo numero di righe da visualizzare in questo caso 3, poichè vogliamo i 3 clienti che guadagnano di più. Infine uso una select per visualizzare solamente le due variabili fattmedia e n_utenze, quest'ultima ci serve per rispondere alla domanda quante utenze hanno i tre clienti con la fattmedia maggiore?
clienti_na3 %>%
arrange(desc(fattmedia)) %>%
head(3) %>%
select(fattmedia,n_utenze)
## # A tibble: 3 × 2
## fattmedia n_utenze
## <dbl> <int>
## 1 9305. 1
## 2 6867. 1
## 3 4339. 2
# Il primo cliente con la fattmedia maggiore ha un n_utenze pari ad uno, lo stesso vale per il secondo cliente e il terzo ha un n_utenze pari a due.
9. Rappresentare la variabile fattmedia mediante un istogramma (suggerimento: si può modificare il range di valori da visualizzare sull’asse delle x mediante xlim() per migliorare il grafico).
# Uso una variabile chaiamata istogramma per salvare il grafico, la variabile istogramma, all'inizio, sarà uguale al dataset clienti_na3, uso una pipeline e richiamo la funzione ggplot per creare un nuovo grafico. Dentro ggplot richiamo la funzione aes per indicare gli assi cartesiani del mio grafico. In questo caso x=fattmedia. Uso un + per aggiungere delle opzioni al grafico, richiamo la fuznione geom_histogram per rappresentare un grafico a istogramma. Poichè un istogramma è composto da celle, bisogna dichiarare ogni cella dell'istogramma quanto deve essere lunga. Cosi indico che il mio istogramma deve arrivare deve essere lungo fino a 10000 cosi da avere un range di valori fattmedia abbastanza lungo, poi divido in celle il mio istogramma ogni 50 unità. Indico il colore dei contorni delle celle con la funzione colour, in questo caso black per nero, uso la funzione fill per indicare il colore all'interno delle celle in questo caso blu. Uso la funzione labs per indicare i titoli dell'asse x, dell'asse y e del titolo del grafico. Come suggerito dalla traccia uso la funzione xlim per limitare l'asse delle x e avere una rappresentazione migliore dell'istogramma.
istogramma <- clienti_na3 %>%
ggplot(aes(x=fattmedia)) +
geom_histogram(breaks = seq(0, 10000, by = 50), colour = "black", fill='blue') +
labs(title= 'istogramma della variabile fattmedia', x = 'fattmedia', y = 'conteggio') +
xlim(0,1500)
# Richiamo la variabile istogramma per visualizzare il grafico
istogramma
## Warning: Removed 40 rows containing non-finite values (`stat_bin()`).
## Warning: Removed 170 rows containing missing values (`geom_bar()`).
10. Suddividere l’istogramma in due pannelli, sulla base della variabile bu_co. Descrivere la distribuzione della variabile per i due gruppi. (suggerimento: si è interessati alla forma della distribuzione, quindi, per evitare che il grafico sia influenzato dalla numerosità assoluta dei soggetti che ricadono nei due gruppi, rappresentare la densità inserendo aes(y=..density..) all’interno di geom_histogram).
istogramma + facet_wrap(~bu_co)
## Warning: Removed 40 rows containing non-finite values (`stat_bin()`).
## Warning: Removed 340 rows containing missing values (`geom_bar()`).
# Dalla seguente forma della distribuzione possiamo notare come i CONSUMER tendono ad avere un fattmedia più bassa rispetto ai clienti BUSINESS. Infatti da notare come le barre iniziali per i clienti CONSUMER siano più alte, proprio ad indicare come ci sia un maggiore flusso di clienti di quella tipologia che ha quella fattmedia. Da notare come invece andando avanti con l'analisi del grafico, possiamo vedere i clienti BUSINESS siano più numerosi per le fattmedia maggiori rispetto ai clienti CONSUMER.
11. Si ipotizza che il fatto che il cliente sia business o consumer determini in qualche misura la modalità scelta per la spedizione della fattura (variabili bu_co e tiposped). Costruire una tabella di contingenza, includendo le frequenze percentuali di colonna e i marginali (suggerimenti: la variabile indipendente va inserita in colonna; ; usare la funzione ctab() del package catspec). Che informazioni si riescono a trarre da una prima lettura della tabella?
# Carichiamo la libreria catspec con la funzione library cosi da poter usare la funzione ctab()
library(catspec)
# Prima di proseguire verifico le classi delle due variabili da analizzare con ctab. Le due variabili devono essere di tipo factor
class(clienti_na3$bu_co)
## [1] "character"
class(clienti_na3$tiposped)
## [1] "character"
# Notiamo che le due variabili sono di tipo character quindi dobbiamo convertirle in factor. Usiamo la funzione as_factor per convertirle in factor. Quindi creo un nuovo dataset chiamato clienti_na4 che sarà la copia del dataset clienti_na3. Uso una pipeline e uso la funzione mutate per rimpiazzare la colonna bu_co con quella convertita in factor. Attuo la stessa strategia con la variabile tiposped.
clienti_na4 = clienti_na3 %>%
mutate(bu_co = as_factor(clienti_na3$bu_co)) %>%
mutate(tiposped = as_factor(clienti_na3$tiposped))
# Verifico se le due variabili interessate sono diventate factor nel dataset clienti_na4
class(clienti_na4$bu_co)
## [1] "factor"
class(clienti_na4$tiposped)
## [1] "factor"
# Usiamo la funzione ctab per avere una tabella di contingent sulle variabili interessate.
ctab(clienti_na4$bu_co,clienti_na4$tiposped,style="l",type=c("n","c"), addmargins = T)
## Var2 Elettronica Cartacea Sum
## Var1
## BUSINESS Count 952.00 263.00 1215.00
## Column % 57.52 45.90 103.42
## CONSUMER Count 703.00 310.00 1013.00
## Column % 42.48 54.10 96.58
## Sum Count 1655.00 573.00 2228.00
## Column % 100.00 100.00 200.00
# Dalla tabella di contingenza si evince che la maggior parte dei clienti, quindi sia BUSINESS e CONSUMER, predilige la posta elettronica piuttosto che quella cartacea. Ovviamente bisogna stare attenti al grafico poichè esso contiene degli errori, in particolare nei marginali di riga.
12. Rappresentare graficamente la relazione tra le variabili mediante un diagramma a barre raggruppate (sceglierne un tipo a piacere).
# Uso il dataset clienti_na4. Uso una pipeline e richiamo la funzione ggplot per creare un grafico nuovo, richiamo al suo interno la funzione aes per indicare le variabili in gioco del mio grafico cioè bu_co e tiposped. Uso la funzione geom_bar per indicare un grafico a barre in modalità raggrupate grazie al compando position="dodge". Dopodichè uso funzioni grafiche per abbellire il grafico, in paricolare uso theme_minimal() per avere uno sfondo bianco, uso la funzione scale_fill_brewer per impostare i colori delle mier barre, uso la funzione labs per dare un titolo all'asse x,y e un al grafico.
clienti_na4 %>%
ggplot(aes(x=bu_co,fill=tiposped)) +
geom_bar(position="dodge") +
theme_minimal() +
scale_fill_brewer(palette="Set3") +
labs(x="Tipo Clienti",y="Tipo Posta")