paint-brush
Detecció d'outliers: el que cal saberper@nataliaogneva
54,579 lectures
54,579 lectures

Detecció d'outliers: el que cal saber

per Natalia Ogneva4m2024/04/23
Read on Terminal Reader
Read this story w/o Javascript

Massa Llarg; Per llegir

Els analistes sovint es troben amb dades atípiques durant el seu treball. Les decisions es basen generalment en la mitjana mostral, que és molt sensible als valors atípics. És crucial gestionar els valors atípics per prendre la decisió correcta. Considerem diversos enfocaments senzills i ràpids per treballar amb valors inusuals.

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Detecció d'outliers: el que cal saber
Natalia Ogneva HackerNoon profile picture

Els analistes sovint es troben amb valors atípics a les dades durant el seu treball, com ara durant l'anàlisi de la prova AB, la creació de models predictius o el seguiment de tendències. Les decisions solen basar-se en la mitjana mostral, que és molt sensible als valors atípics i pot canviar dràsticament el valor. Per tant, és crucial gestionar els valors atípics per prendre la decisió correcta.


Considerem diversos enfocaments senzills i ràpids per treballar amb valors inusuals.

Formulació del problema

Imagineu que heu de realitzar una anàlisi d'experiment utilitzant un valor mitjà de comanda com a mètrica principal. Diguem que la nostra mètrica sol tenir una distribució normal. A més, sabem que la distribució mètrica al grup de prova és diferent de la del control. En altres paraules, la mitjana de la distribució en el control és 10, i en la prova és 12. La desviació estàndard en ambdós grups és 3.


No obstant això, ambdues mostres tenen valors atípics que obliguen les mitjanes de la mostra i la desviació estàndard de la mostra.

 import numpy as np N = 1000 mean_1 = 10 std_1 = 3 mean_2 = 12 std_2 = 3 x1 = np.concatenate((np.random.normal(mean_1, std_1, N), 10 * np.random.random_sample(50) + 20)) x2 = np.concatenate((np.random.normal(mean_2, std_2, N), 4 * np.random.random_sample(50) + 1))

Tingueu en compte que tenir en compte la mètrica podria tenir valors atípics d'ambdós costats. Si la vostra mètrica només podria tenir valors atípics d'un costat, els mètodes es podrien transformar fàcilment per a aquest propòsit.

Tallar les cues

El mètode més fàcil és tallar totes les observacions abans del percentil del 5% i després del percentil del 95% . En aquest cas, hem perdut el 10% de la informació com a estafa. Tanmateix, les distribucions semblen més formades i els moments mostrals són més propers als moments de distribució.

 import numpy as np x1_5pct = np.percentile(x1, 5) x1_95pct = np.percentile(x1, 95) x1_cutted = [i for i in x1 if i > x1_5pct and i < x1_95pct] x2_5pct = np.percentile(x2, 5) x2_95pct = np.percentile(x2, 95) x2_cutted = [i for i in x2 if i > x2_5pct and i < x2_95pct]


Una altra manera és excloure les observacions fora de l'interval específic . La banda baixa és igual al percentil del 25% menys la meitat del rang interquartil, i la banda alta és igual al percentil del 75% més la meitat. Aquí, només perdrem el 0,7% de la informació. Les distribucions semblen més formades que les inicials. Els moments mostrals són encara més iguals als moments de distribució.

 import numpy as np low_band_1 = np.percentile(x1, 25) - 1.5 * np.std(x1) high_band_1 = np.percentile(x1, 75) + 1.5 * np.std(x1) x1_cutted = [i for i in x1 if i > low_band_1 and i < high_band_1] low_band_2 = np.percentile(x2, 25) - 1.5 * np.std(x2) high_band_2 = np.percentile(x2, 75) + 1.5 * np.std(x2) x2_cutted = [i for i in x2 if i > low_band_2 and i < high_band_2]

Bootstrap

El segon mètode que hem considerat aquí és un bootstrap. En aquest enfocament, la mitjana es construeix com una mitjana de submostres. En el nostre exemple, la mitjana del grup control és igual a 10,35 i el grup de prova és 11,78. Encara és un millor resultat en comparació amb el processament de dades addicional.

 import pandas as pd def create_bootstrap_samples( sample_list: np.array, sample_size: int, n_samples: int ): # create a list for sample means sample_means = [] # loop n_samples times for i in range(n_samples): # create a bootstrap sample of sample_size with replacement bootstrap_sample = pd.Series(sample_list).sample(n = sample_size, replace = True) # calculate the bootstrap sample mean sample_mean = bootstrap_sample.mean() # add this sample mean to the sample means list sample_means.append(sample_mean) return pd.Series(sample_means) (create_bootstrap_samples(x1, len(x1), 1000).mean(), create_bootstrap_samples(x2, len(x2), 1000).mean())

Conclusió

La detecció i el processament de valors atípics són importants per prendre la decisió correcta. Ara, almenys tres enfocaments ràpids i senzills us poden ajudar a comprovar les dades abans de l'anàlisi.


Tanmateix, és essencial recordar que els valors atípics detectats podrien ser valors inusuals i una característica de l'efecte novetat. Però és una altra història :)