|
|
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
|
|
|
|
|
|
|
|
|
st.set_page_config(page_title="4 Types of Problems", page_icon="📊",layout="wide")
|
|
|
|
|
|
st.image('4Papps.jpg', use_container_width=True)
|
|
|
st.title("4 Tipos de problemas")
|
|
|
|
|
|
tabs = st.tabs(["Contención", "Desviación del Estándar", "Condición Objetivo", "Innovación"])
|
|
|
|
|
|
|
|
|
with tabs[0]:
|
|
|
|
|
|
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.*
|
|
|
""")
|
|
|
|
|
|
|
|
|
if "df_problemas" not in st.session_state:
|
|
|
data_inicial = [
|
|
|
|
|
|
{"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"},
|
|
|
|
|
|
|
|
|
{"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"},
|
|
|
|
|
|
|
|
|
{"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"},
|
|
|
|
|
|
|
|
|
{"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)
|
|
|
|
|
|
|
|
|
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 """)
|
|
|
|
|
|
with st.expander("Accede al reporte", expanded=False):
|
|
|
|
|
|
categorias = ["Seguridad", "Calidad", "Costo", "Entrega"]
|
|
|
|
|
|
|
|
|
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?")
|
|
|
|
|
|
|
|
|
st.subheader("⚠️ Cause (Causa)")
|
|
|
causa = st.text_area("🔍 ¿Cuál es la posible causa raíz del problema?")
|
|
|
|
|
|
|
|
|
st.subheader("🛠️ Countermeasure (Contramedida)")
|
|
|
contramedida = st.text_area("✅ ¿Qué acción inmediata o temporal puede tomarse para reducir o eliminar el problema?")
|
|
|
|
|
|
|
|
|
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"])
|
|
|
|
|
|
|
|
|
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 """)
|
|
|
|
|
|
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()
|
|
|
|
|
|
st.markdown("""
|
|
|
### 📊 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]
|
|
|
|
|
|
|
|
|
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")
|
|
|
|
|
|
|
|
|
categoria_colores = {
|
|
|
"Seguridad": "#FF4B4B",
|
|
|
"Calidad": "#4B83FF",
|
|
|
"Costo": "#FFA64B",
|
|
|
"Entrega": "#4BFF83"
|
|
|
}
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def calcular_cumplimiento(df, mejor_es_mayor):
|
|
|
resultados_prom = df["Resultados"].mean()
|
|
|
meta_prom = df["Meta"].mean()
|
|
|
|
|
|
|
|
|
if not mejor_es_mayor:
|
|
|
if resultados_prom == 0:
|
|
|
return 100
|
|
|
return max(0, min(100, (1 - (resultados_prom / (meta_prom + 1))) * 100))
|
|
|
|
|
|
|
|
|
if meta_prom == 0:
|
|
|
return 100 if mejor_es_mayor else 0
|
|
|
|
|
|
return max(0, min(100, (resultados_prom / meta_prom) * 100))
|
|
|
|
|
|
|
|
|
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", "", ""]})},
|
|
|
}
|
|
|
|
|
|
|
|
|
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()
|
|
|
|
|
|
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.** 🚀
|
|
|
""")
|
|
|
|
|
|
|
|
|
mdi_icons = {
|
|
|
"Seguridad": "🛑",
|
|
|
"Calidad": "✔️",
|
|
|
"Costo": "💰",
|
|
|
"Entrega": "🚚"
|
|
|
}
|
|
|
|
|
|
st.header("📊 Management Daily Improvement SQCD")
|
|
|
|
|
|
|
|
|
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]
|
|
|
|
|
|
|
|
|
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}"
|
|
|
)
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
icon = mdi_icons.get(perspective, "📊")
|
|
|
st.markdown(f"### {icon} {perspective}")
|
|
|
|
|
|
|
|
|
cumplimiento = st.session_state["mdi"][perspective]["cumplimiento"]
|
|
|
|
|
|
|
|
|
if cumplimiento < 90:
|
|
|
color_gauge = "red"
|
|
|
elif 90 <= cumplimiento < 100:
|
|
|
color_gauge = "yellow"
|
|
|
else:
|
|
|
color_gauge = "green"
|
|
|
|
|
|
|
|
|
max_range = max(100, cumplimiento + 5)
|
|
|
|
|
|
fig_gauge = go.Figure(go.Indicator(
|
|
|
mode="gauge+number",
|
|
|
value=cumplimiento,
|
|
|
number={"font": {"size": 25}},
|
|
|
title={'text': f"{data['indicador']}", 'font': {'size': 20}},
|
|
|
gauge={'axis': {'range': [0, max_range]}, 'bar': {'color': color_gauge}}
|
|
|
))
|
|
|
fig_gauge.update_layout(height=280)
|
|
|
st.plotly_chart(fig_gauge, use_container_width=True)
|
|
|
|
|
|
|
|
|
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
|
|
|
)
|
|
|
st.plotly_chart(fig_control, use_container_width=True)
|
|
|
|
|
|
|
|
|
df_causas = df_editable[df_editable["Causa"] != ""].copy()
|
|
|
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)
|
|
|
fig_barras.update_yaxes(categoryorder='total ascending')
|
|
|
fig_barras.update_layout(height=250)
|
|
|
st.plotly_chart(fig_barras, use_container_width=True)
|
|
|
|
|
|
|
|
|
st.header("📝 DMAIC Action Plan")
|
|
|
|
|
|
|
|
|
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."}
|
|
|
]
|
|
|
|
|
|
|
|
|
df_acciones = pd.DataFrame(st.session_state.acciones)
|
|
|
|
|
|
|
|
|
with st.expander("📌 Ver y Editar Acciones con Ciclo DMAIC", expanded=False):
|
|
|
|
|
|
|
|
|
df_editable = st.data_editor(df_acciones, num_rows="dynamic", use_container_width=True)
|
|
|
|
|
|
|
|
|
st.session_state.acciones = df_editable.to_dict(orient="records")
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
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")
|
|
|
fig.update_layout(xaxis_title="Fechas", yaxis_title="Descripción de la Acción", height=350, showlegend=True)
|
|
|
|
|
|
|
|
|
st.plotly_chart(fig, use_container_width=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
imagen_actual_default = "current.jpg"
|
|
|
imagen_futura_default = "future.jpg"
|
|
|
|
|
|
with tabs[2]:
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
col_izq, col_der = st.columns([2, 2])
|
|
|
|
|
|
|
|
|
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.")
|
|
|
|
|
|
|
|
|
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)")
|
|
|
|
|
|
|
|
|
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"},
|
|
|
])
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
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))
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
st.subheader("📊 7. Seguimiento de Indicadores de Éxito")
|
|
|
|
|
|
|
|
|
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"},
|
|
|
])
|
|
|
|
|
|
|
|
|
df_editable = st.data_editor(st.session_state.indicadores_a3, use_container_width=True, num_rows="dynamic")
|
|
|
st.session_state.indicadores_a3 = df_editable
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
with tabs[3]:
|
|
|
st.markdown("<h1 style='text-align: left;'>🚀 Funnel de Innovación</h1>", unsafe_allow_html=True)
|
|
|
|
|
|
|
|
|
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""" )
|
|
|
|
|
|
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.")
|
|
|
|
|
|
|
|
|
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.")
|
|
|
|
|
|
|
|
|
if "ideas_innovacion" not in st.session_state:
|
|
|
st.session_state.ideas_innovacion = pd.DataFrame([
|
|
|
|
|
|
{"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"},
|
|
|
|
|
|
|
|
|
{"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"},
|
|
|
|
|
|
|
|
|
{"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"},
|
|
|
|
|
|
|
|
|
{"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"},
|
|
|
|
|
|
|
|
|
{"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"},
|
|
|
|
|
|
|
|
|
{"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""" )
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
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",
|
|
|
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)
|
|
|
|
|
|
|
|
|
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) |