4Papp / app.py
Migue1804's picture
Upload 5 files
4d3fe59 verified
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 style='width:100%; border-collapse: collapse;'>"
table_html += "<tr style='background-color: #dddddd; text-align: left;'><th>Categoría</th><th>Fecha Ocurrencia</th><th>Problema</th><th>Causa</th><th>Estatus</th></tr>"
for _, row in df.iterrows():
color = categoria_colores.get(row["Categoría"], "#FFFFFF")
table_html += f"<tr style='background-color: {color}; color: white;'>"
table_html += f"<td>{row['Categoría']}</td>"
table_html += f"<td>{row['Fecha Ocurrencia']}</td>"
table_html += f"<td>{row['Problema']}</td>"
table_html += f"<td>{row['Causa']}</td>"
table_html += f"<td>{row['Estatus']}</td>"
table_html += "</tr>"
table_html += "</table>"
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"<h2 style='color:green;'>Abiertas: {estados_acciones.get('Abierta', 0)}</h2>", unsafe_allow_html=True)
col2.markdown(f"<h2 style='color:gray;'>Cerradas: {estados_acciones.get('Cerrada', 0)}</h2>", unsafe_allow_html=True)
col3.markdown(f"<h2 style='color:red;'>Vencidas: {estados_acciones.get('Vencida', 0)}</h2>", unsafe_allow_html=True)
col4.markdown(f"<h2 style='color:yellow;'>Pendientes: {estados_acciones.get('Pendiente', 0)}</h2>", 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("<h1 style='text-align: center;'>📄 A3 - Resolución de Problemas</h1>", 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("<h1 style='text-align: left;'>🚀 Funnel de Innovación</h1>", 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)