Penganalisis sering menghadapi outlier dalam data semasa kerja mereka, seperti semasa analisis ujian AB, mencipta model ramalan atau menjejaki arah aliran. Keputusan biasanya berdasarkan purata sampel, yang sangat sensitif kepada outlier dan boleh mengubah nilai secara mendadak. Jadi, adalah penting untuk menguruskan outlier untuk membuat keputusan yang betul.
Mari kita pertimbangkan beberapa pendekatan mudah dan pantas untuk bekerja dengan nilai luar biasa.
Bayangkan anda perlu menjalankan analisis percubaan menggunakan nilai pesanan purata sebagai metrik utama. Katakan metrik kami biasanya mempunyai taburan normal. Juga, kita tahu bahawa taburan metrik dalam kumpulan ujian adalah berbeza daripada taburan dalam kawalan. Dalam erti kata lain, min bagi taburan dalam kawalan ialah 10, dan dalam ujian ialah 12. Sisihan piawai dalam kedua-dua kumpulan ialah 3.
Walau bagaimanapun, kedua-dua sampel mempunyai outlier yang memesongkan min sampel dan sisihan piawai sampel.
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))
NB bahawa mempertimbangkan metrik mungkin mempunyai kelebihan dari kedua-dua belah pihak. Jika metrik anda boleh mempunyai outlier hanya dari satu pihak, kaedah boleh diubah dengan mudah untuk tujuan itu.
Kaedah yang paling mudah ialah memotong semua pemerhatian sebelum persentil 5% dan selepas persentil 95% . Dalam kes ini, kami kehilangan 10% maklumat sebagai penipu. Walau bagaimanapun, pengedaran kelihatan lebih terbentuk, dan momen sampel lebih dekat dengan momen pengedaran.
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]
Cara lain ialah mengecualikan pemerhatian di luar julat tertentu . Jalur rendah bersamaan dengan persentil 25% tolak separuh daripada julat antara kuartil, dan jalur tinggi bersamaan dengan persentil 75% tambah satu setengah. Di sini, kami akan kehilangan hanya 0.7% maklumat. Pengagihan kelihatan lebih terbentuk daripada yang awal. Momen sampel adalah lebih sama dengan momen pengedaran.
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]
Kaedah kedua yang kami pertimbangkan di sini ialah bootstrap. Dalam pendekatan ini, min dibina seperti min subsampel. Dalam contoh kami, min dalam kumpulan kawalan sama dengan 10.35, dan kumpulan ujian ialah 11.78. Ia masih merupakan hasil yang lebih baik berbanding pemprosesan data tambahan.
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())
Pengesanan dan pemprosesan outlier adalah penting untuk membuat keputusan yang betul. Kini, sekurang-kurangnya tiga pendekatan pantas dan mudah boleh membantu anda menyemak data sebelum analisis.
Walau bagaimanapun, adalah penting untuk diingat bahawa outlier yang dikesan boleh menjadi nilai luar biasa dan ciri untuk kesan kebaharuan. Tapi lain cerita :)