import streamlit as st import pandas as pd import plotly.express as px import plotly.graph_objects as go import plotly.figure_factory as ff import numpy as np # Configuración de la aplicación st.set_page_config(page_title="4 Types of Problems", page_icon="📊",layout="wide") # Display the image above the title st.image('4Papps.jpg', use_container_width=True) st.title("4 Tipos de problemas") # Definir pestañas tabs = st.tabs(["Contención", "Desviación del Estándar", "Condición Objetivo", "Innovación"]) # Trabajamos solo en la pestaña "Contención" with tabs[0]: # 📌 Resumen del Método 4C’s de Art Smalley st.markdown(""" ## 🛠 Método 4C’s - Resolución Rápida de Problemas (Troubleshooting) El método **4C’s** es una estrategia de resolución de problemas tipo 1 (Troubleshooting), utilizado en Toyota y propuesto por **Art Smalley** para abordar **problemas inmediatos sin un análisis profundo**. - **❗ Concern (Preocupación):** Identificar claramente el problema o anomalía detectada. - **🔍 Cause (Causa):** Determinar la causa raíz probable o el factor que contribuyó al problema. - **🛠 Countermeasure (Acción Correctiva):** Implementar una solución inmediata para restaurar el estándar. - **📊 Check (Seguimiento):** Evaluar si la contramedida funcionó y si se requiere más análisis. 👉 *Este método se enfoca en restaurar la operación de manera rápida y efectiva, sin necesidad de un análisis profundo como en los problemas tipo 2.* """) # Inicializar DataFrame en sesión si no existe if "df_problemas" not in st.session_state: data_inicial = [ # 🚧 Seguridad: Emergencia con equipo de producción {"Categoría": "Seguridad", "Fecha Ocurrencia": "2024-01-10", "Problema": "Derrame de aceite en zona de trabajo", "Causa": "Fuga en manguera hidráulica de prensa", "Contramedida": "Limpieza inmediata y cambio de manguera", "Seguimiento": "Sí", "Fecha Seguimiento": "2024-01-15", "Estatus Seguimiento": "Cerrada", "Investigación Tipo 2": "No", "Estatus": "Cerrado"}, # 🔍 Calidad: Defectos en piezas recién producidas {"Categoría": "Calidad", "Fecha Ocurrencia": "2024-02-05", "Problema": "Riesgo de contaminación en piezas mecanizadas", "Causa": "Exceso de virutas en la máquina CNC", "Contramedida": "Limpieza del área y ajuste en frecuencia de mantenimiento", "Seguimiento": "Sí", "Fecha Seguimiento": "2024-02-09", "Estatus Seguimiento": "En proceso", "Investigación Tipo 2": "Sí", "Estatus": "Abierto"}, # 💲 Costo: Pérdidas por mal funcionamiento de equipos {"Categoría": "Costo", "Fecha Ocurrencia": "2024-03-01", "Problema": "Paro de línea por falla en sensor de temperatura", "Causa": "Sensor descalibrado tras última inspección", "Contramedida": "Reemplazo de sensor y recalibración", "Seguimiento": "Sí", "Fecha Seguimiento": "2024-03-05", "Estatus Seguimiento": "En proceso", "Investigación Tipo 2": "No", "Estatus": "En proceso"}, # 📦 Entrega: Retraso en abastecimiento de materiales {"Categoría": "Entrega", "Fecha Ocurrencia": "2024-03-10", "Problema": "Retraso en entrega de materiales a producción", "Causa": "Error en planificación de inventario", "Contramedida": "Ajuste manual de stock y notificación a proveedor", "Seguimiento": "Sí", "Fecha Seguimiento": "2024-03-15", "Estatus Seguimiento": "Atrasada", "Investigación Tipo 2": "Sí", "Estatus": "Atrasado"} ] st.session_state.df_problemas = pd.DataFrame(data_inicial) # Convertir fechas a datetime for col in ["Fecha Ocurrencia", "Fecha Seguimiento"]: if col in st.session_state.df_problemas.columns: st.session_state.df_problemas[col] = pd.to_datetime(st.session_state.df_problemas[col], errors="coerce") st.markdown(""" ### 📌 Reporta un problema de contención """) # Expander 1: Reportar un nuevo problema with st.expander("Accede al reporte", expanded=False): categorias = ["Seguridad", "Calidad", "Costo", "Entrega"] # 🔴 1️⃣ CONCERN (PREOCUPACIÓN) - ¿Cuál es el problema? st.subheader("🔴 Concern (Preocupación)") problema_tipo = st.selectbox("Seleccione la categoría del problema", categorias) fecha_ocurrencia = st.date_input("📅 Fecha de ocurrencia del problema") problema = st.text_area("❓ ¿Qué sabe usted sobre el problema exacto?") # ⚠️ 2️⃣ CAUSE (CAUSA) - ¿Qué lo originó? st.subheader("⚠️ Cause (Causa)") causa = st.text_area("🔍 ¿Cuál es la posible causa raíz del problema?") # 🛠️ 3️⃣ COUNTERMEASURE (CONTRAMEDIDA) - ¿Cómo se solucionará? st.subheader("🛠️ Countermeasure (Contramedida)") contramedida = st.text_area("✅ ¿Qué acción inmediata o temporal puede tomarse para reducir o eliminar el problema?") # ✅ 4️⃣ CHECK (VERIFICACIÓN) - Seguimiento y estatus st.subheader("✅ Check (Verificación)") seguimiento = st.radio("📊 ¿Es necesario un seguimiento adicional?", ["Sí", "No"]) fecha_seguimiento = st.date_input("📅 Fecha de seguimiento", disabled=(seguimiento == "No")) estatus_seguimiento = st.selectbox("📌 Estatus del seguimiento", ["En proceso", "Atrasada", "Cerrada"], disabled=(seguimiento == "No")) investigar_mas = st.checkbox("🔬 ¿Necesita investigar más a fondo usando métodos de Tipo 2?") estatus = st.selectbox("📈 Estatus del problema", ["Abierto", "En proceso", "Atrasado", "Cerrado"]) # Guardar los datos ingresados if st.button("💾 Guardar Nuevo Problema"): nuevo_problema = pd.DataFrame([{ "Categoría": problema_tipo, "Fecha Ocurrencia": pd.to_datetime(fecha_ocurrencia), "Problema": problema, "Causa": causa, "Contramedida": contramedida, "Seguimiento": seguimiento, "Fecha Seguimiento": pd.to_datetime(fecha_seguimiento) if seguimiento == "Sí" else pd.NaT, "Estatus Seguimiento": estatus_seguimiento if seguimiento == "Sí" else "N/A", "Investigación Tipo 2": "Sí" if investigar_mas else "No", "Estatus": estatus }]) st.session_state.df_problemas = pd.concat([st.session_state.df_problemas, nuevo_problema], ignore_index=True) st.success("✅ Nuevo problema guardado correctamente") st.markdown(""" ### 📝 Reporta los avances """) # Expander 2: Reporta avances en los problemas existentes with st.expander("Ingresa el progreso"): df_editado = st.data_editor(st.session_state.df_problemas, num_rows="dynamic") if st.button("Guardar Cambios en Problemas"): st.session_state.df_problemas = df_editado st.rerun() # Refresca la app para actualizar la tabla HTML st.markdown(""" ### 📊 Visualiza el Histórico de Problemas """) # Expander 3: Visualiza el Histórico de Problemas with st.expander("Revisa como vamos", expanded=True): filtro_categoria = st.selectbox("Filtrar por categoría", ["Todas"] + categorias) df_mostrar = st.session_state.df_problemas.copy() if filtro_categoria != "Todas": df_mostrar = df_mostrar[df_mostrar["Categoría"] == filtro_categoria] # Formatear fechas antes de mostrar if "Fecha Ocurrencia" in df_mostrar.columns: df_mostrar["Fecha Ocurrencia"] = df_mostrar["Fecha Ocurrencia"].dt.strftime("%Y-%m-%d") if "Fecha Seguimiento" in df_mostrar.columns: df_mostrar["Fecha Seguimiento"] = df_mostrar["Fecha Seguimiento"].dt.strftime("%Y-%m-%d").replace("NaT", "N/A") # Definir colores para las categorías categoria_colores = { "Seguridad": "#FF4B4B", "Calidad": "#4B83FF", "Costo": "#FFA64B", "Entrega": "#4BFF83" } # Generar tabla HTML con colores def generar_tabla_html(df): table_html = "" table_html += "" for _, row in df.iterrows(): color = categoria_colores.get(row["Categoría"], "#FFFFFF") table_html += f"" table_html += f"" table_html += f"" table_html += f"" table_html += f"" table_html += f"" table_html += "" table_html += "
CategoríaFecha OcurrenciaProblemaCausaEstatus
{row['Categoría']}{row['Fecha Ocurrencia']}{row['Problema']}{row['Causa']}{row['Estatus']}
" return table_html st.markdown(generar_tabla_html(df_mostrar), unsafe_allow_html=True) #__________________________________________________________________________________________________________________________________________________________________ #Problemas de tipo 2 - Desviación del estandar # 📌 Función para calcular cumplimiento dinámico def calcular_cumplimiento(df, mejor_es_mayor): resultados_prom = df["Resultados"].mean() meta_prom = df["Meta"].mean() # Caso especial para LTI (Seguridad) if not mejor_es_mayor: if resultados_prom == 0: return 100 # Sin eventos = 100% cumplimiento return max(0, min(100, (1 - (resultados_prom / (meta_prom + 1))) * 100)) # Casos para RFT, OEE y OTIF (donde mayor es mejor) if meta_prom == 0: return 100 if mejor_es_mayor else 0 return max(0, min(100, (resultados_prom / meta_prom) * 100)) # Limitar a 100% # 📌 Función para inicializar MDI con datos corregidos def inicializar_mdi(): if "mdi" not in st.session_state: st.session_state["mdi"] = { "Seguridad": {"indicador": "LTI", "mejor_es_mayor": False, "datos": pd.DataFrame({ "Fecha": pd.date_range(start="2024-01-01", periods=12, freq='M'), "Resultados": [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0], "Meta": [0] * 12, "Causa": ["", "", "", "Falta de EPP", "", "", "", "Condiciones inseguras", "", "", "", ""]})}, "Calidad": {"indicador": "RFT", "mejor_es_mayor": True, "datos": pd.DataFrame({ "Fecha": pd.date_range(start="2024-01-01", periods=12, freq='M'), "Resultados": [96, 97, 94, 95, 92, 91, 89, 85, 97, 96, 98, 99], "Meta": [95] * 12, "Causa": ["", "", "Materia prima defectuosa", "", "Falla de calibración", "", "Falta de estandarización", "Error en proceso", "", "", "", ""]})}, "Costo": {"indicador": "OEE", "mejor_es_mayor": True, "datos": pd.DataFrame({ "Fecha": pd.date_range(start="2024-01-01", periods=12, freq='M'), "Resultados": [82, 85, 79, 81, 80, 77, 76, 75, 85, 84, 82, 86], "Meta": [80] * 12, "Causa": ["", "", "Mantenimiento inadecuado", "", "", "Baja eficiencia operativa", "", "Desgaste de equipos", "", "", "", ""]})}, "Entrega": {"indicador": "OTIF", "mejor_es_mayor": True, "datos": pd.DataFrame({ "Fecha": pd.date_range(start="2024-01-01", periods=12, freq='M'), "Resultados": [92, 94, 91, 89, 95, 97, 93, 96, 94, 90, 92, 91], "Meta": [90] * 12, "Causa": ["", "", "", "Falla logística", "", "", "", "", "", "Demora del proveedor", "", ""]})}, } # 🔄 Calcular cumplimiento dinámico para cada perspectiva for perspectiva, data in st.session_state["mdi"].items(): data["cumplimiento"] = round(calcular_cumplimiento(data["datos"], data["mejor_es_mayor"]), 2) with tabs[1]: inicializar_mdi() # 📖 Resumen del Problema Tipo 2 st.markdown(""" ## 🔄 Management Daily Improvement (MDI) & DMAIC Cycle Los **problemas tipo 2** ocurren cuando hay una **desviación del estándar previamente definido** en una operación, proceso o sistema. Se centran en **restaurar y mejorar el estándar** a través de la **gestión diaria y análisis estructurado**. ### 🏭 **Management Daily Improvement (MDI) y la Cultura Toyota** - El **MDI (Mejora Diaria de Gestión)** es clave en Toyota para detectar y corregir desviaciones en tiempo real. - Se basa en la **observación sistemática de métricas clave** en Seguridad, Calidad, Costo y Entrega (**SQCD**). - Los **supervisores y equipos** deben identificar, registrar y actuar sobre desviaciones detectadas. - Se apoya en el **ciclo DMAIC** para implementar mejoras efectivas. ### 🔬 **Ciclo DMAIC** Los problemas de desviación del estándar se analizan y resuelven con el enfoque **DMAIC**: 1️⃣ **Definir**: Identificar el estándar afectado y describir la desviación. 2️⃣ **Medir**: Cuantificar el impacto con datos históricos y métricas clave. 3️⃣ **Analizar**: Determinar la causa raíz mediante herramientas como Ishikawa, Pareto o 5 Porqués. 4️⃣ **Implementar**: Aplicar acciones correctivas para restaurar el estándar. 5️⃣ **Controlar**: Asegurar que la mejora sea sostenible en el tiempo. 📌 **Este tablero MDI ayuda a visualizar las desviaciones en SQCD, permitiendo aplicar el ciclo DMAIC para mejorar los procesos.** 🚀 """) # 📌 Diccionario de iconos por categoría SQCD mdi_icons = { "Seguridad": "🛑", "Calidad": "✔️", "Costo": "💰", "Entrega": "🚚" } st.header("📊 Management Daily Improvement SQCD") # 📌 Obtener las perspectivas del tablero MDI perspectives = list(st.session_state["mdi"].keys()) col1, col2, col3, col4 = st.columns(4) for i, perspective in enumerate(perspectives): col = [col1, col2, col3, col4][i] with col: data = st.session_state["mdi"][perspective] # 📋 Expander para editar los datos with st.expander(f"📋 Datos de {perspective}"): df_editable = st.data_editor( data["datos"], use_container_width=True, num_rows="dynamic", key=f"datos_{perspective}" ) # 🔄 Actualizar el DataFrame y el cumplimiento después de la edición st.session_state["mdi"][perspective]["datos"] = df_editable nuevo_cumplimiento = calcular_cumplimiento(df_editable, data["mejor_es_mayor"]) st.session_state["mdi"][perspective]["cumplimiento"] = round(nuevo_cumplimiento, 2) # 📌 Mostrar Icono + Categoría icon = mdi_icons.get(perspective, "📊") # Si no encuentra el icono, usa un default st.markdown(f"### {icon} {perspective}") # 🏆 Gráfico de cumplimiento (Gauge) - ALTURA REDUCIDA cumplimiento = st.session_state["mdi"][perspective]["cumplimiento"] # 🔄 Definir color según el valor de cumplimiento if cumplimiento < 90: color_gauge = "red" # 🔴 Menos de 90% elif 90 <= cumplimiento < 100: color_gauge = "yellow" # 🟡 Entre 90% y 100% else: color_gauge = "green" # 🟢 Más de 100% # 🔄 Ajustar dinámicamente el rango del gauge max_range = max(100, cumplimiento + 5) # Asegurar que siempre haya espacio para valores >100% fig_gauge = go.Figure(go.Indicator( mode="gauge+number", value=cumplimiento, number={"font": {"size": 25}}, # 🔽 REDUCE el tamaño del número del cumplimiento title={'text': f"{data['indicador']}", 'font': {'size': 20}}, gauge={'axis': {'range': [0, max_range]}, 'bar': {'color': color_gauge}} )) fig_gauge.update_layout(height=280) # 🔽 Ajuste de altura del gauge st.plotly_chart(fig_gauge, use_container_width=True) # 📉 Gráfico de control de tendencia - ALTURA AJUSTADA fig_control = go.Figure() fig_control.add_trace(go.Scatter( x=df_editable["Fecha"], y=df_editable["Resultados"], mode='lines+markers', name='Resultados' )) fig_control.add_hline(y=df_editable["Meta"].mean(), line_dash="dash", line_color="red", annotation_text="Meta", annotation_position="top right") fig_control.update_layout( title=f"Tendencia de {perspective}", xaxis_title="Fecha", yaxis_title="Valor", height=280 # 🔽 Ajuste de altura del gráfico de tendencias ) st.plotly_chart(fig_control, use_container_width=True) # 📊 Gráfico de causas repetitivas corregido - ALTURA REDUCIDA df_causas = df_editable[df_editable["Causa"] != ""].copy() # Excluir valores vacíos df_causas = df_causas["Causa"].value_counts().reset_index() df_causas.columns = ["Causa", "Frecuencia"] if not df_causas.empty: fig_barras = px.bar(df_causas, x="Frecuencia", y="Causa", orientation='h', title=f"Causas más repetitivas en {perspective}", text_auto=True) # Muestra los valores en las barras fig_barras.update_yaxes(categoryorder='total ascending') # Invierte el eje Y fig_barras.update_layout(height=250) # 🔽 Ajuste de altura del gráfico de barras st.plotly_chart(fig_barras, use_container_width=True) st.header("📝 DMAIC Action Plan") # 📌 Inicializar el DataFrame en la sesión si no existe if "acciones" not in st.session_state: st.session_state.acciones = [ {"categoria": "Seguridad", "descripcion": "Capacitación en uso de EPP obligatorio.", "fecha_inicio": "2024-01-10", "fecha_fin": "2024-01-20", "estado": "Abierta", "Definir": "Riesgo identificado en inspección.", "Medir": "2 incidentes en 3 meses.", "Analizar": "Falta de EPP adecuado.", "Implementar": "Entrega de EPP.", "Controlar": "Auditorías mensuales."}, {"categoria": "Seguridad", "descripcion": "Implementación de checklist diario de condiciones inseguras.", "fecha_inicio": "2024-02-01", "fecha_fin": "2024-02-10", "estado": "Cerrada", "Definir": "Condiciones inseguras reportadas.", "Medir": "10 reportes en un mes.", "Analizar": "Falta de control visual.", "Implementar": "Checklists diarios.", "Controlar": "Supervisión de líderes."}, {"categoria": "Calidad", "descripcion": "Cambio de proveedor de materia prima defectuosa.", "fecha_inicio": "2024-03-05", "fecha_fin": "2024-03-15", "estado": "Vencida", "Definir": "Defectos recurrentes en producción.", "Medir": "5% de scrap.", "Analizar": "Proveedores inconsistentes.", "Implementar": "Cambio de proveedor.", "Controlar": "Evaluación mensual."}, {"categoria": "Calidad", "descripcion": "Revisión y ajuste de estándares de calidad en inspección final.", "fecha_inicio": "2024-04-01", "fecha_fin": "2024-04-10", "estado": "Pendiente", "Definir": "Errores detectados en auditoría.", "Medir": "Tasa de defectos >2%.", "Analizar": "Falta de criterios claros.", "Implementar": "Capacitación y ajuste de estándares.", "Controlar": "Revisión semanal."}, {"categoria": "Costo", "descripcion": "Optimización de parámetros de mantenimiento preventivo.", "fecha_inicio": "2024-05-02", "fecha_fin": "2024-05-12", "estado": "Abierta", "Definir": "Fallas recurrentes en equipos.", "Medir": "Tiempo de inactividad de 5%.", "Analizar": "Mantenimiento reactivo en lugar de preventivo.", "Implementar": "Plan de mantenimiento preventivo.", "Controlar": "KPIs de disponibilidad."}, {"categoria": "Costo", "descripcion": "Rediseño de layout para reducir tiempos de inactividad.", "fecha_inicio": "2024-06-01", "fecha_fin": "2024-06-15", "estado": "Pendiente", "Definir": "Retrasos en cambio de herramientas.", "Medir": "Tiempo promedio de 30 min por cambio.", "Analizar": "Mal distribución de áreas.", "Implementar": "Optimización del layout.", "Controlar": "Monitoreo de tiempos."}, {"categoria": "Entrega", "descripcion": "Negociación de tiempos de entrega con proveedor clave.", "fecha_inicio": "2024-07-10", "fecha_fin": "2024-07-20", "estado": "Cerrada", "Definir": "Atrasos en entrega de materiales.", "Medir": "Promedio de 5 días de retraso.", "Analizar": "Proveedor con problemas logísticos.", "Implementar": "Renegociación de tiempos.", "Controlar": "Indicador de cumplimiento de entrega."}, {"categoria": "Entrega", "descripcion": "Implementación de monitoreo en tiempo real de pedidos.", "fecha_inicio": "2024-08-01", "fecha_fin": "2024-08-10", "estado": "Vencida", "Definir": "Pedidos sin visibilidad de avance.", "Medir": "40% de pedidos sin trazabilidad.", "Analizar": "Falta de sistema de monitoreo.", "Implementar": "Implementación de tracking en tiempo real.", "Controlar": "Reporte de seguimiento diario."} ] # 📌 Convertir a DataFrame df_acciones = pd.DataFrame(st.session_state.acciones) # 📌 Expansor para mostrar y editar las acciones with st.expander("📌 Ver y Editar Acciones con Ciclo DMAIC", expanded=False): # 📝 Permitir edición de acciones con posibilidad de agregar/eliminar filas df_editable = st.data_editor(df_acciones, num_rows="dynamic", use_container_width=True) # 🔄 Actualizar los datos en `st.session_state` st.session_state.acciones = df_editable.to_dict(orient="records") # 📌 Recalcular estados de acciones tras edición estados_acciones = {"Abierta": 0, "Cerrada": 0, "Vencida": 0, "Pendiente": 0} for accion in df_editable["estado"]: estados_acciones.setdefault(accion, 0) estados_acciones[accion] += 1 # 📌 Mostrar métricas con colores (Ahora se actualizan correctamente) col1, col2, col3, col4 = st.columns(4) col1.markdown(f"

Abiertas: {estados_acciones.get('Abierta', 0)}

", unsafe_allow_html=True) col2.markdown(f"

Cerradas: {estados_acciones.get('Cerrada', 0)}

", unsafe_allow_html=True) col3.markdown(f"

Vencidas: {estados_acciones.get('Vencida', 0)}

", unsafe_allow_html=True) col4.markdown(f"

Pendientes: {estados_acciones.get('Pendiente', 0)}

", unsafe_allow_html=True) # 📊 Gantt de Acciones (Se actualiza con los cambios) fig = px.timeline(df_editable, x_start="fecha_inicio", x_end="fecha_fin", y="descripcion", color="estado", color_discrete_map={ "Abierta": "green", "Cerrada": "gray", "Vencida": "red", "Pendiente": "yellow" }, title="📅 Estado de las Acciones con DMAIC", labels={"estado": "Estado de la Acción"}, category_orders={"estado": ["Abierta", "Pendiente", "Vencida", "Cerrada"]}) fig.update_yaxes(categoryorder="total ascending") # Ordenar acciones fig.update_layout(xaxis_title="Fechas", yaxis_title="Descripción de la Acción", height=350, showlegend=True) # 📌 Mostrar gráfico Gantt st.plotly_chart(fig, use_container_width=True) #__________________________________________________________________________________________________________________________________________________________________ # Problemas de condición Objetivo # 📌 Precargar imágenes de referencia imagen_actual_default = "current.jpg" imagen_futura_default = "future.jpg" with tabs[2]: # 📖 Introducción a Problemas de Condición Objetivo y VSM st.markdown(""" ## 🔀 Value Stream Mapping (VSM) & A3 Thinking Los problemas de **Condición Objetivo** surgen cuando se busca alcanzar una **meta futura específica** en un proceso sin que haya una falla evidente en el presente. No se trata de corregir defectos actuales, sino de **mejorar el flujo y la eficiencia** para lograr un estado futuro optimizado. ### 📌 Relación entre VSM y A3 🔹 **Value Stream Mapping (VSM)** permite visualizar la situación actual, identificar desperdicios y diseñar un flujo futuro eficiente. 🔹 **A3 Thinking** estructura el análisis y la implementación de mejoras, asegurando que las acciones sean alineadas con la estrategia organizacional. ### 🔄 Proceso de Transformación 1️⃣ **Evaluar el estado actual**: Mapear el flujo de valor existente e identificar oportunidades de mejora. 2️⃣ **Definir la meta futura**: Establecer una condición objetivo alineada con la estrategia de la empresa. 3️⃣ **Diseñar el estado futuro**: Optimizar el flujo mediante la eliminación de desperdicios y sincronización de procesos. 4️⃣ **Implementar mejoras con A3**: Planificar y ejecutar acciones basadas en análisis estructurado. Este enfoque permite **reducir Lead Time, mejorar sincronización y aumentar la eficiencia operativa**, facilitando una transición controlada hacia un proceso más ágil y competitivo. 🚀📊 """) st.markdown("

📄 A3 - Resolución de Problemas

", unsafe_allow_html=True) # 📌 Distribuir en dos columnas de igual tamaño col_izq, col_der = st.columns([2, 2]) # 📌 Sección Izquierda: Situación Actual y Análisis with col_izq: with st.container(): st.subheader("📜 1. Antecedentes") antecedentes = st.text_area("Describe los antecedentes del problema", value="El Lead Time actual es de 23.6 días, generando retrasos y costos elevados.") st.subheader("📊 2. Situación Actual") situacion_actual = st.text_area("Describe la situación actual", value="El flujo del proceso tiene esperas innecesarias, loteo excesivo y transporte ineficiente.") st.subheader("📷 Imagen del Problema (Current State VSM)") imagen_actual = st.file_uploader("Sube una imagen del estado actual", type=["png", "jpg", "jpeg"]) if imagen_actual: st.image(imagen_actual, caption="Estado Actual - VSM", use_container_width=True) else: st.image(imagen_actual_default, caption="Estado Actual (Ejemplo)", use_container_width=True) st.subheader("🔎 3. Análisis de Causa Raíz") causas = st.text_area("Identifica las causas raíz", value="- Loteo grande\n- Retrasos en el proceso\n- Falta de flujo continuo.") st.subheader("🎯 4. Metas") metas = st.text_area("Define las metas a alcanzar", value="Reducir el Lead Time a 4.5 días mejorando la sincronización del proceso.") # 📌 Sección Derecha: Contramedidas y Seguimiento with col_der: with st.container(): st.subheader("🛠️ 5. Contramedidas (Plan de Acción)") plan = st.text_area("Desarrolla el plan de acción", value="- Reducir tamaños de lote\n- Implementar flujo continuo\n- Mejorar la sincronización del proceso.") st.subheader("📷 Imagen del Estado Futuro (Future State VSM)") imagen_futura = st.file_uploader("Sube una imagen del estado futuro", type=["png", "jpg", "jpeg"]) if imagen_futura: st.image(imagen_futura, caption="Estado Futuro - VSM", use_container_width=True) else: st.image(imagen_futura_default, caption="Estado Futuro (Ejemplo)", use_container_width=True) st.subheader("📅 6. Tablero de Acciones (Gantt)") # 📌 Inicializar DataFrame si no existe en la sesión if "acciones_a3" not in st.session_state: st.session_state.acciones_a3 = pd.DataFrame([ {"Task": "Mapear proceso actual", "Start": "2024-02-01", "Finish": "2024-02-10"}, {"Task": "Reducir tamaños de lote", "Start": "2024-02-15", "Finish": "2024-02-20"}, {"Task": "Definir flujo continuo", "Start": "2024-02-21", "Finish": "2024-02-28"}, {"Task": "Capacitación sobre nuevas prácticas", "Start": "2024-03-01", "Finish": "2024-03-05"}, {"Task": "Implementación final", "Start": "2024-03-06", "Finish": "2024-03-10"}, ]) # 📌 Expander para editar o agregar acciones with st.expander("📋 Editar Tablero de Acciones", expanded=False): df_acciones = st.data_editor(st.session_state.acciones_a3, use_container_width=True, num_rows="dynamic") st.session_state.acciones_a3 = df_acciones # Guardar cambios en la sesión # 🔄 Ajustar altura del Gantt dinámicamente if not df_acciones.empty: df_acciones.columns = ["Task", "Start", "Finish"] num_tareas = len(df_acciones) altura_dinamica = max(200, min(num_tareas * 50, 500)) # 📊 Generar Gantt después de la edición tareas = df_acciones.to_dict("records") fig_gantt = ff.create_gantt(tareas, title="Plan de Implementación A3", index_col="Task", show_colorbar=False) fig_gantt.update_layout(showlegend=False, height=altura_dinamica) st.plotly_chart(fig_gantt, use_container_width=True) # 📌 Tablero de Seguimiento de Indicadores st.subheader("📊 7. Seguimiento de Indicadores de Éxito") # 📌 Inicializar DataFrame si no existe en la sesión if "indicadores_a3" not in st.session_state: st.session_state.indicadores_a3 = pd.DataFrame([ {"Indicador": "Lead Time (días)", "Antes": 23.6, "Meta": 4.5, "Resultado": None, "Status": "En proceso"}, {"Indicador": "Tamaño de lote", "Antes": 100, "Meta": 30, "Resultado": None, "Status": "En proceso"}, {"Indicador": "Tiempo de ciclo (min)", "Antes": 12, "Meta": 6, "Resultado": None, "Status": "En proceso"}, ]) # 📌 Mostrar tabla editable df_editable = st.data_editor(st.session_state.indicadores_a3, use_container_width=True, num_rows="dynamic") st.session_state.indicadores_a3 = df_editable # Guardar cambios en la sesión #__________________________________________________________________________________________________________________________________________________________________ # 📌 Problemas de Innovación with tabs[3]: st.markdown("

🚀 Funnel de Innovación

", unsafe_allow_html=True) # 📖 Introducción a la Innovación según Art Smalley st.markdown(""" ## 🌟 Innovación como Cuarto Tipo de Problema Según **Art Smalley**, la innovación es el tipo de problema más avanzado, ya que requiere **crear soluciones completamente nuevas** en lugar de corregir fallas existentes. 🔹 **Objetivo:** Superar las limitaciones actuales y desarrollar mejoras **disruptivas** en procesos, productos y servicios. 🔹 **Ejemplo:** Implementar **automatización en manufactura** para eliminar la variabilidad humana y aumentar la eficiencia. 🔹 **Método:** Para lograr innovación estructurada, combinamos **SCAMPER** (generación de ideas) con **Design Thinking** (planificación y ejecución). 📌 **Ejemplo de Innovación según *Four Types of Problems*** - Toyota implementando **Producción Just-In-Time** para eliminar inventarios excesivos. - Ford introduciendo **manufactura modular** para reducir tiempos de cambio de línea. - Amazon desarrollando **almacenes automatizados** con robots para mejorar eficiencia logística. """) st.markdown(""" ## 📝 Generación de Innovación con SCAMPER & Design Thinking""" ) # 📌 Expander para SCAMPER y Design Thinking with st.expander(" Registro de ideas Innovadoras", expanded=False): st.subheader("🧠 SCAMPER - Generación de Ideas") problema = st.text_area("Describe el problema o necesidad que quieres innovar", value="Reducir tiempos de cambio en la línea de producción.") tecnica_scamper = st.selectbox("Selecciona una técnica SCAMPER", ["Sustituir", "Combinar", "Adaptar", "Modificar", "Poner en otro uso", "Eliminar", "Reorganizar"]) idea_scamper = st.text_area("Propón una idea innovadora basada en SCAMPER", value="Implementar cambios rápidos con herramientas modulares.") # 📌 Design Thinking - Desarrollo de Innovación st.subheader("🎨 Plan de Acción - Design Thinking") fase_design = st.selectbox("Selecciona la fase actual", ["Empatizar", "Definir", "Idear", "Prototipar", "Testear", "Implementación"]) tarea_design = st.text_area("Describe la tarea o acción clave en esta fase", value="Analizar impacto de tiempos de cambio en productividad.") fecha_inicio = st.date_input("Fecha de inicio de la tarea") fecha_fin = st.date_input("Fecha de compromiso") if st.button("💾 Guardar Innovación"): nueva_idea = pd.DataFrame([[problema, tecnica_scamper, idea_scamper, fase_design, tarea_design, fecha_inicio, fecha_fin]], columns=["Problema", "SCAMPER", "Idea SCAMPER", "Fase DT", "Tarea", "Inicio", "Compromiso"]) st.session_state.ideas_innovacion = pd.concat([st.session_state.ideas_innovacion, nueva_idea], ignore_index=True) st.success("✅ Innovación guardada correctamente.") # 📌 Inicializar el tablero con una distribución realista en el Funnel if "ideas_innovacion" not in st.session_state: st.session_state.ideas_innovacion = pd.DataFrame([ # 🔵 EMPATIZAR (10 ideas) {"Problema": "Reducir tiempos de cambio", "SCAMPER": "Modificar", "Idea SCAMPER": "Uso de herramientas modulares", "Fase DT": "Empatizar", "Tarea": "Análisis de tiempos actuales", "Inicio": "2024-01-01", "Compromiso": "2024-01-15"}, {"Problema": "Optimizar flujo de materiales", "SCAMPER": "Reorganizar", "Idea SCAMPER": "Implementación de logística autónoma", "Fase DT": "Empatizar", "Tarea": "Identificar cuellos de botella", "Inicio": "2024-01-02", "Compromiso": "2024-01-16"}, {"Problema": "Minimizar errores en ensamblaje", "SCAMPER": "Sustituir", "Idea SCAMPER": "Guiado con realidad aumentada", "Fase DT": "Empatizar", "Tarea": "Identificación de errores recurrentes", "Inicio": "2024-01-03", "Compromiso": "2024-01-17"}, {"Problema": "Reducción de desperdicios", "SCAMPER": "Eliminar", "Idea SCAMPER": "Optimización de corte CNC", "Fase DT": "Empatizar", "Tarea": "Medición de desperdicios", "Inicio": "2024-01-04", "Compromiso": "2024-01-18"}, {"Problema": "Reducir consumo energético", "SCAMPER": "Adaptar", "Idea SCAMPER": "Energía renovable en manufactura", "Fase DT": "Empatizar", "Tarea": "Evaluación del consumo actual", "Inicio": "2024-01-05", "Compromiso": "2024-01-19"}, {"Problema": "Rediseñar layout de planta", "SCAMPER": "Reorganizar", "Idea SCAMPER": "Modelo de flujo continuo", "Fase DT": "Empatizar", "Tarea": "Análisis de distribución", "Inicio": "2024-01-06", "Compromiso": "2024-01-20"}, {"Problema": "Automatización de inventarios", "SCAMPER": "Combinar", "Idea SCAMPER": "RFID con control en tiempo real", "Fase DT": "Empatizar", "Tarea": "Evaluar soluciones existentes", "Inicio": "2024-01-07", "Compromiso": "2024-01-21"}, {"Problema": "Reducir errores en ensamblaje", "SCAMPER": "Sustituir", "Idea SCAMPER": "Instrucciones con realidad aumentada", "Fase DT": "Empatizar", "Tarea": "Prueba de tecnologías", "Inicio": "2024-01-08", "Compromiso": "2024-01-22"}, {"Problema": "Optimización de distribución de tareas", "SCAMPER": "Modificar", "Idea SCAMPER": "Algoritmos de asignación inteligente", "Fase DT": "Empatizar", "Tarea": "Análisis de cargas de trabajo", "Inicio": "2024-01-09", "Compromiso": "2024-01-23"}, {"Problema": "Reducir tiempo de configuración de maquinaria", "SCAMPER": "Reorganizar", "Idea SCAMPER": "Implementación de configuraciones rápidas", "Fase DT": "Empatizar", "Tarea": "Estudio de tiempos de cambio", "Inicio": "2024-01-10", "Compromiso": "2024-01-24"}, # 🟠 DEFINIR (7 ideas) {"Problema": "Automatizar control de calidad", "SCAMPER": "Sustituir", "Idea SCAMPER": "Inspección con IA", "Fase DT": "Definir", "Tarea": "Análisis de defectos comunes", "Inicio": "2024-01-11", "Compromiso": "2024-01-25"}, {"Problema": "Aumentar eficiencia en picking", "SCAMPER": "Adaptar", "Idea SCAMPER": "Picking con robots móviles", "Fase DT": "Definir", "Tarea": "Identificar oportunidades de automatización", "Inicio": "2024-01-12", "Compromiso": "2024-01-26"}, {"Problema": "Reducir desperdicio de empaque", "SCAMPER": "Eliminar", "Idea SCAMPER": "Empaque reutilizable", "Fase DT": "Definir", "Tarea": "Evaluación de materiales alternativos", "Inicio": "2024-01-13", "Compromiso": "2024-01-27"}, {"Problema": "Optimizar planificación de producción", "SCAMPER": "Reorganizar", "Idea SCAMPER": "Algoritmo de secuenciación dinámica", "Fase DT": "Definir", "Tarea": "Evaluación de algoritmos existentes", "Inicio": "2024-01-14", "Compromiso": "2024-01-28"}, {"Problema": "Reducción de tiempos en línea de ensamble", "SCAMPER": "Modificar", "Idea SCAMPER": "Uso de estaciones de trabajo móviles", "Fase DT": "Definir", "Tarea": "Análisis de tiempos de operación", "Inicio": "2024-01-15", "Compromiso": "2024-01-29"}, {"Problema": "Mejorar ergonomía en estaciones de trabajo", "SCAMPER": "Adaptar", "Idea SCAMPER": "Implementación de estaciones ajustables", "Fase DT": "Definir", "Tarea": "Identificación de riesgos ergonómicos", "Inicio": "2024-01-16", "Compromiso": "2024-01-30"}, {"Problema": "Reducir costos en consumibles de producción", "SCAMPER": "Combinar", "Idea SCAMPER": "Uso de materiales biodegradables", "Fase DT": "Definir", "Tarea": "Análisis de alternativas sustentables", "Inicio": "2024-01-17", "Compromiso": "2024-01-31"}, # 🟡 IDEAR (4 ideas) {"Problema": "Automatizar planificación de producción", "SCAMPER": "Combinar", "Idea SCAMPER": "Sistema con machine learning", "Fase DT": "Idear", "Tarea": "Desarrollo del prototipo", "Inicio": "2024-01-15", "Compromiso": "2024-02-05"}, {"Problema": "Optimización de rutas de logística", "SCAMPER": "Modificar", "Idea SCAMPER": "Uso de IA en distribución", "Fase DT": "Idear", "Tarea": "Prueba con datos históricos", "Inicio": "2024-01-16", "Compromiso": "2024-02-06"}, {"Problema": "Automatización de gestión de pedidos", "SCAMPER": "Reorganizar", "Idea SCAMPER": "Integración de blockchain en trazabilidad", "Fase DT": "Idear", "Tarea": "Desarrollo de modelo de trazabilidad", "Inicio": "2024-01-17", "Compromiso": "2024-02-07"}, {"Problema": "Estandarización de procesos manuales", "SCAMPER": "Sustituir", "Idea SCAMPER": "Aplicaciones móviles para control de procesos", "Fase DT": "Idear", "Tarea": "Desarrollo de interfaz de usuario", "Inicio": "2024-01-18", "Compromiso": "2024-02-08"}, # 🟢 PROTOTIPAR (3 ideas) {"Problema": "Implementar manufactura flexible", "SCAMPER": "Adaptar", "Idea SCAMPER": "Uso de robots colaborativos", "Fase DT": "Prototipar", "Tarea": "Configuración inicial", "Inicio": "2024-01-20", "Compromiso": "2024-02-10"}, {"Problema": "Automatización de gestión de personal", "SCAMPER": "Combinar", "Idea SCAMPER": "Análisis de rendimiento con AI", "Fase DT": "Prototipar", "Tarea": "Prueba con dataset real", "Inicio": "2024-01-21", "Compromiso": "2024-02-11"}, {"Problema": "Monitoreo predictivo de fallas", "SCAMPER": "Sustituir", "Idea SCAMPER": "Implementación de sensores IoT con IA", "Fase DT": "Prototipar", "Tarea": "Desarrollo del modelo de predicción", "Inicio": "2024-01-22", "Compromiso": "2024-02-12"}, # 🔴 TESTEAR (2 ideas) {"Problema": "Optimización de órdenes de producción", "SCAMPER": "Reorganizar", "Idea SCAMPER": "Planificación adaptativa", "Fase DT": "Testear", "Tarea": "Validación con producción real", "Inicio": "2024-01-22", "Compromiso": "2024-02-12"}, {"Problema": "Automatización del control de calidad", "SCAMPER": "Sustituir", "Idea SCAMPER": "Cámaras de visión artificial con IA", "Fase DT": "Testear", "Tarea": "Comparación de defectos detectados manualmente vs IA", "Inicio": "2024-01-23", "Compromiso": "2024-02-13"}, # 🔴 IMPLEMENTACIÓN (1 idea) {"Problema": "Implementar manufactura sin papel", "SCAMPER": "Adaptar", "Idea SCAMPER": "Digitalización con tablets", "Fase DT": "Implementación", "Tarea": "Capacitación de operarios", "Inicio": "2024-01-25", "Compromiso": "2024-02-10"}, ]) st.markdown(""" ## 📋 Ver y Editar Innovaciones Guardadas""" ) # 📌 Expander para visualizar y editar el DataFrame de Innovaciones with st.expander("Ajusta el progreso de las ideas innovadoras", expanded=False): df_ideas = st.data_editor(st.session_state.ideas_innovacion, use_container_width=True, num_rows="dynamic") st.session_state.ideas_innovacion = df_ideas # Guardar cambios # 📊 Visualización del Funnel en horizontal con Plotly st.subheader("📊 Funnel de Innovación - Evolución de Ideas") if not st.session_state.ideas_innovacion.empty: funnel_counts = st.session_state.ideas_innovacion["Fase DT"].value_counts().reset_index() funnel_counts.columns = ["Fase", "Cantidad"] fig_funnel = go.Figure(go.Funnel( orientation="v", # 🏆 FUNNEL EN HORIZONTAL y=funnel_counts["Cantidad"], x=funnel_counts["Fase"], textinfo="value+percent initial", marker={"color": ["blue", "green", "orange", "red", "purple", "gray"]} )) fig_funnel.update_layout(title="Funnel de Innovación - Design Thinking") st.plotly_chart(fig_funnel, use_container_width=True) # 📌 Seguimiento de Acciones en un Gantt st.subheader("📅 Tablero de Acciones y Compromisos") if not st.session_state.ideas_innovacion.empty: fig_gantt = px.timeline(st.session_state.ideas_innovacion, x_start="Inicio", x_end="Compromiso", y="Tarea", color="Fase DT", title="Tareas y Fechas de Innovación", category_orders={"Fase DT": ["Empatizar", "Definir", "Idear", "Prototipar", "Testear", "Implementación"]}) fig_gantt.update_yaxes(categoryorder="total ascending") fig_gantt.update_layout(showlegend=True) st.plotly_chart(fig_gantt, use_container_width=True)