CoolFace
Apppublic

FLOR22/REGRESION_CUADRATICA_2

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
app.py238 linesDownload Raw Back to root
1 2 3import pandas as pd4import numpy as np5import gradio as gr6import matplotlib.pyplot as plt7 8# Variables globales9df = None10b0, b1, b2, r_squared = None, None, None, None11 12# Función para cargar datos13def cargar_datos(file):14    global df15    try:16        if file.name.endswith('.xlsx'):17            df = pd.read_excel(file.name)18        elif file.name.endswith('.csv'):19            df = pd.read_csv(file.name)20        else:21            return None, None, None, "Formato de archivo no soportado. Sube un archivo CSV o Excel."22 23        columnas = df.columns.tolist()24        return df.head(), columnas, columnas, "Datos cargados con éxito."25    except Exception as e:26        return None, None, None, f"Error al cargar datos: {str(e)}"27 28# Función para calcular el modelo cuadrático y resultados detallados29def calcular_modelo_detallado(var_independiente, var_dependiente):30    global b0, b1, b2, r_squared, df31    if df is None:32        return None, None, "Error: No se han cargado datos."33 34    try:35        # Verificar si las columnas seleccionadas existen en el DataFrame36        if var_independiente not in df.columns or var_dependiente not in df.columns:37            return None, None, "Error: Selecciona columnas válidas."38 39        # Crear columnas necesarias40        df["Xi"] = df[var_independiente]41        df["Yi"] = df[var_dependiente]42 43        # Corrección de cálculos para Xi^2, Xi^3, Xi^444        df["Xi^2"] = df["Xi"] ** 245        df["Xi^3"] = df["Xi"] ** 346        df["Xi^4"] = df["Xi"] ** 447        df["Xi*Yi"] = df["Xi"] * df["Yi"]48        df["Xi^2*Yi"] = df["Xi^2"] * df["Yi"]49 50        # Calcular sumas necesarias51        n = len(df)52        sum_X = df["Xi"].sum()53        sum_Y = df["Yi"].sum()54        sum_X2 = df["Xi^2"].sum()55        sum_X3 = df["Xi^3"].sum()56        sum_X4 = df["Xi^4"].sum()57        sum_XY = df["Xi*Yi"].sum()58        sum_X2Y = df["Xi^2*Yi"].sum()59 60        # Media de Yi61        Y_media = sum_Y / n62 63        # Cálculo de coeficientes64        denominator = (sum_X2 - (sum_X**2)/n) * (sum_X4 - (sum_X2**2)/n) - (sum_X3 - (sum_X2*sum_X)/n)**265        if denominator == 0:66            return None, None, "Error: No se puede dividir por cero en los cálculos del modelo."67 68        b2 = ((sum_X2Y - (sum_X2*sum_Y)/n) * (sum_X2 - (sum_X**2)/n) -69              (sum_XY - (sum_X*sum_Y)/n) * (sum_X3 - (sum_X2*sum_X)/n)) / denominator70 71        b1 = ((sum_XY - (sum_X*sum_Y)/n) * (sum_X4 - (sum_X2**2)/n) -72              (sum_X2Y - (sum_X2*sum_Y)/n) * (sum_X3 - (sum_X2*sum_X)/n)) / denominator73 74        b0 = (sum_Y/n) - b1*(sum_X/n) - b2*(sum_X2/n)75 76        # Calcular valores estimados y R^277        df["Y_est"] = b0 + b1*df["Xi"] + b2*df["Xi^2"]78        df["(Yi - Y_media)^2"] = (df["Yi"] - Y_media)**279        df["(Yi - Y_est)^2"] = (df["Yi"] - df["Y_est"])**280 81        r_squared = 1 - df["(Yi - Y_est)^2"].sum() / df["(Yi - Y_media)^2"].sum()82 83        # Generar tabla detallada (limitada hasta Xi^2*Yi)84        detalles = df[[85            "Xi", "Yi", "Xi^2", "Xi^3", "Xi^4", "Xi*Yi", "Xi^2*Yi"86        ]].copy()87 88        # Calcular sumas89        suma_fila = detalles.sum(numeric_only=True)90        detalles.loc["Suma"] = suma_fila91 92        # Calcular promedios correctamente93        promedio_fila = detalles.iloc[:-1].mean(numeric_only=True)  # Excluir fila "Suma"94        detalles.loc["Promedio"] = promedio_fila95 96        # Resultados del modelo97        modelo = f"Y = {b0:.5f} + {b1:.5f}X + {b2:.5f}X^2"98        r2_texto = f"Coeficiente de determinación (R^2): {r_squared:.4f}"99 100        return detalles, modelo, r2_texto101 102    except Exception as e:103        return None, None, f"Error al calcular el modelo: {str(e)}"104 105 106# Función para graficar el modelo cuadrático107def graficar_modelo():108    global df, b0, b1, b2109    if df is None:110        return "Error: No se han cargado datos.", None111 112    try:113        plt.figure(figsize=(8, 6))114        plt.scatter(df["Xi"], df["Yi"], color="blue", label="Datos originales")115        x_vals = np.linspace(df["Xi"].min(), df["Xi"].max(), 100)116        y_vals = b0 + b1 * x_vals + b2 * x_vals**2117        plt.plot(x_vals, y_vals, color="red", label="Modelo cuadrático ajustado")118        plt.xlabel("X (Variable Independiente)")119        plt.ylabel("Y (Variable Dependiente)")120        plt.title("Modelo de Regresión Cuadrática")121        plt.legend()122        plt.grid()123        plt.savefig("modelo_grafico.png")  # Guardar gráfico temporalmente124        return "Gráfico generado con éxito.", "modelo_grafico.png"125    except Exception as e:126        return f"Error al generar el gráfico: {str(e)}", None127 128# Función para predecir Y dado un valor de X129def predecir_y(valor_x):130    global b0, b1, b2131    try:132        valor_y = b0 + b1 * valor_x + b2 * (valor_x**2)133        return f"Para X = {valor_x}, la predicción de Y es: {valor_y:.4f}"134    except Exception as e:135        return f"Error al realizar la predicción: {str(e)}"136 137# Función para calcular Y estimado y coeficiente de correlación138def calcular_y_estimado():139    global df, b0, b1, b2140    if df is None:141        return None, "Error: No se han cargado datos."142 143    try:144        # Calcular Y estimado para todas las X145        df["Y_est"] = b0 + b1 * df["Xi"] + b2 * df["Xi"]**2146 147        # Calcular coeficiente de correlación148        correlacion = np.corrcoef(df["Yi"], df["Y_est"])[0, 1]149 150        # Crear tabla con Y estimado151        resultado = df[["Xi", "Yi", "Y_est"]].copy()152 153        # Calcular correctamente la suma y el promedio154        suma_fila = resultado.sum(numeric_only=True)  # Calcular sumas155        promedio_fila = resultado.mean(numeric_only=True)  # Calcular promedios156 157        # Agregar filas de suma y promedio a la tabla158        resultado.loc["Suma"] = suma_fila159        resultado.loc["Promedio"] = promedio_fila160 161        texto_correlacion = f"Coeficiente de correlación (r): {correlacion:.4f}"162        return resultado, texto_correlacion163    except Exception as e:164        return None, f"Error al calcular Y estimado: {str(e)}"165 166 167# Interfaz con Gradio168with gr.Blocks() as demo:169    gr.Markdown("## Sistema Detallado de Regresión Cuadrática con Gráfico, Predicción y Cálculos")170 171    # Cargar datos172    with gr.Tab("1. Cargar Datos"):173        archivo_input = gr.File(label="Sube tu archivo de datos (CSV o Excel)")174        exploracion_result = gr.Dataframe()175        columnas_result = gr.Dropdown(choices=[], multiselect=False, label="Selecciona Variable Independiente")176        variable_objetivo = gr.Dropdown(choices=[], label="Selecciona Variable Dependiente")177        mensaje_carga = gr.Textbox(label="Estado de carga de datos")178 179        def actualizar_columnas(file):180            df_head, columnas, _, mensaje = cargar_datos(file)181            return df_head, gr.update(choices=columnas), gr.update(choices=columnas), mensaje182 183        archivo_input.change(184            fn=actualizar_columnas,185            inputs=archivo_input,186            outputs=[exploracion_result, columnas_result, variable_objetivo, mensaje_carga]187        )188 189    # Calcular modelo detallado190    with gr.Tab("2. Calcular Modelo Detallado"):191        calcular_btn = gr.Button("Calcular Modelo Detallado")192        detalles_output = gr.Dataframe()193        modelo_output = gr.Textbox(label="Modelo Cuadrático")194        r2_output = gr.Textbox(label="Coeficiente de Determinación (R^2)")195 196        calcular_btn.click(197            calcular_modelo_detallado,198            inputs=[columnas_result, variable_objetivo],199            outputs=[detalles_output, modelo_output, r2_output]200        )201 202    # Graficar modelo203    with gr.Tab("3. Graficar Modelo"):204        graficar_btn = gr.Button("Generar Gráfico")205        grafico_result = gr.Image()206        mensaje_grafico = gr.Textbox(label="Estado del gráfico")207 208        graficar_btn.click(209            graficar_modelo,210            outputs=[mensaje_grafico, grafico_result]211        )212 213    # Predicción de Y dado un valor de X214    with gr.Tab("4. Predecir Y"):215        input_x = gr.Number(label="Ingresa un valor para X")216        prediccion_result = gr.Textbox(label="Predicción de Y")217 218        input_x.change(219            fn=predecir_y,220            inputs=input_x,221            outputs=prediccion_result222        )223 224    # Calcular Y estimado y coeficiente de correlación225    with gr.Tab("5. Y Estimado y Correlación"):226        calcular_y_btn = gr.Button("Calcular Y Estimado")227        y_estimado_output = gr.Dataframe()228        correlacion_output = gr.Textbox(label="Coeficiente de Correlación (r)")229 230        calcular_y_btn.click(231            calcular_y_estimado,232            outputs=[y_estimado_output, correlacion_output]233        )234 235    demo.launch()236 237 238