Da quando non ho visto una risposta che si occupi di valori numerici e non numerici tratti di attributi , ecco una risposta complementare.
È possibile che si desideri eliminare gli outlier solo sugli attributi numerici (le variabili categoriche difficilmente possono essere outlier).
Definizione della funzione
Ho esteso il suggerimento di @ tanemaki per gestire i dati quando sono presenti anche attributi non numerici:
from scipy import stats
def drop_numerical_outliers(df, z_thresh=3):
# Constrains will contain `True` or `False` depending on if it is a value below the threshold.
constrains = df.select_dtypes(include=[np.number]) \
.apply(lambda x: np.abs(stats.zscore(x)) < z_thresh, reduce=False) \
.all(axis=1)
# Drop (inplace) values set to be rejected
df.drop(df.index[~constrains], inplace=True)
uso
drop_numerical_outliers(df)
Esempio
Immagina un set df
di dati con alcuni valori sulle case: vicolo, contorno del terreno, prezzo di vendita, ... Ad esempio: Documentazione dei dati
Innanzitutto, si desidera visualizzare i dati su un grafico a dispersione (con z-score Thresh = 3):
# Plot data before dropping those greater than z-score 3.
# The scatterAreaVsPrice function's definition has been removed for readability's sake.
scatterAreaVsPrice(df)
# Drop the outliers on every attributes
drop_numerical_outliers(train_df)
# Plot the result. All outliers were dropped. Note that the red points are not
# the same outliers from the first plot, but the new computed outliers based on the new data-frame.
scatterAreaVsPrice(train_df)