1. Introduzione

La povertà non è soltanto una condizione materiale misurabile attraverso soglie di reddito, ma un costrutto sociale e politico che riflette specifiche concezioni di giustizia, di cittadinanza e di vita dignitosa. Ogni definizione operativa di povertà, anche quando formulata in termini tecnici e statistici, incorpora scelte normative su quali bisogni debbano essere soddisfatti e su quali standard di vita siano ritenuti accettabili in un determinato contesto storico e territoriale. In questo senso, la misurazione della povertà non è un atto neutrale, ma un processo situato all’interno di rapporti di potere e di configurazioni istituzionali più ampie.

Muovendo da questa consapevolezza, il presente lavoro adotta uno strumento quantitativo — un modello log–lineare stimato tramite OLS — non con l’intento di ridurre la complessità del fenomeno a una relazione puramente tecnica tra variabili, ma per indagare come specifiche caratteristiche socio-demografiche si traducano in differenziali di reddito all’interno di un contesto urbano marginalizzato. L’attenzione è rivolta agli inquilini delle case popolari del quartiere Quarticciolo, assumendo il reddito familiare come indicatore sintetico di posizione economica relativa.

L’analisi mira a rendere empiricamente osservabili le modalità attraverso cui la struttura familiare, la partecipazione al mercato del lavoro e le condizioni amministrative o migratorie contribuiscono alla produzione di vulnerabilità economica. I risultati mostrano che il mercato del lavoro rappresenta il principale meccanismo distributivo locale, ma evidenziano anche una penalizzazione economica significativa associata alla presenza di stranieri nel nucleo familiare, non interamente spiegabile dalle caratteristiche produttive osservate. Le disuguaglianze rilevate appaiono dunque come esiti di dinamiche strutturali che attraversano il mercato del lavoro, le politiche abitative e i processi di integrazione sociale.

Il paper è organizzato come segue. La Sezione 2 descrive i dati e il processo di pulizia. La Sezione 3 presenta la costruzione delle variabili e l’analisi descrittiva. La Sezione 4 illustra la strategia empirica. La Sezione 5 riporta i risultati. La Sezione 6 conclude.

2. Costruzione del Dataset

Come scelta metodologica, si è deciso di rendere esplicito il lavoro di pulizia e costruzione del dataset, passaggio che spesso viene omesso nei paper econometrici standard, nei quali i dati sono assunti come “dati” e non come esito di un processo relazionale che può generare bias già a monte. Per chi non è interessato a questa parte può passare direttamente alla sezione successiva.

Nel file CSV ottenuto da ATER osserviamo soltanto il lato positivo dell’informazione disponibile, mentre restano invisibili le lacune, le incompletezze e le eventuali imputazioni che possono essere solo speculate.
Come è possibile che un inquilino classificato come “abusivo sconosciuto all’ATER” abbia dichiarato un reddito di oltre centomila euro annui? Si tratta di un errore di battitura che confonde centinaia e migliaia, oppure di un’informazione riportata correttamente? Perché una persona che guadagna circa ottantasettemila euro annui risulta assegnataria con requisiti per ottenere un alloggio popolare? Come possono dieci persone abitare nello stesso alloggio che non supera i sessanta metri quadrati?

L’obbietivo di questa sezione è costruire un dataset sui redditi familiari e sulle variabili rilevanti alla determinazione dello stesso che poi verrà utilizzato nelle sezioni di Exploratory Data Analysis e per stimare i parametri tramite un modello OLS.

  1. Import e pulizia del dataset
  2. Costruzione delle variabili di regressione
    • Individuali
    • Capofamiglia
  3. Aggregazione in famiglie

2.1 Import e pulizia del dataset amministrativo

# 1)Import del dataset, l'unità statistica è il singolo inquilino degli alloggi Ater
redditi <- read_excel("data/redditi.xlsx") %>%
  clean_names()

names(redditi)  # nomi delle variabili contenute all'interno del dataset 
##  [1] "id_edificio"                 "id_alloggio"                
##  [3] "anno_dichiarazione"          "anno_reddito"               
##  [5] "eta"                         "nazionalita"                
##  [7] "tipo_componente"             "tipo_persona"               
##  [9] "tipo_cond_lavorativa"        "tipo_attivita"              
## [11] "reddito_dipendente"          "reddito_pensione"           
## [13] "reddito_autonomo"            "altro_reddito"              
## [15] "redditi_occasionali"         "redditi_non_imponibili"     
## [17] "reddito_fabbricato"          "redditi_oneri_previdenziali"
# la funzione unique() ci riporta tutti i valori che la variabile assume all'interno del dataset.
unique(redditi$nazionalita) 
##  [1] "Marocco"     "Romania"     "Ecuador"     "NULL"        "Italia"     
##  [6] "Eritrea"     "Tunisia"     "Moldavia"    "Filippine"   "Egitto"     
## [11] "Ucraina"     "Perù"        "Serbia"      "Bangladesh"  "Portogallo" 
## [16] "Sri Lanka"   "Georgia"     "Colombia"    "Montenegro"  "Etiopia"    
## [21] "Macedonia"   "Bulgaria"    "Polonia"     "Cuba"        "Algeria"    
## [26] "Siria"       "Libano"      "Afghanistan" "Cina"        "Nigeria"
unique(redditi$tipo_componente)
##  [1] "Capofamiglia"                     "Coniuge"                         
##  [3] "Figlio/a"                         "Nipote"                          
##  [5] "Altro"                            "Convivente"                      
##  [7] "Figlio/a coniugato/a"             "Nuora"                           
##  [9] "Fratello"                         "Sorella"                         
## [11] "Figlio/a separato/a divorziato/a" "Genero"                          
## [13] "Ospite da considerare"            "Aggiunto"                        
## [15] "Badante (IT) da considerare"
unique(redditi$tipo_persona)
##  [1] "Titolare dell'alloggio"                                                           
##  [2] "Assegnatario/a non titolare"                                                      
##  [3] "Occupante abusivo"                                                                
##  [4] "Occupante abusivo sconosciuto all'Ater"                                           
##  [5] "Familiare (non assegnatario) residente nell'alloggio con legami di parentela"     
##  [6] "In attesa di regolarizzazione (con requisiti)"                                    
##  [7] "Occupante abusivo con nome su bollettino c/c"                                     
##  [8] "Non residente nell’alloggio"                                                      
##  [9] "Altro soggetto residente nell'alloggio senza legami di parentela (ospite/badante)"
## [10] "Coabitante senza diritto al subentro"
unique(redditi$tipo_attivita)
##  [1] "Lav. autonomo"                                         
##  [2] "Casalinga"                                             
##  [3] "Minore"                                                
##  [4] "Disoccupato/a"                                         
##  [5] "Lav. dipendente"                                       
##  [6] "NULL"                                                  
##  [7] "Studente/ssa"                                          
##  [8] "Pensionato/a"                                          
##  [9] "Non produttivo/a"                                      
## [10] "Effettivamente disoccupato"                            
## [11] "Lav. contratto di collaborazione continuativa e coord."
## [12] "Non definito"                                          
## [13] "Imprenditore"
glimpse(redditi) # come ci si presenta il dataset a una prima ispezione
## Rows: 3,443
## Columns: 18
## $ id_edificio                 <dbl> 24231, 24231, 24231, 24231, 24231, 24231, …
## $ id_alloggio                 <dbl> 1381442, 1381442, 1381442, 1381442, 138144…
## $ anno_dichiarazione          <dbl> 2024, 2024, 2024, 2024, 2024, 2023, 2024, …
## $ anno_reddito                <dbl> 2023, 2023, 2023, 2023, 2023, 2023, 2023, …
## $ eta                         <dbl> 45, 34, 14, 11, 8, 41, 60, 58, 15, 47, 22,…
## $ nazionalita                 <chr> "Marocco", "Marocco", "Marocco", "Marocco"…
## $ tipo_componente             <chr> "Capofamiglia", "Coniuge", "Figlio/a", "Fi…
## $ tipo_persona                <chr> "Titolare dell'alloggio", "Assegnatario/a …
## $ tipo_cond_lavorativa        <chr> "Lavoratore autonomo, commerciante e artig…
## $ tipo_attivita               <chr> "Lav. autonomo", "Casalinga", "Minore", "M…
## $ reddito_dipendente          <chr> "0.00", "0.00", "0.00", "0.00", "0.00", "0…
## $ reddito_pensione            <chr> "0.00", "0.00", "0.00", "0.00", "0.00", "0…
## $ reddito_autonomo            <chr> "15041.00", "0.00", "0.00", "0.00", "0.00"…
## $ altro_reddito               <chr> "0.00", "0.00", "0.00", "0.00", "0.00", "0…
## $ redditi_occasionali         <chr> "0.00", "0.00", "0.00", "0.00", "0.00", "0…
## $ redditi_non_imponibili      <chr> "0.00", "0.00", "0.00", "0.00", "0.00", "0…
## $ reddito_fabbricato          <chr> "0.00", "0.00", "0.00", "0.00", "0.00", "0…
## $ redditi_oneri_previdenziali <chr> "0.00", "0.00", "0.00", "0.00", "0.00", "0…

Una volta visionate le caratteristiche del dataset puliamo i dati eliminando le colonne che non ci servono (id_edificio, anno_dichiarazione, anno_reddito) e trasformando la tipologia del dato: le variabili numeriche continue in num in variabili numeriche; id_edifcio e id_alloggio in chr. Queste operazioni di contorno ci permettono di poter applicare operatori algebrici al nostro dataset. 3443 persone è un numero coerente con i dati del censimento ISTAT 2021 dove risultano 333333 persone. Quarticciolo è di fatti una borgata esclusivamente costruita da alloggi popolari.

2.2 Costruzione delle variabili di regressione

Una volta ultimata questa fase di pulizia possiamo procedere al secondo step della preparazione del nostro dataset, in questa fase costruiremo le variabili da inserire all’interno della nostra regressione. Con quest’operazione si vuole sfruttare al massimo il patrimonio informativo contenuto nella rilevazione amministrativa raccogliendolo all’interno di variabili più comode nell’elaborazione tramite software.

2.2.1 Variabili individuali

Per esempio l’aggiunta di una serie di variabili binarie che si segnalano se l’individuo ha o meno un attributo come essere stato o meno catalogato come casalinga/studente/straniero/irregolare, ci permetterà in seguito di confrontare le famiglie straniere/italiane, irregolari/regolari a parità di reddito andando a quantificare quanto l’essere una famiglia straniera vada a incidere sul reddito. Quest’ultimo viene ottenuto come somma di tutte le varie tipologie di reddito di cui sopra.

# 2.1) Reddito totale individuale (somma componenti)
redditi <- redditi %>%
  mutate(
    reddito_tot_ind = rowSums(
      across(c(
        reddito_dipendente, reddito_pensione, reddito_autonomo,
        altro_reddito, redditi_occasionali, redditi_non_imponibili,
        reddito_fabbricato, redditi_oneri_previdenziali
      )),
      na.rm = TRUE
    )
  )

# Flag individuali (usiamo tipo_attivita_fix per robustezza ai "NULL")
redditi <- redditi %>%
  mutate(
    # Età
    flag_minore = if_else(!is.na(eta) & eta < 18, 1L, 0L),

    # Attività (da tipo_attivita_fix)
    flag_studente  = if_else(tipo_attivita_fix == "Studente/ssa", 1L, 0L),
    flag_casalinga = if_else(tipo_attivita_fix == "Casalinga", 1L, 0L),

    # Nazionalità: 0 = Italia, 1 = straniero
    # Assunzione: se nazionalita è NULL/NA/vuota -> 1 (più probabile straniero)
    flag_straniero = if_else(as.character(nazionalita) == "Italia", 0L, 1L),

    # Regolarità: 0 = regolare, 1 = irregolare
    # Assunzione: se tipo_persona è NULL/NA/vuota -> 1 (più probabile irregolare)
    tipo_persona_clean = str_squish(as.character(tipo_persona)),
    flag_irregolare = case_when(
      tipo_persona_clean %in% c(
        "Titolare dell'alloggio",
        "Assegnatario/a non titolare",
        "Familiare (non assegnatario) residente nell'alloggio con legami di parentela"
      ) ~ 0L,
      tipo_persona_clean %in% c("", "NULL") | is.na(tipo_persona_clean) ~ 1L,
      TRUE ~ 1L
    )
  )

2.2.2 Capofamiglia

Applichiamo lo stesso ragionamento per il capofamiglia(o persona di riferimento) che presumiamo avere una maggiore influenza sul reddito familiare rispetto agli altri componenti. Di questa figura estraiamo come informazioni rilevante l’età, se occupato o meno e il tipo di lavoro che fa.

# 2.2) Selezione capofamiglia
capo <- redditi %>%
  filter(tipo_componente == "Capofamiglia") %>%
  mutate(
    eta = as.numeric(eta),
    reddito_tot_ind = as.numeric(reddito_tot_ind),
    attivita_capofamiglia = str_squish(as.character(tipo_attivita_fix))
  ) #scegliamo di estrarre queste informazioni dopo aver visionato le pubblicazione ISTAT sulla povertà. 

# Controllo: esattamente 1 capofamiglia per alloggio, se il codice continua ad andare allora c'è una corrispondenza biunivoca fra ID_ALLOGGIO e Capofamiglia
stopifnot(nrow(capo) == n_distinct(capo$id_alloggio))
#Vista la variegata classificazione proposta da ATER rispetto al tipo di attività lavorativa svolta si decide di riassumere queste informazioni in quattro macro classificazioni: occupato, disoccupato, pensionato, inattivo_altro (casalinga, studente, non definito, non produttivo) 

occ <- c("Lav. dipendente", "Lav. autonomo", "Imprenditore",
         "Lav. contratto di collaborazione continuativa e coord.")
dis <- c("Disoccupato/a", "Effettivamente disoccupato")

capo <- capo %>%
  transmute(
    id_alloggio,
    eta_capofamiglia = eta,
    reddito_capofamiglia = reddito_tot_ind,
    attivita_capofamiglia
  ) %>%
  mutate(
    attivita_capo_macro4 = factor(
      case_when(
        attivita_capofamiglia %in% occ ~ "occupato",
        attivita_capofamiglia %in% dis ~ "disoccupato",
        attivita_capofamiglia == "Pensionato/a" ~ "pensionato",
        TRUE ~ "inattivo_altro"
      ),
      levels = c("inattivo_altro", "pensionato", "disoccupato", "occupato")
    ),
    capo_occupato    = as.integer(attivita_capo_macro4 == "occupato"),
    capo_disoccupato = as.integer(attivita_capo_macro4 == "disoccupato"),
    capo_pensionato  = as.integer(attivita_capo_macro4 == "pensionato")
  )
#################################################################################################################
#    tabelle riassuntive a livello di frequenza assoluta di riduzione della varietà di occupazioni 
#################################################################################################################
# prima della semplificazione:
# occupati = (Lav. dipendente, Lav. autonomo, Imprenditore, Lav. contratto di collaborazione continuativa e coord.
# disoccupati = Disoccupato/a, Effettivamente disoccupato
# pensionati rimangono invariati in virtù di costituire la categoria più frequente 45%
# inattivo altro = Casalinga, Non produttivo/a, Non definito, Studente/ssa  
capo %>% 
  count(attivita_capofamiglia) %>% 
  arrange(desc(n)) %>% 
  mutate(
    perc = round(n / sum(n) * 100, 2)
  ) %>%
  knitr::kable(
    caption = "Distribuzione del tipo di attività del capofamiglia (classificazione originale ATER)",
    col.names = c("Attività lavorativa", "Frequenza", "Percentuale (%)"),
    align = c("l","r","r")
  )
Distribuzione del tipo di attività del capofamiglia (classificazione originale ATER)
Attività lavorativa Frequenza Percentuale (%)
Pensionato/a 753 45.01
Lav. dipendente 583 34.85
Disoccupato/a 107 6.40
Casalinga 100 5.98
Non produttivo/a 58 3.47
Lav. autonomo 31 1.85
Effettivamente disoccupato 17 1.02
Non definito 15 0.90
Studente/ssa 4 0.24
Lav. contratto di collaborazione continuativa e coord. 3 0.18
Imprenditore 2 0.12
#dopo la semplificazione
capo %>% 
  count(attivita_capo_macro4) %>% 
  mutate(
    perc = round(n / sum(n) * 100, 2)
  ) %>%
  knitr::kable(
    caption = "Distribuzione del tipo di attività del capofamiglia (macro-categorie)",
    col.names = c("Macro-categoria", "Frequenza", "Percentuale (%)"),
    align = c("l","r","r")
  )
Distribuzione del tipo di attività del capofamiglia (macro-categorie)
Macro-categoria Frequenza Percentuale (%)
inattivo_altro 177 10.58
pensionato 753 45.01
disoccupato 124 7.41
occupato 619 37.00

2.3 Aggregazione in famiglie e finalizzazione del dataset

Aggreghiamo i singoli individui utilizzando come chiave id_alloggio e calcolandoci ulteriori variabili a livello familiare sulla dimensione e composizione del nucleo sfruttando le informazioni per singola persona calcolate in precedenza.

#raggruppiamo le osservazioni in famiglie utilizzando il codice identificativo dell'alloggio. 
famiglie_core <- redditi %>%
  group_by(id_alloggio) %>%
  summarise(
    # calcoliamo delle variabili di dimensione e composizione del nucleo familiare 
    n_componenti   = n(),
    n_minori       = sum(flag_minore, na.rm = TRUE),
    n_studenti     = sum(flag_studente, na.rm = TRUE),
    n_carico       = n_minori + n_studenti,
    n_adulti       = n_componenti - n_carico,

    # dummies che rispondono alla domanda: è presente all'interno del nucleo almeno una persona contrassegnata come ... ? 1=SI, 0=NO 
    presenza_casalinga  = as.integer(sum(flag_casalinga, na.rm = TRUE) > 0),
    presenza_stranieri  = as.integer(sum(flag_straniero,  na.rm = TRUE) > 0),
    presenza_irregolare = as.integer(sum(flag_irregolare, na.rm = TRUE) > 0),

    # Somma dei redditi individuali dei componenti. 
    reddito_familiare = sum(reddito_tot_ind, na.rm = TRUE),

    .groups = "drop"
  )

In ultimo questo è il dataset che ci siamo proposte di costruire all’inizio, fra le variabili aggiuntive che abbiamo calcolato anche il log reddito utilizzando una trasformazione log(+1) dati i numerosi zeri che avrebbero reso uguale a -infinito il logaritmo.

# Ispezione finale
glimpse(famiglie)
## Rows: 1,673
## Columns: 17
## $ id_alloggio          <chr> "1317841", "1361635", "1361636", "1361883", "1362…
## $ n_componenti         <int> 10, 1, 1, 1, 2, 2, 5, 5, 4, 2, 3, 1, 2, 1, 1, 2, …
## $ n_minori             <int> 4, 0, 0, 0, 1, 0, 2, 1, 2, 1, 2, 0, 0, 0, 0, 1, 2…
## $ n_studenti           <int> 1, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ n_carico             <int> 5, 0, 0, 0, 1, 0, 5, 4, 2, 1, 2, 0, 0, 0, 0, 1, 2…
## $ n_adulti             <int> 5, 1, 1, 1, 1, 2, 0, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1…
## $ presenza_casalinga   <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ presenza_stranieri   <int> 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ presenza_irregolare  <int> 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0…
## $ reddito_familiare    <dbl> 980.00, 0.00, 0.00, 0.00, 0.00, 5843.00, 7033.20,…
## $ eta_capofamiglia     <dbl> 45, 47, 34, 67, 27, 46, 38, 70, 38, 47, 34, 51, 6…
## $ attivita_capo_macro4 <fct> disoccupato, inattivo_altro, inattivo_altro, diso…
## $ capo_occupato        <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ capo_disoccupato     <int> 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ capo_pensionato      <int> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ zero_income          <int> 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0…
## $ log_reddito          <dbl> 6.888572, 0.000000, 0.000000, 0.000000, 0.000000,…

3. Analisi Descrittiva

In questa sezione si presentano le principali evidenze descrittive delle variabili costruite a livello familiare, con un duplice obiettivo. Da un lato, fornire un quadro sintetico della composizione dei nuclei e delle condizioni socio-demografiche rilevanti; dall’altro, ricavare indicazioni utili alla successiva specificazione del modello di regressione. In particolare, oltre alle tabelle riassuntive per variabili continue e dummy, l’attenzione si concentra sulla distribuzione del reddito — che, come atteso in un contesto di forte vulnerabilità economica, appare caratterizzata da marcata asimmetria e presenza di valori estremi — e sulle correlazioni tra regressori, così da anticipare eventuali criticità legate a collinearità o a forme di eteroschedasticità.

3.1 Statistiche descrittive

La Tabella sulle variabili continue sintetizza la distribuzione del reddito (sia in livello sia in trasformazione logaritmica) e alcune dimensioni chiave della struttura familiare: numero di componenti, numero di individui a carico ed età del capofamiglia. Già da questa sintesi emerge come il reddito in livello presenti una distribuzione molto dispersa, con differenze ampie tra valori minimi e massimi, mentre la trasformazione logaritmica (qui calcolata come log(reddito+1) per gestire la presenza di zeri) consente una rappresentazione più stabile e comparabile della variabilità economica. Sul piano demografico, le statistiche su numerosità del nucleo e carichi familiari restituiscono una popolazione in cui la dimensione della famiglia e il peso dei dipendenti costituiscono elementi potenzialmente centrali nel determinare la capacità reddituale complessiva. L’età del capofamiglia, infine, fornisce una prima proxy della fase del ciclo di vita economico del nucleo, variabile che verrà poi verificata anche in forma non lineare nella strategia empirica.

vars_cont <- c(
  "log_reddito",
  "reddito_familiare",
  "n_componenti",
  "n_carico",
  "eta_capofamiglia"
)

labels_cont <- c(
  log_reddito        = "Log reddito (log(reddito+1))",
  reddito_familiare  = "Reddito familiare (€)",
  n_componenti       = "N. componenti",
  n_carico           = "N. a carico",
  eta_capofamiglia   = "Età capofamiglia"
)

tab_cont <- famiglie %>%
  select(any_of(vars_cont)) %>%
  pivot_longer(cols = everything(), names_to = "Variabile", values_to = "Valore") %>%
  mutate(
    Variabile = factor(Variabile, levels = vars_cont),
    Variabile = labels_cont[as.character(Variabile)]
  ) %>%
  group_by(Variabile) %>%
  summarise(
    N    = sum(!is.na(Valore)),
    Mean = mean(Valore, na.rm = TRUE),
    SD   = sd(Valore, na.rm = TRUE),
    Min  = min(Valore, na.rm = TRUE),
    Max  = max(Valore, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(
    N = as.integer(N),
    across(c(Mean, SD, Min, Max), ~round(.x, 2)),
    across(
      c(Mean, SD, Min, Max),
      ~ifelse(
        Variabile == "Reddito familiare (€)",
        scales::comma(.x, accuracy = 0.01, big.mark = ".", decimal.mark = ","),
        format(.x, nsmall = 2)
      )
    )
  )

kable(
  tab_cont,
  caption = "Statistiche descrittive (variabili continue)",
  align = c("l","r","r","r","r","r"),
  booktabs = TRUE
) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  ) %>%
  column_spec(1, width = "7cm") %>%
  column_spec(2:6, width = "2cm")
Statistiche descrittive (variabili continue)
Variabile N Mean SD Min Max
Età capofamiglia 1673 63.90 16.02 20.00 116.00
Log reddito (log(reddito+1)) 1673 9.10 2.64 0.00 12.23
N. a carico 1673 0.38 0.85 0.00 6.00
N. componenti 1673 2.06 1.11 1.00 10.00
Reddito familiare (€) 1673 21.575,77 16.335,34 0,00 204.722,37

La Tabella delle dummy completa il quadro descrittivo riportando, per ciascuna variabile binaria, conteggi e percentuali di occorrenza. Queste misure sono particolarmente utili perché consentono di valutare, già in fase preliminare, quanto siano diffuse alcune condizioni strutturali potenzialmente rilevanti per il reddito: la presenza di componenti stranieri, l’irregolarità amministrativa, la presenza di casalinghe e, soprattutto, la condizione occupazionale del capofamiglia, qui articolata in occupato/disoccupato/pensionato. La dummy sul reddito zero, infine, rende esplicita la quota di famiglie che non dichiarano reddito e motiva la scelta metodologica di trattare separatamente questo segmento quando si passa alla regressione in logaritmi, evitando che l’operazione di trasformazione introduca distorsioni meccaniche.

# Dummy da includere (ordine = ordine tabella)
vars_dummy <- c(
  "presenza_stranieri",
  "presenza_irregolare",
  "presenza_casalinga",
  "capo_occupato",
  "capo_disoccupato",
  "capo_pensionato",
  "zero_income"
)

# Etichette leggibili
labels_dummy <- c(
  presenza_stranieri   = "Presenza stranieri (1=si)",
  presenza_irregolare  = "Presenza irregolare (1=si)",
  presenza_casalinga   = "Presenza casalinga (1=si)",
  capo_occupato        = "Capofamiglia occupato (1=si)",
  capo_disoccupato     = "Capofamiglia disoccupato (1=si)",
  capo_pensionato      = "Capofamiglia pensionato (1=si)",
  zero_income          = "Reddito zero (1=si)"
)

tab_dum <- famiglie %>%
  select(any_of(vars_dummy)) %>%
  pivot_longer(cols = everything(), names_to = "Variabile", values_to = "Valore") %>%
  mutate(
    Variabile = factor(Variabile, levels = vars_dummy),
    Variabile = labels_dummy[as.character(Variabile)]
  ) %>%
  group_by(Variabile) %>%
  summarise(
    N   = sum(!is.na(Valore)),
    `0` = sum(Valore == 0, na.rm = TRUE),
    `1` = sum(Valore == 1, na.rm = TRUE),
    `%1` = round(mean(Valore == 1, na.rm = TRUE) * 100, 1),
    .groups = "drop"
  )

kable(
  tab_dum,
  caption = "Variabili dummy: conteggi e percentuale di 1",
  align = c("l","r","r","r","r"),
  booktabs = TRUE
) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  ) %>%
  column_spec(1, width = "7cm") %>%
  column_spec(2:5, width = "2cm")
Variabili dummy: conteggi e percentuale di 1
Variabile N 0 1 %1
Capofamiglia disoccupato (1=si) 1673 1549 124 7.4
Capofamiglia occupato (1=si) 1673 1054 619 37.0
Capofamiglia pensionato (1=si) 1673 920 753 45.0
Presenza casalinga (1=si) 1673 1438 235 14.0
Presenza irregolare (1=si) 1673 1264 409 24.4
Presenza stranieri (1=si) 1673 1572 101 6.0
Reddito zero (1=si) 1673 1555 118 7.1

3.2 Ispezione Grafica

Per integrare le statistiche riassuntive, l’analisi grafica esplora con maggiore dettaglio la forma delle distribuzioni e le relazioni bivariate tra le principali variabili. Il matrix plot consente di visualizzare, lungo la diagonale, la distribuzione di ciascuna variabile e, fuori diagonale, l’andamento empirico delle associazioni tra reddito, età e composizione familiare. In particolare, il log-reddito mostra una distribuzione ancora chiaramente asimmetrica, con una massa consistente di osservazioni su valori bassi e una coda destra pronunciata: questa evidenza rafforza la scelta di lavorare in logaritmi (e, successivamente, di valutare diagnostiche dei residui per verificare la qualità della specificazione). Inoltre, la relazione tra log-reddito ed età del capofamiglia appare compatibile con una dinamica non lineare: più che una crescita monotona, la forma suggerisce un profilo riconducibile al ciclo di vita economico, motivando l’inclusione di un termine quadratico dell’età nella specificazione alternativa. Infine, la dispersione del reddito al variare di alcune dimensioni demografiche appare non costante, un indizio preliminare della possibile presenza di eteroschedasticità che verrà poi verificata formalmente tramite test nella sezione dei risultati.

panel.hist <- function(x, ...){
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(usr[1:2], 0, 1.5))
  h <- hist(x, plot = FALSE, breaks = 25)
  breaks <- h$breaks; nB <- length(breaks)
  y <- h$counts; y <- y/max(y)
  rect(breaks[-nB], 0, breaks[-1], y,
       col = "#dbe9f6", border = "white")
}

panel.smooth2 <- function(x, y, ...){
  points(x, y,
         pch = 16,
         col = adjustcolor("#2b6cb0", alpha = 0.35),
         cex = 0.6)
  ok <- complete.cases(x, y)
  if(sum(ok) > 10){
    lines(lowess(x[ok], y[ok]),
          col = "#1a365d",
          lwd = 1.5)
  }
}

pairs(
  famiglie[, c(
    "log_reddito",
    "eta_capofamiglia",
    "n_componenti",
    "n_carico",
    "n_adulti"
  )],
  diag.panel  = panel.hist,
  lower.panel = panel.smooth2,
  upper.panel = panel.smooth2,
  gap = 0.5,
  labels = c(
    "Log reddito",
    "Età capo",
    "Componenti",
    "A carico",
    "Adulti"
  )
)

La heatmap delle correlazioni fornisce un controllo sintetico sulle interdipendenze tra regressori, utile sia per prevenire problemi di collinearità sia per interpretare in modo più informato i coefficienti del modello. In generale, ci si attende una correlazione positiva tra il numero di componenti e il numero di adulti e/o di individui a carico, mentre variabili come occupazione del capofamiglia, irregolarità e presenza di stranieri possono risultare associate sia al livello del reddito sia ad alcune caratteristiche della struttura familiare. La rappresentazione triangolare consente di mantenere leggibilità e di focalizzarsi sui pattern principali: laddove emergano associazioni particolarmente elevate tra covariate, queste verranno tenute in considerazione nella fase di specificazione, per evitare che la stima OLS sia guidata da sovrapposizioni informative tra regressori.

library(lattice)
library(viridisLite)

vars_corr <- famiglie %>%
  select(
    log_reddito,
    eta_capofamiglia,
    n_componenti,
    n_carico,
    n_adulti,
    presenza_stranieri,
    presenza_irregolare,
    capo_occupato
  ) %>%
  mutate(across(everything(), as.numeric))

corr_mat <- cor(vars_corr, use = "complete.obs")

# maschera triangolo superiore
corr_mat[upper.tri(corr_mat, diag = TRUE)] <- NA

# Etichette più leggibili
labels <- c(
  "Log reddito",
  "Età capo",
  "Componenti",
  "A carico",
  "Adulti",
  "Stranieri",
  "Irregolare",
  "Capo occupato"
)

# Panel custom
myPanel <- function(x, y, z, ...){
  lattice::panel.levelplot(x, y, z, ...)
  txt <- ifelse(!is.na(z), sprintf("%.2f", z), "")
  lattice::panel.text(x, y, txt, cex = 0.8, col = "black")
}

lattice::levelplot(
  corr_mat,
  panel = myPanel,
  col.regions = viridisLite::viridis(100),
  at = seq(-1, 1, length = 101),
  scales = list(
    x = list(rot = 45, labels = labels, cex = 0.8),
    y = list(labels = labels, cex = 0.8)
  ),
  xlab = "",
  ylab = "",
  main = list("Correlation Matrix", cex = 1),
  colorkey = list(
    space = "right",
    width = 1,
    labels = list(cex = 0.8)
  )
)

4. Strategia Empirica

Questo lavoro analizza i determinanti del reddito familiare attraverso un modello log–lineare stimato tramite OLS. La variabile dipendente è il logaritmo del reddito familiare. Poiché una quota non trascurabile di famiglie presenta reddito nullo, l’analisi viene condotta restringendo il campione alle osservazioni con reddito strettamente positivo, così da evitare i problemi meccanici associati al logaritmo dello zero e consentire un’interpretazione dei coefficienti in termini di semi–elasticità. La specificazione di base è la seguente: \[ \log(\text{reddito}_i) = \beta_0 + \beta_1 \, \text{adulti}_i + \beta_2 \, \text{carico}_i + \beta_3 \, \text{eta\_capo}_i + \beta_4 \, \text{casalinga}_i + \beta_5 \, \text{irregolare}_i + \beta_6 \, \text{stranieri}_i + \beta_7 \, \text{capo\_occupato}_i + u_i \] La composizione familiare è sintetizzata dal numero di adulti (proxy della capacità produttiva potenziale) e dal numero di individui a carico (peso demografico non attivo). L’età del capofamiglia cattura effetti di ciclo di vita, mentre le variabili dicotomiche (presenza di casalinga, condizione di irregolarità, presenza di stranieri e occupazione del capofamiglia) descrivono condizioni strutturali e di inserimento nel mercato del lavoro.

Le evidenze descrittive suggeriscono inoltre una possibile relazione non lineare tra età e reddito; per questo motivo si considera una specificazione alternativa con termine quadratico dell’età: \[ \log(\text{reddito}_i) = \beta_0 + \beta_1 \, \text{eta\_capo}_i + \beta_2 \, \text{eta\_capo}_i^2 + \beta_3 \, \text{adulti}_i + \beta_4 \, \text{carico}_i + \beta_5 \, \text{casalinga}_i + \beta_6 \, \text{irregolare}_i + \beta_7 \, \text{stranieri}_i + \beta_8 \, \text{capo\_occupato}_i + u_i \] La rilevanza dell’estensione quadratica viene valutata tramite test di specificazione.

Infine, poiché l’inferenza OLS standard assume omoschedasticità degli errori, tale ipotesi viene verificata tramite il test di Breusch–Pagan. In caso di rifiuto dell’omoschedasticità, l’inferenza è condotta con errori standard robusti di tipo HC1, così da garantire validità statistica anche in presenza di eteroschedasticità.

5. Risultati

Il modello log–lineare è stato stimato restringendo il campione alle famiglie con reddito strettamente positivo, così da evitare problemi meccanici legati al logaritmo dello zero e mantenere un’interpretazione dei coefficienti in termini di semi–elasticità. Questa scelta consente di concentrarsi sulla variazione relativa del reddito tra i nuclei effettivamente percettori, isolando le determinanti che incidono sull’intensità del reddito piuttosto che sulla sua mera presenza.

La specificazione baseline include la composizione demografica del nucleo, le caratteristiche del capofamiglia e alcune variabili strutturali legate alla posizione amministrativa e lavorativa.

library(lmtest)
library(sandwich)
library(car)
library(nortest)
library(tseries)
library(broom)

# Restrizione a redditi strettamente positivi
df_pos <- famiglie %>%
  filter(reddito_familiare > 0) %>%
  mutate(
    log_reddito_pos = log(reddito_familiare)
  )

# Modello baseline
mod_baseline <- lm(
  log_reddito_pos ~ 
    n_adulti +
    n_carico +
    eta_capofamiglia +
    presenza_casalinga +
    presenza_irregolare +
    presenza_stranieri +
    capo_occupato,
  data = df_pos
)

summary(mod_baseline)
## 
## Call:
## lm(formula = log_reddito_pos ~ n_adulti + n_carico + eta_capofamiglia + 
##     presenza_casalinga + presenza_irregolare + presenza_stranieri + 
##     capo_occupato, data = df_pos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.4103 -0.3381  0.1108  0.5022  1.9574 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          8.037651   0.140249  57.310  < 2e-16 ***
## n_adulti             0.364543   0.023654  15.411  < 2e-16 ***
## n_carico             0.062158   0.027174   2.287  0.02231 *  
## eta_capofamiglia     0.015504   0.001739   8.916  < 2e-16 ***
## presenza_casalinga  -0.194715   0.060475  -3.220  0.00131 ** 
## presenza_irregolare -0.122660   0.047538  -2.580  0.00996 ** 
## presenza_stranieri  -0.428168   0.086480  -4.951 8.19e-07 ***
## capo_occupato        0.441567   0.051565   8.563  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7574 on 1547 degrees of freedom
## Multiple R-squared:  0.2075, Adjusted R-squared:  0.2039 
## F-statistic: 57.86 on 7 and 1547 DF,  p-value: < 2.2e-16

I risultati mostrano che la struttura familiare è sistematicamente associata al livello di reddito. Il numero di adulti presenta un effetto positivo, coerente con una maggiore capacità produttiva potenziale del nucleo, mentre il numero di individui a carico esercita un effetto negativo, suggerendo che un aumento del peso demografico non attivo tenda a comprimere le risorse disponibili. Accanto alla dimensione demografica emergono fattori strutturali: la presenza di stranieri e la condizione di irregolarità risultano associate a livelli inferiori di reddito, indicando possibili penalizzazioni economiche legate alla posizione amministrativa o alla cittadinanza. In questo quadro, la condizione occupazionale del capofamiglia rappresenta uno dei determinanti più rilevanti, con un’associazione positiva e significativa con il reddito familiare.

Prima di procedere all’interpretazione definitiva dei coefficienti, è necessario valutare la validità delle ipotesi del modello attraverso un’analisi diagnostica.

# 1) Breusch-Pagan (eteroschedasticità)
bp_test <- bptest(mod_baseline)

# 2) Shapiro-Wilk (normalità residui)
shapiro_test <- shapiro.test(residuals(mod_baseline))

# 3) Jarque-Bera (normalità)
jb_test <- jarque.bera.test(residuals(mod_baseline))

# 4) Durbin-Watson (autocorrelazione)
dw_test <- dwtest(mod_baseline)

bp_test
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_baseline
## BP = 26.044, df = 7, p-value = 0.0004946
shapiro_test
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(mod_baseline)
## W = 0.8654, p-value < 2.2e-16
jb_test
## 
##  Jarque Bera Test
## 
## data:  residuals(mod_baseline)
## X-squared = 7498.1, df = 2, p-value < 2.2e-16
dw_test
## 
##  Durbin-Watson test
## 
## data:  mod_baseline
## DW = 2.0155, p-value = 0.6189
## alternative hypothesis: true autocorrelation is greater than 0

I test formali confermano alcune delle evidenze già emerse in fase esplorativa. Il test di Breusch–Pagan indica la presenza di eteroschedasticità, ossia una varianza dei residui non costante lungo il dominio dei regressori. I test di normalità (Shapiro–Wilk e Jarque–Bera) segnalano deviazioni dalla distribuzione normale dei residui; tuttavia, data la natura cross–sectional del campione, tali deviazioni non compromettono la consistenza degli stimatori OLS. Il test di Durbin–Watson non evidenzia autocorrelazione seriale, come atteso in un contesto non temporale. Alla luce dell’eteroschedasticità rilevata, l’inferenza viene condotta utilizzando errori standard robusti di tipo HC1.

Le evidenze descrittive avevano inoltre suggerito una possibile relazione non lineare tra età del capofamiglia e reddito, interpretabile in termini di dinamiche di ciclo di vita. Per verificare questa ipotesi viene stimata una specificazione alternativa che include anche il termine quadratico dell’età.

mod_quad <- lm(
  log_reddito_pos ~ 
    eta_capofamiglia +
    I(eta_capofamiglia^2) +
    n_adulti +
    n_carico +
    presenza_casalinga +
    presenza_irregolare +
    presenza_stranieri +
    capo_occupato,
  data = df_pos
)

summary(mod_quad)
## 
## Call:
## lm(formula = log_reddito_pos ~ eta_capofamiglia + I(eta_capofamiglia^2) + 
##     n_adulti + n_carico + presenza_casalinga + presenza_irregolare + 
##     presenza_stranieri + capo_occupato, data = df_pos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.4288 -0.3440  0.1060  0.4993  1.9536 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            7.435e+00  2.911e-01  25.542  < 2e-16 ***
## eta_capofamiglia       3.588e-02  8.800e-03   4.077 4.78e-05 ***
## I(eta_capofamiglia^2) -1.587e-04  6.719e-05  -2.362 0.018298 *  
## n_adulti               3.565e-01  2.386e-02  14.943  < 2e-16 ***
## n_carico               7.266e-02  2.750e-02   2.642 0.008313 ** 
## presenza_casalinga    -2.043e-01  6.052e-02  -3.376 0.000753 ***
## presenza_irregolare   -1.112e-01  4.772e-02  -2.330 0.019952 *  
## presenza_stranieri    -4.259e-01  8.636e-02  -4.931 9.05e-07 ***
## capo_occupato          4.327e-01  5.163e-02   8.382  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7563 on 1546 degrees of freedom
## Multiple R-squared:  0.2103, Adjusted R-squared:  0.2063 
## F-statistic: 51.48 on 8 and 1546 DF,  p-value: < 2.2e-16
# Test congiunto sulla significatività dei termini di età
linearHypothesis(
  mod_quad,
  c("eta_capofamiglia = 0",
    "I(eta_capofamiglia^2) = 0")
)
## 
## Linear hypothesis test:
## eta_capofamiglia = 0
## I(eta_capofamiglia^2) = 0
## 
## Model 1: restricted model
## Model 2: log_reddito_pos ~ eta_capofamiglia + I(eta_capofamiglia^2) + 
##     n_adulti + n_carico + presenza_casalinga + presenza_irregolare + 
##     presenza_stranieri + capo_occupato
## 
##   Res.Df    RSS Df Sum of Sq      F    Pr(>F)    
## 1   1548 933.12                                  
## 2   1546 884.32  2    48.794 42.652 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

L’inclusione del termine quadratico migliora la coerenza economica della specificazione: il coefficiente dell’età risulta positivo mentre quello dell’età al quadrato è negativo, indicando un profilo concavo del reddito lungo il ciclo di vita. Ciò suggerisce che il reddito familiare cresca nelle fasi centrali dell’età lavorativa per poi ridursi nelle età più avanzate, coerentemente con dinamiche di pensionamento o riduzione dell’intensità lavorativa. Il test congiunto conferma che la relazione non può essere adeguatamente rappresentata come puramente lineare.

L’analisi grafica dei residui consente infine di visualizzare la distribuzione degli errori e la loro dispersione rispetto ai valori predetti.

par(mfrow = c(1,2))

# Residuals vs Fitted
plot(
  fitted(mod_quad),
  residuals(mod_quad),
  pch = 16,
  col = rgb(0,0,0,0.4),
  xlab = "Fitted values",
  ylab = "Residuals",
  main = "Residuals vs Fitted"
)
abline(h = 0, col = "red", lwd = 2)

# Q-Q plot
qqnorm(residuals(mod_quad),
       pch = 16,
       col = rgb(0,0,0,0.4))
qqline(residuals(mod_quad),
       col = "red",
       lwd = 2)

par(mfrow = c(1,1))

Il grafico Residuals vs Fitted evidenzia una dispersione non perfettamente costante, coerente con l’esito del test di Breusch–Pagan, mentre il Q–Q plot mostra deviazioni dalla normalità nelle code della distribuzione. Tali evidenze rafforzano la scelta di utilizzare errori standard robusti per l’inferenza.

Infine, si riportano i coefficienti stimati con errori standard robusti HC1.

# SE robusti HC1
robust_se <- vcovHC(mod_quad, type = "HC1")
robust_results <- coeftest(mod_quad, vcov = robust_se)

tab_coef <- tidy(robust_results) %>%
  mutate(
    Variabile = case_when(
      term == "(Intercept)" ~ "Intercetta",
      term == "n_adulti" ~ "Numero adulti",
      term == "n_carico" ~ "Numero individui a carico",
      term == "eta_capofamiglia" ~ "Età capofamiglia",
      term == "I(eta_capofamiglia^2)" ~ "Età capofamiglia²",
      term == "presenza_casalinga" ~ "Presenza casalinga",
      term == "presenza_irregolare" ~ "Presenza irregolare",
      term == "presenza_stranieri" ~ "Presenza stranieri",
      term == "capo_occupato" ~ "Capofamiglia occupato",
      TRUE ~ term
    )
  ) %>%
  select(
    Variabile,
    Coefficiente = estimate,
    `Errore standard` = std.error,
    t = statistic,
    `p-value` = p.value
  )

kable(
  tab_coef,
  digits = 3,
  caption = "Stima OLS con errori standard robusti (HC1)"
) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Stima OLS con errori standard robusti (HC1)
Variabile Coefficiente Errore standard t p-value
Intercetta 7.435 0.390 19.070 0.000
Età capofamiglia 0.036 0.012 3.074 0.002
Età capofamiglia² 0.000 0.000 -1.786 0.074
Numero adulti 0.357 0.031 11.527 0.000
Numero individui a carico 0.073 0.037 1.974 0.049
Presenza casalinga -0.204 0.079 -2.582 0.010
Presenza irregolare -0.111 0.054 -2.074 0.038
Presenza stranieri -0.426 0.108 -3.950 0.000
Capofamiglia occupato 0.433 0.067 6.500 0.000

Poiché la variabile dipendente è espressa in logaritmi, i coefficienti possono essere interpretati come variazioni percentuali approssimate del reddito familiare associate a variazioni unitarie delle covariate. Nel complesso, i risultati indicano che la dotazione di adulti e l’occupazione del capofamiglia agiscono come fattori di protezione reddituale, mentre il carico demografico, la presenza di stranieri e la condizione di irregolarità si associano a livelli inferiori di reddito. La stabilità dei segni e dell’ordine di grandezza dei coefficienti tra la specificazione lineare e quella quadratica rafforza la robustezza complessiva delle evidenze empiriche.

6. Conclusioni

Questo lavoro ha analizzato i determinanti del reddito familiare nel quartiere di Quarticciolo attraverso un modello log–lineare stimato su famiglie con reddito strettamente positivo. I risultati mostrano che la struttura demografica del nucleo e la partecipazione al mercato del lavoro del capofamiglia rappresentano i principali fattori associati al livello di reddito.Poiché la variabile dipendente è in logaritmi, per le dummy l’effetto percentuale è calcolato come \(exp(\beta)-1\).

In termini di magnitudine, l’occupazione del capofamiglia è associata a un incremento del reddito familiare di circa il 54%, confermando il ruolo centrale del mercato del lavoro come meccanismo distributivo locale. Allo stesso modo, ogni adulto aggiuntivo nel nucleo è associato a un aumento del reddito di circa il 43%, mentre la presenza di una casalinga comporta una riduzione stimata intorno al 18%. Particolarmente rilevante è l’effetto della presenza di stranieri nel nucleo familiare: a parità di composizione, età e condizione occupazionale, tale variabile è associata a una riduzione del reddito di circa il 35%. La penalizzazione stimata risulta superiore a quella legata alla condizione di irregolarità amministrativa (circa −10%), suggerendo che il differenziale osservato non sia interamente spiegabile da caratteristiche produttive misurate nel modello, ma possa riflettere meccanismi più ampi di segmentazione e disuguaglianza nelle opportunità economiche.

Nel complesso, l’evidenza empirica suggerisce che la vulnerabilità economica nel quartiere analizzato si strutturi lungo linee che intrecciano composizione familiare, integrazione nel mercato del lavoro e appartenenza migratoria. Le differenze osservate non appaiono quindi puramente individuali, ma radicate in dinamiche strutturali che contribuiscono a produrre e riprodurre disuguaglianze economiche nel contesto urbano considerato.