Upload 5 files
Browse files- .gitattributes +2 -0
- 4Papps.jpg +0 -0
- app.py +703 -0
- current.jpg +3 -0
- future.jpg +3 -0
- requirements.txt +4 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
current.jpg filter=lfs diff=lfs merge=lfs -text
|
| 37 |
+
future.jpg filter=lfs diff=lfs merge=lfs -text
|
4Papps.jpg
ADDED
|
app.py
ADDED
|
@@ -0,0 +1,703 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import pandas as pd
|
| 3 |
+
import plotly.express as px
|
| 4 |
+
import plotly.graph_objects as go
|
| 5 |
+
import plotly.figure_factory as ff
|
| 6 |
+
import numpy as np
|
| 7 |
+
|
| 8 |
+
# Configuración de la aplicación
|
| 9 |
+
st.set_page_config(page_title="4 Types of Problems", page_icon="📊",layout="wide")
|
| 10 |
+
# Display the image above the title
|
| 11 |
+
st.image('4Papps.jpg', use_container_width=True)
|
| 12 |
+
st.title("4 Tipos de problemas")
|
| 13 |
+
# Definir pestañas
|
| 14 |
+
tabs = st.tabs(["Contención", "Desviación del Estándar", "Condición Objetivo", "Innovación"])
|
| 15 |
+
|
| 16 |
+
# Trabajamos solo en la pestaña "Contención"
|
| 17 |
+
with tabs[0]:
|
| 18 |
+
# 📌 Resumen del Método 4C’s de Art Smalley
|
| 19 |
+
st.markdown("""
|
| 20 |
+
## 🛠 Método 4C’s - Resolución Rápida de Problemas (Troubleshooting)
|
| 21 |
+
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**.
|
| 22 |
+
|
| 23 |
+
- **❗ Concern (Preocupación):** Identificar claramente el problema o anomalía detectada.
|
| 24 |
+
- **🔍 Cause (Causa):** Determinar la causa raíz probable o el factor que contribuyó al problema.
|
| 25 |
+
- **🛠 Countermeasure (Acción Correctiva):** Implementar una solución inmediata para restaurar el estándar.
|
| 26 |
+
- **📊 Check (Seguimiento):** Evaluar si la contramedida funcionó y si se requiere más análisis.
|
| 27 |
+
|
| 28 |
+
👉 *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.*
|
| 29 |
+
""")
|
| 30 |
+
|
| 31 |
+
# Inicializar DataFrame en sesión si no existe
|
| 32 |
+
if "df_problemas" not in st.session_state:
|
| 33 |
+
data_inicial = [
|
| 34 |
+
# 🚧 Seguridad: Emergencia con equipo de producción
|
| 35 |
+
{"Categoría": "Seguridad", "Fecha Ocurrencia": "2024-01-10",
|
| 36 |
+
"Problema": "Derrame de aceite en zona de trabajo",
|
| 37 |
+
"Causa": "Fuga en manguera hidráulica de prensa",
|
| 38 |
+
"Contramedida": "Limpieza inmediata y cambio de manguera",
|
| 39 |
+
"Seguimiento": "Sí", "Fecha Seguimiento": "2024-01-15", "Estatus Seguimiento": "Cerrada",
|
| 40 |
+
"Investigación Tipo 2": "No", "Estatus": "Cerrado"},
|
| 41 |
+
|
| 42 |
+
# 🔍 Calidad: Defectos en piezas recién producidas
|
| 43 |
+
{"Categoría": "Calidad", "Fecha Ocurrencia": "2024-02-05",
|
| 44 |
+
"Problema": "Riesgo de contaminación en piezas mecanizadas",
|
| 45 |
+
"Causa": "Exceso de virutas en la máquina CNC",
|
| 46 |
+
"Contramedida": "Limpieza del área y ajuste en frecuencia de mantenimiento",
|
| 47 |
+
"Seguimiento": "Sí", "Fecha Seguimiento": "2024-02-09", "Estatus Seguimiento": "En proceso",
|
| 48 |
+
"Investigación Tipo 2": "Sí", "Estatus": "Abierto"},
|
| 49 |
+
|
| 50 |
+
# 💲 Costo: Pérdidas por mal funcionamiento de equipos
|
| 51 |
+
{"Categoría": "Costo", "Fecha Ocurrencia": "2024-03-01",
|
| 52 |
+
"Problema": "Paro de línea por falla en sensor de temperatura",
|
| 53 |
+
"Causa": "Sensor descalibrado tras última inspección",
|
| 54 |
+
"Contramedida": "Reemplazo de sensor y recalibración",
|
| 55 |
+
"Seguimiento": "Sí", "Fecha Seguimiento": "2024-03-05", "Estatus Seguimiento": "En proceso",
|
| 56 |
+
"Investigación Tipo 2": "No", "Estatus": "En proceso"},
|
| 57 |
+
|
| 58 |
+
# 📦 Entrega: Retraso en abastecimiento de materiales
|
| 59 |
+
{"Categoría": "Entrega", "Fecha Ocurrencia": "2024-03-10",
|
| 60 |
+
"Problema": "Retraso en entrega de materiales a producción",
|
| 61 |
+
"Causa": "Error en planificación de inventario",
|
| 62 |
+
"Contramedida": "Ajuste manual de stock y notificación a proveedor",
|
| 63 |
+
"Seguimiento": "Sí", "Fecha Seguimiento": "2024-03-15", "Estatus Seguimiento": "Atrasada",
|
| 64 |
+
"Investigación Tipo 2": "Sí", "Estatus": "Atrasado"}
|
| 65 |
+
]
|
| 66 |
+
|
| 67 |
+
st.session_state.df_problemas = pd.DataFrame(data_inicial)
|
| 68 |
+
|
| 69 |
+
# Convertir fechas a datetime
|
| 70 |
+
for col in ["Fecha Ocurrencia", "Fecha Seguimiento"]:
|
| 71 |
+
if col in st.session_state.df_problemas.columns:
|
| 72 |
+
st.session_state.df_problemas[col] = pd.to_datetime(st.session_state.df_problemas[col], errors="coerce")
|
| 73 |
+
|
| 74 |
+
st.markdown("""
|
| 75 |
+
### 📌 Reporta un problema de contención """)
|
| 76 |
+
# Expander 1: Reportar un nuevo problema
|
| 77 |
+
with st.expander("Accede al reporte", expanded=False):
|
| 78 |
+
|
| 79 |
+
categorias = ["Seguridad", "Calidad", "Costo", "Entrega"]
|
| 80 |
+
|
| 81 |
+
# 🔴 1️⃣ CONCERN (PREOCUPACIÓN) - ¿Cuál es el problema?
|
| 82 |
+
st.subheader("🔴 Concern (Preocupación)")
|
| 83 |
+
problema_tipo = st.selectbox("Seleccione la categoría del problema", categorias)
|
| 84 |
+
fecha_ocurrencia = st.date_input("📅 Fecha de ocurrencia del problema")
|
| 85 |
+
problema = st.text_area("❓ ¿Qué sabe usted sobre el problema exacto?")
|
| 86 |
+
|
| 87 |
+
# ⚠️ 2️⃣ CAUSE (CAUSA) - ¿Qué lo originó?
|
| 88 |
+
st.subheader("⚠️ Cause (Causa)")
|
| 89 |
+
causa = st.text_area("🔍 ¿Cuál es la posible causa raíz del problema?")
|
| 90 |
+
|
| 91 |
+
# 🛠️ 3️⃣ COUNTERMEASURE (CONTRAMEDIDA) - ¿Cómo se solucionará?
|
| 92 |
+
st.subheader("🛠️ Countermeasure (Contramedida)")
|
| 93 |
+
contramedida = st.text_area("✅ ¿Qué acción inmediata o temporal puede tomarse para reducir o eliminar el problema?")
|
| 94 |
+
|
| 95 |
+
# ✅ 4️⃣ CHECK (VERIFICACIÓN) - Seguimiento y estatus
|
| 96 |
+
st.subheader("✅ Check (Verificación)")
|
| 97 |
+
seguimiento = st.radio("📊 ¿Es necesario un seguimiento adicional?", ["Sí", "No"])
|
| 98 |
+
fecha_seguimiento = st.date_input("📅 Fecha de seguimiento", disabled=(seguimiento == "No"))
|
| 99 |
+
estatus_seguimiento = st.selectbox("📌 Estatus del seguimiento", ["En proceso", "Atrasada", "Cerrada"], disabled=(seguimiento == "No"))
|
| 100 |
+
investigar_mas = st.checkbox("🔬 ¿Necesita investigar más a fondo usando métodos de Tipo 2?")
|
| 101 |
+
estatus = st.selectbox("📈 Estatus del problema", ["Abierto", "En proceso", "Atrasado", "Cerrado"])
|
| 102 |
+
|
| 103 |
+
# Guardar los datos ingresados
|
| 104 |
+
if st.button("💾 Guardar Nuevo Problema"):
|
| 105 |
+
nuevo_problema = pd.DataFrame([{
|
| 106 |
+
"Categoría": problema_tipo,
|
| 107 |
+
"Fecha Ocurrencia": pd.to_datetime(fecha_ocurrencia),
|
| 108 |
+
"Problema": problema,
|
| 109 |
+
"Causa": causa,
|
| 110 |
+
"Contramedida": contramedida,
|
| 111 |
+
"Seguimiento": seguimiento,
|
| 112 |
+
"Fecha Seguimiento": pd.to_datetime(fecha_seguimiento) if seguimiento == "Sí" else pd.NaT,
|
| 113 |
+
"Estatus Seguimiento": estatus_seguimiento if seguimiento == "Sí" else "N/A",
|
| 114 |
+
"Investigación Tipo 2": "Sí" if investigar_mas else "No",
|
| 115 |
+
"Estatus": estatus
|
| 116 |
+
}])
|
| 117 |
+
|
| 118 |
+
st.session_state.df_problemas = pd.concat([st.session_state.df_problemas, nuevo_problema], ignore_index=True)
|
| 119 |
+
st.success("✅ Nuevo problema guardado correctamente")
|
| 120 |
+
|
| 121 |
+
st.markdown("""
|
| 122 |
+
### 📝 Reporta los avances """)
|
| 123 |
+
# Expander 2: Reporta avances en los problemas existentes
|
| 124 |
+
with st.expander("Ingresa el progreso"):
|
| 125 |
+
df_editado = st.data_editor(st.session_state.df_problemas, num_rows="dynamic")
|
| 126 |
+
|
| 127 |
+
if st.button("Guardar Cambios en Problemas"):
|
| 128 |
+
st.session_state.df_problemas = df_editado
|
| 129 |
+
st.rerun() # Refresca la app para actualizar la tabla HTML
|
| 130 |
+
|
| 131 |
+
st.markdown("""
|
| 132 |
+
### 📊 Visualiza el Histórico de Problemas """)
|
| 133 |
+
# Expander 3: Visualiza el Histórico de Problemas
|
| 134 |
+
with st.expander("Revisa como vamos", expanded=True):
|
| 135 |
+
filtro_categoria = st.selectbox("Filtrar por categoría", ["Todas"] + categorias)
|
| 136 |
+
df_mostrar = st.session_state.df_problemas.copy()
|
| 137 |
+
|
| 138 |
+
if filtro_categoria != "Todas":
|
| 139 |
+
df_mostrar = df_mostrar[df_mostrar["Categoría"] == filtro_categoria]
|
| 140 |
+
|
| 141 |
+
# Formatear fechas antes de mostrar
|
| 142 |
+
if "Fecha Ocurrencia" in df_mostrar.columns:
|
| 143 |
+
df_mostrar["Fecha Ocurrencia"] = df_mostrar["Fecha Ocurrencia"].dt.strftime("%Y-%m-%d")
|
| 144 |
+
if "Fecha Seguimiento" in df_mostrar.columns:
|
| 145 |
+
df_mostrar["Fecha Seguimiento"] = df_mostrar["Fecha Seguimiento"].dt.strftime("%Y-%m-%d").replace("NaT", "N/A")
|
| 146 |
+
|
| 147 |
+
# Definir colores para las categorías
|
| 148 |
+
categoria_colores = {
|
| 149 |
+
"Seguridad": "#FF4B4B",
|
| 150 |
+
"Calidad": "#4B83FF",
|
| 151 |
+
"Costo": "#FFA64B",
|
| 152 |
+
"Entrega": "#4BFF83"
|
| 153 |
+
}
|
| 154 |
+
|
| 155 |
+
# Generar tabla HTML con colores
|
| 156 |
+
def generar_tabla_html(df):
|
| 157 |
+
table_html = "<table style='width:100%; border-collapse: collapse;'>"
|
| 158 |
+
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>"
|
| 159 |
+
|
| 160 |
+
for _, row in df.iterrows():
|
| 161 |
+
color = categoria_colores.get(row["Categoría"], "#FFFFFF")
|
| 162 |
+
table_html += f"<tr style='background-color: {color}; color: white;'>"
|
| 163 |
+
table_html += f"<td>{row['Categoría']}</td>"
|
| 164 |
+
table_html += f"<td>{row['Fecha Ocurrencia']}</td>"
|
| 165 |
+
table_html += f"<td>{row['Problema']}</td>"
|
| 166 |
+
table_html += f"<td>{row['Causa']}</td>"
|
| 167 |
+
table_html += f"<td>{row['Estatus']}</td>"
|
| 168 |
+
table_html += "</tr>"
|
| 169 |
+
|
| 170 |
+
table_html += "</table>"
|
| 171 |
+
return table_html
|
| 172 |
+
|
| 173 |
+
st.markdown(generar_tabla_html(df_mostrar), unsafe_allow_html=True)
|
| 174 |
+
#__________________________________________________________________________________________________________________________________________________________________
|
| 175 |
+
|
| 176 |
+
#Problemas de tipo 2 - Desviación del estandar
|
| 177 |
+
|
| 178 |
+
# 📌 Función para calcular cumplimiento dinámico
|
| 179 |
+
def calcular_cumplimiento(df, mejor_es_mayor):
|
| 180 |
+
resultados_prom = df["Resultados"].mean()
|
| 181 |
+
meta_prom = df["Meta"].mean()
|
| 182 |
+
|
| 183 |
+
# Caso especial para LTI (Seguridad)
|
| 184 |
+
if not mejor_es_mayor:
|
| 185 |
+
if resultados_prom == 0:
|
| 186 |
+
return 100 # Sin eventos = 100% cumplimiento
|
| 187 |
+
return max(0, min(100, (1 - (resultados_prom / (meta_prom + 1))) * 100))
|
| 188 |
+
|
| 189 |
+
# Casos para RFT, OEE y OTIF (donde mayor es mejor)
|
| 190 |
+
if meta_prom == 0:
|
| 191 |
+
return 100 if mejor_es_mayor else 0
|
| 192 |
+
|
| 193 |
+
return max(0, min(100, (resultados_prom / meta_prom) * 100)) # Limitar a 100%
|
| 194 |
+
|
| 195 |
+
# 📌 Función para inicializar MDI con datos corregidos
|
| 196 |
+
def inicializar_mdi():
|
| 197 |
+
if "mdi" not in st.session_state:
|
| 198 |
+
st.session_state["mdi"] = {
|
| 199 |
+
"Seguridad": {"indicador": "LTI", "mejor_es_mayor": False, "datos": pd.DataFrame({
|
| 200 |
+
"Fecha": pd.date_range(start="2024-01-01", periods=12, freq='M'),
|
| 201 |
+
"Resultados": [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0],
|
| 202 |
+
"Meta": [0] * 12,
|
| 203 |
+
"Causa": ["", "", "", "Falta de EPP", "", "", "", "Condiciones inseguras", "", "", "", ""]})},
|
| 204 |
+
|
| 205 |
+
"Calidad": {"indicador": "RFT", "mejor_es_mayor": True, "datos": pd.DataFrame({
|
| 206 |
+
"Fecha": pd.date_range(start="2024-01-01", periods=12, freq='M'),
|
| 207 |
+
"Resultados": [96, 97, 94, 95, 92, 91, 89, 85, 97, 96, 98, 99],
|
| 208 |
+
"Meta": [95] * 12,
|
| 209 |
+
"Causa": ["", "", "Materia prima defectuosa", "", "Falla de calibración", "", "Falta de estandarización", "Error en proceso", "", "", "", ""]})},
|
| 210 |
+
|
| 211 |
+
"Costo": {"indicador": "OEE", "mejor_es_mayor": True, "datos": pd.DataFrame({
|
| 212 |
+
"Fecha": pd.date_range(start="2024-01-01", periods=12, freq='M'),
|
| 213 |
+
"Resultados": [82, 85, 79, 81, 80, 77, 76, 75, 85, 84, 82, 86],
|
| 214 |
+
"Meta": [80] * 12,
|
| 215 |
+
"Causa": ["", "", "Mantenimiento inadecuado", "", "", "Baja eficiencia operativa", "", "Desgaste de equipos", "", "", "", ""]})},
|
| 216 |
+
|
| 217 |
+
"Entrega": {"indicador": "OTIF", "mejor_es_mayor": True, "datos": pd.DataFrame({
|
| 218 |
+
"Fecha": pd.date_range(start="2024-01-01", periods=12, freq='M'),
|
| 219 |
+
"Resultados": [92, 94, 91, 89, 95, 97, 93, 96, 94, 90, 92, 91],
|
| 220 |
+
"Meta": [90] * 12,
|
| 221 |
+
"Causa": ["", "", "", "Falla logística", "", "", "", "", "", "Demora del proveedor", "", ""]})},
|
| 222 |
+
}
|
| 223 |
+
|
| 224 |
+
# 🔄 Calcular cumplimiento dinámico para cada perspectiva
|
| 225 |
+
for perspectiva, data in st.session_state["mdi"].items():
|
| 226 |
+
data["cumplimiento"] = round(calcular_cumplimiento(data["datos"], data["mejor_es_mayor"]), 2)
|
| 227 |
+
|
| 228 |
+
with tabs[1]:
|
| 229 |
+
inicializar_mdi()
|
| 230 |
+
# 📖 Resumen del Problema Tipo 2
|
| 231 |
+
st.markdown("""
|
| 232 |
+
## 🔄 Management Daily Improvement (MDI) & DMAIC Cycle
|
| 233 |
+
Los **problemas tipo 2** ocurren cuando hay una **desviación del estándar previamente definido** en una operación, proceso o sistema.
|
| 234 |
+
Se centran en **restaurar y mejorar el estándar** a través de la **gestión diaria y análisis estructurado**.
|
| 235 |
+
|
| 236 |
+
### 🏭 **Management Daily Improvement (MDI) y la Cultura Toyota**
|
| 237 |
+
- El **MDI (Mejora Diaria de Gestión)** es clave en Toyota para detectar y corregir desviaciones en tiempo real.
|
| 238 |
+
- Se basa en la **observación sistemática de métricas clave** en Seguridad, Calidad, Costo y Entrega (**SQCD**).
|
| 239 |
+
- Los **supervisores y equipos** deben identificar, registrar y actuar sobre desviaciones detectadas.
|
| 240 |
+
- Se apoya en el **ciclo DMAIC** para implementar mejoras efectivas.
|
| 241 |
+
|
| 242 |
+
### 🔬 **Ciclo DMAIC**
|
| 243 |
+
Los problemas de desviación del estándar se analizan y resuelven con el enfoque **DMAIC**:
|
| 244 |
+
|
| 245 |
+
1️⃣ **Definir**: Identificar el estándar afectado y describir la desviación.
|
| 246 |
+
2️⃣ **Medir**: Cuantificar el impacto con datos históricos y métricas clave.
|
| 247 |
+
3️⃣ **Analizar**: Determinar la causa raíz mediante herramientas como Ishikawa, Pareto o 5 Porqués.
|
| 248 |
+
4️⃣ **Implementar**: Aplicar acciones correctivas para restaurar el estándar.
|
| 249 |
+
5️⃣ **Controlar**: Asegurar que la mejora sea sostenible en el tiempo.
|
| 250 |
+
|
| 251 |
+
📌 **Este tablero MDI ayuda a visualizar las desviaciones en SQCD, permitiendo aplicar el ciclo DMAIC para mejorar los procesos.** 🚀
|
| 252 |
+
""")
|
| 253 |
+
|
| 254 |
+
# 📌 Diccionario de iconos por categoría SQCD
|
| 255 |
+
mdi_icons = {
|
| 256 |
+
"Seguridad": "🛑",
|
| 257 |
+
"Calidad": "✔️",
|
| 258 |
+
"Costo": "💰",
|
| 259 |
+
"Entrega": "🚚"
|
| 260 |
+
}
|
| 261 |
+
|
| 262 |
+
st.header("📊 Management Daily Improvement SQCD")
|
| 263 |
+
|
| 264 |
+
# 📌 Obtener las perspectivas del tablero MDI
|
| 265 |
+
perspectives = list(st.session_state["mdi"].keys())
|
| 266 |
+
col1, col2, col3, col4 = st.columns(4)
|
| 267 |
+
|
| 268 |
+
for i, perspective in enumerate(perspectives):
|
| 269 |
+
col = [col1, col2, col3, col4][i]
|
| 270 |
+
with col:
|
| 271 |
+
data = st.session_state["mdi"][perspective]
|
| 272 |
+
|
| 273 |
+
# 📋 Expander para editar los datos
|
| 274 |
+
with st.expander(f"📋 Datos de {perspective}"):
|
| 275 |
+
df_editable = st.data_editor(
|
| 276 |
+
data["datos"], use_container_width=True, num_rows="dynamic", key=f"datos_{perspective}"
|
| 277 |
+
)
|
| 278 |
+
|
| 279 |
+
# 🔄 Actualizar el DataFrame y el cumplimiento después de la edición
|
| 280 |
+
st.session_state["mdi"][perspective]["datos"] = df_editable
|
| 281 |
+
nuevo_cumplimiento = calcular_cumplimiento(df_editable, data["mejor_es_mayor"])
|
| 282 |
+
st.session_state["mdi"][perspective]["cumplimiento"] = round(nuevo_cumplimiento, 2)
|
| 283 |
+
|
| 284 |
+
# 📌 Mostrar Icono + Categoría
|
| 285 |
+
icon = mdi_icons.get(perspective, "📊") # Si no encuentra el icono, usa un default
|
| 286 |
+
st.markdown(f"### {icon} {perspective}")
|
| 287 |
+
|
| 288 |
+
# 🏆 Gráfico de cumplimiento (Gauge) - ALTURA REDUCIDA
|
| 289 |
+
cumplimiento = st.session_state["mdi"][perspective]["cumplimiento"]
|
| 290 |
+
|
| 291 |
+
# 🔄 Definir color según el valor de cumplimiento
|
| 292 |
+
if cumplimiento < 90:
|
| 293 |
+
color_gauge = "red" # 🔴 Menos de 90%
|
| 294 |
+
elif 90 <= cumplimiento < 100:
|
| 295 |
+
color_gauge = "yellow" # 🟡 Entre 90% y 100%
|
| 296 |
+
else:
|
| 297 |
+
color_gauge = "green" # 🟢 Más de 100%
|
| 298 |
+
|
| 299 |
+
# 🔄 Ajustar dinámicamente el rango del gauge
|
| 300 |
+
max_range = max(100, cumplimiento + 5) # Asegurar que siempre haya espacio para valores >100%
|
| 301 |
+
|
| 302 |
+
fig_gauge = go.Figure(go.Indicator(
|
| 303 |
+
mode="gauge+number",
|
| 304 |
+
value=cumplimiento,
|
| 305 |
+
number={"font": {"size": 25}}, # 🔽 REDUCE el tamaño del número del cumplimiento
|
| 306 |
+
title={'text': f"{data['indicador']}", 'font': {'size': 20}},
|
| 307 |
+
gauge={'axis': {'range': [0, max_range]}, 'bar': {'color': color_gauge}}
|
| 308 |
+
))
|
| 309 |
+
fig_gauge.update_layout(height=280) # 🔽 Ajuste de altura del gauge
|
| 310 |
+
st.plotly_chart(fig_gauge, use_container_width=True)
|
| 311 |
+
|
| 312 |
+
# 📉 Gráfico de control de tendencia - ALTURA AJUSTADA
|
| 313 |
+
fig_control = go.Figure()
|
| 314 |
+
fig_control.add_trace(go.Scatter(
|
| 315 |
+
x=df_editable["Fecha"], y=df_editable["Resultados"],
|
| 316 |
+
mode='lines+markers', name='Resultados'
|
| 317 |
+
))
|
| 318 |
+
fig_control.add_hline(y=df_editable["Meta"].mean(), line_dash="dash", line_color="red",
|
| 319 |
+
annotation_text="Meta", annotation_position="top right")
|
| 320 |
+
fig_control.update_layout(
|
| 321 |
+
title=f"Tendencia de {perspective}",
|
| 322 |
+
xaxis_title="Fecha", yaxis_title="Valor",
|
| 323 |
+
height=280 # 🔽 Ajuste de altura del gráfico de tendencias
|
| 324 |
+
)
|
| 325 |
+
st.plotly_chart(fig_control, use_container_width=True)
|
| 326 |
+
|
| 327 |
+
# 📊 Gráfico de causas repetitivas corregido - ALTURA REDUCIDA
|
| 328 |
+
df_causas = df_editable[df_editable["Causa"] != ""].copy() # Excluir valores vacíos
|
| 329 |
+
df_causas = df_causas["Causa"].value_counts().reset_index()
|
| 330 |
+
df_causas.columns = ["Causa", "Frecuencia"]
|
| 331 |
+
|
| 332 |
+
if not df_causas.empty:
|
| 333 |
+
fig_barras = px.bar(df_causas, x="Frecuencia", y="Causa", orientation='h',
|
| 334 |
+
title=f"Causas más repetitivas en {perspective}",
|
| 335 |
+
text_auto=True) # Muestra los valores en las barras
|
| 336 |
+
fig_barras.update_yaxes(categoryorder='total ascending') # Invierte el eje Y
|
| 337 |
+
fig_barras.update_layout(height=250) # 🔽 Ajuste de altura del gráfico de barras
|
| 338 |
+
st.plotly_chart(fig_barras, use_container_width=True)
|
| 339 |
+
|
| 340 |
+
|
| 341 |
+
st.header("📝 DMAIC Action Plan")
|
| 342 |
+
|
| 343 |
+
# 📌 Inicializar el DataFrame en la sesión si no existe
|
| 344 |
+
if "acciones" not in st.session_state:
|
| 345 |
+
st.session_state.acciones = [
|
| 346 |
+
{"categoria": "Seguridad", "descripcion": "Capacitación en uso de EPP obligatorio.", "fecha_inicio": "2024-01-10", "fecha_fin": "2024-01-20", "estado": "Abierta",
|
| 347 |
+
"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."},
|
| 348 |
+
{"categoria": "Seguridad", "descripcion": "Implementación de checklist diario de condiciones inseguras.", "fecha_inicio": "2024-02-01", "fecha_fin": "2024-02-10", "estado": "Cerrada",
|
| 349 |
+
"Definir": "Condiciones inseguras reportadas.", "Medir": "10 reportes en un mes.", "Analizar": "Falta de control visual.", "Implementar": "Checklists diarios.", "Controlar": "Supervisión de líderes."},
|
| 350 |
+
{"categoria": "Calidad", "descripcion": "Cambio de proveedor de materia prima defectuosa.", "fecha_inicio": "2024-03-05", "fecha_fin": "2024-03-15", "estado": "Vencida",
|
| 351 |
+
"Definir": "Defectos recurrentes en producción.", "Medir": "5% de scrap.", "Analizar": "Proveedores inconsistentes.", "Implementar": "Cambio de proveedor.", "Controlar": "Evaluación mensual."},
|
| 352 |
+
{"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",
|
| 353 |
+
"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."},
|
| 354 |
+
{"categoria": "Costo", "descripcion": "Optimización de parámetros de mantenimiento preventivo.", "fecha_inicio": "2024-05-02", "fecha_fin": "2024-05-12", "estado": "Abierta",
|
| 355 |
+
"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."},
|
| 356 |
+
{"categoria": "Costo", "descripcion": "Rediseño de layout para reducir tiempos de inactividad.", "fecha_inicio": "2024-06-01", "fecha_fin": "2024-06-15", "estado": "Pendiente",
|
| 357 |
+
"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."},
|
| 358 |
+
{"categoria": "Entrega", "descripcion": "Negociación de tiempos de entrega con proveedor clave.", "fecha_inicio": "2024-07-10", "fecha_fin": "2024-07-20", "estado": "Cerrada",
|
| 359 |
+
"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."},
|
| 360 |
+
{"categoria": "Entrega", "descripcion": "Implementación de monitoreo en tiempo real de pedidos.", "fecha_inicio": "2024-08-01", "fecha_fin": "2024-08-10", "estado": "Vencida",
|
| 361 |
+
"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."}
|
| 362 |
+
]
|
| 363 |
+
|
| 364 |
+
# 📌 Convertir a DataFrame
|
| 365 |
+
df_acciones = pd.DataFrame(st.session_state.acciones)
|
| 366 |
+
|
| 367 |
+
# 📌 Expansor para mostrar y editar las acciones
|
| 368 |
+
with st.expander("📌 Ver y Editar Acciones con Ciclo DMAIC", expanded=False):
|
| 369 |
+
|
| 370 |
+
# 📝 Permitir edición de acciones con posibilidad de agregar/eliminar filas
|
| 371 |
+
df_editable = st.data_editor(df_acciones, num_rows="dynamic", use_container_width=True)
|
| 372 |
+
|
| 373 |
+
# 🔄 Actualizar los datos en `st.session_state`
|
| 374 |
+
st.session_state.acciones = df_editable.to_dict(orient="records")
|
| 375 |
+
|
| 376 |
+
# 📌 Recalcular estados de acciones tras edición
|
| 377 |
+
estados_acciones = {"Abierta": 0, "Cerrada": 0, "Vencida": 0, "Pendiente": 0}
|
| 378 |
+
for accion in df_editable["estado"]:
|
| 379 |
+
estados_acciones.setdefault(accion, 0)
|
| 380 |
+
estados_acciones[accion] += 1
|
| 381 |
+
|
| 382 |
+
# 📌 Mostrar métricas con colores (Ahora se actualizan correctamente)
|
| 383 |
+
col1, col2, col3, col4 = st.columns(4)
|
| 384 |
+
col1.markdown(f"<h2 style='color:green;'>Abiertas: {estados_acciones.get('Abierta', 0)}</h2>", unsafe_allow_html=True)
|
| 385 |
+
col2.markdown(f"<h2 style='color:gray;'>Cerradas: {estados_acciones.get('Cerrada', 0)}</h2>", unsafe_allow_html=True)
|
| 386 |
+
col3.markdown(f"<h2 style='color:red;'>Vencidas: {estados_acciones.get('Vencida', 0)}</h2>", unsafe_allow_html=True)
|
| 387 |
+
col4.markdown(f"<h2 style='color:yellow;'>Pendientes: {estados_acciones.get('Pendiente', 0)}</h2>", unsafe_allow_html=True)
|
| 388 |
+
|
| 389 |
+
# 📊 Gantt de Acciones (Se actualiza con los cambios)
|
| 390 |
+
fig = px.timeline(df_editable, x_start="fecha_inicio", x_end="fecha_fin", y="descripcion",
|
| 391 |
+
color="estado", color_discrete_map={
|
| 392 |
+
"Abierta": "green", "Cerrada": "gray", "Vencida": "red", "Pendiente": "yellow"
|
| 393 |
+
},
|
| 394 |
+
title="📅 Estado de las Acciones con DMAIC", labels={"estado": "Estado de la Acción"},
|
| 395 |
+
category_orders={"estado": ["Abierta", "Pendiente", "Vencida", "Cerrada"]})
|
| 396 |
+
|
| 397 |
+
fig.update_yaxes(categoryorder="total ascending") # Ordenar acciones
|
| 398 |
+
fig.update_layout(xaxis_title="Fechas", yaxis_title="Descripción de la Acción", height=350, showlegend=True)
|
| 399 |
+
|
| 400 |
+
# 📌 Mostrar gráfico Gantt
|
| 401 |
+
st.plotly_chart(fig, use_container_width=True)
|
| 402 |
+
|
| 403 |
+
|
| 404 |
+
#__________________________________________________________________________________________________________________________________________________________________
|
| 405 |
+
# Problemas de condición Objetivo
|
| 406 |
+
|
| 407 |
+
# 📌 Precargar imágenes de referencia
|
| 408 |
+
imagen_actual_default = "current.jpg"
|
| 409 |
+
imagen_futura_default = "future.jpg"
|
| 410 |
+
|
| 411 |
+
with tabs[2]:
|
| 412 |
+
# 📖 Introducción a Problemas de Condición Objetivo y VSM
|
| 413 |
+
st.markdown("""
|
| 414 |
+
## 🔀 Value Stream Mapping (VSM) & A3 Thinking
|
| 415 |
+
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.
|
| 416 |
+
|
| 417 |
+
### 📌 Relación entre VSM y A3
|
| 418 |
+
🔹 **Value Stream Mapping (VSM)** permite visualizar la situación actual, identificar desperdicios y diseñar un flujo futuro eficiente.
|
| 419 |
+
🔹 **A3 Thinking** estructura el análisis y la implementación de mejoras, asegurando que las acciones sean alineadas con la estrategia organizacional.
|
| 420 |
+
|
| 421 |
+
### 🔄 Proceso de Transformación
|
| 422 |
+
1️⃣ **Evaluar el estado actual**: Mapear el flujo de valor existente e identificar oportunidades de mejora.
|
| 423 |
+
2️⃣ **Definir la meta futura**: Establecer una condición objetivo alineada con la estrategia de la empresa.
|
| 424 |
+
3️⃣ **Diseñar el estado futuro**: Optimizar el flujo mediante la eliminación de desperdicios y sincronización de procesos.
|
| 425 |
+
4️⃣ **Implementar mejoras con A3**: Planificar y ejecutar acciones basadas en análisis estructurado.
|
| 426 |
+
|
| 427 |
+
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. 🚀📊
|
| 428 |
+
""")
|
| 429 |
+
|
| 430 |
+
st.markdown("<h1 style='text-align: center;'>📄 A3 - Resolución de Problemas</h1>", unsafe_allow_html=True)
|
| 431 |
+
|
| 432 |
+
# 📌 Distribuir en dos columnas de igual tamaño
|
| 433 |
+
col_izq, col_der = st.columns([2, 2])
|
| 434 |
+
|
| 435 |
+
# 📌 Sección Izquierda: Situación Actual y Análisis
|
| 436 |
+
with col_izq:
|
| 437 |
+
with st.container():
|
| 438 |
+
st.subheader("📜 1. Antecedentes")
|
| 439 |
+
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.")
|
| 440 |
+
|
| 441 |
+
st.subheader("📊 2. Situación Actual")
|
| 442 |
+
situacion_actual = st.text_area("Describe la situación actual", value="El flujo del proceso tiene esperas innecesarias, loteo excesivo y transporte ineficiente.")
|
| 443 |
+
|
| 444 |
+
st.subheader("📷 Imagen del Problema (Current State VSM)")
|
| 445 |
+
imagen_actual = st.file_uploader("Sube una imagen del estado actual", type=["png", "jpg", "jpeg"])
|
| 446 |
+
if imagen_actual:
|
| 447 |
+
st.image(imagen_actual, caption="Estado Actual - VSM", use_container_width=True)
|
| 448 |
+
else:
|
| 449 |
+
st.image(imagen_actual_default, caption="Estado Actual (Ejemplo)", use_container_width=True)
|
| 450 |
+
|
| 451 |
+
st.subheader("🔎 3. Análisis de Causa Raíz")
|
| 452 |
+
causas = st.text_area("Identifica las causas raíz", value="- Loteo grande\n- Retrasos en el proceso\n- Falta de flujo continuo.")
|
| 453 |
+
|
| 454 |
+
st.subheader("🎯 4. Metas")
|
| 455 |
+
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.")
|
| 456 |
+
|
| 457 |
+
# 📌 Sección Derecha: Contramedidas y Seguimiento
|
| 458 |
+
with col_der:
|
| 459 |
+
with st.container():
|
| 460 |
+
st.subheader("🛠️ 5. Contramedidas (Plan de Acción)")
|
| 461 |
+
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.")
|
| 462 |
+
|
| 463 |
+
st.subheader("📷 Imagen del Estado Futuro (Future State VSM)")
|
| 464 |
+
imagen_futura = st.file_uploader("Sube una imagen del estado futuro", type=["png", "jpg", "jpeg"])
|
| 465 |
+
if imagen_futura:
|
| 466 |
+
st.image(imagen_futura, caption="Estado Futuro - VSM", use_container_width=True)
|
| 467 |
+
else:
|
| 468 |
+
st.image(imagen_futura_default, caption="Estado Futuro (Ejemplo)", use_container_width=True)
|
| 469 |
+
|
| 470 |
+
st.subheader("📅 6. Tablero de Acciones (Gantt)")
|
| 471 |
+
|
| 472 |
+
# 📌 Inicializar DataFrame si no existe en la sesión
|
| 473 |
+
if "acciones_a3" not in st.session_state:
|
| 474 |
+
st.session_state.acciones_a3 = pd.DataFrame([
|
| 475 |
+
{"Task": "Mapear proceso actual", "Start": "2024-02-01", "Finish": "2024-02-10"},
|
| 476 |
+
{"Task": "Reducir tamaños de lote", "Start": "2024-02-15", "Finish": "2024-02-20"},
|
| 477 |
+
{"Task": "Definir flujo continuo", "Start": "2024-02-21", "Finish": "2024-02-28"},
|
| 478 |
+
{"Task": "Capacitación sobre nuevas prácticas", "Start": "2024-03-01", "Finish": "2024-03-05"},
|
| 479 |
+
{"Task": "Implementación final", "Start": "2024-03-06", "Finish": "2024-03-10"},
|
| 480 |
+
])
|
| 481 |
+
|
| 482 |
+
# 📌 Expander para editar o agregar acciones
|
| 483 |
+
with st.expander("📋 Editar Tablero de Acciones", expanded=False):
|
| 484 |
+
df_acciones = st.data_editor(st.session_state.acciones_a3, use_container_width=True, num_rows="dynamic")
|
| 485 |
+
st.session_state.acciones_a3 = df_acciones # Guardar cambios en la sesión
|
| 486 |
+
|
| 487 |
+
# 🔄 Ajustar altura del Gantt dinámicamente
|
| 488 |
+
if not df_acciones.empty:
|
| 489 |
+
df_acciones.columns = ["Task", "Start", "Finish"]
|
| 490 |
+
num_tareas = len(df_acciones)
|
| 491 |
+
altura_dinamica = max(200, min(num_tareas * 50, 500))
|
| 492 |
+
|
| 493 |
+
# 📊 Generar Gantt después de la edición
|
| 494 |
+
tareas = df_acciones.to_dict("records")
|
| 495 |
+
fig_gantt = ff.create_gantt(tareas, title="Plan de Implementación A3", index_col="Task", show_colorbar=False)
|
| 496 |
+
fig_gantt.update_layout(showlegend=False, height=altura_dinamica)
|
| 497 |
+
st.plotly_chart(fig_gantt, use_container_width=True)
|
| 498 |
+
|
| 499 |
+
# 📌 Tablero de Seguimiento de Indicadores
|
| 500 |
+
st.subheader("📊 7. Seguimiento de Indicadores de Éxito")
|
| 501 |
+
|
| 502 |
+
# 📌 Inicializar DataFrame si no existe en la sesión
|
| 503 |
+
if "indicadores_a3" not in st.session_state:
|
| 504 |
+
st.session_state.indicadores_a3 = pd.DataFrame([
|
| 505 |
+
{"Indicador": "Lead Time (días)", "Antes": 23.6, "Meta": 4.5, "Resultado": None, "Status": "En proceso"},
|
| 506 |
+
{"Indicador": "Tamaño de lote", "Antes": 100, "Meta": 30, "Resultado": None, "Status": "En proceso"},
|
| 507 |
+
{"Indicador": "Tiempo de ciclo (min)", "Antes": 12, "Meta": 6, "Resultado": None, "Status": "En proceso"},
|
| 508 |
+
])
|
| 509 |
+
|
| 510 |
+
# 📌 Mostrar tabla editable
|
| 511 |
+
df_editable = st.data_editor(st.session_state.indicadores_a3, use_container_width=True, num_rows="dynamic")
|
| 512 |
+
st.session_state.indicadores_a3 = df_editable # Guardar cambios en la sesión
|
| 513 |
+
|
| 514 |
+
#__________________________________________________________________________________________________________________________________________________________________
|
| 515 |
+
|
| 516 |
+
# 📌 Problemas de Innovación
|
| 517 |
+
with tabs[3]:
|
| 518 |
+
st.markdown("<h1 style='text-align: left;'>🚀 Funnel de Innovación</h1>", unsafe_allow_html=True)
|
| 519 |
+
|
| 520 |
+
# 📖 Introducción a la Innovación según Art Smalley
|
| 521 |
+
st.markdown("""
|
| 522 |
+
## 🌟 Innovación como Cuarto Tipo de Problema
|
| 523 |
+
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.
|
| 524 |
+
|
| 525 |
+
🔹 **Objetivo:** Superar las limitaciones actuales y desarrollar mejoras **disruptivas** en procesos, productos y servicios.
|
| 526 |
+
🔹 **Ejemplo:** Implementar **automatización en manufactura** para eliminar la variabilidad humana y aumentar la eficiencia.
|
| 527 |
+
🔹 **Método:** Para lograr innovación estructurada, combinamos **SCAMPER** (generación de ideas) con **Design Thinking** (planificación y ejecución).
|
| 528 |
+
|
| 529 |
+
📌 **Ejemplo de Innovación según *Four Types of Problems***
|
| 530 |
+
- Toyota implementando **Producción Just-In-Time** para eliminar inventarios excesivos.
|
| 531 |
+
- Ford introduciendo **manufactura modular** para reducir tiempos de cambio de línea.
|
| 532 |
+
- Amazon desarrollando **almacenes automatizados** con robots para mejorar eficiencia logística.
|
| 533 |
+
""")
|
| 534 |
+
|
| 535 |
+
st.markdown("""
|
| 536 |
+
## 📝 Generación de Innovación con SCAMPER & Design Thinking""" )
|
| 537 |
+
# 📌 Expander para SCAMPER y Design Thinking
|
| 538 |
+
with st.expander(" Registro de ideas Innovadoras", expanded=False):
|
| 539 |
+
st.subheader("🧠 SCAMPER - Generación de Ideas")
|
| 540 |
+
problema = st.text_area("Describe el problema o necesidad que quieres innovar",
|
| 541 |
+
value="Reducir tiempos de cambio en la línea de producción.")
|
| 542 |
+
tecnica_scamper = st.selectbox("Selecciona una técnica SCAMPER",
|
| 543 |
+
["Sustituir", "Combinar", "Adaptar", "Modificar", "Poner en otro uso", "Eliminar", "Reorganizar"])
|
| 544 |
+
idea_scamper = st.text_area("Propón una idea innovadora basada en SCAMPER",
|
| 545 |
+
value="Implementar cambios rápidos con herramientas modulares.")
|
| 546 |
+
|
| 547 |
+
# 📌 Design Thinking - Desarrollo de Innovación
|
| 548 |
+
st.subheader("🎨 Plan de Acción - Design Thinking")
|
| 549 |
+
fase_design = st.selectbox("Selecciona la fase actual",
|
| 550 |
+
["Empatizar", "Definir", "Idear", "Prototipar", "Testear", "Implementación"])
|
| 551 |
+
tarea_design = st.text_area("Describe la tarea o acción clave en esta fase",
|
| 552 |
+
value="Analizar impacto de tiempos de cambio en productividad.")
|
| 553 |
+
fecha_inicio = st.date_input("Fecha de inicio de la tarea")
|
| 554 |
+
fecha_fin = st.date_input("Fecha de compromiso")
|
| 555 |
+
|
| 556 |
+
if st.button("💾 Guardar Innovación"):
|
| 557 |
+
nueva_idea = pd.DataFrame([[problema, tecnica_scamper, idea_scamper, fase_design, tarea_design, fecha_inicio, fecha_fin]],
|
| 558 |
+
columns=["Problema", "SCAMPER", "Idea SCAMPER", "Fase DT", "Tarea", "Inicio", "Compromiso"])
|
| 559 |
+
st.session_state.ideas_innovacion = pd.concat([st.session_state.ideas_innovacion, nueva_idea], ignore_index=True)
|
| 560 |
+
st.success("✅ Innovación guardada correctamente.")
|
| 561 |
+
|
| 562 |
+
# 📌 Inicializar el tablero con una distribución realista en el Funnel
|
| 563 |
+
if "ideas_innovacion" not in st.session_state:
|
| 564 |
+
st.session_state.ideas_innovacion = pd.DataFrame([
|
| 565 |
+
# 🔵 EMPATIZAR (10 ideas)
|
| 566 |
+
{"Problema": "Reducir tiempos de cambio", "SCAMPER": "Modificar",
|
| 567 |
+
"Idea SCAMPER": "Uso de herramientas modulares", "Fase DT": "Empatizar",
|
| 568 |
+
"Tarea": "Análisis de tiempos actuales", "Inicio": "2024-01-01", "Compromiso": "2024-01-15"},
|
| 569 |
+
{"Problema": "Optimizar flujo de materiales", "SCAMPER": "Reorganizar",
|
| 570 |
+
"Idea SCAMPER": "Implementación de logística autónoma", "Fase DT": "Empatizar",
|
| 571 |
+
"Tarea": "Identificar cuellos de botella", "Inicio": "2024-01-02", "Compromiso": "2024-01-16"},
|
| 572 |
+
{"Problema": "Minimizar errores en ensamblaje", "SCAMPER": "Sustituir",
|
| 573 |
+
"Idea SCAMPER": "Guiado con realidad aumentada", "Fase DT": "Empatizar",
|
| 574 |
+
"Tarea": "Identificación de errores recurrentes", "Inicio": "2024-01-03", "Compromiso": "2024-01-17"},
|
| 575 |
+
{"Problema": "Reducción de desperdicios", "SCAMPER": "Eliminar",
|
| 576 |
+
"Idea SCAMPER": "Optimización de corte CNC", "Fase DT": "Empatizar",
|
| 577 |
+
"Tarea": "Medición de desperdicios", "Inicio": "2024-01-04", "Compromiso": "2024-01-18"},
|
| 578 |
+
{"Problema": "Reducir consumo energético", "SCAMPER": "Adaptar",
|
| 579 |
+
"Idea SCAMPER": "Energía renovable en manufactura", "Fase DT": "Empatizar",
|
| 580 |
+
"Tarea": "Evaluación del consumo actual", "Inicio": "2024-01-05", "Compromiso": "2024-01-19"},
|
| 581 |
+
{"Problema": "Rediseñar layout de planta", "SCAMPER": "Reorganizar",
|
| 582 |
+
"Idea SCAMPER": "Modelo de flujo continuo", "Fase DT": "Empatizar",
|
| 583 |
+
"Tarea": "Análisis de distribución", "Inicio": "2024-01-06", "Compromiso": "2024-01-20"},
|
| 584 |
+
{"Problema": "Automatización de inventarios", "SCAMPER": "Combinar",
|
| 585 |
+
"Idea SCAMPER": "RFID con control en tiempo real", "Fase DT": "Empatizar",
|
| 586 |
+
"Tarea": "Evaluar soluciones existentes", "Inicio": "2024-01-07", "Compromiso": "2024-01-21"},
|
| 587 |
+
{"Problema": "Reducir errores en ensamblaje", "SCAMPER": "Sustituir",
|
| 588 |
+
"Idea SCAMPER": "Instrucciones con realidad aumentada", "Fase DT": "Empatizar",
|
| 589 |
+
"Tarea": "Prueba de tecnologías", "Inicio": "2024-01-08", "Compromiso": "2024-01-22"},
|
| 590 |
+
{"Problema": "Optimización de distribución de tareas", "SCAMPER": "Modificar",
|
| 591 |
+
"Idea SCAMPER": "Algoritmos de asignación inteligente", "Fase DT": "Empatizar",
|
| 592 |
+
"Tarea": "Análisis de cargas de trabajo", "Inicio": "2024-01-09", "Compromiso": "2024-01-23"},
|
| 593 |
+
{"Problema": "Reducir tiempo de configuración de maquinaria", "SCAMPER": "Reorganizar",
|
| 594 |
+
"Idea SCAMPER": "Implementación de configuraciones rápidas", "Fase DT": "Empatizar",
|
| 595 |
+
"Tarea": "Estudio de tiempos de cambio", "Inicio": "2024-01-10", "Compromiso": "2024-01-24"},
|
| 596 |
+
|
| 597 |
+
# 🟠 DEFINIR (7 ideas)
|
| 598 |
+
{"Problema": "Automatizar control de calidad", "SCAMPER": "Sustituir",
|
| 599 |
+
"Idea SCAMPER": "Inspección con IA", "Fase DT": "Definir",
|
| 600 |
+
"Tarea": "Análisis de defectos comunes", "Inicio": "2024-01-11", "Compromiso": "2024-01-25"},
|
| 601 |
+
|
| 602 |
+
{"Problema": "Aumentar eficiencia en picking", "SCAMPER": "Adaptar",
|
| 603 |
+
"Idea SCAMPER": "Picking con robots móviles", "Fase DT": "Definir",
|
| 604 |
+
"Tarea": "Identificar oportunidades de automatización", "Inicio": "2024-01-12", "Compromiso": "2024-01-26"},
|
| 605 |
+
|
| 606 |
+
{"Problema": "Reducir desperdicio de empaque", "SCAMPER": "Eliminar",
|
| 607 |
+
"Idea SCAMPER": "Empaque reutilizable", "Fase DT": "Definir",
|
| 608 |
+
"Tarea": "Evaluación de materiales alternativos", "Inicio": "2024-01-13", "Compromiso": "2024-01-27"},
|
| 609 |
+
|
| 610 |
+
{"Problema": "Optimizar planificación de producción", "SCAMPER": "Reorganizar",
|
| 611 |
+
"Idea SCAMPER": "Algoritmo de secuenciación dinámica", "Fase DT": "Definir",
|
| 612 |
+
"Tarea": "Evaluación de algoritmos existentes", "Inicio": "2024-01-14", "Compromiso": "2024-01-28"},
|
| 613 |
+
|
| 614 |
+
{"Problema": "Reducción de tiempos en línea de ensamble", "SCAMPER": "Modificar",
|
| 615 |
+
"Idea SCAMPER": "Uso de estaciones de trabajo móviles", "Fase DT": "Definir",
|
| 616 |
+
"Tarea": "Análisis de tiempos de operación", "Inicio": "2024-01-15", "Compromiso": "2024-01-29"},
|
| 617 |
+
|
| 618 |
+
{"Problema": "Mejorar ergonomía en estaciones de trabajo", "SCAMPER": "Adaptar",
|
| 619 |
+
"Idea SCAMPER": "Implementación de estaciones ajustables", "Fase DT": "Definir",
|
| 620 |
+
"Tarea": "Identificación de riesgos ergonómicos", "Inicio": "2024-01-16", "Compromiso": "2024-01-30"},
|
| 621 |
+
|
| 622 |
+
{"Problema": "Reducir costos en consumibles de producción", "SCAMPER": "Combinar",
|
| 623 |
+
"Idea SCAMPER": "Uso de materiales biodegradables", "Fase DT": "Definir",
|
| 624 |
+
"Tarea": "Análisis de alternativas sustentables", "Inicio": "2024-01-17", "Compromiso": "2024-01-31"},
|
| 625 |
+
|
| 626 |
+
# 🟡 IDEAR (4 ideas)
|
| 627 |
+
{"Problema": "Automatizar planificación de producción", "SCAMPER": "Combinar",
|
| 628 |
+
"Idea SCAMPER": "Sistema con machine learning", "Fase DT": "Idear",
|
| 629 |
+
"Tarea": "Desarrollo del prototipo", "Inicio": "2024-01-15", "Compromiso": "2024-02-05"},
|
| 630 |
+
|
| 631 |
+
{"Problema": "Optimización de rutas de logística", "SCAMPER": "Modificar",
|
| 632 |
+
"Idea SCAMPER": "Uso de IA en distribución", "Fase DT": "Idear",
|
| 633 |
+
"Tarea": "Prueba con datos históricos", "Inicio": "2024-01-16", "Compromiso": "2024-02-06"},
|
| 634 |
+
|
| 635 |
+
{"Problema": "Automatización de gestión de pedidos", "SCAMPER": "Reorganizar",
|
| 636 |
+
"Idea SCAMPER": "Integración de blockchain en trazabilidad", "Fase DT": "Idear",
|
| 637 |
+
"Tarea": "Desarrollo de modelo de trazabilidad", "Inicio": "2024-01-17", "Compromiso": "2024-02-07"},
|
| 638 |
+
|
| 639 |
+
{"Problema": "Estandarización de procesos manuales", "SCAMPER": "Sustituir",
|
| 640 |
+
"Idea SCAMPER": "Aplicaciones móviles para control de procesos", "Fase DT": "Idear",
|
| 641 |
+
"Tarea": "Desarrollo de interfaz de usuario", "Inicio": "2024-01-18", "Compromiso": "2024-02-08"},
|
| 642 |
+
|
| 643 |
+
# 🟢 PROTOTIPAR (3 ideas)
|
| 644 |
+
{"Problema": "Implementar manufactura flexible", "SCAMPER": "Adaptar",
|
| 645 |
+
"Idea SCAMPER": "Uso de robots colaborativos", "Fase DT": "Prototipar",
|
| 646 |
+
"Tarea": "Configuración inicial", "Inicio": "2024-01-20", "Compromiso": "2024-02-10"},
|
| 647 |
+
|
| 648 |
+
{"Problema": "Automatización de gestión de personal", "SCAMPER": "Combinar",
|
| 649 |
+
"Idea SCAMPER": "Análisis de rendimiento con AI", "Fase DT": "Prototipar",
|
| 650 |
+
"Tarea": "Prueba con dataset real", "Inicio": "2024-01-21", "Compromiso": "2024-02-11"},
|
| 651 |
+
|
| 652 |
+
{"Problema": "Monitoreo predictivo de fallas", "SCAMPER": "Sustituir",
|
| 653 |
+
"Idea SCAMPER": "Implementación de sensores IoT con IA", "Fase DT": "Prototipar",
|
| 654 |
+
"Tarea": "Desarrollo del modelo de predicción", "Inicio": "2024-01-22", "Compromiso": "2024-02-12"},
|
| 655 |
+
|
| 656 |
+
# 🔴 TESTEAR (2 ideas)
|
| 657 |
+
{"Problema": "Optimización de órdenes de producción", "SCAMPER": "Reorganizar",
|
| 658 |
+
"Idea SCAMPER": "Planificación adaptativa", "Fase DT": "Testear",
|
| 659 |
+
"Tarea": "Validación con producción real", "Inicio": "2024-01-22", "Compromiso": "2024-02-12"},
|
| 660 |
+
|
| 661 |
+
{"Problema": "Automatización del control de calidad", "SCAMPER": "Sustituir",
|
| 662 |
+
"Idea SCAMPER": "Cámaras de visión artificial con IA", "Fase DT": "Testear",
|
| 663 |
+
"Tarea": "Comparación de defectos detectados manualmente vs IA", "Inicio": "2024-01-23", "Compromiso": "2024-02-13"},
|
| 664 |
+
|
| 665 |
+
# 🔴 IMPLEMENTACIÓN (1 idea)
|
| 666 |
+
{"Problema": "Implementar manufactura sin papel", "SCAMPER": "Adaptar",
|
| 667 |
+
"Idea SCAMPER": "Digitalización con tablets", "Fase DT": "Implementación",
|
| 668 |
+
"Tarea": "Capacitación de operarios", "Inicio": "2024-01-25", "Compromiso": "2024-02-10"},
|
| 669 |
+
])
|
| 670 |
+
|
| 671 |
+
st.markdown("""
|
| 672 |
+
## 📋 Ver y Editar Innovaciones Guardadas""" )
|
| 673 |
+
# 📌 Expander para visualizar y editar el DataFrame de Innovaciones
|
| 674 |
+
with st.expander("Ajusta el progreso de las ideas innovadoras", expanded=False):
|
| 675 |
+
df_ideas = st.data_editor(st.session_state.ideas_innovacion, use_container_width=True, num_rows="dynamic")
|
| 676 |
+
st.session_state.ideas_innovacion = df_ideas # Guardar cambios
|
| 677 |
+
|
| 678 |
+
# 📊 Visualización del Funnel en horizontal con Plotly
|
| 679 |
+
st.subheader("📊 Funnel de Innovación - Evolución de Ideas")
|
| 680 |
+
if not st.session_state.ideas_innovacion.empty:
|
| 681 |
+
funnel_counts = st.session_state.ideas_innovacion["Fase DT"].value_counts().reset_index()
|
| 682 |
+
funnel_counts.columns = ["Fase", "Cantidad"]
|
| 683 |
+
|
| 684 |
+
fig_funnel = go.Figure(go.Funnel(
|
| 685 |
+
orientation="v", # 🏆 FUNNEL EN HORIZONTAL
|
| 686 |
+
y=funnel_counts["Cantidad"],
|
| 687 |
+
x=funnel_counts["Fase"],
|
| 688 |
+
textinfo="value+percent initial",
|
| 689 |
+
marker={"color": ["blue", "green", "orange", "red", "purple", "gray"]}
|
| 690 |
+
))
|
| 691 |
+
|
| 692 |
+
fig_funnel.update_layout(title="Funnel de Innovación - Design Thinking")
|
| 693 |
+
st.plotly_chart(fig_funnel, use_container_width=True)
|
| 694 |
+
|
| 695 |
+
# 📌 Seguimiento de Acciones en un Gantt
|
| 696 |
+
st.subheader("📅 Tablero de Acciones y Compromisos")
|
| 697 |
+
if not st.session_state.ideas_innovacion.empty:
|
| 698 |
+
fig_gantt = px.timeline(st.session_state.ideas_innovacion, x_start="Inicio", x_end="Compromiso", y="Tarea",
|
| 699 |
+
color="Fase DT", title="Tareas y Fechas de Innovación",
|
| 700 |
+
category_orders={"Fase DT": ["Empatizar", "Definir", "Idear", "Prototipar", "Testear", "Implementación"]})
|
| 701 |
+
fig_gantt.update_yaxes(categoryorder="total ascending")
|
| 702 |
+
fig_gantt.update_layout(showlegend=True)
|
| 703 |
+
st.plotly_chart(fig_gantt, use_container_width=True)
|
current.jpg
ADDED
|
Git LFS Details
|
future.jpg
ADDED
|
Git LFS Details
|
requirements.txt
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
plotly
|
| 2 |
+
streamlit
|
| 3 |
+
numpy
|
| 4 |
+
pandas
|