--- name: pca_explained kind: function lang: py domain: datascience version: "1.0.0" purity: pure signature: "def pca_explained(columns: dict, n_components: int = 2) -> dict" description: "PCA rapido sobre columnas numericas: estandariza (z-score), descarta filas con valores faltantes y ajusta sklearn PCA determinista para revelar estructura latente y cuanta varianza concentran pocos componentes. EDA barato." tags: [eda, models, pca, dimensionality-reduction, variance, datascience, sklearn] params: - name: columns desc: "Mapa {nombre_columna: [valores numericos]}. Listas alineadas por fila (misma longitud). Columnas no numericas o constantes se descartan; None/NaN marcan filas a descartar." - name: n_components desc: "Numero maximo de componentes principales (default 2). Se acota a min(n_features, n_filas_validas)." output: "dict con n_components, n_rows_used, n_features, explained_variance_ratio (lista), cumulative (lista), top_loadings (lista de {component, feature, loading}) y projection (matriz cap a 1000 filas). Con <2 columnas numericas o <3 filas validas devuelve {n_components:0, explained_variance_ratio:[], note:'datos insuficientes'}." uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "" imports: [numpy, scikit-learn] tested: true tests: ["test_pc1_concentra_varianza_con_columnas_colineales", "test_una_sola_columna_numerica_datos_insuficientes", "test_pocas_filas_validas_datos_insuficientes"] test_file_path: "python/functions/datascience/pca_explained_test.py" file_path: "python/functions/datascience/pca_explained.py" --- ## Ejemplo ```python from datascience import pca_explained # x e y casi colineales (y ~= 2x); z independiente. n = 50 cols = { "x": [float(i) for i in range(n)], "y": [2.0 * i for i in range(n)], "z": [float((i * 7) % 13) for i in range(n)], } res = pca_explained(cols, n_components=2) # res["explained_variance_ratio"][0] > 0.6 -> PC1 concentra la varianza # res["cumulative"][-1] ~ 1.0 con 2 componentes sobre 3 features # res["top_loadings"][0] -> {"component": 0, "feature": "x" o "y", "loading": ...} ``` ## Cuando usarla Cuando exploras un dataset tabular numerico y quieres ver, de un vistazo y sin montar un pipeline, si pocas dimensiones explican casi toda la varianza (alta correlacion entre columnas) y que features pesan en cada componente. Util como primer paso de EDA antes de decidir reduccion de dimensionalidad o seleccion de variables. Pasa las columnas alineadas por fila; la funcion limpia filas con faltantes y estandariza por ti. ## Notas Funcion pura y determinista: estandariza con `StandardScaler`, ajusta `sklearn.decomposition.PCA` con `random_state=0`. No hace I/O. Las columnas no numericas o que no pueden coercerse a float se descartan; los None se tratan como NaN y eliminan la fila completa. `projection` se acota a las primeras 1000 filas para mantener la salida manejable. Degrada con gracia: con menos de 2 columnas numericas o menos de 3 filas validas devuelve `note: "datos insuficientes"` sin lanzar excepcion.