pre-trattamento dei dati

importazione dataset

Ho importato i dati dell’indagine Multiscopo sulle famiglie: aspetti della vita quotidiana per l’anno 2023 con i relativi metadati.

Oltre alle variabili indicate in Legenda AVQ.docx, e riportate di seguito:

num..ordine

Acronimovariabile

TipoVariabile

Denominazione.Variabile

227

TEATRO

Categorica

Frequenza con cui negli ultimi 12 mesi è andato a teatro?

228

CINE

Categorica

Frequenza con cui negli ultimi 12 mesi è andato a cinema?

229

MUSEO

Categorica

Frequenza con cui negli ultimi 12 mesi è andato a musei o mostre?

230

MUSIC

Categorica

Frequenza con cui negli ultimi 12 mesi è andato a concerti di musica classica?

231

ACMUS

Categorica

Frequenza con cui negli ultimi 12 mesi è andato ad altri concerti di musica?

232

SPSPO

Categorica

Frequenza con cui negli ultimi 12 mesi è andato a spettacoli sportivi?

233

DISCO

Categorica

Frequenza con cui negli ultimi 12 mesi è andato in discoteche, balere, night club o altri luoghi dove ballare?

234

MONUM

Categorica

Frequenza con cui negli ultimi 12 mesi è andato in siti archeologici, monumenti?

238

FREQIN12

Categorica

Frequenza d'uso di Internet negli ultimi 12 mesi

344

NLIBRIM

Categorica

Numero di libri letti negli ultimi 12 mesi (considerare solo i libri letti per motivi non strettamente scolastici o professionali)

345

NLIBRI_CARM

Categorica

numero di libri cartacei letti

346

NLEBOOM

Categorica

Numero di e-book letti negli ultimi 12 mesi

347

NLAUDIOM

Categorica

Numero di audiolibri ascoltati negli ultimi 12 mesi

207

FREQSERIE

Categorica

frequenza serie tv

209

NUMBIBM

Categorica

quante volte si è recato in biblioteca negli ultimi 12 mesi?

341

LQUOT

Categorica

Legge quotidiani almeno una volta alla settimana?

342

QUONLINE

Categorica

Legge quotidiani online almeno una volta alla settimana?

6

ETAMi

Categorica

Eta in anni compiuti

7

SESSO

Categorica

Sesso - scheda generale

11

ISTRMi

Categorica

Titolo di studio

21

RIPMf

Categorica

Ripartizione geografica di residenza dell'intervistato

708

RISEC

Categorica

Con riferimento agli ultimi 12 mesi e tenendo presente le esigenze di tutti i componenti familiari, come sono state le risorse economiche complessive della famiglia?

3

NCOMP

-

n. dei componenti la famiglia attuale


ho ritenuto opportuno scaricare anche se seguenti variabili:


num..ordine

Acronimovariabile

TipoVariabile

Denominazione.Variabile

1

PROFAM

-

progressivo famiglia

2

PROIND

-

numero d'ordine del componente

237

INTTEMPO

Categorica

Lei ha mai usato Internet?

343

LIBRI

Categorica

ha letto libri negli ultimi 12 mesi?

208

BIBLIO

Categorica

biblioteca negli ultimi 12 mesi

12

CONDMi

Categorica

Condizione professionale

14

POSIZMi

Categorica

posizione nella professione

22

COEFIN

-

Coefficiente di riporto all'universo


PROFAM e PROIND possono essere usate per creare un identificativo univoco dei rispondenti
INTTEMPO e LIBRI servono per controllare le risposte alle domande sull’uso di internet (FREQIN12) e sul numero di libri letti ()
BIBLIO per controllare NUMBIBM
CONDMi POSIZMi potrebbero essere usati per ricostruire la condizione professionale
COEFIN serve per il riporto all’universo nelle elaborazioni


Sulla base dei metadati ho ricostruito il dataset dfrid in R.

tibble [41,750 × 31] (S3: tbl_df/tbl/data.frame)
 $ PROFAM     : int [1:41750] 1 1 ...
 $ PROIND     : int [1:41750] 1 2 ...
 $ TEATRO     : Factor w/ 5 levels "mai","1-3 volte",..: 1 1 ...
 $ CINE       : Factor w/ 5 levels "mai","1-3 volte",..: 1 1 ...
 $ MUSEO      : Factor w/ 5 levels "mai","1-3 volte",..: NA 1 ...
 $ MUSIC      : Factor w/ 5 levels "mai","1-3 volte",..: 1 1 ...
 $ ACMUS      : Factor w/ 5 levels "mai","1-3 volte",..: 1 2 ...
 $ SPSPO      : Factor w/ 5 levels "mai","1-3 volte",..: 1 2 ...
 $ DISCO      : Factor w/ 5 levels "mai","1-3 volte",..: 1 1 ...
 $ MONUM      : Factor w/ 5 levels "mai","1-3 volte",..: 1 1 ...
 $ FREQIN12   : Factor w/ 5 levels "tutti i giorni",..: 1 2 ...
 $ INTTEMPO   : Factor w/ 4 levels "si, negli ultimi 3 mesi",..: 1 1 ...
 $ LIBRI      : Factor w/ 2 levels "no","si": 1 NA ...
 $ NLIBRIM    : Factor w/ 25 levels "01","02","03",..: NA NA ...
 $ NLIBRI_CARM: Factor w/ 25 levels "01","02","03",..: NA NA ...
 $ NLEBOOM    : Factor w/ 26 levels "00","01","02",..: NA NA ...
 $ NLAUDIOM   : Factor w/ 5 levels "00","01","02",..: NA NA ...
 $ FREQSERIE  : Factor w/ 4 levels "Una o piu� volte a settimana",..: 1 1 ...
 $ NUMBIBM    : Factor w/ 25 levels "01","02","03",..: NA NA ...
 $ BIBLIO     : Factor w/ 2 levels "no","si": 1 1 ...
 $ LQUOT      : Factor w/ 5 levels "no","si, 1 o 2 giorni",..: 1 NA ...
 $ QUONLINE   : Factor w/ 5 levels "no","si, 1 o 2 giorni",..: 1 NA ...
 $ ETAMi      : Factor w/ 15 levels "da 0 a 2 anni",..: 12 12 ...
 $ SESSO      : Factor w/ 2 levels "maschio","femmina": 1 2 ...
 $ ISTRMi     : Factor w/ 5 levels "laurea e post-laurea",..: 2 3 ...
 $ RIPMf      : Factor w/ 6 levels "Nord-ovest","Nord-est",..: 4 4 ...
 $ RISEC      : Factor w/ 4 levels "ottime","adeguate",..: 2 2 ...
 $ NCOMP      : int [1:41750] 2 2 ...
 $ CONDMi     : Factor w/ 4 levels "occupato","in cerca di occupazione",..: 2 3 ...
 $ POSIZMi    : Factor w/ 5 levels "dirigente; autonomo come imprenditore; libero professionista",..: 2 NA ...
 $ COEFIN     : int [1:41750] 18584641 18584641 ...


controlli e creazione nuove variabili


1. creazione di un identificativo univoco combinando PROFAM e PROIND

dfrid <- dfrid %>% 
  mutate(id = paste(str_pad(dfrid$PROFAM,width = 5,pad = 0),PROIND,sep = ""),.before=1)

2. CINEMA,TEATRO, SPETTACOLI VARI (domanda 18.1 del questionario)

Domanda: 18.1 Consideri gli ultimi 12 mesi, quante volte, indicativamente, è andato a: (PER LE PERSONE DI 3 ANNI E PIÙ)

Distribuzioni di frequenza nel dataset:

dfrid %>% filter(ETAMi %in% levels(ETAMi)[-1]) %>% 
  select(TEATRO,CINE,MUSEO,MUSIC,ACMUS,SPSPO,DISCO,MONUM) %>% 
  gather("variable","value",1:8,factor_key = T) %>% 
  group_by(variable,value) %>% count() %>% 
  spread(variable,n) %>% 
  mutate(value=factor(value,levels=levels(dfrid$TEATRO))) %>% 
  arrange(value) %>% 
  janitor::adorn_totals(where = "row")
           value TEATRO  CINE MUSEO MUSIC ACMUS SPSPO DISCO MONUM
             mai  32172 24132 27181 36093 31318 29952 32983 28411
       1-3 volte   6723 12062  9794  3151  7289  6906  4304  8620
       4-6 volte    784  2641  2125   440   953  1469  1246  1979
      7-12 volte    235   892   652   133   221   651   660   656
 più di 12 volte    210   479   318   222   254  1031   922   443
            <NA>    882   800   936   967   971   997   891   897
           Total  41006 41006 41006 41006 41006 41006 41006 41006


dfrid %>% filter(ETAMi %in% levels(ETAMi)[-1]) %>% 
  select(TEATRO,CINE,MUSEO,MUSIC,ACMUS,SPSPO,DISCO,MONUM) %>% 
  gather("variable","value",1:8,factor_key = T) %>% 
  group_by(variable,value) %>% summarise(n=n()) %>% 
  mutate(perc=n/sum(n)*100) %>% select(-n) %>% 
  spread(variable,perc) %>% 
  mutate(value=factor(value,levels=levels(dfrid$TEATRO))) %>% 
  arrange(value) %>% 
  janitor::adorn_totals(where = "row") %>% 
  mutate_at(2:ncol(.),~round(.,digits = 1))
           value TEATRO  CINE MUSEO MUSIC ACMUS SPSPO DISCO MONUM
             mai   78.5  58.8  66.3  88.0  76.4  73.0  80.4  69.3
       1-3 volte   16.4  29.4  23.9   7.7  17.8  16.8  10.5  21.0
       4-6 volte    1.9   6.4   5.2   1.1   2.3   3.6   3.0   4.8
      7-12 volte    0.6   2.2   1.6   0.3   0.5   1.6   1.6   1.6
 più di 12 volte    0.5   1.2   0.8   0.5   0.6   2.5   2.2   1.1
            <NA>    2.2   2.0   2.3   2.4   2.4   2.4   2.2   2.2
           Total  100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0


dfrid %>% filter(ETAMi %in% levels(ETAMi)[-1]) %>% 
  select(id,TEATRO,CINE,MUSEO,MUSIC,ACMUS,SPSPO,DISCO,MONUM) %>% 
  mutate_at(2:ncol(.),~ifelse(is.na(.),1,0)) %>% 
  gather("variable","value",2:9,factor_key = T) %>% 
  group_by(id) %>% summarise(n.na=sum(value)) %>% 
  mutate(n.na=ifelse(n.na>1,1,n.na)) %>% 
  group_by(n.na) %>% summarise(n.id=n_distinct(id)) %>% 
  mutate(perc=n.id/sum(n.id)*100) %>% 
  janitor::adorn_totals(where = "row")
  n.na  n.id       perc
     0 39512  96.356631
     1  1494   3.643369
 Total 41006 100.000000


C’è circa un 2% di risposte mancanti per ciascuna variabile, per un totale del 3.6% di casi interessati: come trattarle?

Possibile soluzione: assegnarli alla modalità con maggiore frequenza (mai)

Una seconda questione riguarda il tipo di variabile: in realtà si tratta di variabili di tipo ordinale.

Avendo l’obiettivo di fare una cluster analysis in cui si usano variabili qualitative, ed essendo quindi necessario utilizzare la metrica di Gower per il calcolo delle distanze, bisogna ricordare che le variabili nominali (factor) e quelle ordinali (factor ordered) vengono trattate diversamente.


# trasformo gli NA in "mai" ed escludo dal dataset 0-2 anni
dfrid <- dfrid %>% filter(ETAMi %in% levels(ETAMi)[-1]) %>% 
  mutate(TEATRO = fct_na_value_to_level(TEATRO, level = "mai")) %>% 
  mutate(CINE = fct_na_value_to_level(CINE, level = "mai")) %>% 
  mutate(MUSEO = fct_na_value_to_level(MUSEO, level = "mai")) %>% 
  mutate(MUSIC = fct_na_value_to_level(MUSIC, level = "mai")) %>% 
  mutate(ACMUS = fct_na_value_to_level(ACMUS, level = "mai")) %>% 
  mutate(SPSPO = fct_na_value_to_level(SPSPO, level = "mai")) %>% 
  mutate(DISCO = fct_na_value_to_level(DISCO, level = "mai")) %>% 
  mutate(MONUM = fct_na_value_to_level(MONUM, level = "mai"))
# trasformo in variabili ordinali
dfrid <- dfrid %>% 
  mutate_at(which(names(dfrid)=="TEATRO"):which(names(dfrid)=="MONUM"),~ordered(.))


3. FREQIN12 Frequenza d’uso di Internet negli ultimi 12 mesi (PER LE PERSONE DI 3 ANNI E PIÙ)


# A tibble: 13 × 3
# Groups:   FREQIN12, INTTEMPO [13]
   FREQIN12                                INTTEMPO                          n
   <fct>                                   <fct>                         <int>
 1 tutti i giorni                          si, negli ultimi 3 mesi       26608
 2 tutti i giorni                          si, da più 3 mesi a 1 anno fa    23
 3 qualche volta alla settimana            si, negli ultimi 3 mesi        3827
 4 qualche volta alla settimana            si, da più 3 mesi a 1 anno fa   172
 5 una volta alla settimana                si, negli ultimi 3 mesi         482
 6 una volta alla settimana                si, da più 3 mesi a 1 anno fa    32
 7 qualche volta al mese (meno di 4 volte) si, negli ultimi 3 mesi         489
 8 qualche volta al mese (meno di 4 volte) si, da più 3 mesi a 1 anno fa    68
 9 meno di una volta al mese               si, negli ultimi 3 mesi         219
10 meno di una volta al mese               si, da più 3 mesi a 1 anno fa    63
11 <NA>                                    si, più di 1 anno fa            995
12 <NA>                                    mai                            7481
13 <NA>                                    <NA>                            547

In questo caso la maggior parte dei dati mancanti è rappresentato da chi non usa internet (INTTEMPO=si, più di 1 anno fa o mai)

Si può aggiungere quindi la modalità non uso internet alla variabile FREQIN12

levels(dfrid$FREQIN12) <- c(levels(dfrid$FREQIN12), "non uso internet")
dfrid$FREQIN12[is.na(dfrid$FREQIN12) & dfrid$INTTEMPO %in% c("si, più di 1 anno fa","mai")] <- "non uso internet"
descr::freq(dfrid$FREQIN12,plot = F)
dfrid$FREQIN12 
                                        Frequency  Percent Valid Percent
tutti i giorni                              26631  64.9442        65.822
qualche volta alla settimana                 3999   9.7522         9.884
una volta alla settimana                      514   1.2535         1.270
qualche volta al mese (meno di 4 volte)       557   1.3583         1.377
meno di una volta al mese                     282   0.6877         0.697
non uso internet                             8476  20.6701        20.950
NA's                                          547   1.3340              
Total                                       41006 100.0000       100.000

Rimangono 547 casi mananti (1.3%).

4. LIBRI (PER LE PERSONE DI 6 ANNI E PIÙ)

Le variabili NLIBRIM, NLIBRI_CARM, NLEBOOM, NLAUDIOM sono categoriche, hanno modalità diverse e sono state rivolte solo a chi ha risposto LIBRI=si (Negli ultimi 12 mesi ha letto libri).

frequenze filtrate per età>6 anni e LIBRI=si

NLIBRIM

n.1

NLIBRI_CARM

n.2

NLEBOOM

n.3

NLAUDIOM

n.4

01

1,718

01

1,728

00

11,946

00

15,288

02

2,904

02

2,830

01

1,132

01

290

03

2,388

03

2,185

02

839

02

143

04

1,536

04

1,399

03

520

03

77

05

1,564

05

1,359

04

252

4 e piu'

269

06

1,010

06

847

05

324

07

374

07

306

06

158

08

504

08

458

07

75

09

138

09

112

08

81

10

1,328

10

1,054

09

61

11

74

11

56

10

218

12

501

12

368

11

22

13

51

13

33

12

79

14

42

14

24

13

11

15

393

15

307

14

8

16

36

16

25

15

67

17

14

17

11

16-20

111

18

39

18

40

21-25

27

19

8

19

9

26-30

37

20

514

20

364

31-40

43

21-25

180

21-25

124

41-50

27

26-30

269

26-30

187

51 e piu'

29

31-40

182

31-40

130

41-50

159

41-50

107

51 e piu'

141

51 e piu'

77

<NA>

1,927

Probabilmente gli NA della variabile NLIBRI_CARM corrispondono a chi non ha letto libri cartacei.

levels(dfrid$NLIBRI_CARM) <- c(levels(dfrid$NLIBRI_CARM), "00")
dfrid$NLIBRI_CARM[is.na(dfrid$NLIBRI_CARM) & (dfrid$ETAMi %in% levels(dfrid$ETAMi)[3:15] & dfrid$LIBRI=="si")] <- "00"
dfrid$NLIBRI_CARM <- fct_relevel(dfrid$NLIBRI_CARM, "00")

Rimane comunque il problema di come trattare queste variabili nelle analisi di cluster.

Intanto si tratta di variabili ordinali con molte modalità ed usarle tutte nella cluster potrebbe introdurre molto “rumore”.

Una prima soluzione può consistere nel trasformarle in numeriche (per le modalità come 21-25 si assume il valore centrale: 23), verificando e correggendo i valori numerici di NLIBRI_CARM, NLEBOOM, NLAUDIOM in modo che ci sia coerenza con NLIBRIM. Ad esempio supponiamo il caso: NLIBRIM=21-25 con NLIBRI_CARM=NLEBOOM=0 e NLAUDIOM=4 e piu’, avremo che: nnNLIBRIM=23 (valore numerico di NLIBRIM), nnNLIBRI_CARM=nnNLEBOOM=0 e nnNLAUDIOM=23 (è 4 e piu’ e permette di essere coerenti con nnNLIBRIM).

Nelle analisi, avendo l’obiettivo generale del consumo culturale, si può usare il numero totale di libri letti, indipendentemente da quanti per tipo di supporto, e aggiungere una variabile sul tipo di supporto preferito, calcolato in base al peso che hanno i diversi supporti sul numero totale di libri letti. In specifico si può calcolare una nuova variabile tipo.libri riportando quale sia il supporto su cui è stata letta la maggior parte dei libri. Se una persona legge 10 libri e 8 sono cartacei e 2 ebook, sarà tipo.libri=cartacei, se ne avesse letti 5 cartacei e 5 ebook metto tipo.libri=misto.

Una alternativa, anzichè usare il numero di libri letti, può consistere nel considerare tipologie di lettori. Ad esempio ISTAT (Lettura di libri e fruizione delle biblioteche. Istituto Nazionale di Statistica, 2023) definisce quattro tipologie di lettori:

Tipologie di lettori ISTAT

n.libri.letti

tipologia

nessuno

Non lettori

1-3 libri

Lettori deboli

4-11 libri

Lettori medi

12 o più libri

Lettori forti

Non riporto tutti i comandi usati per ottenere il dataset corretto, anche perché per alcuni casi la verifica di coerenza sul numero di libri letti è stata fatta manualmente.
Riporto invece la summary delle variabili legate alla lettura:

  LIBRI          NLIBRIM       NLIBRI_CARM       NLEBOOM          NLAUDIOM    
 no  :23438   02     : 2904   02     : 2830   00     :11946   00      :15288  
 si  :16067   03     : 2388   03     : 2185   01     : 1132   01      :  290  
 NA's:  638   01     : 1718   00     : 1927   02     :  839   02      :  143  
              05     : 1564   01     : 1728   03     :  520   03      :   77  
              04     : 1536   04     : 1399   05     :  324   4 e piu':  269  
              (Other): 5957   (Other): 5998   (Other): 1306   NA's    :24076  
              NA's   :24076   NA's   :24076   NA's   :24076                   
   nnNLIBRIM      nnNLIBRI_CARM      nnNLEBOOM         nnNLAUDIOM     
 Min.   : 0.000   Min.   : 0.000   Min.   : 0.0000   Min.   : 0.0000  
 1st Qu.: 0.000   1st Qu.: 0.000   1st Qu.: 0.0000   1st Qu.: 0.0000  
 Median : 0.000   Median : 0.000   Median : 0.0000   Median : 0.0000  
 Mean   : 2.912   Mean   : 2.264   Mean   : 0.5611   Mean   : 0.0875  
 3rd Qu.: 3.000   3rd Qu.: 2.000   3rd Qu.: 0.0000   3rd Qu.: 0.0000  
 Max.   :82.000   Max.   :55.000   Max.   :55.0000   Max.   :50.0000  
 NA's   :638      NA's   :638      NA's   :638       NA's   :638      
       tipo.libri            lettore.tipo  
 Non lettori:23438   Non lettori   :23438  
 cartacei   :12830   Lettori deboli: 7010  
 ebook      : 2507   Lettori medi  : 6528  
 audiolibri :  229   Lettori forti : 2529  
 misto      :  501   NA's          :  638  
 NA's       :  638                         
                                           


5. FREQSERIE (PER LE PERSONE DI 3 ANNI E PIÙ)

dfrid$FREQSERIE[dfrid$ETAMi %in% levels(dfrid$ETAMi)[-1]] 
                                        Frequency Percent Valid Percent
Una o più volte a settimana                 17487  42.645         43.66
Qualche volta al mese (meno di 4 volte)      8324  20.299         20.78
Qualche volta l'anno                         4457  10.869         11.13
Mai                                          9783  23.857         24.43
NA's                                          955   2.329              
Total                                       41006 100.000        100.00

6. NUMBIBM (PER LE PERSONE DI 3 ANNI E PIÙ)

All domanda quante volte si è recato in biblioteca negli ultimi 12 mesi? rispondono solo quelli che hanno risposto si alla domanda Negli ultimi 12 mesi è stato in una biblioteca? per cui bisogna aggiungere una modalità “00” a NUMBIBM corrispondente a chi non ha usato la biblioteca.

dfrid=dfrid %>% droplevels(dfrid$NUMBIBM)

levels(dfrid$NUMBIBM) <- c(levels(dfrid$NUMBIBM),"00")
dfrid$NUMBIBM[is.na(dfrid$NUMBIBM) & (dfrid$ETAMi %in% levels(dfrid$ETAMi)[-1] & dfrid$BIBLIO=="no")] <- "00"
dfrid$NUMBIBM <- fct_relevel(dfrid$NUMBIBM, "00")
dfrid <- dfrid %>% mutate_at(which(names(dfrid)=="NUMBIBM"),~ordered(.))
descr::freq(dfrid$NUMBIBM,plot = F)
dfrid$NUMBIBM 
          Frequency   Percent Valid Percent Cum Percent
00            35299  86.08252      87.09566       87.10
01              541   1.31932       1.33485       88.43
02              797   1.94362       1.96649       90.40
03              633   1.54368       1.56184       91.96
04              455   1.10959       1.12265       93.08
05              505   1.23153       1.24602       94.33
06              330   0.80476       0.81423       95.14
07               74   0.18046       0.18259       95.32
08              118   0.28776       0.29115       95.62
09               28   0.06828       0.06909       95.68
10              610   1.48759       1.50510       97.19
11-15           368   0.89743       0.90799       98.10
16-20           258   0.62918       0.63658       98.73
21-25            65   0.15851       0.16038       98.89
26-30           143   0.34873       0.35283       99.25
31-40            72   0.17558       0.17765       99.43
41-50           109   0.26581       0.26894       99.69
51 e piu'       124   0.30239       0.30595      100.00
NA's            477   1.16324                          
Total         41006 100.00000     100.00000            

Anche in questo caso potrebbe essere opportuno creare una variabile con classi del numero di visite in biblioteca

dfrid=dfrid %>% filter(ETAMi %in% levels(dfrid$ETAMi)[-1]) %>% 
  mutate(clNUMBIBM=ifelse(BIBLIO=="no",0,
                          ifelse(NUMBIBM %in% levels(dfrid$NUMBIBM)[1:3],1,
                                 ifelse(NUMBIBM %in% levels(dfrid$NUMBIBM)[4:6],2,
                                        ifelse(NUMBIBM %in% levels(dfrid$NUMBIBM)[7:10],3,
                                               ifelse(NUMBIBM %in% levels(dfrid$NUMBIBM)[11:13],4,
                                                      ifelse(NUMBIBM %in% levels(dfrid$NUMBIBM)[14:17],5,NA))))))) %>% 
  mutate(clNUMBIBM=factor(clNUMBIBM,
                          levels = 0:5,
                          labels = c("mai","1-3 volte","4-6","7-10","11-25","più 25 volte")))

dfrid$clNUMBIBM <- ordered(dfrid$clNUMBIBM)
descr::freq(dfrid$clNUMBIBM,plot = F)
dfrid$clNUMBIBM 
             Frequency  Percent Valid Percent Cum Percent
mai              35299  86.0825       87.3630       87.36
1-3 volte         1338   3.2629        3.3115       90.67
4-6               1593   3.8848        3.9426       94.62
7-10               550   1.3413        1.3612       95.98
11-25             1236   3.0142        3.0590       99.04
più 25 volte       389   0.9486        0.9628      100.00
NA's               601   1.4656                          
Total            41006 100.0000      100.0000            

7. LQUOT, QUONLINE (PER LE PERSONE DI 6 ANNI E PIÙ)

dfrid$LQUOT[dfrid$ETAMi %in% levels(dfrid$ETAMi)[3:15]] 
                   Frequency Percent Valid Percent
no                     28827  71.811        72.603
si, 1 o 2 giorni        5895  14.685        14.847
si, 3 o 4 giorni        1477   3.679         3.720
si, 5 o 6 giorni         619   1.542         1.559
si, tutti i giorni      2887   7.192         7.271
NA's                     438   1.091              
Total                  40143 100.000       100.000
dfrid$QUONLINE[dfrid$ETAMi %in% levels(dfrid$ETAMi)[3:15]] 
                   Frequency Percent Valid Percent
no                     27761  69.155        70.061
si, 1 o 2 giorni        5891  14.675        14.867
si, 3 o 4 giorni        1594   3.971         4.023
si, 5 o 6 giorni         669   1.667         1.688
si, tutti i giorni      3709   9.239         9.360
NA's                     519   1.293              
Total                  40143 100.000       100.000
dfrid$LQUOT <- ordered(dfrid$LQUOT)
dfrid$QUONLINE <- ordered(dfrid$QUONLINE)


# dfrid2 contiene correzioni sul numero di libri letti
dfElab <- dfrid %>% select(id:RISEC,clNUMBIBM) %>% 
  left_join(dfrid2 %>% select(id,nnNLIBRIM:tipo.libri),by="id") %>% 
  mutate(nnNLIBRIM=ifelse(ETAMi %in% levels(dfrid$ETAMi)[3:15] & LIBRI=="no",0,nnNLIBRIM)) %>% 
  mutate(nnNLIBRI_CARM=ifelse(ETAMi %in% levels(dfrid$ETAMi)[3:15] & LIBRI=="no",0,nnNLIBRI_CARM)) %>% 
  mutate(nnNLEBOOM=ifelse(ETAMi %in% levels(dfrid$ETAMi)[3:15] & LIBRI=="no",0,nnNLEBOOM)) %>% 
  mutate(nnNLAUDIOM=ifelse(ETAMi %in% levels(dfrid$ETAMi)[3:15] & LIBRI=="no",0,nnNLAUDIOM)) %>% 
  mutate(lettore.tipo=ifelse(ETAMi %in% levels(dfrid$ETAMi)[3:15] & LIBRI=="no",0,
                             ifelse(ETAMi %in% levels(dfrid$ETAMi)[3:15] & nnNLIBRIM %in% 1:3,1,
                                    ifelse(ETAMi %in% levels(dfrid$ETAMi)[3:15] & nnNLIBRIM %in% 4:11,2,
                                           ifelse(ETAMi %in% levels(dfrid$ETAMi)[3:15] & nnNLIBRIM>11,3,NA))))) %>% 
  mutate(lettore.tipo=factor(lettore.tipo,levels = 0:3,labels = c("Non lettori","Lettori deboli","Lettori medi","Lettori forti")))

levels(dfElab$tipo.libri) <- c(levels(dfElab$tipo.libri),"Non lettori")
dfElab$tipo.libri[is.na(dfElab$tipo.libri) & (dfrid$ETAMi %in% levels(dfrid$ETAMi)[3:15] & dfElab$LIBRI=="no")] <- "Non lettori"
dfElab$tipo.libri <- fct_relevel(dfElab$tipo.libri, "Non lettori")

dfElab <- dfElab %>% mutate_at(which(names(dfElab)=="NLIBRIM"):which(names(dfElab)=="NLAUDIOM"),~ordered(.))
dfElab <- dfElab %>% mutate_at(which(names(dfElab)=="lettore.tipo"),~ordered(.))

selezione dei casi e delle variabili

Per le analisi potrebbe essere opportuno considerare i rispondenti al di sopra di una certa età, che potrebbe essere 16 o 18 anni.

Il dataset finale, se consideriamo ad esempio i maggiorenni avrebbe la seguente struttura:

dfElab18 <- dfElab %>% filter(ETAMi %in% levels(dfElab$ETAMi)[7:15])
dfElab18 <- dfElab18 %>% droplevels(dfElab18$ETAMi)
Struttura dataset

prog

variable

type

levels

missing

1

id

character

2

PROFAM

integer

3

PROIND

integer

4

NCOMP

integer

5

ETAMi

factor

da 18 a 19 anni; da 20 a 24 anni; da 25 a 34 anni; da 35 a 44 anni; da 45 a 54 anni; da 55 a 59 anni; da 60 a 64 anni; da 65 a 74 anni; 75 anni e piu'

0

6

SESSO

factor

maschio; femmina

0

7

ISTRMi

factor

laurea e post-laurea; diploma; licenza di scuola media; licenza di scuola elementare, nessun titolo di studio; non disponibile

0

8

CONDMi

factor

occupato; in cerca di occupazione; inattivo; non disponibile

0

9

POSIZMi

factor

dirigente; autonomo come imprenditore; libero professionista; direttivo, quadro; impiegato; capo operaio, operaio subalterno e assimilati; apprendista; lavorante a domicilio per conto d'impresa; lavoratore in proprio; socio cooperativa Produzione Beni e/o prestazioni di servizio; coadiuvante; collaborazione coordinata e continuativa (con o senza progetto); prestazione d'opera occasionale; non disponibile

6,346

10

RIPMf

factor

Nord-ovest; Nord-est; Centro; Sud; Isole; non disponibile

0

11

COEFIN

integer

12

FREQSERIE

factor

Una o più volte a settimana; Qualche volta al mese (meno di 4 volte); Qualche volta l'anno; Mai

829

13

BIBLIO

factor

no; si

395

14

NUMBIBM

ordered factor

00; 01; 02; 03; 04; 05; 06; 07; 08; 09; 10; 11-15; 16-20; 21-25; 26-30; 31-40; 41-50; 51 e piu'

395

15

TEATRO

ordered factor

mai; 1-3 volte; 4-6 volte; 7-12 volte; più di 12 volte

0

16

CINE

ordered factor

mai; 1-3 volte; 4-6 volte; 7-12 volte; più di 12 volte

0

17

MUSEO

ordered factor

mai; 1-3 volte; 4-6 volte; 7-12 volte; più di 12 volte

0

18

MUSIC

ordered factor

mai; 1-3 volte; 4-6 volte; 7-12 volte; più di 12 volte

0

19

ACMUS

ordered factor

mai; 1-3 volte; 4-6 volte; 7-12 volte; più di 12 volte

0

20

SPSPO

ordered factor

mai; 1-3 volte; 4-6 volte; 7-12 volte; più di 12 volte

0

21

DISCO

ordered factor

mai; 1-3 volte; 4-6 volte; 7-12 volte; più di 12 volte

0

22

MONUM

ordered factor

mai; 1-3 volte; 4-6 volte; 7-12 volte; più di 12 volte

0

23

INTTEMPO

factor

si, negli ultimi 3 mesi; si, da più 3 mesi a 1 anno fa; si, più di 1 anno fa; mai

482

24

FREQIN12

factor

tutti i giorni; qualche volta alla settimana; una volta alla settimana; qualche volta al mese (meno di 4 volte); meno di una volta al mese; non uso internet

482

25

LQUOT

ordered factor

no; si, 1 o 2 giorni; si, 3 o 4 giorni; si, 5 o 6 giorni; si, tutti i giorni

324

26

QUONLINE

ordered factor

no; si, 1 o 2 giorni; si, 3 o 4 giorni; si, 5 o 6 giorni; si, tutti i giorni

403

27

LIBRI

factor

no; si

515

28

NLIBRIM

ordered factor

01; 02; 03; 04; 05; 06; 07; 08; 09; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21-25; 26-30; 31-40; 41-50; 51 e piu'

22,097

29

NLIBRI_CARM

ordered factor

00; 01; 02; 03; 04; 05; 06; 07; 08; 09; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21-25; 26-30; 31-40; 41-50; 51 e piu'

22,097

30

NLEBOOM

ordered factor

00; 01; 02; 03; 04; 05; 06; 07; 08; 09; 10; 11; 12; 13; 14; 15; 16-20; 21-25; 26-30; 31-40; 41-50; 51 e piu'

22,097

31

NLAUDIOM

ordered factor

00; 01; 02; 03; 4 e piu'

22,097

32

RISEC

factor

ottime; adeguate; scarse; assolutamente insufficienti

0

33

clNUMBIBM

ordered factor

mai; 1-3 volte; 4-6; 7-10; 11-25; più 25 volte

514

34

nnNLIBRIM

numeric

515

35

nnNLIBRI_CARM

numeric

515

36

nnNLEBOOM

numeric

515

37

nnNLAUDIOM

numeric

515

38

tipo.libri

factor

Non lettori; cartacei; ebook; audiolibri; misto

515

39

lettore.tipo

ordered factor

Non lettori; Lettori deboli; Lettori medi; Lettori forti

515

In questo dataset le variabili da NLIBRIM a NLAUDIOM contengono come missing i casi di chi non legge libri (LIBRI=no).

variabili base e dati mancanti

Se consideriamo come variabili base della cluster analysis:
FREQSERIE, clNUMBIBM, TEATRO, CINE, MUSEO, MUSIC, ACMUS, SPSPO, DISCO, MONUM, FREQIN12, LQUOT, QUONLINE, lettore.tipo, tipo.libri
i casi con NA sono:

dfElab18 %>% 
  select(FREQSERIE,clNUMBIBM,TEATRO:MONUM,FREQIN12,LQUOT,QUONLINE,lettore.tipo,tipo.libri) %>% 
  mutate_all(~ifelse(is.na(.),1,0)) %>% 
  mutate(n.na=rowSums(.)) %>% group_by(n.na) %>% summarise(n=n()) %>% mutate(`%`=n/sum(n)*100)
# A tibble: 8 × 3
   n.na     n     `%`
  <dbl> <int>   <dbl>
1     0 34051 95.4   
2     1   919  2.58  
3     2   298  0.835 
4     3   108  0.303 
5     4    89  0.249 
6     5    49  0.137 
7     6    27  0.0757
8     7   140  0.392 

Il 95.4% dei casi non presenta dati mancanti,
se analizziamo come il 4.6% di casi con informazioni mancanti incidono sulle variabili base, osserviamo che gli NA sembrano distribuiti uniformemente:

dftmp <-dfElab18 %>% left_join(
  dfElab18 %>% 
    select(id,FREQSERIE,clNUMBIBM,TEATRO:MONUM,FREQIN12,LQUOT,QUONLINE,lettore.tipo,tipo.libri) %>% 
    mutate_at(2:ncol(.),~ifelse(is.na(.),1,0)) %>% column_to_rownames("id") %>% 
    mutate(n.na=rowSums(.)) %>% 
    rownames_to_column("id") %>% 
    mutate(pres.na=ifelse(n.na==0,0,1)) %>% 
    mutate(pres.na=factor(pres.na,levels = 0:1,labels = c("no.na","si.na"))) %>% 
    select(id,pres.na),by="id")
Peso dei dati mancanti sulle variabili base

Variable

V1

no.na

si.na

% na

FREQSERIE

Una o più volte a settimana

14927

384

2.5

Qualche volta al mese (meno di 4 volte)

7017

159

2.2

Qualche volta l'anno

3832

71

1.8

Mai

8275

187

2.2

<NA>

829

clNUMBIBM

mai

30663

1024

3.2

1-3 volte

818

31

3.7

4-6

992

28

2.7

7-10

382

8

2.1

11-25

878

18

2.0

più 25 volte

318

7

2.2

<NA>

514

TEATRO

mai

27907

1429

4.9

1-3 volte

5089

162

3.1

4-6 volte

666

20

2.9

7-12 volte

210

7

3.2

più di 12 volte

179

12

6.3

CINE

mai

21757

1254

5.4

1-3 volte

9090

274

2.9

4-6 volte

2034

57

2.7

7-12 volte

756

25

3.2

più di 12 volte

414

20

4.6

MUSEO

mai

23812

1341

5.3

1-3 volte

7622

206

2.6

4-6 volte

1770

47

2.6

7-12 volte

585

12

2.0

più di 12 volte

262

24

8.4

MUSIC

mai

30658

1495

4.6

1-3 volte

2713

98

3.5

4-6 volte

388

13

3.2

7-12 volte

119

6

4.8

più di 12 volte

173

18

9.4

ACMUS

mai

26545

1410

5.0

1-3 volte

6262

158

2.5

4-6 volte

840

37

4.2

7-12 volte

200

5

2.4

più di 12 volte

204

20

8.9

SPSPO

mai

26242

1397

5.1

1-3 volte

5340

160

2.9

4-6 volte

1136

36

3.1

7-12 volte

513

10

1.9

più di 12 volte

820

27

3.2

DISCO

mai

27954

1417

4.8

1-3 volte

3702

114

3.0

4-6 volte

1058

33

3.0

7-12 volte

557

26

4.5

più di 12 volte

780

40

4.9

MONUM

mai

24525

1381

5.3

1-3 volte

6925

162

2.3

4-6 volte

1671

40

2.3

7-12 volte

567

20

3.4

più di 12 volte

363

27

6.9

FREQIN12

tutti i giorni

22724

606

2.6

qualche volta alla settimana

2957

128

4.1

una volta alla settimana

374

10

2.6

qualche volta al mese (meno di 4 volte)

417

24

5.4

meno di una volta al mese

217

26

10.7

non uso internet

7362

354

4.6

<NA>

482

LQUOT

no

23919

901

3.6

si, 1 o 2 giorni

5487

193

3.4

si, 3 o 4 giorni

1379

50

3.5

si, 5 o 6 giorni

566

29

4.9

si, tutti i giorni

2700

133

4.7

<NA>

324

QUONLINE

no

22872

924

3.9

si, 1 o 2 giorni

5476

148

2.6

si, 3 o 4 giorni

1506

41

2.7

si, 5 o 6 giorni

627

21

3.2

si, tutti i giorni

3570

93

2.5

<NA>

403

lettore.tipo

Non lettori

20853

729

3.4

Lettori deboli

5760

172

2.9

Lettori medi

5354

127

2.3

Lettori forti

2084

87

4.0

<NA>

515

tipo.libri

Non lettori

20853

729

3.4

cartacei

10368

298

2.8

ebook

2229

65

2.8

audiolibri

196

8

3.9

misto

405

15

3.6

<NA>

515


Possiamo quindi selezionare i casi che non presentano dati mancanti senza introdurre distorsioni rilevanti.

dfElab18OK <- dfElab18 %>% filter(id %in% dftmp$id[dftmp$pres.na=="no.na"])

variabili descrittive

Come variabili per la descrizione dei cluster avremo:

NCOMP, ETAMi, SESSO, ISTRMi, RIPMf, RISEC

Oltre a queste si potrebbe considerare la condizione professionale, ottenuta combinando CONDMi (Condizione professionale) e POSIZMi (posizione nella professione).

dfElab18OK <- dfElab18OK %>% 
  mutate(condprof=ifelse(CONDMi=="occupato",
                         ifelse(POSIZMi=="non disponibile",
                                "occupato altro",as.character(POSIZMi)),
                         as.character(CONDMi))) %>% 
  mutate(condprof=factor(condprof,
                         levels=c(levels(dfElab18OK$POSIZMi)[1:4],"occupato altro",levels(dfElab18OK$CONDMi)[2:4])))
levels(dfElab18OK$condprof)[1] <- "dirigente, imprenditore, libero prof."
levels(dfElab18OK$condprof)[3] <- "operaio"
levels(dfElab18OK$condprof)[4] <- "altro autonomo"
Distribuzioni di frequenza delle variabili descrittive

Variable

V1

n

%

NCOMP

1

6015

17.7

2

10370

30.5

3

8307

24.4

4

6952

20.4

5

1826

5.4

6

436

1.3

7

80

0.2

8

49

0.1

9

16

0.0

ETAMi

da 18 a 19 anni

799

2.3

da 20 a 24 anni

1888

5.5

da 25 a 34 anni

3745

11.0

da 35 a 44 anni

4509

13.2

da 45 a 54 anni

6253

18.4

da 55 a 59 anni

3440

10.1

da 60 a 64 anni

2994

8.8

da 65 a 74 anni

5143

15.1

75 anni e piu'

5280

15.5

SESSO

maschio

16084

47.2

femmina

17967

52.8

ISTRMi

laurea e post-laurea

6151

18.1

diploma

13674

40.2

licenza di scuola media

9032

26.5

licenza di scuola elementare, nessun titolo di studio

4693

13.8

non disponibile

501

1.5

RIPMf

Nord-ovest

7826

23.0

Nord-est

7052

20.7

Centro

6386

18.8

Sud

9373

27.5

Isole

3385

9.9

non disponibile

29

0.1

RISEC

ottime

579

1.7

adeguate

22649

66.5

scarse

9758

28.7

assolutamente insufficienti

1065

3.1

condprof

dirigente, imprenditore, libero prof.

2065

6.1

direttivo, quadro; impiegato

6296

18.5

operaio

5018

14.7

altro autonomo

1512

4.4

occupato altro

216

0.6

in cerca di occupazione

3108

9.1

inattivo

15336

45.0

non disponibile

500

1.5


Per alcune variabili (ISTRMi, RIPMf e condprof) ci sono casi con non disponibile, ma questi potranno poi essere trattati in fase analisi.

analisi dei dati

In questa fase, per semplificare e velocizzare le prove di analisi considero solo i giovani da 18 a 34 anni.

dfElab1834OK <- dfElab18OK %>% filter(ETAMi %in% levels(dfElab18OK$ETAMi)[1:3])

descrizione delle variabili base

Una prima parte dovrebbe essere dedicata ad una breve descrizione della variabili in esame.

Una versione semplice potrebbe consistere calcolare distribuzioni di frequenza e grafici delle variabili base.

Il metodo corretto per fare queste elaborazioni consiste nel considerare i Coefficiente di riporto all’universo (COEFIN).

Sulla base delle indicazioni riportate nel file con il tracciato record calcolo il peso dividendo COEFIN/10000

dfElab1834OK <- dfElab1834OK %>% mutate(peso = COEFIN / 10000)

Per usare i pesi in R uso la libreria srvyr e creo un oggetto survey

library(srvyr)
svy1834 <- dfElab1834OK %>%
  as_survey_design(ids = 1, weights = peso)

Usando l’oggetto svy1834 posso effettuare le analisi, ad esempio calcolare la distribuzione di frequenza della variabile TEATRO

bind_rows(svy1834 %>% group_by(TEATRO) %>% 
            summarise(survey_total(vartype = NULL)) %>% 
            mutate(perc=coef/sum(coef)*100),
          svy1834 %>% mutate(TEATRO="Total") %>% group_by(TEATRO) %>% 
            summarise(survey_total(vartype = NULL)) %>% 
            mutate(perc=coef/sum(coef)*100))
# A tibble: 6 × 3
  TEATRO              coef    perc
  <chr>              <dbl>   <dbl>
1 mai             7792389.  79.7  
2 1-3 volte       1691081.  17.3  
3 4-6 volte        193378.   1.98 
4 7-12 volte        49261.   0.504
5 più di 12 volte   49211.   0.503
6 Total           9775320. 100    

Le differenze rispetto ai calcoli fatti non usando i coefficienti di riporto, almeno a livello molto aggregato, sembrano trascurabili

bind_rows(
  dfElab1834OK %>% group_by(TEATRO) %>% summarise(n=n()) %>% mutate(perc=n/sum(n)*100),
  dfElab1834OK %>% mutate(TEATRO="Total") %>% group_by(TEATRO) %>% 
    summarise(n=n()) %>% mutate(perc=n/sum(n)*100))
# A tibble: 6 × 3
  TEATRO              n    perc
  <chr>           <int>   <dbl>
1 mai              5103  79.3  
2 1-3 volte        1135  17.6  
3 4-6 volte         128   1.99 
4 7-12 volte         34   0.529
5 più di 12 volte    32   0.498
6 Total            6432 100    

Il metodo formalmente corretto è comunque il primo.

In alternativa a srvyr si può usare la libreria survey

library(survey)
svy1834b <- svydesign(ids = ~1, weights = ~peso, data = dfElab1834OK)
svytable(~TEATRO,design = svy1834b) %>% as.data.frame()
           TEATRO       Freq
1             mai 7792388.91
2       1-3 volte 1691080.51
3       4-6 volte  193378.00
4      7-12 volte   49260.89
5 più di 12 volte   49211.50

prova di cluster

Nelle funzioni comunemente usate per le procedure di clustering non è possibile utilizzare i coefficienti di riporto all’universo. Normalmente si procede al calcolo dei cluster usando il dataset non pesato, una volta creati i cluster, si usa svydesign per verificare se ci sia una relazione significativa tra i cluster e le variabili base.

In questo caso tutte le variabili base sono qualitative, dobbiamo quindi:

  • calcolare una matrice di distanze con la metrica di Gower

  • tra i possibili metodi di cluster utilizzabili con distanze di Gower (cluster gerarchica o PAM) dobbiamo scegliere quale fornisca gli indici di clustering migliori e rispetto a quale numero di gruppi

  • verificare se la relazione tra i cluster e le variabili base sia significativa usando i pesi

matrice di distanze

dfClust <- dfElab1834OK %>% 
  select(id,FREQSERIE, clNUMBIBM, 
         TEATRO, CINE, MUSEO, MUSIC, ACMUS, SPSPO, DISCO, MONUM, 
         FREQIN12, LQUOT, QUONLINE, lettore.tipo, tipo.libri) %>%
  column_to_rownames("id")

library(cluster)
dst <- daisy(dfClust,metric = "gower")

valutazione del metodo e del numero di cluster ottimali

Utilizzo la funzione presentata a lezione

source("../2025_26/funzioni/utility.R")

out <- best.cluster.ext(dat = dfClust,
                        dst = dst,
                        mincl = 2,maxcl = 10,
                        gap = F,stability = F,
                        indices = c("SC","Cind","Dunn2","Gamma"))
out$plot.2

Una soluzione possibile è rappresentata dal metodo PAM con 8 cluster
i valori di silhouette e Pearson’s Gamma non sono molto alti ma, se escludiamo la soluzione a 2 gruppi, la soluzione a 8 cluster sembra essere la migliore.

# calcolo cluster k-medoids
ppClu <- pam(x = dst,k = 8)
# aggiungo la variabile cluster al dataset
dfClust <- dfClust %>% mutate(cluster=factor(ppClu$clustering),.before=1)
# associo ad ogni unità il peso di ponderazione
dfClust <- dfClust %>% rownames_to_column("id")
dfClust <- dfClust %>% left_join(dfElab1834OK %>% select(id,peso),by="id")

# creo l'oggetto survey
svyClu <- dfClust %>%
  as_survey_design(ids = 1, weights = peso)

descrizione dei cluster

Dimensione dei cluster

dfClust$cluster 
      Frequency Percent
1        791432   8.096
2       2384853  24.397
3       1392508  14.245
4        609815   6.238
5       1542603  15.781
6       1424626  14.574
7        919788   9.409
8        709694   7.260
Total   9775320 100.000

domanda 18

Di seguito sono riportate, per la domanda 18, tabelle per ciascuna variabile rispetto ai cluster (valori assoluti, percentuali di riga e di colonna) e test chi-quadro. Questi ultimi sono quasi sempre significativi (p<0.05) a causa del fatto che abbiamo molte osservazioni con pesi di ponderazione riferiti a milioni di unità.

options(width = 500)
varSP <- c("TEATRO", "CINE", "MUSEO", "MUSIC", "ACMUS", "SPSPO", "DISCO", "MONUM")
tbdfT <- data.frame()
for(i in 1:length(varSP)){
  tmpsvy=svyClu %>% select(cluster,V1=varSP[i])
  tab1 <- svytable(~V1+cluster,design = tmpsvy)
  tb1n <- tab1 %>% addmargins() %>% round(digits = 0)
  tb1r <- tab1 %>% addmargins(margin = 1) %>% prop.table(margin = 1) %>% addmargins(margin = 2)
  tb1c <- tab1 %>% addmargins(margin = 2) %>% prop.table(margin = 2) %>% addmargins(margin = 1)
  cat("\n\n",varSP[i],"\n\n")
  print(tb1n)
  print(tb1r %>% as.data.frame.matrix() %>% mutate_all(~round(.*100,digits = 1)))
  print(tb1c %>% as.data.frame.matrix() %>% mutate_all(~round(.*100,digits = 1)))
  print(svychisq(~V1+cluster,design = tmpsvy))
  tbdf=tb1c %>% as.data.frame.matrix() %>% rownames_to_column("levels") %>% 
    filter(levels!="Sum") %>% 
    gather("cluster","value",2:ncol(.),factor_key = T) %>% 
    mutate(value=value*100) %>% 
    mutate(levels=factor(levels,levels = levels(dfClust$TEATRO))) %>% 
    mutate(variable=varSP[i],.before=1)
  tbdfT <- bind_rows(tbdfT,tbdf)
}


 TEATRO 

                 cluster
V1                      1       2       3       4       5       6       7       8     Sum
  mai              511762 2080848 1209888  546804  899516 1238669  854600  450302 7792389
  1-3 volte        229452  289501  168314   52930  521478  160521   45730  223156 1691081
  4-6 volte         29652    8406   12651    2566   86387   22743   11209   19764  193378
  7-12 volte         5535    4373       0    3360   27385    2694     994    4918   49261
  più di 12 volte   15031    1725    1656    4155    7837       0    7255   11554   49211
  Sum              791432 2384853 1392508  609815 1542603 1424626  919788  709694 9775320
                   1    2    3   4    5    6    7    8 Sum
mai              6.6 26.7 15.5 7.0 11.5 15.9 11.0  5.8 100
1-3 volte       13.6 17.1 10.0 3.1 30.8  9.5  2.7 13.2 100
4-6 volte       15.3  4.3  6.5 1.3 44.7 11.8  5.8 10.2 100
7-12 volte      11.2  8.9  0.0 6.8 55.6  5.5  2.0 10.0 100
più di 12 volte 30.5  3.5  3.4 8.4 15.9  0.0 14.7 23.5 100
Sum              8.1 24.4 14.2 6.2 15.8 14.6  9.4  7.3 100
                    1     2     3     4     5     6     7     8   Sum
mai              64.7  87.3  86.9  89.7  58.3  86.9  92.9  63.5  79.7
1-3 volte        29.0  12.1  12.1   8.7  33.8  11.3   5.0  31.4  17.3
4-6 volte         3.7   0.4   0.9   0.4   5.6   1.6   1.2   2.8   2.0
7-12 volte        0.7   0.2   0.0   0.6   1.8   0.2   0.1   0.7   0.5
più di 12 volte   1.9   0.1   0.1   0.7   0.5   0.0   0.8   1.6   0.5
Sum             100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0

    Pearson's X^2: Rao & Scott adjustment

data:  NextMethod()
F = 20.07, ndf = 26.807, ddf = 172395.708, p-value < 2.2e-16



 CINE 

                 cluster
V1                      1       2       3       4       5       6       7       8     Sum
  mai              136926  872665  562413  312563  286650  596126  600908  118161 3486411
  1-3 volte        412078 1072556  636567  228155  676414  599584  249074  351597 4226026
  4-6 volte        159324  295542  133694   46867  361626  159637   49845  161029 1367565
  7-12 volte        56629  107187   43883   15836  151246   50525    6876   51203  483385
  più di 12 volte   26475   36904   15951    6395   66666   18754   13085   27703  211933
  Sum              791432 2384853 1392508  609815 1542603 1424626  919788  709694 9775320
                   1    2    3   4    5    6    7    8 Sum
mai              3.9 25.0 16.1 9.0  8.2 17.1 17.2  3.4 100
1-3 volte        9.8 25.4 15.1 5.4 16.0 14.2  5.9  8.3 100
4-6 volte       11.7 21.6  9.8 3.4 26.4 11.7  3.6 11.8 100
7-12 volte      11.7 22.2  9.1 3.3 31.3 10.5  1.4 10.6 100
più di 12 volte 12.5 17.4  7.5 3.0 31.5  8.8  6.2 13.1 100
Sum              8.1 24.4 14.2 6.2 15.8 14.6  9.4  7.3 100
                    1     2     3     4     5     6     7     8   Sum
mai              17.3  36.6  40.4  51.3  18.6  41.8  65.3  16.6  35.7
1-3 volte        52.1  45.0  45.7  37.4  43.8  42.1  27.1  49.5  43.2
4-6 volte        20.1  12.4   9.6   7.7  23.4  11.2   5.4  22.7  14.0
7-12 volte        7.2   4.5   3.2   2.6   9.8   3.5   0.7   7.2   4.9
più di 12 volte   3.3   1.5   1.1   1.0   4.3   1.3   1.4   3.9   2.2
Sum             100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0

    Pearson's X^2: Rao & Scott adjustment

data:  NextMethod()
F = 19.707, ndf = 27.71, ddf = 178206.07, p-value < 2.2e-16



 MUSEO 

                 cluster
V1                      1       2       3       4       5       6       7       8     Sum
  mai              196726 1642059  979250  477266  216983 1107146  799458  207408 5626296
  1-3 volte        375730  601094  337428  110738  811857  251763   94298  340234 2923142
  4-6 volte        159708  101241   59762   11726  334772   53246   11104  112855  844415
  7-12 volte        38778   29616    8895    6498  144416    6541    6175   40070  280987
  più di 12 volte   20490   10843    7173    3587   34575    5930    8753    9128  100480
  Sum              791432 2384853 1392508  609815 1542603 1424626  919788  709694 9775320
                   1    2    3   4    5    6    7    8 Sum
mai              3.5 29.2 17.4 8.5  3.9 19.7 14.2  3.7 100
1-3 volte       12.9 20.6 11.5 3.8 27.8  8.6  3.2 11.6 100
4-6 volte       18.9 12.0  7.1 1.4 39.6  6.3  1.3 13.4 100
7-12 volte      13.8 10.5  3.2 2.3 51.4  2.3  2.2 14.3 100
più di 12 volte 20.4 10.8  7.1 3.6 34.4  5.9  8.7  9.1 100
Sum              8.1 24.4 14.2 6.2 15.8 14.6  9.4  7.3 100
                    1     2     3     4     5     6     7     8   Sum
mai              24.9  68.9  70.3  78.3  14.1  77.7  86.9  29.2  57.6
1-3 volte        47.5  25.2  24.2  18.2  52.6  17.7  10.3  47.9  29.9
4-6 volte        20.2   4.2   4.3   1.9  21.7   3.7   1.2  15.9   8.6
7-12 volte        4.9   1.2   0.6   1.1   9.4   0.5   0.7   5.6   2.9
più di 12 volte   2.6   0.5   0.5   0.6   2.2   0.4   1.0   1.3   1.0
Sum             100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0

    Pearson's X^2: Rao & Scott adjustment

data:  NextMethod()
F = 48.644, ndf = 27.41, ddf = 176271.64, p-value < 2.2e-16



 MUSIC 

                 cluster
V1                      1       2       3       4       5       6       7       8     Sum
  mai              594904 2155626 1271381  548541 1230162 1245160  846573  499428 8391776
  1-3 volte        147865  187611  111290   50281  243088  151618   48859  159594 1100205
  4-6 volte         33038   25947    4971    7406   45340   26387    9992   31598  184679
  7-12 volte         6440    4161    4866       0   14462       0    2678   10837   43443
  più di 12 volte    9186   11508       0    3587    9551    1461   11686    8237   55217
  Sum              791432 2384853 1392508  609815 1542603 1424626  919788  709694 9775320
                   1    2    3   4    5    6    7    8 Sum
mai              7.1 25.7 15.2 6.5 14.7 14.8 10.1  6.0 100
1-3 volte       13.4 17.1 10.1 4.6 22.1 13.8  4.4 14.5 100
4-6 volte       17.9 14.0  2.7 4.0 24.6 14.3  5.4 17.1 100
7-12 volte      14.8  9.6 11.2 0.0 33.3  0.0  6.2 24.9 100
più di 12 volte 16.6 20.8  0.0 6.5 17.3  2.6 21.2 14.9 100
Sum              8.1 24.4 14.2 6.2 15.8 14.6  9.4  7.3 100
                    1     2     3     4     5     6     7     8   Sum
mai              75.2  90.4  91.3  90.0  79.7  87.4  92.0  70.4  85.8
1-3 volte        18.7   7.9   8.0   8.2  15.8  10.6   5.3  22.5  11.3
4-6 volte         4.2   1.1   0.4   1.2   2.9   1.9   1.1   4.5   1.9
7-12 volte        0.8   0.2   0.3   0.0   0.9   0.0   0.3   1.5   0.4
più di 12 volte   1.2   0.5   0.0   0.6   0.6   0.1   1.3   1.2   0.6
Sum             100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0

    Pearson's X^2: Rao & Scott adjustment

data:  NextMethod()
F = 7.4383, ndf = 26.334, ddf = 169351.221, p-value < 2.2e-16



 ACMUS 

                 cluster
V1                      1       2       3       4       5       6       7       8     Sum
  mai              267222 1570241 1051222  440243  431589 1013647  756974  277791 5808929
  1-3 volte        391522  691608  317638  146247  832361  364672  122462  346140 3212649
  4-6 volte         87585   92233   18481   19739  203843   37115   24416   57383  540795
  7-12 volte        28885   22349    4457       0   54574    7586    2887   21425  142163
  più di 12 volte   16218    8423     711    3587   20236    1606   13049    6955   70784
  Sum              791432 2384853 1392508  609815 1542603 1424626  919788  709694 9775320
                   1    2    3   4    5    6    7    8 Sum
mai              4.6 27.0 18.1 7.6  7.4 17.4 13.0  4.8 100
1-3 volte       12.2 21.5  9.9 4.6 25.9 11.4  3.8 10.8 100
4-6 volte       16.2 17.1  3.4 3.6 37.7  6.9  4.5 10.6 100
7-12 volte      20.3 15.7  3.1 0.0 38.4  5.3  2.0 15.1 100
più di 12 volte 22.9 11.9  1.0 5.1 28.6  2.3 18.4  9.8 100
Sum              8.1 24.4 14.2 6.2 15.8 14.6  9.4  7.3 100
                    1     2     3     4     5     6     7     8   Sum
mai              33.8  65.8  75.5  72.2  28.0  71.2  82.3  39.1  59.4
1-3 volte        49.5  29.0  22.8  24.0  54.0  25.6  13.3  48.8  32.9
4-6 volte        11.1   3.9   1.3   3.2  13.2   2.6   2.7   8.1   5.5
7-12 volte        3.6   0.9   0.3   0.0   3.5   0.5   0.3   3.0   1.5
più di 12 volte   2.0   0.4   0.1   0.6   1.3   0.1   1.4   1.0   0.7
Sum             100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0

    Pearson's X^2: Rao & Scott adjustment

data:  NextMethod()
F = 28.91, ndf = 25.977, ddf = 167061.061, p-value < 2.2e-16



 SPSPO 

                 cluster
V1                      1       2       3       4       5       6       7       8     Sum
  mai              392094 1537963 1057473  411810  917850  952527  723479  352550 6345746
  1-3 volte        250979  595158  250205  136144  414226  335727  134418  237236 2354094
  4-6 volte         80454  126864   40193   26187  121841   60599   32568   66447  555153
  7-12 volte        30044   50403   14243   15378   43076   42223   13760   34315  243443
  più di 12 volte   37862   74465   30393   20296   45611   33550   15564   19145  276884
  Sum              791432 2384853 1392508  609815 1542603 1424626  919788  709694 9775320
                   1    2    3   4    5    6    7    8 Sum
mai              6.2 24.2 16.7 6.5 14.5 15.0 11.4  5.6 100
1-3 volte       10.7 25.3 10.6 5.8 17.6 14.3  5.7 10.1 100
4-6 volte       14.5 22.9  7.2 4.7 21.9 10.9  5.9 12.0 100
7-12 volte      12.3 20.7  5.9 6.3 17.7 17.3  5.7 14.1 100
più di 12 volte 13.7 26.9 11.0 7.3 16.5 12.1  5.6  6.9 100
Sum              8.1 24.4 14.2 6.2 15.8 14.6  9.4  7.3 100
                    1     2     3     4     5     6     7     8   Sum
mai              49.5  64.5  75.9  67.5  59.5  66.9  78.7  49.7  64.9
1-3 volte        31.7  25.0  18.0  22.3  26.9  23.6  14.6  33.4  24.1
4-6 volte        10.2   5.3   2.9   4.3   7.9   4.3   3.5   9.4   5.7
7-12 volte        3.8   2.1   1.0   2.5   2.8   3.0   1.5   4.8   2.5
più di 12 volte   4.8   3.1   2.2   3.3   3.0   2.4   1.7   2.7   2.8
Sum             100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0

    Pearson's X^2: Rao & Scott adjustment

data:  NextMethod()
F = 6.7061, ndf = 27.837, ddf = 179022.486, p-value < 2.2e-16



 DISCO 

                 cluster
V1                      1       2       3       4       5       6       7       8     Sum
  mai              307390 1246777  980476  364195  488990  784388  698842  229821 5100879
  1-3 volte        252195  614813  242688  128419  517985  373785  134114  256829 2520827
  4-6 volte         88489  228800   68842   56819  241761  107610   36005  113285  941610
  7-12 volte        73534  126741   53351   27228  157086   80973   15305   45674  579892
  più di 12 volte   69825  167722   47151   33156  136781   77870   35522   64085  632111
  Sum              791432 2384853 1392508  609815 1542603 1424626  919788  709694 9775320
                   1    2    3   4    5    6    7    8 Sum
mai              6.0 24.4 19.2 7.1  9.6 15.4 13.7  4.5 100
1-3 volte       10.0 24.4  9.6 5.1 20.5 14.8  5.3 10.2 100
4-6 volte        9.4 24.3  7.3 6.0 25.7 11.4  3.8 12.0 100
7-12 volte      12.7 21.9  9.2 4.7 27.1 14.0  2.6  7.9 100
più di 12 volte 11.0 26.5  7.5 5.2 21.6 12.3  5.6 10.1 100
Sum              8.1 24.4 14.2 6.2 15.8 14.6  9.4  7.3 100
                    1     2     3     4     5     6     7     8   Sum
mai              38.8  52.3  70.4  59.7  31.7  55.1  76.0  32.4  52.2
1-3 volte        31.9  25.8  17.4  21.1  33.6  26.2  14.6  36.2  25.8
4-6 volte        11.2   9.6   4.9   9.3  15.7   7.6   3.9  16.0   9.6
7-12 volte        9.3   5.3   3.8   4.5  10.2   5.7   1.7   6.4   5.9
più di 12 volte   8.8   7.0   3.4   5.4   8.9   5.5   3.9   9.0   6.5
Sum             100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0

    Pearson's X^2: Rao & Scott adjustment

data:  NextMethod()
F = 16.557, ndf = 27.919, ddf = 179548.463, p-value < 2.2e-16



 MONUM 

                 cluster
V1                      1       2       3       4       5       6       7       8     Sum
  mai              282147 1770046 1107471  498012  324579 1161992  804761  282213 6231222
  1-3 volte        328077  464096  219669   94861  734847  213431   77923  299128 2432033
  4-6 volte        115733   96596   39717    8347  320926   34010   16058   80647  712033
  7-12 volte        40064   33770   17769    4565  119014    9263   10905   29837  265187
  più di 12 volte   25411   20345    7882    4029   43237    5930   10140   17869  134845
  Sum              791432 2384853 1392508  609815 1542603 1424626  919788  709694 9775320
                   1    2    3   4    5    6    7    8 Sum
mai              4.5 28.4 17.8 8.0  5.2 18.6 12.9  4.5 100
1-3 volte       13.5 19.1  9.0 3.9 30.2  8.8  3.2 12.3 100
4-6 volte       16.3 13.6  5.6 1.2 45.1  4.8  2.3 11.3 100
7-12 volte      15.1 12.7  6.7 1.7 44.9  3.5  4.1 11.3 100
più di 12 volte 18.8 15.1  5.8 3.0 32.1  4.4  7.5 13.3 100
Sum              8.1 24.4 14.2 6.2 15.8 14.6  9.4  7.3 100
                    1     2     3     4     5     6     7     8   Sum
mai              35.7  74.2  79.5  81.7  21.0  81.6  87.5  39.8  63.7
1-3 volte        41.5  19.5  15.8  15.6  47.6  15.0   8.5  42.1  24.9
4-6 volte        14.6   4.1   2.9   1.4  20.8   2.4   1.7  11.4   7.3
7-12 volte        5.1   1.4   1.3   0.7   7.7   0.7   1.2   4.2   2.7
più di 12 volte   3.2   0.9   0.6   0.7   2.8   0.4   1.1   2.5   1.4
Sum             100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0

    Pearson's X^2: Rao & Scott adjustment

data:  NextMethod()
F = 42.474, ndf = 27.086, ddf = 174192.338, p-value < 2.2e-16
tbdfT %>% 
  mutate(variable=factor(variable,levels = varSP)) %>% 
  ggplot(aes(x=cluster,y=value,fill=levels))+
  geom_col(color="gray90")+
  scale_fill_manual(values = RColorBrewer::brewer.pal(n = 5,name = "YlOrRd"),"")+
  facet_wrap(~variable,ncol=2) + 
  ylab(NULL)+theme_minimal()

Lettura

tab1 <- svytable(~lettore.tipo+cluster,design = svyClu)
tb1n <- tab1 %>% addmargins() %>% round(digits = 0)
tb1r <- tab1 %>% addmargins(margin = 1) %>% prop.table(margin = 1) %>% addmargins(margin = 2)
tb1c <- tab1 %>% addmargins(margin = 2) %>% prop.table(margin = 2) %>% addmargins(margin = 1)
print(tb1n)
                cluster
lettore.tipo           1       2       3       4       5       6       7       8     Sum
  Non lettori          0 2384853       0  559716       0 1345200  855046       0 5144815
  Lettori deboli  224853       0 1045775   26780  359179   53456   33663  382471 2126178
  Lettori medi    469016       0  274748   16093  917447   16896   28020  261413 1983632
  Lettori forti    97563       0   71984    7227  265977    9074    3059   65810  520695
  Sum             791432 2384853 1392508  609815 1542603 1424626  919788  709694 9775320
print(tb1r %>% as.data.frame.matrix() %>% mutate_all(~round(.*100,digits = 1)))
                  1    2    3    4    5    6    7    8 Sum
Non lettori     0.0 46.4  0.0 10.9  0.0 26.1 16.6  0.0 100
Lettori deboli 10.6  0.0 49.2  1.3 16.9  2.5  1.6 18.0 100
Lettori medi   23.6  0.0 13.9  0.8 46.3  0.9  1.4 13.2 100
Lettori forti  18.7  0.0 13.8  1.4 51.1  1.7  0.6 12.6 100
Sum             8.1 24.4 14.2  6.2 15.8 14.6  9.4  7.3 100
print(tb1c %>% as.data.frame.matrix() %>% mutate_all(~round(.*100,digits = 1)))
                   1   2     3     4     5     6     7     8   Sum
Non lettori      0.0 100   0.0  91.8   0.0  94.4  93.0   0.0  52.6
Lettori deboli  28.4   0  75.1   4.4  23.3   3.8   3.7  53.9  21.8
Lettori medi    59.3   0  19.7   2.6  59.5   1.2   3.0  36.8  20.3
Lettori forti   12.3   0   5.2   1.2  17.2   0.6   0.3   9.3   5.3
Sum            100.0 100 100.0 100.0 100.0 100.0 100.0 100.0 100.0
svychisq(~lettore.tipo+cluster,design = svyClu)

    Pearson's X^2: Rao & Scott adjustment

data:  NextMethod()
F = 266.14, ndf = 20.219, ddf = 130028.897, p-value < 2.2e-16
tb1c %>% as.data.frame.matrix() %>% rownames_to_column("variable") %>%
  filter(variable!="Sum") %>%
  gather("cluster","value",2:ncol(.),factor_key = T) %>%
  mutate(value=value*100) %>%
  mutate(variable=factor(variable,levels = levels(dfClust$lettore.tipo))) %>%
  ggplot(aes(x=cluster,y=value,fill=variable))+
  geom_col(color="gray90")+
  scale_fill_manual(values = RColorBrewer::brewer.pal(n = 5,name = "YlOrRd"),"")+
  ylab(NULL)+theme_minimal()+ggtitle("lettore.tipo")

tab1 <- svytable(~tipo.libri+cluster,design = svyClu)
tb1n <- tab1 %>% addmargins() %>% round(digits = 0)
tb1r <- tab1 %>% addmargins(margin = 1) %>% prop.table(margin = 1) %>% addmargins(margin = 2)
tb1c <- tab1 %>% addmargins(margin = 2) %>% prop.table(margin = 2) %>% addmargins(margin = 1)
print(tb1n)
             cluster
tipo.libri          1       2       3       4       5       6       7       8     Sum
  Non lettori       0 2384853       0  559716       0 1345200  855046       0 5144815
  cartacei     665471       0 1234834       0 1471536       0       0       0 3371841
  ebook         73341       0  103735   42886       0   62854   57134  681880 1021831
  audiolibri    18032       0   13765    2836   26383    6006    2136    7638   76797
  misto         34588       0   40174    4377   44685   10567    5471   20176  160037
  Sum          791432 2384853 1392508  609815 1542603 1424626  919788  709694 9775320
print(tb1r %>% as.data.frame.matrix() %>% mutate_all(~round(.*100,digits = 1)))
               1    2    3    4    5    6    7    8 Sum
Non lettori  0.0 46.4  0.0 10.9  0.0 26.1 16.6  0.0 100
cartacei    19.7  0.0 36.6  0.0 43.6  0.0  0.0  0.0 100
ebook        7.2  0.0 10.2  4.2  0.0  6.2  5.6 66.7 100
audiolibri  23.5  0.0 17.9  3.7 34.4  7.8  2.8  9.9 100
misto       21.6  0.0 25.1  2.7 27.9  6.6  3.4 12.6 100
Sum          8.1 24.4 14.2  6.2 15.8 14.6  9.4  7.3 100
print(tb1c %>% as.data.frame.matrix() %>% mutate_all(~round(.*100,digits = 1)))
                1   2     3     4     5     6     7     8   Sum
Non lettori   0.0 100   0.0  91.8   0.0  94.4  93.0   0.0  52.6
cartacei     84.1   0  88.7   0.0  95.4   0.0   0.0   0.0  34.5
ebook         9.3   0   7.4   7.0   0.0   4.4   6.2  96.1  10.5
audiolibri    2.3   0   1.0   0.5   1.7   0.4   0.2   1.1   0.8
misto         4.4   0   2.9   0.7   2.9   0.7   0.6   2.8   1.6
Sum         100.0 100 100.0 100.0 100.0 100.0 100.0 100.0 100.0
svychisq(~tipo.libri + cluster, design = svyClu, statistic = "adjWald")

    Design-based Wald test of association

data:  NextMethod()
F = 677.38, ndf = 28, ddf = 6404, p-value < 2.2e-16
tb1c %>% as.data.frame.matrix() %>% rownames_to_column("variable") %>%
  filter(variable!="Sum") %>%
  gather("cluster","value",2:ncol(.),factor_key = T) %>%
  mutate(value=value*100) %>%
  mutate(variable=factor(variable,levels = levels(dfClust$tipo.libri))) %>%
  ggplot(aes(x=cluster,y=value,fill=variable))+
  geom_col(color="gray90")+
  scale_fill_manual(values = RColorBrewer::brewer.pal(n = 5,name = "YlOrRd"),"")+
  ylab(NULL)+theme_minimal()+ggtitle("tipo.libri")

Allo stesso modo possono essere rappresentate le altre variabili

profilazione dei cluster

Una volta descritti i cluster rispetto alle bvariabili base è necessario farne una profilazione rispetto alle variabili socio-demografiche.

Tecnicamente i comandi sono sostanzialmente gli stessi usati al punto precedente.

Si deve solo creare un oggetto survey con tutte le variabili necessarie.

dfClustP <- dfClust %>% 
  inner_join(dfElab1834OK %>% select(id,ETAMi,SESSO,ISTRMi,RIPMf,RISEC,condprof),
             by="id") %>% 
  mutate(ETAMi=droplevels(ETAMi))

svyClu <- dfClustP %>%
  as_survey_design(ids = 1, weights = peso)

età

tab1 <- svytable(~ETAMi+cluster,design = svyClu)
tb1n <- tab1 %>% addmargins() %>% round(digits = 0)
tb1r <- tab1 %>% addmargins(margin = 1) %>% prop.table(margin = 1) %>% addmargins(margin = 2)
tb1c <- tab1 %>% addmargins(margin = 2) %>% prop.table(margin = 2) %>% addmargins(margin = 1)
print(tb1n)
                 cluster
ETAMi                   1       2       3       4       5       6       7       8     Sum
  da 18 a 19 anni   93019  285598  170332   57490  206164  162701   70055   91073 1136433
  da 20 a 24 anni  247780  625606  357980  163292  464444  378142  231676  261514 2730435
  da 25 a 34 anni  450633 1473649  864195  389033  871995  883783  618056  357107 5908452
  Sum              791432 2384853 1392508  609815 1542603 1424626  919788  709694 9775320
print(tb1r %>% as.data.frame.matrix() %>% mutate_all(~round(.*100,digits = 1)))
                  1    2    3   4    5    6    7   8 Sum
da 18 a 19 anni 8.2 25.1 15.0 5.1 18.1 14.3  6.2 8.0 100
da 20 a 24 anni 9.1 22.9 13.1 6.0 17.0 13.8  8.5 9.6 100
da 25 a 34 anni 7.6 24.9 14.6 6.6 14.8 15.0 10.5 6.0 100
Sum             8.1 24.4 14.2 6.2 15.8 14.6  9.4 7.3 100
print(tb1c %>% as.data.frame.matrix() %>% mutate_all(~round(.*100,digits = 1)))
                    1     2     3     4     5     6     7     8   Sum
da 18 a 19 anni  11.8  12.0  12.2   9.4  13.4  11.4   7.6  12.8  11.6
da 20 a 24 anni  31.3  26.2  25.7  26.8  30.1  26.5  25.2  36.8  27.9
da 25 a 34 anni  56.9  61.8  62.1  63.8  56.5  62.0  67.2  50.3  60.4
Sum             100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0
svychisq(~ETAMi+cluster,design = svyClu)

    Pearson's X^2: Rao & Scott adjustment

data:  NextMethod()
F = 3.0834, ndf = 13.951, ddf = 89721.595, p-value = 8.277e-05
g1=tb1c %>% as.data.frame.matrix() %>% rownames_to_column("variable") %>%
  filter(variable!="Sum") %>%
  gather("cluster","value",2:ncol(.),factor_key = T) %>%
  mutate(value=value*100) %>%
  mutate(variable=factor(variable,levels = levels(dfClustP$ETAMi))) %>%
  ggplot(aes(x=cluster,y=value,fill=variable))+
  geom_col(color="gray90")+
  scale_fill_manual(values = RColorBrewer::brewer.pal(n = 5,name = "YlOrRd"),"",labels = function(x) str_wrap(x, width = 30))+
  ylab(NULL)+theme_minimal()+ggtitle("cluster per ETAMi")+theme(legend.position = "bottom")

g2=tb1r %>% as.data.frame.matrix() %>% rownames_to_column("variable") %>% 
  select(-Sum) %>% 
  gather("cluster","value",2:ncol(.),factor_key = T) %>% 
  mutate(value=value*100) %>%
  mutate(variable=factor(variable,levels = c(levels(dfClustP$ETAMi),"Sum"))) %>%
  ggplot(aes(x=variable,y=value,fill=cluster))+
  geom_col(color="gray90")+
  scale_fill_manual(values = RColorBrewer::brewer.pal(n = 8,name = "Set1"),"",labels = function(x) str_wrap(x, width = 30))+
  ylab(NULL)+theme_minimal()+ggtitle("ETAMi per cluster")+theme(legend.position = "bottom")
library(patchwork)
g1 + g2

Per quanto il test chi-quadro risulti significativo, non si apprezzano differenze rilevanti tra i cluster rispetto all’età.

istruzione

tab1 <- svytable(~ISTRMi+cluster,design = svyClu)
tb1n <- tab1 %>% addmargins() %>% round(digits = 0)
tb1r <- tab1 %>% addmargins(margin = 1) %>% prop.table(margin = 1) %>% addmargins(margin = 2)
tb1c <- tab1 %>% addmargins(margin = 2) %>% prop.table(margin = 2) %>% addmargins(margin = 1)
print(tb1n)
                                                       cluster
ISTRMi                                                        1       2       3       4       5       6       7       8     Sum
  laurea e post-laurea                                   285135  312304  387343   91901  653777  185328  131326  234993 2282108
  diploma                                                395473 1467822  783975  327741  722336  807216  485538  368976 5359077
  licenza di scuola media                                103873  555172  200735  166130  152836  387688  262673   89070 1918176
  licenza di scuola elementare, nessun titolo di studio       0   11876    7053    5647       0    9256    9039    1685   44556
  non disponibile                                          6951   37679   13402   18396   13654   35139   31212   14970  171403
  Sum                                                    791432 2384853 1392508  609815 1542603 1424626  919788  709694 9775320
print(tb1r %>% as.data.frame.matrix() %>% mutate_all(~round(.*100,digits = 1)))
                                                         1    2    3    4    5    6    7    8 Sum
laurea e post-laurea                                  12.5 13.7 17.0  4.0 28.6  8.1  5.8 10.3 100
diploma                                                7.4 27.4 14.6  6.1 13.5 15.1  9.1  6.9 100
licenza di scuola media                                5.4 28.9 10.5  8.7  8.0 20.2 13.7  4.6 100
licenza di scuola elementare, nessun titolo di studio  0.0 26.7 15.8 12.7  0.0 20.8 20.3  3.8 100
non disponibile                                        4.1 22.0  7.8 10.7  8.0 20.5 18.2  8.7 100
Sum                                                    8.1 24.4 14.2  6.2 15.8 14.6  9.4  7.3 100
print(tb1c %>% as.data.frame.matrix() %>% mutate_all(~round(.*100,digits = 1)))
                                                          1     2     3     4     5     6     7     8   Sum
laurea e post-laurea                                   36.0  13.1  27.8  15.1  42.4  13.0  14.3  33.1  23.3
diploma                                                50.0  61.5  56.3  53.7  46.8  56.7  52.8  52.0  54.8
licenza di scuola media                                13.1  23.3  14.4  27.2   9.9  27.2  28.6  12.6  19.6
licenza di scuola elementare, nessun titolo di studio   0.0   0.5   0.5   0.9   0.0   0.6   1.0   0.2   0.5
non disponibile                                         0.9   1.6   1.0   3.0   0.9   2.5   3.4   2.1   1.8
Sum                                                   100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0
svychisq(~ISTRMi+cluster,design = svyClu)

    Pearson's X^2: Rao & Scott adjustment

data:  NextMethod()
F = 15.396, ndf = 26.595, ddf = 171032.880, p-value < 2.2e-16
g1=tb1c %>% as.data.frame.matrix() %>% rownames_to_column("variable") %>%
  filter(variable!="Sum") %>%
  gather("cluster","value",2:ncol(.),factor_key = T) %>%
  mutate(value=value*100) %>%
  mutate(variable=factor(variable,levels = levels(dfClustP$ISTRMi))) %>%
  ggplot(aes(x=cluster,y=value,fill=variable))+
  geom_col(color="gray90")+
  geom_text(aes(label = ifelse(value<5,NA,format(round(value,1),nsmall=1))),
            position = position_stack(vjust = 0.5),
            size = 3)+
  scale_fill_manual(values = RColorBrewer::brewer.pal(n = 5,name = "YlGn"),"",labels = function(x) str_wrap(x, width = 30))+
  ylab("%")+theme_minimal()+ggtitle("cluster per ISTRMi")+
  theme(legend.position = "bottom",
        legend.text = element_text(size = 8),
        legend.title = element_text(size = 9))+
  guides(fill = guide_legend(nrow = 2))
g2=tb1r %>% as.data.frame.matrix() %>% rownames_to_column("variable") %>% 
  select(-Sum) %>% 
  gather("cluster","value",2:ncol(.),factor_key = T) %>% 
  mutate(value=value*100) %>%
  mutate(variable=factor(variable,levels = c(levels(dfClustP$ISTRMi),"Sum"))) %>%
  ggplot(aes(x=variable,y=value,fill=cluster))+
  geom_col(color="gray90")+
  geom_text(aes(label = ifelse(value<5,NA,format(round(value,1),nsmall=1))),
            position = position_stack(vjust = 0.5),
            size = 3)+
  scale_fill_manual(values = RColorBrewer::brewer.pal(n = 8,name = "Set1"),"",labels = function(x) str_wrap(x, width = 30))+
  ylab("%")+xlab(NULL)+theme_minimal()+ggtitle("ISTRMi per cluster")+
  theme(legend.position = "bottom",
        legend.text = element_text(size = 8),
        legend.title = element_text(size = 9))+
  scale_x_discrete(labels = function(x) str_wrap(x, width = 15))
g1 + g2