Detecting and Filtering Outliers
이번에는 특정 범위를 넘어가는 데이터를 추출해보겠습니다.
data = pd.DataFrame(np.random.randn(1000, 4))
data.describe()
0 1 2 3
count 1000.000000 1000.000000 1000.000000 1000.000000
mean -0.047439 0.046069 0.024366 -0.006350
std 0.997187 0.998359 1.008925 0.993665
min -3.428254 -3.645860 -3.184377 -3.745356
25% -0.743886 -0.599807 -0.612162 -0.697084
50% -0.086309 0.043663 -0.013609 -0.026381
75% 0.624413 0.746527 0.690847 0.694459
max 3.366626 2.653656 3.525865 2.735527
이때 2번째 column에 대해서 절댓값이 3이 넘어가는 행을 추출해보겠습니다.
col = data[2]
col[np.abs(col) > 3]
55 3.260383
230 -3.056990
317 -3.184377
777 3.525865
Name: 2, dtype: float64
또한 특정 행에 있는 데이터 하나라도 절댓값이 3이 넘어가는 행을 추출하겠습니다.
data[(np.abs(data) > 3).any(1)]
0 1 2 3
36 -2.315555 0.457246 -0.025907 -3.399312
55 0.050188 1.951312 3.260383 0.963301
131 0.146326 0.508391 -0.196713 -3.745356
230 -0.293333 -0.242459 -3.056990 1.918403
254 -3.428254 -0.296336 -0.439938 -0.867165
317 0.275144 1.179227 -3.184377 1.369891
539 -0.362528 -3.548824 1.553205 -2.186301
631 3.366626 -2.372214 0.851010 1.332846
777 -0.658090 -0.207434 3.525865 0.283070
798 0.599947 -3.645860 0.255475 -0.549574
만약 데이터의 절댓값이 3이 넘어간다면, 해당 값을 1(-1)(부호에 맞게) * 3을 곱하여 처리해보겠습니다.
data[np.abs(data) > 3] = np.sign(data) * 3
data.describe()
0 1 2 3
count 1000.000000 1000.000000 1000.000000 1000.000000
mean -0.047378 0.047263 0.023821 -0.005206
std 0.994634 0.994342 1.005685 0.989845
min -3.000000 -3.000000 -3.000000 -3.000000
25% -0.743886 -0.599807 -0.612162 -0.697084
50% -0.086309 0.043663 -0.013609 -0.026381
75% 0.624413 0.746527 0.690847 0.694459
max 3.000000 2.653656 3.000000 2.735527
min, max가 최소 -3, 최대 3이 된 모습을 볼 수 있습니다.
1번 column은 3이 넘는 숫자가 없었나보네요.
np.sign(data).head()
0 1 2 3
0 -1.0 1.0 -1.0 1.0
1 -1.0 1.0 -1.0 1.0
2 -1.0 -1.0 -1.0 -1.0
3 -1.0 1.0 1.0 -1.0
4 1.0 1.0 1.0 -1.0
data를 np.sign(data)하여 모두 부호화 한 데이터를 5개만 봤습니다.