He estado interesado en trabajar con inliers ya que lo veo cada vez más un problema con muchos de los datos que miro. ¿Se pregunta si alguien ha tenido clientes que mencionen esto como un punto importante? Estos inliers no son algo que la herramienta de exploración de outliers manejará bien en muchos casos. Así que termino haciendo una combinación de una o más de estas técnicas. Abierto a sugerencias sobre otras tácticas aquí.
Tenía un ejemplo de nuestros recuentos de usuarios de datos de clientes. Gran parte de los datos era realista en términos de # usuarios, pero había estos fragmentos de conteos de usuarios y 100, 200, 500, 2500, etc. Estos son solo un número máximo de usuarios por contacto, pero no un recuento preciso de usuarios en un sitio. Son inliers y realmente deberían faltar o tratarse de otra manera. Si conoce estos valores, que son intrínsecos (fáciles de detectar en Graph Builder o distirbution), puede hacer algo como esto:
For Each Row(
:Name( "Potassium (mg)" ) = Match( :Name( "Potassium (mg)" ),
200, .,
:Name( "Potassium (mg)" )
)
);
Esto eliminará esos valores más intrínsecamente de la fila de forma destructiva (también puede cambiar a valores faltantes, usar códigos de valores faltantes o algo así).
También utilizo ampliamente la propiedad de columna de verificación de rango para eliminar valores que deberían omitirse del análisis:
dt:Name( "Resting Calories (kcal)" ) << set property ("Range Check", LTLT( 1400, 2500 ) );
Este, por ejemplo, eliminará los valores atípicos en el lado alto y también los días incompletos en el lado bajo.
Pero el etiquetado automático de valores que ocurre con demasiada frecuencia es lo que me interesa explorar. De hecho, creo que recodificar es una buena herramienta aquí, además genera el script para cambiarlos a faltantes, etc.
La recodificación de una columna numérica y la ordenación por conteo le brinda una instantánea de los valores que pueden ocurrir con demasiada frecuencia, o un equipo que está escupiendo un valor predeterminado. En el ejemplo anterior, 1822 podría ser sospechoso y justificar una mayor investigación.
Supongo que mi punto es considerar algunas de las otras herramientas como detectores atípicos y atípicos fuera de etiqueta, pueden ser muy útiles.
También vale la pena señalar que es posible señalar y hacer clic en esto mediante una búsqueda + reemplazo en el menú principal, si usted:
- Buscar en 0
- Reemplazar con .
- Marque la casilla "Igualar todo el valor de celda"
- Marque la casilla "Buscar datos".
Esto es genial porque es simple, pero una advertencia (tal vez ... no estoy seguro de que esto suceda mucho en conjuntos de datos "reales") es que no verifica el carácter / numérico ... entonces cualquier celda en columnas de caracteres que contenga solo "0", se convierte en "."
// get the continuous columns as a list of strings
dtcollist = dt << get column names( continuous, string );
// when doing lots of updates to the data table, use this to
// prevent the window being updated for each change
dt << Start Data Update();
For Each Row(
// Loop over each column within each row
// probably the same performance whichever way you do it
For( c = 1, c <= N Items( dtcollist ), c++,
AsColumn( dt, dtcollist[c] ) = Match( AsColumn( dt, dtcollist[c] ),
0, .,
AsColumn( dt, dtcollist[c] )
)
)
);
// Tell JMP it's okay to update the data in the window now
dt << End Data Update();
Este es un fragmento de código realmente útil, especialmente para el conjunto de datos que estoy viendo ahora. Lamentablemente, la tabla de datos tiene 0, lo que realmente significa que faltan. Este script recorrerá todas las columnas continuas numéricas y cambiará todos los ceros a faltantes. Gracias Justin por ayudar a optimizar esto.
Yo también uso Recode en esto, lo que llamaré la técnica de 'prescripción fuera de etiqueta' para corregir los incidentes.