본문 바로가기
  • 데이터에 가치를 더하다, 서영석입니다.
연구 활동/이상 탐지 프레임워크 설계

[이상치 탐지] EDA for data(2min)

by 꿀먹은데이터 2022. 4. 28.

본 센서는 ver1,ver2,ver3으로 구성되어있으며 가스를 측정하는데 있어 주기가 2분인 센서의 데이터를 가져왔다. 

 'AI 데이터 연구단'에서 자체적으로 개발한 센서이며 , TVOC,CO2,미세먼지 등 실내 공기의 질을 측정하는 센서이다.

 

 데이터를 측정하는 센서에 따라 시간의 주기가 맞지 않을 때가 있다.

 

보통 시간의 주기를 1min으로 하면 센서의 시간에 따른 정교성이 부족하다면. 1분 5초에 따라 측정할 수도 있고, 1분 10초 마다 센서로 측정할 수 있어 이를 조정해주는 작업이 필요하다. 

 

.. 센서를 정교하게 잘 만든다면 이런 일이 안벌어지지 않을까..??

이 부분은 결함이 일어날 수도 있다고 생각하고 EDA를 진행하였다. 

 

 본 데이터는 2분마다 가스를 측정하는 센서로 TS2,CH2O, 미세먼지 등을 측정해주는 기기이다.

앞서 데이터를 보면 이렇다.

 

센서에서 측정된 dataframe

 

이 와 같이 2분마다 측정되던 센서가 분만 봤을 때 어느 순간 2분에서 3분으로 되고, 1분으로 돌아오는 것을 볼 수 있다. (15->18-19->22으로 분이 변경.)

이를 전처리 해주는 작업을 우선시로 해주기로 하였다.

df_ver3=pd.read_csv('/content/drive/MyDrive/Outlier Detection Paper/data/구버전/10000000-data-2022-04-28 10_38_08.csv')
df_ver3['time'] = pd.to_datetime(df_ver3['time'])
df_ver3 = df_ver3.sort_values('time')
df_ver3['time'] = df_ver3['time'].dt.to_period(freq = 'min')  #분까지 끊기
df_ver3

방법은 이렇다.

홀수분일 때는 앞으로 당겨주어 짝수분으로 만들어주고, 마지막 홀수분 이후에는 한 행을 추가하는 방식

               (ex. 21분 --> 20분으로)                         (ex. 21분이 20분으로 되면서 한 행을 추가. (22분)

time =df_ver3['time'].apply(lambda x: x.strftime('%Y%m%d%H%M'))

for i in range(len(df_ver3['time'])):
  if int(time[i][-2:])%2 ==1:
    df_ver3['time'][i]=df_ver3['time'][i]+datetime.timedelta(minutes=1)

setting 날짜 범위 시작, 날짜 범위 끝

ver3_frame = pd.date_range(start = '2022-04-21 10:38',            # 날짜 범위 시작
                     end = '2022-04-28 10:34',                    # 날짜 범위 끝
                     freq = '2min',                           # 시간 간격( 2분 간격)
                     tz = 'Asia/Seoul')                       # 시간대(timezone)
ver3_frame=pd.DataFrame(ver3_frame)
ver3_frame.columns=['time']
ver3_frame['time'] = ver3_frame['time'].dt.to_period(freq = 'min')  #분까지 끊기
ver3_frame

위와 같이 data_range에 start 부분과 end 부분을 위 df_ver3과 같이 세팅해주고 데이터프레임을 time 부분만 만들어준 뒤(ver3_frame), 원래의 dataframe과 합쳐주면, time 부분의 column만 ver3_frame으로 변경해주면 된다. 

위와 같이 ver3_frame을 봤을 때 짝수분으로 깔끔하게 나온 것을 볼 수 있다.

new_df_ver3 = pd.merge(ver3_frame,df_ver3, how='outer',on='time')
new_df_ver3.sort_values(['time'],inplace=True)
new_df_ver3.reset_index(drop=True,inplace=True)
new_df_ver3.drop(['ts2','entity_id'],axis=1,inplace=True)
new_df_ver3=new_df_ver3.set_index('time')
new_df_ver3

앞서 제시한 방식대로 데이터프레임을 병합해줬을 경우, NaN값이 나온다.

왜냐하면 홀수 시간대를 짝수 시간대로 앞으로 당기기 때문에 발생하는 빈 열들에 채워줘야한다.

가스의 경우 중간값으로 누락값을 채워도 된다고 판단하여 interpolate함수로 채워주었다.

ver3=new_df_ver3.interpolate()
ver3[1:].isnull().sum()

 

최종 데이터프레임 ver3 모습