Re: ¿Cómo excluir filas hasta que la media de distribución cumpla un criterio?Hola @neo ,
¿Su objetivo es lograr específicamente que esos medios estén dentro de los límites de control o está buscando una forma automatizada de limpiar su conjunto de datos?Si es lo último, podría considerar la plataforma Explorar valores atípicos en el menú Analizar > Detección.Con frecuencia uso los valores atípicos del rango de cuantiles, y los valores atípicos de PCA robustos son muy similares a lo que normalmente hago dentro de la plataforma PCA.
Si está tratando específicamente de encontrar un conjunto de sitios (¿solo hay 5?) o filas que cumplan la condición de que todos estén dentro de la media, entonces probablemente comenzaría con un análisis multivariado para encontrar filas que tengan valores extremos. en varias columnas primero.
Re: ¿Cómo excluir filas hasta que la media de distribución cumpla con un criterio?@ih
El objetivo es conseguir que la media esté dentro de los límites de especificación para todos los parámetros pertinentes y no explorar valores atípicos.
Sí, en este ejemplo hay 5 sitios por lote/oblea (>1000 en mi caso real), pero no pude encontrar un ejemplo mejor en los datos de muestra de JMP.
Echaré un vistazo al análisis multivariado (no entiendo por qué necesito mirar varias columnas juntas, pero supongo que lo haré cuando mire la plataforma multivariante).
Re: ¿Cómo excluir filas hasta que la media de distribución cumpla un criterio?¿Estás de acuerdo con situaciones como esta? La media todavía está entre los límites de las especificaciones, aunque no hay un solo resultado dentro de las especificaciones.


Re: ¿Cómo excluir filas hasta que la media de distribución cumpla un criterio?@jthi Gracias por señalar uno de los posibles casos que satisface el requisito pero no el objetivo. No entiendo el cuadro de análisis de Oneway pero la respuesta es No para el gráfico de distribución. En mi ejemplo, tengo filas dentro de la distribución, pero tienes razón al señalar una posibilidad.
El objetivo es llevar la media de una distribución dentro de los límites de especificaciones filtrando (Sitios/Oblea en mi caso de ejemplo) comenzando desde los extremos de la distribución. Mientras hacía esto manualmente, excluí filas (sitios) que comenzaban en el extremo de distribución en el lado donde la media estaba fuera del límite de especificación y, como se mencionó anteriormente, tuve que volver a los parámetros analizados previamente, ya que filtrar sitios en parámetros posteriores resultó en el media de parámetros previamente analizados que se salen de los límites de las especificaciones.
¿Cómo excluir filas hasta que la media de distribución cumpla con un criterio?A continuación se muestra un ejemplo similar a mi caso real en el que me gustaría excluir los SITIOS hasta que la media de distribución para cada parámetro (solo los casos trazados a continuación) caiga dentro de sus respectivos límites de especificación.
Los sitios/oblea que se excluirán comienzan desde el extremo de distribución en el lado donde la media está fuera del límite de especificación (LSL o USL).
Creo que se podría comenzar con cualquier parámetro, eliminar sitios del extremo de distribución hasta que la media recalculada sea >=LSL o <= USL para ese parámetro, luego pasar al siguiente parámetro y verificar y excluir sitios si es necesario.
¿Cómo abordar este problema con JSL?
¿Existe una plataforma JMP que ya pueda hacer esto, por ejemplo, evaluación de procesos?
Lo siguiente da
Names Default To Here( 1 );
Clear Log();
dt = Open( "$sample_data\Semiconductor Capability.jmp" );
obj = dt << Manage Spec Limits( Y( dt << Get Column Group( "Processes" ) ), Show Limits All, Save to Column Properties(1), );
obj << close window;
dist = Distribution(Stack( 0 ),
Continuous Distribution(Column( :IVP2 ), Outlier Box Plot( 0 ), Process Capability( 0 ) ),
Continuous Distribution(Column( :NPN4 ), Outlier Box Plot( 0 ), Process Capability( 0 ) ),
Continuous Distribution(Column( :IVP7 ), Outlier Box Plot( 0 ), Process Capability( 0 ) ),
Continuous Distribution(Column( :PLY1 ), Outlier Box Plot( 0 ), Process Capability( 0 ) ),
Continuous Distribution(Column( :VIA1 ), Outlier Box Plot( 0 ), Process Capability( 0 ) ),
Continuous Distribution(Column( :M1_M1 ), Outlier Box Plot( 0 ), Process Capability( 0 ) )
);

mientras que el resultado final deseado puede verse así (filtrado realizado manualmente, el gráfico a continuación es cuando se realiza para todas las obleas).

Es probable que el acto de filtrar SITIOS usando la receta anterior expulse la media de los parámetros analizados anteriormente fuera de sus límites de especificación. De todos modos, esto es lo que noté mientras hacía el ejercicio manualmente.Es posible que sea necesario repetir la receta, digamos 5 veces, sobre los parámetros para una verificación o hasta que se hayan filtrado todos los SITIOS. Esto es lo que me gustaría saber de este ejercicio. Agradecería alguna ayuda sobre cómo proceder.
Una vez verificados y hechos todos los parámetros, los SITIOS excluidos deben etiquetarse como Excluidos en una nueva columna (y permanecer como No excluidos).
Automatización y secuencias de comandosventanasRe: ¿Cómo excluir filas hasta que la media de distribución cumpla un criterio?@jthi A continuación se muestra un script de ejecución en seco básico que parece funcionar como yo quiero. Ahora solo hay un parámetro elegido (será necesario repetirlo para otros parámetros).Estoy luchando por seguir los pasos en el bucle correcto.
Tengo pasos en etapas a continuación (dos se muestran a continuación como texto comentado) que necesito ejecutar para cada oblea hasta que aparezca la declaración if (podría haber una mejor manera de hacerlo, por ejemplo, usando While(), pero esto es lo que tengo). hasta ahora). Necesito ayuda en lo siguiente
- ¿Cómo hago un bucle de las tareas para que el mínimo/máximo y la media por oblea se utilicen para la receta y no los valores correspondientes para toda la columna de parámetros?
- Una vez que haya hecho esto para una columna de parámetros, me gustaría pasar a la siguiente (por ejemplo, un total de 6 en la publicación original). ¿Cómo hacer esto automáticamente a través de JSL?
Names Default To Here( 1 );
Clear Log();
dt = Open( "$sample_data\Semiconductor Capability.jmp" ); // get data table
//get spec limits into column properties
obj = dt << Manage Spec Limits( Y( dt << Get Column Group( "Processes" ) ), Show Limits All, Save to Column Properties(1));
obj << close window; // close Manage Spec Limits window
dt << clear row states(); // clear any excluded or hidden rows
colName = "IVP7"; // choose column to operate on
specs = dt:colName << get property("spec limits"); //get spec limits for chosen column
_LSL = specs["LSL"]; //show (lsl); // get LSL
_USL = specs["USL"]; //show (usl); // get USL
/////// Stage 1 Start //////
colMean = Col Mean(dt:colName); show (colMean); // get col mean
colMin = Col Minimum(dt:colName); show (colMin); // get col min
colMax = Col Maximum (dt:colName); show (colMax); // get col max
del_LSL = _LSL - colMean; show (del_LSL); // get delta of mean wrt to LSL, +ve if colMean < LSL
del_USL = _USL - colMean; show (del_USL); // get delta of mean wrt to USL, -ve if colMean > USL
if (del_LSL >0, dt << select where( dt:colName == colMin)<< Hide and Exclude, // hide and exclude colMin
del_USL <0, dt << select where( dt:colName == colMax)<< Hide and Exclude, // hide and exclude colMax
break () // break if del_LSL<=0 or if del_USL >=0
);
/////// Stage 1 End/////
/////// Stage 2 Start //////
colMeanNew = Col Mean( If( Excluded(Row State(Row())), ., dt:colName ) ); show (colMeanNew);
colMinNew = Col Minimum( If( Excluded(Row State(Row())), ., dt:colName ) ); show (colMinNew);
colMaxNew = Col Maximum( If( Excluded(Row State(Row())), ., dt:colName ) ); show (colMaxNew);
del_LSL_New = _LSL - colMeanNew; show (del_LSL); // get new delta of mean wrt to LSL, +ve if colMean < LSL
del_USL_New = _USL - colMeanNew; show (del_USL); // get new delta of mean wrt to USL, -ve if colMean > USL
if (del_LSL_New >0, dt << select where( dt:colName == colMinNew)<< Hide and Exclude, // hide and exclude colMin
del_USL_New <0, dt << select where( dt:colName == colMaxNew)<< Hide and Exclude, // hide and exclude colMax
break () // break if del_LSL<=0 or if del_USL >=0
);
/////// Stage 2 End //////
/////// Stage 3 Start and so on//////
colMeanNew2 = Col Mean( If( Excluded( Row State(Row())), ., dt:colName ) ); show (colMeanNew2);
colMinNew2 = Col Minimum( If( Excluded( Row State(Row())), ., dt:colName ) ); show (colMinNew2);
colMaxNew2 = Col Maximum( If( Excluded( Row State(Row())), ., dt:colName ) ); show (colMaxNew2);
Re: ¿Cómo excluir filas hasta que la media de distribución cumpla un criterio?Cree una expresión/función para realizar sus exclusiones. Luego obtenga una lista de columnas de interés y revíselas una por una. No verifiqué que esto funcione correctamente.
Names Default To Here(1);
Clear Log();
dt = Open("$sample_data\Semiconductor Capability.jmp");
dt << clear row states();
obj = dt << Manage Spec Limits(
Y(dt << Get Column Group("Processes")),
Show Limits All,
Save to Column Properties(1)
);
obj << close window;
expr_exclude_rows = Expr(
Summarize(dt, colMean = Mean(dt:colName), colMin = Min(dt:colName), colMax = Max(dt:colName));
del_LSL = _LSL - colMean;
del_USL = _USL - colMean;
If(del_LSL > 0,
dt << select where(dt:colName == colMin) << Hide and Exclude;
);
If(del_USL < 0,
dt << select where(dt:colName == colMax) << Hide and Exclude;
);
If(N Items(dt << Get Selected Rows) < 1,
continue_clean = 0;
);
dt << Clear Select;
);
dt << Show Window(0);
dt << Begin Data Update;
duration = 0;
cols_of_interest = {"IVP7"};
For Each({colName}, cols_of_interest,
start = Tick Seconds();
specs = dt:colName << get property("spec limits");
_LSL = specs["LSL"];
_USL = specs["USL"];
continue_clean = 1;
While(continue_clean,
expr_exclude_rows;
);
end = Tick Seconds();
cur_dur = end - start;
duration += cur_dur;
Write("colName: ", colName, " took ", Round(cur_dur, 2), " seconds.\!N");
);
dt << End Data Update;
dt << Show Window(1);
total_end = Tick Seconds();
rows_excluded = dt << Get Excluded Rows;
Write("Total run time for ", N Items(cols_of_interest), " columns was " , Round(duration, 2), " seconds with ", N items(rows_excluded), " rows excluded\!N");Re: ¿Cómo excluir filas hasta que la media de distribución cumpla un criterio?@jthi Gracias. La parte clave que me faltaba en mis intentos de lograr Mientras bucle es
If(N Items(dt << Get Selected Rows) < 1,
continue_clean = 0;
);
dt << Clear Select;
por lo que no estaba funcionando como se esperaba.
Ahora lo probé y lo modifiqué para que funcione con varias columnas de parámetros siguiendo su secuencia de comandos. Aún se necesitan más pruebas, pero creo que funciona según lo requerido.
Lo que tengo que hacer a continuación es repetir este análisis para cada Oblea . Actualmente, el script se ejecuta en todas las filas de la tabla de datos para la columna de parámetro elegida. No me queda claro cómo limitar el análisis a una oblea antes de pasar a la siguiente.
El objetivo final es obtener el número de filas excluidas por oblea (quizás podría ser útil agregar una nueva columna como ExcludedRows & set =1 en la tabla de datos como parte del análisis)
Pero antes de solicitar alguna dirección sobre cómo crear un guión para repetir el análisis por Oblea .
Re: ¿Cómo excluir filas hasta que la media de distribución cumpla con un criterio?Dado el análisis que está realizando, creo que la forma más eficiente de ejecutar cada oblea es dividir la tabla de datos en tablas de datos separadas para cada oblea.Luego simplemente recorre las tablas una tras otra.
Re: ¿Cómo excluir filas hasta que la media de distribución cumpla con un criterio?@txnelson De acuerdo. Gracias, sé cómo subconjunto por oblea (en mi caso real, esto generará >100 datos de oblea) pero no sé cómo crear un script para ejecutar el análisis oblea por oblea, una vez que tenga datos de oblea separados. ¿Podría darme alguna dirección por favor?
Re: ¿Cómo excluir filas hasta que la media de distribución cumpla con un criterio?A continuación se muestra una ilustración de cómo ejecutar esto por separado para cada oblea.estoy usando @jthi código de ejemplo.Lo modifiqué para crear tablas de datos para cada oblea y luego ejecutar el código en cada tabla de datos.Con fines ilustrativos, eliminé todos los datos de las obleas excepto las obleas 1 y 2.
Names Default To Here( 1 );
Clear Log();
dtAll = Open( "$sample_data\Semiconductor Capability.jmp" );
dtAll << clear row states();
obj = dtAll << Manage Spec Limits(
Y( dtAll << Get Column Group( "Processes" ) ),
Show Limits All,
Save to Column Properties( 1 )
);
obj << close window;
Window( "Consistency Problem" ) << close window;
// For illustration remove all data except for wafers 1 & 2
dtAll << select where( :wafer > 2 );
dtAll << delete rows;
expr_exclude_rows = Expr(
Summarize( dt, colMean = Mean( dt:colName ), colMin = Min( dt:colName ), colMax = Max( dt:colName ) );
del_LSL = _LSL - colMean;
del_USL = _USL - colMean;
If( del_LSL > 0,
dt << select where( dt:colName == colMin ) << Hide and Exclude
);
If( del_USL < 0,
dt << select where( dt:colName == colMax ) << Hide and Exclude
);
If( N Items( dt << Get Selected Rows ) < 1,
continue_clean = 0
);
dt << Clear Select;
);
// Create all data tables based on wafer
dtList = dtAll << Subset( By( :wafer ), All rows, Selected columns only( 0 ) );
// Run the analysis for each data table
For Each( {dt}, dtList,
dt << Show Window( 0 );
dt << Begin Data Update;
duration = 0;
cols_of_interest = {"IVP7"};
For Each( {colName}, cols_of_interest,
start = Tick Seconds();
specs = dt:colName << get property( "spec limits" );
_LSL = specs["LSL"];
_USL = specs["USL"];
continue_clean = 1;
While( continue_clean, expr_exclude_rows );
end = Tick Seconds();
cur_dur = end - start;
duration += cur_dur;
Write( "colName: ", colName, " took ", Round( cur_dur, 2 ), " seconds.\!N" );
);
dt << End Data Update;
dt << Show Window( 1 );
total_end = Tick Seconds();
rows_excluded = dt << Get Excluded Rows;
Write(
"Total run time for ",
N Items( cols_of_interest ),
" columns was ",
Round( duration, 2 ),
" seconds with ",
N Items( rows_excluded ),
" rows excluded\!N"
);
);