Hay datos disponibles públicamente que describen el estado socioeconómico de un lugar. En Australia, donde vivo, el Gobierno, a través de la Oficina Australiana de Estadísticas (ABS), recopila y publica periódicamente datos individuales y de hogares sobre ingresos, empleo, educación, empleo y vivienda en cada región. Algunos ejemplos de información publicada incluyen:
- Población con ingresos altos/bajos
- El número de personas que son nombradas como directivos en su profesión.
- Número de personas sin educación superior
- El número de personas que están desempleadas
- Porcentaje de propiedades con 4 o más dormitorios
Aunque estos puntos de datos parecen centrarse en cada individuo, muestran claramente cómo las personas tienen acceso a los recursos económicos y sociales, así como su capacidad para participar en una comunidad particular e informar la calidad de la cultura y la economía de la comunidad.
Teniendo en cuenta estos datos, ¿hay alguna manera de obtener puntuaciones que coincidan con las áreas de los menos privilegiados?
Un objetivo de puntuación puede enmarcar esto como un problema de regresión, donde cada punto o forma de datos se utiliza para predecir un cambio en el objetivo, en este caso, un valor numérico. Esto requiere flexibilidad que desea estar presente en momentos al entrenar un modelo predictivo.
Sin embargo, dado que para empezar no tenemos un objetivo, es posible que tengamos que abordar este problema de una manera diferente. Por ejemplo, suponiendo que cada región es diferente en términos de cultura popular, ¿podemos pensar en comprender qué factores pueden ayudar a explicar las grandes diferencias, de modo que obtengamos estadísticas basadas en la combinación de los números de estos factores?
Podemos hacer exactamente eso usando un método llamado Análisis de Componentes Principales (PCA), ¡y este artículo muestra cómo!
La ABS publica datos que muestran el estatus socioeconómico del área en la sección “Descarga de datos” de este sitio web, en el “Cubo de datos de proporciones variables estandarizadas”.[1]. Estos puntos de datos se publican en el nivel del Área estadística 1 (SA1), que es una frontera digital que separa a Australia en áreas de aproximadamente 200 a 800 personas. Este es un límite digital más grande en comparación con un código postal (Zipcode) o un límite digital de estado.
A los efectos de la presentación en este artículo, encuentro las estadísticas sociales y económicas basadas en 14 de los 44 puntos publicados en la Tabla 1 de la fuente de datos anterior (explicaré por qué y elegiré una pequeña sección más adelante). Estos son :
- INC_LOW: Porcentaje de personas que viven en hogares con un ingreso anual promedio entre $1 y $25,999 AUD
- INC_HIGH: Número de personas con unos ingresos anuales superiores a los $91.000 AUD
- UNEMPLOYED_IER: Porcentaje de personas de 15 y más años que están desempleadas
- CAMA ALTA: Porcentaje de propiedades con cuatro o más dormitorios
- HIGHPORTGAGE: Porcentaje de propiedades residenciales con pagos de hipoteca superiores a $2.800 AUD al mes
- RENTA BAJO: Porcentaje de propiedades residenciales que pagan menos de $250 AUD por semana
- HIPOTECA: El porcentaje de activos que las personas poseen sin hipoteca
- HIPOTECA: El porcentaje de viviendas que las personas poseen con una hipoteca.
- GRUPO: El porcentaje de propiedad propiedad de personas que viven en un grupo (como una casa o unidad).
- INDIVIDUAL: El porcentaje de propiedad que es propiedad de un individuo.
- ANULACIÓN: El porcentaje de viviendas ocupadas que requieren una o más habitaciones adicionales (según el Estándar Nacional de Ocupación de Canadá)
- NOCAR: Porcentaje de zonas sin coches
- MONOPADRES: Porcentaje de familias monoparentales
- UINCORP: Porcentaje de propiedad propiedad de una persona propietaria del negocio
En esta sección, revisaré el código Python para encontrar la demografía de SA1 en Australia usando PCA.
Comenzaré descargando los paquetes y datos esenciales de Python.
## 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()
Lo más importante que hay que limpiar antes de realizar PCA es detener cada uno de los 14 puntos de datos (los indicadores) para que tengan una media de 0 y una varianza de 1. Esto es especialmente importante para asegurarse de que la carga asignada a cada parte por el PCA (piense en ellos como indicadores de la importancia de un factor) es el mismo y tiene la misma forma. De lo contrario, se puede dar demasiado énfasis, o demasiado énfasis, a algo que no es importante o viceversa.
Tenga en cuenta que la fuente de datos ABS mencionada anteriormente tiene un formato fijo. Dicho esto, para una fuente de datos no oficial:
## 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 datos estructurados, PCA se puede realizar en tan solo unas pocas líneas de código:
## Perform PCApca = PCA()
pca.fit_transform(data_final)
PCA tiene como objetivo representar el contenido de Componentes Principales (PC). La cantidad de PC presentadas en PCA es proporcional a la cantidad de elementos en los datos. En este caso se devuelven 14 PC.
Cada PC es una combinación de una línea de todos los productos estándar, que se distingue por la actualización de sus funciones estándar. Por ejemplo, la siguiente imagen muestra las actualizaciones asignadas a la primera y segunda PC (PC1 y PC2) y la interfaz.
Con 14 PC, el número a continuación da una idea de cuánta variación tiene cada 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()
Como se muestra en la figura siguiente, el Componente Principal 1 (PC1) representa la mayor parte de la variación en los datos originales, y cada PC posterior explica menos variación. De hecho, PC1 describe el ciclo. El 35% de los datos cambian.
A los efectos de la presentación de este artículo, se ha elegido el PC1 como el único PC para obtener estadísticas socioeconómicas, por las siguientes razones:
- PC1 describe la variación más significativa dentro de los datos para una variable en particular.
- Aunque la selección de muchos PC conduce a una descripción (ligeramente) heterogénea, dificulta una mejor interpretación basada en las ventajas y desventajas socioeconómicas de una región en particular. Por ejemplo, como se muestra en la figura, PC1 y PC2 pueden proporcionar explicaciones contradictorias sobre cómo un determinado parámetro (como ‘INC_LOW’) afecta el cambio socioeconómico de una región.
## 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()
Para obtener una puntuación para cada SA1, simplemente multiplicamos la desviación estándar de cada componente restándole PC1. Esto se puede lograr mediante:
## 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()
Cuanto mayor sea la puntuación, más beneficioso será el SA1 en términos de oportunidades económicas y sociales.
¿Cómo sabemos que los resultados que obtuvimos anteriormente fueron remotamente precisos?
En su declaración, la ABS publicó en realidad un índice económico llamado Índice de Recursos Económicos (IER), que se describe en el sitio web de la ABS como:
“El Índice de Recursos Económicos (IER) se centra en los beneficios y problemas económicos, resumiendo los relacionados con los ingresos y la vivienda. El IER excluye los cambios en educación y empleo porque no están directamente relacionados con la economía. También excluye activos como los ahorros. o ingresos que, aunque sean procedentes, no pueden incluirse por no estar recogidos en el Censo.
Sin detallar los pasos, la ABS declaró en su documento técnico que el IER se obtuvo utilizando los mismos factores (14) y método (PCA, solo PC1) que hicimos anteriormente. Es decir, si obtenemos el puntaje correcto, se debe comparar con el puntaje IER publicado aquí (“Área Estadística Nivel 1, Índices, SEIFA 2021.xlsx”, Tabla 4).
Cuando la tasa de interés publicada es igual a 1000 con una desviación estándar de 100, comenzamos a verificar probando que el número es igual:
## Standardise raw scoresscore_SA1['IER_recreated'] =
(score_SA1['Score_Raw']/score_SA1['Score_Raw'].std())*100 + 1000
En comparación, leemos en el documento IER publicado por 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)
Verificación 1- Cargas PC1
Como se muestra en la figura, la comparación de las descargas de PC1 con las descargas de PC1 anteriores publicadas por ABS muestra que difieren entre sí en un -45%. Dado que se trata solo de una variable aleatoria, no afecta las estadísticas establecidas (media de 1000 con una desviación estándar de 100).
(Debe verificar la columna ‘Derivada (A)’ y la elevación del PC1 en la Figura 1).
Prueba 2- Distribución de puntos
El siguiente código crea un histograma de ambas puntuaciones, cuya forma parece la misma.
## 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()
Validación 3- Éxito de IER y SA1
Como confirmación final, comparemos las puntuaciones de IER y 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 línea diagonal recta como se muestra en la siguiente figura ayuda a garantizar que las dos puntuaciones sean iguales.
Además de esto, el siguiente número muestra que estas dos estadísticas tienen una correlación cercana a 1:
La ilustración de este artículo proporciona una comparación detallada de cómo la ABS evalúa el IER, uno de los cuatro indicadores socioeconómicos que publica, que se puede utilizar para evaluar el estatus socioeconómico de una región.
En retrospectiva, lo que realmente hemos logrado es reducir la cantidad de datos de 14 a 1, perdiendo la mayor parte de la información proporcionada por los datos.
También se suele considerar que un método de reducción de características, como PCA, ayuda a reducir áreas de alto nivel, como clasificar el texto en 2 o 3 componentes principales (visuales).