Nota: JMP 11 lanzado la semana pasada. Hoy comenzamos una serie los martes de Grandes estadisticas publicaciones de blog de John Sall sobre lo que tiene que cambiar cuando tiene Big Data, con un énfasis en la detección.
La preparación de datos es una gran parte del trabajo de un analista, y cuando tiene grandes volúmenes de datos, a menudo se convierte en una parte más importante del trabajo.
Descargué datos de registros de nacimiento de tres años. Sitio web de los CDC y, a pesar de tener 12.8 millones de filas, fue bastante rápido para hacer un gráfico del peso al nacer del bebé por la edad de la madre.

Entre los 12.8 millones, encontrarás algunos bebés bastante pesados, digamos 8 kilogramos (17.6 libras). Pero note que después de un espacio, hay una línea de bebés de 10 kilogramos en la parte superior. Los bebés realmente no son tan grandes. Si hace clic en uno de estos puntos y usa una información sobre herramientas para ver los detalles, verá un valor de 9999. Eso obviamente no es un peso real, sino un código de valor faltante.
Antes de ajustar nada, tendrá que recodificar estos valores como faltantes o agregar una propiedad de Código de valor faltante a las propiedades de la columna para que las plataformas lo reconozcan como un código de valor faltante.
Si tiene más de unos pocos códigos que arreglar, entonces hay algunos pasos más. La forma habitual es seleccionar los puntos gráficamente, volver a la tabla de datos con la columna y las filas correctas seleccionadas, y luego ejecutar el comando Eliminar en el menú Editar, convirtiéndolos en valores perdidos. Eso funciona muy bien cuando solo tienes que arreglar algunas columnas. Pero cuando tienes que arreglar muchas columnas, es demasiado tedioso hacerlo de esa manera.
La industria de los semiconductores tiene datos con cientos o miles de columnas. Los valores son todos recogidos por máquinas de prueba. Las máquinas no darán un mal valor, ¿verdad? Mira la distribución de esta columna obtenida a máquina. La mayoría de los valores están por debajo de 0,5, pero faltan códigos de valor de 9999. Si cuida los códigos de valor faltantes, aprenderá la distribución real.


A continuación se muestra otra medida recogida a máquina. Casi todos los valores son menores que 0.5, pero hay valores que son mucho más grandes, son algún tipo de códigos de error del sistema de medición. Dado que estos códigos son 11 órdenes de magnitud más que los datos reales, van a causar estragos en cualquier análisis, incluso si utiliza métodos robustos, así que configúrelos como desaparecidos.


Si elimina los códigos grandes, verá códigos negativos que antes no eran evidentes. Estos son solo tres órdenes de magnitud diferentes de los datos reales, por lo que se ocultaron hasta que eliminó los otros valores atípicos. Deshazte de estos, y empezarás a ver la distribución. Todavía hay valores atípicos, pero parecen valores reales, no solo códigos de error. Así que dejémoslos en paz y recordemos considerar métodos robustos más adelante.


Si tiene este tipo de datos para analizar rutinariamente, entonces querrá que la limpieza se realice de forma bastante automática. La principal característica aquí es que los códigos de error están muy lejos de los valores reales; Podría usar 20 veces el rango intercuartil (IQR) y aún así encontrarlos todos.
Así que escribí un guión que recopilaba todos los valores únicos que eran 20 IQR del cuartil superior y, de manera similar, del cuartil inferior. Eso capturó la mayoría de los valores deshonestos, pero surgió otro problema. En algunos casos, la mayoría de los datos tenían el mismo valor y el IQR era cero, como se muestra a continuación. No puede declarar valores falsos cuando son apenas diferentes de más de la mitad de los datos.

Así que tienes que ir hacia afuera hasta encontrar un rango de cuantiles que no esté vacío. Entonces tienes un criterio para medir. Ahora uso el valor más pequeño mayor que el cuartil superior y el mayor valor más pequeño que el cuartil inferior, y esto maneja los casos en que los datos se agrupan en constantes en el medio.
La necesidad aquí es para automatización : Debe tener scripts que busquen automáticamente valores deshonestos, informarlos y, si se le solicita, repararlos. Sin la automatización, está limitado a repetir todos los pasos para todas las columnas en cada tabla que obtiene.
Así que aquí está mi guión, en partes.
Primero, escribo el código que se llamará desde el diálogo para recorrer las variables seleccionadas desde el diálogo. Ubica la columna, obtiene todos los valores en un vector. Entonces encuentra un rango de cuantiles extendido. Luego localiza todos los valores que son 20 rangos de cuantiles fuera de los cuantiles y también son enteros. Sé que todos los códigos de error son enteros. Luego acumulo la información sobre los valores "divertidos". Si la opción Reparar está activada, sustituyo los valores de columna por faltantes.
okAction = expr(
text1 = "Quantile Tail=" || Char(tail,5) || " Reach=" || Char(reach,5);
dt<
For( icol = 1, icol <= nCheckCol, icol++,
col = Column( checkCols[icol] );
data = col<
// Guarantee a non-degenerate IQR by going just outside it
QUpper = Minimum(data[Loc(data >Quantile(1-tail,vec))]);
QLower = Maximum(data[Loc(data
LimitUpper = QUpper+reach*(QUpper-QLower);
LimitLower = QLower-reach*(QUpper-QLower);
funnyRows = Loc(((vec>LimitUpper)|(vec
nFix = nrow(funnyRows);
if (nFix==0,continue());
text1 ||= "\!n\!nColumn: "||(col<
||"\!n Lower Quantile="||char(QLower,7) || " Lower Threshold=" || char(LimitLower)
||"\!n Upper Quantile="||char(QUpper,7) || " Upper Threshold=" || char(LimitUpper)
||"\!n Outlier Values= ";
text1 ||= char(data[funnyRows]);
if (isFix,for(i=1,i<=nfix,i++,col[funnyRows]=.;));
);
dt<
NewWindow("Cleanup Items",ScriptBox(text1,"TEXT",600,600));
);
El resto del código es código de configuración y diálogo:
cleanupDlg = NewWindow("Outlier Cleanup",
BorderBox(left(3),top(2),
VListBox(
BorderBox(Left(60),Top(10),Bottom(10),
TextBox("Look for outliers to clean up.", Set Font Size(15),Set Wrap(400))
),
HlistBox(
VListBox(
PanelBox("Select Columns",
colListData=ColListBox(All,width(lbWidth),nLines(min(nc,25))))
),
PanelBox("Cast Selected Columns into Roles",VListBox(
chkbox1=CheckBox("Replace with missing"),
chkbox2=CheckBox("Look for non-integer outliers too"),
HListBox(TextBox("Quantile tail: "),edtbox1=TextEditBox(Char(tail))),
HListBox(TextBox("Number of quantiles ranges beyond quantile:"),
edtbox2=TextEditBox(Char(reach))),
LineupBox(NCol(2),Spacing(8),
ButtonBox("Columns to Check", colListCheck<
colListCheck = ColListBox(width(lbWidth),nLines(30))
)
)),
PanelBox("Action",LineupBox(NCol(1),
ButtonBox("OK",
checkCols = colListCheck<
nCheckCol = nItems(checkCols);
isFix = chkbox1<
isNonInt = chkbox2<
tail = Num(edtbox1<
reach = Num(edtbox2<
if (nCheckCol>=0, okAction; cleanupDlg << CloseWindow;);
),
ButtonBox("Cancel",cleanupDlg<
ButtonBox("Remove", colListCheck<
)))
)));
colListData << Set Data Type( "Numeric" );
Después de probar el script, lo convierto en un complemento para usar cada vez que obtengo un nuevo lote de datos. Obtengo una ventana de salida que muestra para cada variable cuáles fueron los valores del cuantil extendido y qué valores estaban a 20 rangos de ellos.
Column: DELW_SICR
Lower Quantile=-0.0321 Lower Threshold=-1.98795621097088
Upper Quantile=0.06569 Upper Threshold=2.02154020965099
Outlier Values= [9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999]
Column: PS_RPNBR
Lower Quantile=5462.67 Lower Threshold=-10461.529296875
Upper Quantile=6258.88 Upper Threshold=22183.0791015625
Outlier Values= [421034, 422334, 423613, 423085, 425256, 420978, 422327, 423525, 423021, 425233]
Column: RCON_PEM
Lower Quantile=0.162 Lower Threshold=-1.39799988269806
Upper Quantile=0.24 Upper Threshold=1.79999987781048
Outlier Values= [22539399168, 22751399936, 27257200640, 26248300544, 28104099840, 565313024]
Por lo general, los datos grandes son datos sucios, y cuando hay mucho que ver, es necesario buscar herramientas para facilitar la limpieza de los datos y prepararlos para analizarlos. El script que uso en esta entrada de blog - el complemento Códigos de error de limpieza - ahora está en el Intercambio de archivos JMP, listo para descargar si necesita facilitar la limpieza de sus datos.
Mike Clayton escribió:
De acuerdo en que los códigos de error son a menudo enteros, por lo que para datos continuos y buena capacidad de medición, esos enteros se pueden filtrar y explicar mediante ingeniería de pruebas u otros equipos. Una mala capacidad de medición puede dar "enteros" falsos en ciertos rangos de valores.
Sin embargo, a veces a todos los enteros se les otorgan dígitos extra falsos por el proceso de generación de archivos de prueba o el proceso de conversión de archivos. Por lo tanto, se deben crear códigos de error detectables para sobrevivir a todas las conversiones de binario a analógico y métodos de análisis de archivos, para que permanezcan detectables hasta el momento. enteros
Luego, por supuesto, hay dispositivos marginales que también son muchos múltiplos de IQR fuera del resto de la distribución de piezas, y si los límites de tolerancia son demasiado flojos [debido a los límites establecidos por los diseñadores en lugar de establecer estadísticamente después de la producción piloto y la retroalimentación del cliente], esos " Los dispositivos disidentes deben estar identificados y contenidos, y pueden ser parte de la "limpieza" de los datos o el siguiente paso en el análisis.
Es una buena idea mantener todos los valores atípicos en la hoja de datos, "excluidos" temporalmente, para la validación del equipo, por producto, para aquellos lotes que tienen un gran número de dichos valores atípicos.
Gracias por el script para capturar enteros mucho más atípicos.