<jupyter_start><jupyter_text>Si no se estandarizan las variables para que tengan media cero y desviación estándar de uno antes de realizar el estudio PCA, la variable Assault, que tiene una media y dispersión muy superior al resto, dominará la mayoría de las componentes principales<jupyter_code># Entrenamiento modelo PCA con escalado de los datos
# ==============================================================================


# Se extrae el modelo entrenado del pipeline

# Se combierte el array a dataframe para añadir nombres a los ejes.<jupyter_output><empty_output><jupyter_text>Analizar con detalle el vector de loadings que forma cada componente puede ayudar a interpretar qué tipo de información recoge cada una de ellas. Por ejemplo, la primera componente es el resultado de la siguiente combinación lineal de las variables originales:PC1=0.535899 Murder+0.583184 Assault+0.278191 UrbanPop+0.543432 Rape La influencia de las variables en cada componente analizarse visualmente con un gráfico de tipo heatmap.<jupyter_code># Heatmap componentes
# ==============================================================================

# Porcentaje de varianza explicada por cada componente
# ==============================================================================
print('----------------------------------------------------')
print('Porcentaje de varianza explicada por cada componente')
print('----------------------------------------------------')
print(modelo_pca.explained_variance_ratio_)

fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(6, 4))
ax.bar(
    x      = np.arange(modelo_pca.n_components_) + 1,
    height = modelo_pca.explained_variance_ratio_
)

for x, y in zip(np.arange(len(datos.columns)) + 1, modelo_pca.explained_variance_ratio_):
    label = round(y, 2)
    ax.annotate(
        label,
        (x,y),
        textcoords="offset points",
        xytext=(0,10),
        ha='center'
    )

ax.set_xticks(np.arange(modelo_pca.n_components_) + 1)
ax.set_ylim(0, 1.1)
ax.set_title('Porcentaje de varianza explicada por cada componente')
ax.set_xlabel('Componente principal')
ax.set_ylabel('Por. varianza explicada');
# Porcentaje de varianza explicada acumulada
# ==============================================================================
prop_varianza_acum = modelo_pca.explained_variance_ratio_.cumsum()
print('------------------------------------------')
print('Porcentaje de varianza explicada acumulada')
print('------------------------------------------')
print(prop_varianza_acum)

fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(6, 4))
ax.plot(
    np.arange(len(datos.columns)) + 1,
    prop_varianza_acum,
    marker = 'o'
)

for x, y in zip(np.arange(len(datos.columns)) + 1, prop_varianza_acum):
    label = round(y, 2)
    ax.annotate(
        label,
        (x,y),
        textcoords="offset points",
        xytext=(0,10),
        ha='center'
    )
    
ax.set_ylim(0, 1.1)
ax.set_xticks(np.arange(modelo_pca.n_components_) + 1)
ax.set_title('Porcentaje de varianza explicada acumulada')
ax.set_xlabel('Componente principal')
ax.set_ylabel('Por. varianza acumulada');<jupyter_output>------------------------------------------
Porcentaje de varianza explicada acumulada
------------------------------------------
[0.62006039 0.86750168 0.95664248 1.        ]<jupyter_text>Si se empleasen únicamente las dos primeras componentes se conseguiría explicar el 87% de la varianza observada. Una vez entrenado el modelo, con el método transform() se puede reducir la dimensionalidad de nuevas observaciones proyectándolas en el espacio definido por las componentes.<jupyter_code># Proyección de las observaciones de entrenamiento
# ==============================================================================<jupyter_output><empty_output><jupyter_text>La transformación es el resultado de multiplicar los vectores que definen cada componente con el valor de las variables. Puede calcularse de forma manual: Puede revertirse la transformación y reconstruir el valor inicial con el método inverse_transform(). Es importante tener en cuenta que, la reconstrucción, solo será completa si se han incluido todas las componentes.<jupyter_code># Recostruccion de las proyecciones
# ==============================================================================

print('------------------')
print('Valores originales')
print('------------------')
display(reconstruccion.head())

print('---------------------')
print('Valores reconstruidos')
print('---------------------')
display(datos.head())<jupyter_output>------------------
Valores originales
------------------
{'fraction_non_alphanumeric': 0.2580364900086881, 'fraction_numerical': 0.018896611642050393, 'mean_word_length': 3.5729890764647467, 'pattern_counts': {'":': 0, '<': 15, '<?xml version=': 0, '>': 15, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '15690', 'license': 'MIT', 'n_tokens_mistral': 1422, 'n_tokens_neox': 1329, 'n_words': 379, 'path': '4-Machine_Learning/2-No Supervisado/1-PCA/PCA_USArrest - Clase.ipynb', 'repo_name': 'erfederuiz/thebridge_ft_nov21', 'size': '4604'}