Gaegul's devlog

[데이터 분석] 이상치 처리 본문

Data Analysis

[데이터 분석] 이상치 처리

부지런깨꾹이 2022. 10. 28. 02:08
728x90
반응형

이상치 처리 방법은 다양하지만 이번 시간에는 3sigma 기준으로 이상치를 처리해볼껍니당! (IQR로 구할 수 도 있지만 이번 시간에는 3sigma 방법을 볼꺼예요 ☺️)

3sigma 란?

일변량 자료들 중 평균 ± 3*표준편차를 벗어나는 것들을 비정상이라 규정(정규분포 기반)

#이상치 처리
def outlier(data):
  threshold = 3
  outlier = [] 
  for i in range(len(data)): 
    if (data[i]>data.mean()+3*data.std())|(data[i]<data.mean()-3*data.std()):
      outlier.append(data[i]) 
      data[i] = np.NaN
  print('데이터셋 내의 이상값은', outlier)

이상치에 해당하는 데이터는 NaN으로 변경해줍니다.

# 변수 3sigma 기준으로 outlier 처리
# 일변량 자료들 중 평균 ± 3*표준편차를 벗어나는 것들을 비정상이라 규정(정규분포 기반)
outlier_list = ['w', 'pw', 'bps', 'bpd', 'spo2', 'hr', 'gl']
for i in outlier_list:
  outlier(train_tmp[str(i)])
  outlier(test_tmp[str(i)])
print('TrainSet w / pw 의 분포 그래프')
f, axes = plt.subplots(1, 2, figsize=(15, 10), sharex=True)
sns.distplot(train_tmp['w'], color="blue", ax=axes[0])
sns.distplot(train_tmp['pw'], color="red", ax=axes[1])
plt.show()

nan을 채우는 방법은 다양하지만 저 같은 경우는 time series에서는 일반적으로 interpolate 메소드를 사용합니다.

# time 보간으로 채움
train_tmp = train_tmp.set_index(['timestamp'])
train_tmp[['w', 'pw']] = train_tmp[['w', 'pw']].interpolate(method='time')

#예외처리
train_tmp['pw'] = train_tmp['pw'].fillna(method='bfill') 
test_tmp['pw'] = test_tmp['pw'].fillna(method='bfill')

 

728x90
반응형
Comments