FLOR22/REGRESION_CUADRATICA_2
0
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 