Cómo personalizar el histograma, la capacidad Sigma y el resumen del proceso para principiantesHola. Soy muy nuevo. Antes de comenzar a aprender a usar scripts, me gustaría obtener una confirmación de que estoy abordando esto correctamente. Queremos una forma sencilla de crear el siguiente informe de distribución simple que se puede crear para una columna seleccionada por el usuario, generalmente 30 puntos de datos, que se parece a la imagen siguiente y esperamos eliminar los elementos con líneas rojas:

Un ejemplo de una tabla de datos es:

A continuación se muestra el script que creó el sistema cuando usé: Guardar script/En tabla de datos:
Distribución(
Distribución continua(
Columna( :OD ),
Disposición horizontal (1),
Histograma( 0 ),
Vertical( 0 ),
Capacidad del proceso(
Utilice las especificaciones de propiedades de columna,
Análisis de capacidad del proceso (No conformidad (0))
)
),
Sólo histogramas,
EnviarAlInforme(
Despacho( {"OD", "Capacidad del proceso", "Capacidad de OD", "Histograma"}, "1",
Caja de escala,
{Mín( 2,1388234375 ), Máx( 2,1636765625 ), Inc( 0,005 ),
Marcas menores (5)}
)
)
);
Supongo que esto no se puede hacer sin scripts. Si no es así, por favor, háganmelo saber.
Lo que tengo pensado hacer es intentar aprender a crear un script para que el usuario pueda seleccionar la columna que se va a utilizar, mientras que el script anterior solo utiliza la columna "OD". Con suerte, esto generaría el informe básico anterior al ejecutar el script.
Luego comenzamos a buscar cambios en el script para eliminar las entradas que hemos tachado en rojo.
¿Es este enfoque ingenuo? ¿Existe una forma mejor de abordarlo?
Gracias por cualquier aportación,
Conceder
Ingeniería de Calidad y ProcesosRe: Cómo abordar para principiantes la personalización del histograma, la capacidad Sigma y el resumen del procesoPara las tablas de capacidad, esto es bastante fácil, ya que puede utilizar filtros como
Contains({"Cpk", "Cp"}, Index)
Pero esto no funciona para el cuadro de tabla debajo de Resumen del proceso, ya que no tiene nombres de columna... por lo que no puede utilizar fácilmente Ajustes preestablecidos, por ejemplo.
Utilice secuencias de comandos. Con ellas, puede agregar esos encabezados al cuadro de la tabla y luego usarlos para filtrar.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
mycol = "NPN1";
dist = dt << Distribution(
Ignore Platform Preferences(1),
Continuous Distribution(
Column(Eval(mycol)),
Quantiles(0),
Summary Statistics(0),
Horizontal Layout(1),
Histogram(0),
Vertical(0),
Outlier Box Plot(0),
Process Capability(
Use Column Property Specs,
Process Capability Analysis(Nonconformance(0))
)
)
);
// modify axis
Report(dist)[OutlineBox("Histogram"), AxisBox(1)] << Min(100) << Max(130) << Inc(1) << Minor Ticks(5);
// Filter table boxes
Report(dist)[OutlineBox("Within Sigma Capability"), TableBox(1)] << Filter Where(Contains({"Cpk", "Cp"}, Index));
Report(dist)[OutlineBox("Overall Sigma Capability"), TableBox(1)] << Filter Where(Contains({"Ppk", "Pp"}, Index));
Report(dist)[OutlineBox("Process Summary"), TableBox(1), StringColBox(1)] << Set Heading("Stat");
Report(dist)[OutlineBox("Process Summary"), TableBox(1), NumberColBox(1)] << Set Heading("Value");
Report(dist)[OutlineBox("Process Summary"), TableBox(1)] << Filter Where(Contains({"LSL", "Target", "USL", "N", "Sample Mean"}, Stat));

Re: Cómo abordar para principiantes la personalización del histograma, la capacidad Sigma y el resumen del procesoGracias, Jarmo, por tomarte el tiempo de hacer eso. Eso me brinda una excelente base para aplicar en nuestra mesa. Agradezco tu ayuda.
Voy a probar un poco y ver si puedo averiguar si puedo hacer un mensaje de usuario para la columna de destino, ya que el nombre varía, y desarrollarlo. Como mínimo, puedo personalizar el script para determinados escenarios de piezas con mi conocimiento actual (limitado). Para nuestros usuarios, eso puede ser incluso mejor para ellos. De todos modos, gracias de nuevo.
Re: Cómo abordar para principiantes la personalización del histograma, la capacidad Sigma y el resumen del procesoUna vez que empieces a trabajar con JSL, crear una interfaz de usuario sencilla para algo como esto es bastante simple (incluso más si usas Column Dialog(), pero a mí personalmente no me gusta eso). Este ejemplo contiene algunas técnicas más avanzadas, pero probablemente hará lo que quieres hacer. Hay algunas comprobaciones de cordura que quizás quieras agregar, como verificar los límites de especificaciones, pero algo como esto puede servir como punto de partida.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
run_custom_dist = Expr(
dist = dt << Distribution(
Ignore Platform Preferences(1),
Continuous Distribution(
Column(Eval(mycol)),
Quantiles(0),
Summary Statistics(0),
Horizontal Layout(1),
Histogram(0),
Vertical(0),
Outlier Box Plot(0),
Process Capability(Use Column Property Specs, Process Capability Analysis(Nonconformance(0)))
)
);
// modify axis
Report(dist)[Outline Box("Histogram"), AxisBox(1)] << Min(100) << Max(130) << Inc(1) << Minor Ticks(5);
// Filter table boxes
Report(dist)[Outline Box("Within Sigma Capability"), Table Box(1)] << Filter Where(Contains({"Cpk", "Cp"}, Index));
Report(dist)[Outline Box("Overall Sigma Capability"), Table Box(1)] << Filter Where(Contains({"Ppk", "Pp"}, Index));
Report(dist)[Outline Box("Process Summary"), Table Box(1), String Col Box(1)] << Set Heading("Stat");
Report(dist)[Outline Box("Process Summary"), Table Box(1), Number Col Box(1)] << Set Heading("Value");
Report(dist)[Outline Box("Process Summary"), Table Box(1)] << Filter Where(Contains({"LSL", "Target", "USL", "N", "Sample Mean"}, Stat));
);
nw = New Window("UI",
H List Box(
Panel Box("Pick Columns",
window:fcs = Filter Col Selector(dt, << Character(0))
),
Panel Box("Cast",
Lineup Box(N Col(2),
Button Box("Column", << Set Function(function({this},
(this << sib) << Append(window:fcs << get selected)
))),
window:clb = Col List Box(dt, Min Items(1), Max items(1), N Lines(2), << Modeling Type({"Continuous"}))
)
),
Panel Box("Actions",
Lineup Box(N Col(1),
Button Box("OK",
sel = window:clb << get items;
If(N Items(sel) > 0,
mycol = sel[1];
run_custom_dist;
window:fcs << close window;
);
),
Button Box("Cancel", window:fcs << close window);
)
)
)
);
Write();
Scripting Guide es una buena fuente para comenzar a usar JSL
Re: Cómo abordar para principiantes la personalización del histograma, la capacidad Sigma y el resumen del proceso¡Gracias Jarmo! He empezado con la Guía de creación de scripts. Probablemente no estoy siendo lo suficientemente paciente, pero sigo trabajando en ella.:)
¿Podría pedirle que muestre un cambio más? Creo que me ayudará mucho. ¿Podría agregar algo al script para que se agregue un gráfico de promedio móvil debajo de las capacidades de Sigma (básicamente en la parte inferior)? Hice un ejemplo a continuación con el NPN1 del archivo Semiconductor. Me falta algo en las indicaciones del script y creo que me ayudará a comprenderlo.

Me imagino que vas a poner los ojos en blanco. Como muestra fundamentalmente la siguiente pregunta, no entiendo bien JMP. ¿Tiene más sentido que un script como este sea un archivo de script que un usuario abre y ejecuta o tiene más sentido guardar este script en la tabla de datos y ejecutarlo desde allí? ¿Es solo una preferencia o hay alguna ventaja?
Si hay alguna otra forma de agradecer tu ayuda además de un Kudo, házmelo saber. Tu ayuda me ha ahorrado muchos dolores de cabeza.
Gracias de nuevo,
Conceder
Re: Cómo abordar para principiantes la personalización del histograma, la capacidad Sigma y el resumen del procesoPuedes crear algo como esto usando Workflow Builder , por lo que, dependiendo de lo que estés haciendo, utilizarlo podría ser una buena idea (y es una buena práctica al usar JMP).
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
run_custom_dist = Expr(
vlb = V List Box(
dist = dt << Distribution(
Ignore Platform Preferences(1),
Continuous Distribution(
Column(Eval(mycol)),
Quantiles(0),
Summary Statistics(0),
Horizontal Layout(1),
Histogram(0),
Vertical(0),
Outlier Box Plot(0),
Process Capability(Use Column Property Specs, Process Capability Analysis(Nonconformance(0)))
)
),
ccb = dt << Control Chart Builder(
Show Two Shewhart Charts(0),
Include Missing Categories(0),
Show Limit Summaries(0),
Show Capability(0),
Variables(Y(Eval(mycol))),
Chart(Points(Statistic("Moving Range")), Limits(Sigma("Moving Range"))),
Show Control Panel(0)
)
);
// modify axis
Report(dist)[Outline Box("Histogram"), AxisBox(1)] << Min(100) << Max(130) << Inc(1) << Minor Ticks(5);
// Filter table boxes
Report(dist)[Outline Box("Within Sigma Capability"), Table Box(1)] << Filter Where(Contains({"Cpk", "Cp"}, Index));
Report(dist)[Outline Box("Overall Sigma Capability"), Table Box(1)] << Filter Where(Contains({"Ppk", "Pp"}, Index));
Report(dist)[Outline Box("Process Summary"), Table Box(1), String Col Box(1)] << Set Heading("Stat");
Report(dist)[Outline Box("Process Summary"), Table Box(1), Number Col Box(1)] << Set Heading("Value");
Report(dist)[Outline Box("Process Summary"), Table Box(1)] << Filter Where(Contains({"LSL", "Target", "USL", "N", "Sample Mean"}, Stat));
nw = new window("",
vlb
);
);
nw = New Window("UI",
H List Box(
Panel Box("Pick Columns",
window:fcs = Filter Col Selector(dt, << Character(0))
),
Panel Box("Cast",
Lineup Box(N Col(2),
Button Box("Column", << Set Function(function({this},
(this << sib) << Append(window:fcs << get selected)
))),
window:clb = Col List Box(dt, Min Items(1), Max items(1), N Lines(2), << Modeling Type({"Continuous"}))
)
),
Panel Box("Actions",
Lineup Box(N Col(1),
Button Box("OK",
sel = window:clb << get items;
If(N Items(sel) > 0,
mycol = sel[1];
run_custom_dist;
window:fcs << close window;
);
),
Button Box("Cancel", window:fcs << close window);
)
)
)
);
Write();
Cómo se debe utilizar algo como esto depende totalmente de usted, para mí tal vez tendría más sentido tener un flujo de trabajo para esto (aunque arreglar la distribución podría ser un poco difícil sin JSL para el flujo de trabajo) O crear un complemento que el usuario pueda ejecutar en su propia tabla según sea necesario. Para fines de complemento, lo más probable es que permita al usuario seleccionar más de una columna o utilizar un conmutador de columnas y sería una buena idea implementar algunas comprobaciones adicionales (si la tabla está abierta, si las columnas seleccionadas tienen límites de especificaciones, etc.).
Editar: Se corrigió el valor codificado del generador de gráficos de control
Re: Cómo abordar para principiantes la personalización del histograma, la capacidad Sigma y el resumen del procesoGracias, Jarmo. Eso me brinda una base excelente para comenzar a trabajar. He estado modificando ese código y realmente me está ayudando. Ver ese nuevo código de ventana realmente me ayudó con algo que me faltaba.
También trabajaré con ese generador de flujo de trabajo. No lo había analizado en absoluto todavía. En definitiva, por lo que sé ahora, un complemento parece ser lo mejor para nuestro grupo, una vez que llegue allí...
Nuevamente, realmente aprecio toda tu ayuda y no puedo agradecerte lo suficiente.
Conceder
Re: Cómo abordar para principiantes la personalización del histograma, la capacidad Sigma y el resumen del procesoPensé que tendría sentido preguntar aquí en lugar de crear un nuevo tema...
He realizado un buen proceso y he creado un complemento para nuestro grupo que está en uso. Estoy tratando de obtener más información y quiero agregar solo la fila "Total externo" y solo la columna "PPM general esperado" de la sección No conformidad (subrayada en rojo en la captura a continuación):

Puedo hacer que se muestre el cuadro, pero no hay valores... A continuación se muestra la sección del script (líneas 50 a 52) para esto y una captura de pantalla:
Report(dist)[Outline Box("Nonconformance"), Table Box(1), String Col Box(1)] << Set Heading("Portion");
Report(dist)[Outline Box("Nonconformance"), Table Box(1), Number Col Box(1)] << Set Heading("Expected Overall PPM");
Report(dist)[Outline Box("Nonconformance"), Table Box(1)] << Filter Where(Contains({"Total Outside"}, Expected Overall PPM));
Observe que en la captura de pantalla también se agregaron las columnas "Esperado dentro del %" y "Esperado general %", lo cual no quiero.

Sé que me estoy perdiendo algo básico... Intenté usar las propiedades de los elementos para comparar qué es diferente, pero no veo nada en valor. También probé la herramienta Guardar secuencia de comandos para ver si eso ayuda a dar una pista, pero usa un comando de Despacho y tampoco puedo hacer que funcione...
Además, ¿es posible colocar la sección "No conformidad" directamente debajo del "Resumen del proceso" y sobre la "Capacidad general de Sigma"? No lo creo por lo que he buscado, pero es posible que también me esté perdiendo algo allí.

Gracias,
Conceder
Re: Cómo abordar para principiantes la personalización del histograma, la capacidad Sigma y el resumen del procesoPuede modificar las columnas que desea mostrar primero utilizando JMP y verificando el script que crea JMP para ver SI JMP puede capturar lo que desea hacer (en este caso, puede). Luego puede dejarlo en manos del script de distribución o moverlo fuera de él.

Y en tu guión podría verse algo así
Report(dist)[Outline Box("Nonconformance"), NumberColBox("Observed %")] << Visibility("Collapse");
Report(dist)[Outline Box("Nonconformance"), NumberColBox("Expected Within %")] << Visibility("Collapse");
Report(dist)[Outline Box("Nonconformance"), NumberColBox("Expected Overall %")] << Visibility("Collapse");
Report(dist)[Outline Box("Nonconformance"), NumberColBox("Expected Overall PPM")] << Visibility("Visible");
Report(dist)[Outline Box("Nonconformance"), Table Box(1)] << Filter Where(Portion == "Total Outside");
También puedes usar el cuadro de clonación para "copiar" la no conformidad.
ncob = Report(dist)[Outline Box("Nonconformance")];
(Report(dist)["Process Capability","? Capability","Process Summary"] << parent) << Append(
ncob << clone box;
);
(ncob << parent) << Set(0);
</CODE><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jthi_1-1729017828517.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_1-1729017828517.png" style="width: 321px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_1-1729017828517.png" style="width: 321px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_1-1729017828517.png" style="width: 321px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_1-1729017828517.png" style="width: 321px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_1-1729017828517.png" style="width: 321px;"><span class="lia-inline-image-display-wrapper" image-alt="jthi_1-1729017828517.png" style="width: 321px;"><img src="https://us.v-cdn.net/6038925/uploads/images/69147iBECE0693438ABAB9/jthi_1-1729017828517.png" role="button" title="jthi_1-1729017828517.png" alt="jthi_1-1729017828517.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P>
<P>Pero si no necesitas las funcionalidades de estas plataformas JMP, consideraría crear un informe personalizado a partir de diferentes partes. De esta manera, puedes controlar más fácilmente cómo se verá el informe y los usuarios no intentarán usar por accidente funciones que podrían no funcionar correctamente.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-805889" slang="en-US" mode="CREATE">Re: Cómo abordar para principiantes la personalización del histograma, la capacidad Sigma y el resumen del proceso</LINGO-SUB><LINGO-BODY id="lingo-body-805889" slang="en-US" mode="CREATE"><P>¡Ah! Voy a intentar comprender tu mensaje y jugar con él. Vi las banderas de Visibilidad en el script de Dispatch (parece lo mismo que el que tenías), pero no entendí cómo combinarlas como lo hiciste tú.</P><P> </P><P>¿Qué te impulsó a utilizarlo?</P><PRE class="language-jsl"><CODE>Filter Where(Portion == "Total Outside");
y no una lista de llamadas como algunas de las otras. Por ejemplo:
Filter Where(Contains({"LSL", "Target", "USL", "N", "Sample Mean"}, Stat))
¡Gracias Jarmo!
Re: Cómo abordar para principiantes la personalización del histograma, la capacidad Sigma y el resumen del procesoYo usé
Filter Where(Portion == "Total Outside");
pero aún puedes usar Contiene si lo deseas (en tu script el problema no era contiene sino usar la columna incorrecta PPM general esperado en lugar de Porción para hacer la comparación)
Report(dist)[Outline Box("Nonconformance"), Table Box(1)] << Filter Where(Contains({"Total Outside"}, Portion));
Utilicé la comparación igualitaria porque solo desea mostrar una línea de la tabla. Contiene se puede utilizar para varios elementos y cuando solo tiene un elemento (como en este caso) no es necesario.
La razón por la que lo cambié fue algo como esto:
Podrías pensar que "pero ¿importa si funciona?". Básicamente no importa, PERO cuando tú (o al menos cuando yo lo haga) empieces a pensar en el código, importará un poco. Para mí ahora sería obvio que nunca habrá más de un elemento en esa tabla (o si hay más de uno, la idea del filtrado debe cambiarse y te hará detenerte un poco).
Re: Cómo abordar para principiantes la personalización del histograma, la capacidad Sigma y el resumen del procesoJarmo, gracias por esa excelente explicación.
Re: Cómo abordar para principiantes la personalización del histograma, la capacidad Sigma y el resumen del procesoEl detonante para buenas publicaciones en la comunidad son las buenas preguntas .
Gracias @GM-FPP .
Re: Cómo abordar para principiantes la personalización del histograma, la capacidad Sigma y el resumen del procesoGracias @hogi, agradezco tu mensaje.