Esistono dati accessibili al pubblico che descrivono le caratteristiche socioeconomiche di una località geografica. In Australia, dove risiedo, il governo attraverso il Ufficio australiano di statistica (ABS) raccoglie e pubblica regolarmente dati individuali e familiari relativi a reddito, occupazione, istruzione, occupazione e alloggio a livello di area. Alcuni esempi di punti dati pubblicati includono:
- Percentuale di persone con reddito relativamente alto/basso
- Percentuale di persone classificate come manager nelle rispettive occupazioni
- Percentuale di persone senza alcun livello di istruzione formale
- Percentuale di disoccupati
- Percentuale di immobili con 4 o più camere da letto
Sebbene questi dati sembrino concentrarsi fortemente sulle singole persone, riflettono l’accesso delle persone alle risorse materiali e sociali e la loro capacità di partecipare alla società in una particolare area geografica, informando in definitiva sui vantaggi e svantaggi socioeconomici di quest’area.
Considerati questi dati, esiste un modo per ricavare un punteggio che classifichi le aree geografiche dalla più a quella meno avvantaggiata?
L’obiettivo di ricavare un punteggio può formularlo come un problema di regressione, in cui ciascun punto dati o caratteristica viene utilizzato per prevedere una variabile target, in questo scenario, un punteggio numerico. Ciò richiede che la variabile target sia disponibile in alcuni casi per l’addestramento del modello predittivo.
Tuttavia, poiché non disponiamo di una variabile target con cui iniziare, potrebbe essere necessario affrontare il problema in un altro modo. Ad esempio, partendo dal presupposto che ciascuna area geografica è diversa da un punto di vista socioeconomico, possiamo mirare a capire quali punti dati aiutano a spiegare la maggior parte delle variazioni, derivando così un punteggio basato su una combinazione numerica di questi punti dati.
Possiamo fare esattamente questo utilizzando una tecnica chiamata Analisi delle componenti principali (PCA) e questo articolo dimostra come!
ABS pubblica nella sezione “Download Dati” della presente ABS i dati che indicano le caratteristiche socio-economiche di un’area geografica pagina webnel “Cubo dati Proporzioni variabili standardizzate”(1). Questi punti dati sono pubblicati su Area statistica 1 (SA1) livello, che è un confine digitale che segrega l’Australia in aree di popolazione di circa 200-800 persone. Si tratta di un confine digitale molto più granulare rispetto al codice postale (codice postale) o al confine digitale dello Stato.
A scopo dimostrativo in questo articolo, deriverò un punteggio socioeconomico basato su 14 dei 44 punti dati pubblicati forniti nella Tabella 1 della fonte dati sopra (spiegherò perché seleziono questo sottoinsieme più avanti ). Questi sono :
- INC_LOW: percentuale di persone che vivono in famiglie con reddito familiare annuo equivalente dichiarato compreso tra $ 1 e $ 25.999 AUD
- INC_HIGH: percentuale di persone con reddito familiare annuo equivalente dichiarato superiore a $ 91.000 AUD
- UNEMPLOYED_IER: percentuale di persone di 15 anni e più che sono disoccupate
- LETTO ALTO: percentuale di proprietà private occupate con quattro o più camere da letto
- HIGHMORTGAGE: percentuale di proprietà private occupate che pagano un mutuo superiore a $ 2.800 AUD al mese
- AFFITTO BASSO: percentuale di proprietà private occupate che pagano un affitto inferiore a $ 250 AUD a settimana
- PROPRIETÀ: percentuale di immobili privati occupati senza ipoteca
- MUTUO: percentuale delle proprietà private occupate con mutuo
- GRUPPO: percentuale di proprietà private occupate che sono proprietà private occupate in gruppo (ad esempio appartamenti o unità)
- LONE: percentuale di proprietà occupate che sono proprietà private occupate da una persona sola
- SOVRAFFOLLAMENTO: percentuale di proprietà private occupate che richiedono una o più camere da letto aggiuntive (sulla base dello standard nazionale canadese di occupazione)
- NOCAR: Percentuale di proprietà private occupate senza auto
- UN GENITORE: Percentuale di famiglie con un solo genitore
- UNINCORP: Percentuale di immobili con almeno una persona che è titolare di un’impresa
In questa sezione analizzerò dettagliatamente il codice Python per ricavare un punteggio socioeconomico per una regione SA1 in Australia utilizzando PCA.
Inizierò caricando i pacchetti Python richiesti e i dati.
## Load the required Python packages### For dataframe operations
import numpy as np
import pandas as pd
### For PCA
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
### For Visualization
import matplotlib.pyplot as plt
import seaborn as sns
### For Validation
from scipy.stats import pearsonr
## Load datafile1 = 'data/standardised_variables_seifa_2021.xlsx'
### Reading from Table 1, from row 5 onwards, for column A to AT
data1 = pd.read_excel(file1, sheet_name = 'Table 1', header = 5,
usecols = 'A:AT')
## Remove rows with missing value (113 out of 60k rows)data1_dropna = data1.dropna()
Un passo importante di pulizia prima di eseguire la PCA è quello di standardizzare ciascuno dei 14 punti dati (caratteristiche) su una media di 0 e una deviazione standard di 1. Questo serve principalmente per garantire i carichi assegnati a ciascuna caratteristica dalla PCA (considerarli come indicatori di quanto è importante una funzionalità) sono comparabili tra le funzionalità. Altrimenti, si potrebbe dare più enfasi, o un carico maggiore, a una caratteristica che in realtà non è significativa o viceversa.
Si noti che la fonte dati ABS citata sopra ha già le funzionalità standardizzate. Detto questo, per un’origine dati non standardizzata:
## Standardise data for PCA### Take all but the first column which is merely a location indicator
data_final = data1_dropna.iloc(:,1:)
### Perform standardisation of data
sc = StandardScaler()
sc.fit(data_final)
### Standardised data
data_final = sc.transform(data_final)
Con i dati standardizzati, la PCA può essere eseguita in poche righe di codice:
## Perform PCApca = PCA()
pca.fit_transform(data_final)
PCA mira a rappresentare i dati sottostanti per Componenti Principali (PC). Il numero di PC forniti in una PCA è pari al numero di funzionalità standardizzate nei dati. In questo caso vengono restituiti 14 PC.
Ogni PC è una combinazione lineare di tutte le funzionalità standardizzate, differenziato solo dai rispettivi caricamenti della funzionalità standardizzata. Ad esempio, l’immagine seguente mostra i carichi assegnati al primo e al secondo PC (PC1 e PC2) per funzione.
Con 14 PC, il codice seguente fornisce una visualizzazione della variazione spiegata da ciascun PC:
## Create visualization for variations explained by each PCexp_var_pca = pca.explained_variance_ratio_
plt.bar(range(1, len(exp_var_pca) + 1), exp_var_pca, alpha = 0.7,
label = '% of Variation Explained',color = 'darkseagreen')
plt.ylabel('Explained Variation')
plt.xlabel('Principal Component')
plt.legend(loc = 'best')
plt.show()
Come illustrato nella visualizzazione dell’output di seguito, il Componente Principale 1 (PC1) rappresenta la percentuale maggiore di varianza nel set di dati originale, mentre ciascun PC successivo spiega una parte minore della varianza. Per essere precisi, PC1 spiega circa. 35% della variazione all’interno dei dati.
Ai fini della dimostrazione in questo articolo, PC1 è scelto come unico PC per ricavare il punteggio socioeconomico, per i seguenti motivi:
- PC1 spiega una variazione sufficientemente ampia all’interno dei dati su base relativa.
- Sebbene la scelta di più PC consenta potenzialmente di spiegare (marginalmente) più variazioni, rende difficile l’interpretazione del punteggio nel contesto del vantaggio e dello svantaggio socioeconomico di una particolare area geografica. Ad esempio, come mostrato nell’immagine seguente, PC1 e PC2 possono fornire narrazioni contrastanti su come una particolare caratteristica (ad esempio “INC_LOW”) influenza la variazione socioeconomica di un’area geografica.
## Show and compare loadings for PC1 and PC2### Using df_plot dataframe per Image 1
sns.heatmap(df_plot, annot = False, fmt = ".1f", cmap = 'summer')
plt.show()
Per ottenere un punteggio per ciascun SA1, moltiplichiamo semplicemente la porzione standardizzata di ciascuna funzionalità per il relativo caricamento PC1. Ciò può essere ottenuto:
## Obtain raw score based on PC1### Perform sum product of standardised feature and PC1 loading
pca.fit_transform(data_final)
### Reverse the sign of the sum product above to make output more interpretable
pca_data_transformed = -1.0*pca.fit_transform(data_final)
### Convert to Pandas dataframe, and join raw score with SA1 column
pca1 = pd.DataFrame(pca_data_transformed(:,0), columns = ('Score_Raw'))
score_SA1 = pd.concat((data1_dropna('SA1_2021').reset_index(drop = True), pca1)
, axis = 1)
### Inspect the raw score
score_SA1.head()
Più alto è il punteggio, più un SA1 è avvantaggiato in termini di accesso alle risorse socio-economiche.
Come facciamo a sapere che il punteggio che abbiamo derivato sopra fosse anche lontanamente corretto?
Per contestualizzare, l’ABS ha effettivamente pubblicato un punteggio socioeconomico chiamato Indice delle risorse economiche (IER)definito sul sito web dell’ABS come:
“L’Indice delle risorse economiche (IER) si concentra sugli aspetti finanziari del relativo vantaggio e svantaggio socioeconomico, riassumendo le variabili relative al reddito e all’abitazione. L’IER esclude le variabili relative all’istruzione e all’occupazione poiché non sono misure dirette delle risorse economiche. Esclude inoltre beni come risparmi o azioni che, sebbene rilevanti, non possono essere incluse in quanto non raccolte nel censimento.
Senza rivelare i passaggi dettagliati, l’ABS ha dichiarato nel loro Documento tecnico che l’IER è stato derivato utilizzando le stesse caratteristiche (14) e metodologia (solo PCA, PC1) di quanto avevamo eseguito in precedenza. Cioè, se ricavassimo i punteggi corretti, dovrebbero essere confrontabili con il punteggio IER pubblicato Qui (“Area Statistica Livello 1, Indici, SEIFA 2021.xlsx”, Tabella 4).
Poiché il punteggio pubblicato è standardizzato su una media di 1.000 e una deviazione standard di 100, iniziamo la validazione standardizzando lo stesso punteggio grezzo:
## Standardise raw scoresscore_SA1('IER_recreated') =
(score_SA1('Score_Raw')/score_SA1('Score_Raw').std())*100 + 1000
Per confronto, leggiamo nei punteggi IER pubblicati da SA1:
## Read in ABS published IER scores
## similarly to how we read in the standardised portion of the featuresfile2 = 'data/Statistical Area Level 1, Indexes, SEIFA 2021.xlsx'
data2 = pd.read_excel(file2, sheet_name = 'Table 4', header = 5,
usecols = 'A:C')
data2.rename(columns = {'2021 Statistical Area Level 1 (SA1)': 'SA1_2021', 'Score': 'IER_2021'}, inplace = True)
col_select = ('SA1_2021', 'IER_2021')
data2 = data2(col_select)
ABS_IER_dropna = data2.dropna().reset_index(drop = True)
Convalida 1— Caricamenti PC1
Come mostrato nell’immagine seguente, confrontando il carico PC1 derivato sopra con quello Caricamento PC1 pubblicato dall’ABS suggerisce che differiscono di una costante del -45%. Poiché si tratta semplicemente di una differenza di scala, non influisce sui punteggi derivati che sono standardizzati (a una media di 1.000 e una deviazione standard di 100).
(Dovresti essere in grado di verificare la colonna “Derivato (A)” con i caricamenti PC1 nell’immagine 1).
Validazione 2— Distribuzione dei punteggi
Il codice seguente crea un istogramma per entrambi i punteggi, le cui forme sembrano quasi identiche.
## Check distribution of scoresscore_SA1.hist(column = 'IER_recreated', bins = 100, color = 'darkseagreen')
plt.title('Distribution of recreated IER scores')
ABS_IER_dropna.hist(column = 'IER_2021', bins = 100, color = 'lightskyblue')
plt.title('Distribution of ABS IER scores')
plt.show()
Convalida 3: punteggio IER tramite SA1
Come convalida finale, confrontiamo i punteggi IER di SA1:
## Join the two scores by SA1 for comparison
IER_join = pd.merge(ABS_IER_dropna, score_SA1, how = 'left', on = 'SA1_2021')## Plot scores on x-y axis.
## If scores are identical, it should show a straight line.
plt.scatter('IER_recreated', 'IER_2021', data = IER_join, color = 'darkseagreen')
plt.title('Comparison of recreated and ABS IER scores')
plt.xlabel('Recreated IER score')
plt.ylabel('ABS IER score')
plt.show()
Una linea retta diagonale, come mostrata nell’immagine di output di seguito, conferma che i due punteggi sono in gran parte identici.
In aggiunta a ciò, il codice seguente mostra che i due punteggi hanno una correlazione prossima a 1:
La dimostrazione contenuta in questo articolo replica efficacemente il modo in cui l’ABS calibra l’IER, uno dei quattro indici socioeconomici che pubblica, che può essere utilizzato per classificare lo stato socioeconomico di un’area geografica.
Facendo un passo indietro, ciò che abbiamo ottenuto in sostanza è una riduzione della dimensione dei dati da 14 a 1, perdendo alcune informazioni veicolate dai dati.
La tecnica di riduzione della dimensionalità come la PCA è comunemente vista anche come utile per ridurre lo spazio ad alta dimensione come l’incorporamento del testo a 2-3 componenti principali (visualizzabili).
Fonte: towardsdatascience.com