univariate_analysis
Descripción General
Módulo de análisis estadístico descriptivo univariado. Proporciona estadísticas completas y visualizaciones interactivas para variables individuales.
Clases Principales
UnivariateAnalyzer
Métodos de Análisis
analyze_numeric_variable
Análisis completo de variable numérica.
- Parameters:
column(str): Nombre de la columna a analizar
- Returns:
Diccionario con estadísticas completas
Estadísticas calculadas:
Tendencia central: media, mediana, moda
Dispersión: desviación estándar, varianza, rango, IQR
Forma: asimetría (skewness), curtosis
Percentiles: P5, Q1, Q3, P95
Normalidad: Test de Shapiro-Wilk o Kolmogorov-Smirnov
Outliers: Detección mediante método IQR
Ejemplo:
stats = analyzer.analyze_numeric_variable('edad')
print(f"Media: {stats['mean']:.2f}")
print(f"Desviación estándar: {stats['std']:.2f}")
print(f"Asimetría: {stats['skewness']:.3f}")
print(f"Es normal: {stats['is_normal']}")
print(f"Outliers: {stats['outliers_count']} ({stats['outliers_pct']:.1f}%)")
analyze_categorical_variable
Análisis completo de variable categórica.
- Parameters:
column(str): Nombre de la columna a analizar
- Returns:
Diccionario con estadísticas
Estadísticas calculadas:
Conteo: total de observaciones, valores únicos
Moda: categoría más frecuente y su porcentaje
Distribución: frecuencias absolutas y relativas
Entropía: Medida de diversidad de categorías
Ejemplo:
stats = analyzer.analyze_categorical_variable('nivel_riesgo')
print(f"Valores únicos: {stats['unique_values']}")
print(f"Moda: {stats['mode']} ({stats['mode_percentage']:.1f}%)")
print(f"Entropía: {stats['entropy']:.3f}")
# Ver distribución
for categoria, frecuencia in stats['value_counts'].items():
porcentaje = stats['frequencies'][categoria]
print(f"{categoria}: {frecuencia} ({porcentaje:.1f}%)")
Métodos de Visualización
create_numeric_visualizations
Crea visualizaciones para variable numérica.
- Parameters:
column(str): Nombre de la columna
- Returns:
Diccionario con figuras de Plotly
Visualizaciones generadas:
Histograma con KDE: Distribución de frecuencias con curva de densidad
Boxplot: Diagrama de caja con outliers
Q-Q Plot: Evaluación de normalidad
ECDF: Función de distribución empírica acumulada
Ejemplo:
figures = analyzer.create_numeric_visualizations('puntaje_datacredito')
# Mostrar histograma
figures['histogram'].show()
# Mostrar boxplot
figures['boxplot'].show()
create_categorical_visualizations
Crea visualizaciones para variable categórica.
- Parameters:
column(str): Nombre de la columna
- Returns:
Diccionario con figuras de Plotly
Visualizaciones generadas:
Gráfico de barras: Frecuencias por categoría
Gráfico de torta: Distribución porcentual
Funciones de Renderizado
render_univariate_analysis
Renderiza el módulo de análisis univariado en Streamlit.
- Funcionalidades:
Selector interactivo de variables
Análisis automático según tipo de variable
Visualizaciones interactivas
Interpretaciones estadísticas
render_numeric_analysis
Renderiza análisis específico para variable numérica.
- Parameters:
analyzer(UnivariateAnalyzer): Analizador inicializadocolumn(str): Nombre de la columnadf(DataFrame): DataFrame con datos
render_categorical_analysis
Renderiza análisis específico para variable categórica.
- Parameters:
analyzer(UnivariateAnalyzer): Analizador inicializadocolumn(str): Nombre de la columnadf(DataFrame): DataFrame con datos
render_univariate_module
Función principal para renderizar el módulo univariado completo.
Tests Estadísticos
Test de Normalidad
El módulo implementa dos tests de normalidad:
Shapiro-Wilk: Para n < 5000 muestras
Kolmogorov-Smirnov: Para n ≥ 5000 muestras
- Interpretación:
p-value > 0.05: Distribución normal
p-value ≤ 0.05: No sigue distribución normal
Detección de Outliers
Método IQR (Rango Intercuartílico):
- Donde:
Q1 = Cuartil 1 (percentil 25)
Q3 = Cuartil 3 (percentil 75)
IQR = Q3 - Q1
Interpretación de Estadísticas
Asimetría (Skewness)
< -1: Asimetría negativa fuerte (cola izquierda)
-1 a -0.5: Asimetría negativa moderada
-0.5 a 0.5: Aproximadamente simétrica
0.5 a 1: Asimetría positiva moderada
> 1: Asimetría positiva fuerte (cola derecha)
Curtosis
< 0: Platicúrtica (más plana que normal)
≈ 0: Mesocúrtica (similar a normal)
> 0: Leptocúrtica (más puntiaguda que normal)
Coeficiente de Variación
< 15%: Baja variabilidad
15-30%: Variabilidad moderada
> 30%: Alta variabilidad
Ejemplo Completo de Análisis
from src.univariate_analysis import UnivariateAnalyzer
import pandas as pd
# Cargar datos
df = pd.read_csv("datos_credito_hipotecario_realista.csv")
# Crear analizador
analyzer = UnivariateAnalyzer(df)
# Analizar salario
stats_salario = analyzer.analyze_numeric_variable('salario_mensual')
print("=== ANÁLISIS DE SALARIO MENSUAL ===")
print(f"Observaciones: {stats_salario['count']:,}")
print(f"Media: ${stats_salario['mean']:,.0f}")
print(f"Mediana: ${stats_salario['median']:,.0f}")
print(f"Desv. Estándar: ${stats_salario['std']:,.0f}")
print(f"Coef. Variación: {stats_salario['cv']:.1f}%")
print(f"Asimetría: {stats_salario['skewness']:.3f}")
print(f"Outliers: {stats_salario['outliers_count']} ({stats_salario['outliers_pct']:.1f}%)")
# Crear visualizaciones
figures = analyzer.create_numeric_visualizations('salario_mensual')
figures['histogram'].write_html("histograma_salario.html")
# Analizar nivel de riesgo
stats_riesgo = analyzer.analyze_categorical_variable('nivel_riesgo')
print("\n=== ANÁLISIS DE NIVEL DE RIESGO ===")
print(f"Categorías: {stats_riesgo['unique_values']}")
print(f"Moda: {stats_riesgo['mode']} ({stats_riesgo['mode_percentage']:.1f}%)")
print("\nDistribución:")
for cat, pct in stats_riesgo['frequencies'].items():
print(f" {cat}: {pct:.1f}%")
Ver también
bivariate_analysis - Análisis bivariado
data_processor - Procesamiento de datos
feature_engineering - Ingeniería de características