File size: 45,570 Bytes
4d3fe59 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 | 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) |