본문 바로가기

Data Science/Data Preprocessing

[02. Data Quality Assessment] 001. Missing Values

728x90

모든 데이터가 다 있으면 좋겠지만 데이터를 수집하다보면 결측값들이 존재한다. 데이터가 많다면 비어있는 데이터를 삭제할 수 있다. 데이터셋의 크기가 작다면 결측값들을 평균, 최빈값 또는 중간값 등으로 채워 넣는다. 마지막으로 모델링을 통해 예측되는 값을 넣을 수도 있는데 이는 잘 사용하지 않는다. 정확하게 데이터간의 관계를 파악하고 있어야 가능하고, 이러한 예측값이 정확하다는 보장도 없다.

 

애플과 삼성전자의 주가데이터를 통해 결측값을 삭제 또는 평균 등의 값으로 채워 넣는 방법에 대해 알아보자.

 

우선 삼성전자와 애플의 주가를 불러오자.

 

import FinanceDataReader as fdr

if __name__ == '__main__':
    aapl = fdr.DataReader('AAPL', '2020-04-01')
    ssec = fdr.DataReader('005930', '2020-04-01')
    price = aapl[['Close']].merge(ssec[['Close']], how='outer', left_index=True, right_index=True)
    price = price.rename(columns={'Close_x': 'AAPL', 'Close_y': 'SSEC'})
    print(price)


결과 값
              AAPL     SSEC
Date                       
2020-04-01   60.23  45800.0
2020-04-02   61.23  46800.0
2020-04-03   60.35  47000.0
2020-04-06   65.62  48700.0
2020-04-07   64.86  49600.0
2020-04-08   66.52  48600.0
2020-04-09   67.00  49100.0
2020-04-10     NaN  49250.0
2020-04-13   68.31  48300.0
2020-04-14   71.76  49000.0
2020-04-15   71.11      NaN
2020-04-16   71.67  49000.0
2020-04-17   70.70  51400.0
2020-04-20   69.23  50100.0
2020-04-21   67.09  49250.0
2020-04-22   69.03  49850.0
2020-04-23   68.76  49850.0
2020-04-24   70.74  49350.0
2020-04-27   70.79  49850.0
2020-04-28   69.64  50100.0
2020-04-29   71.93  50000.0
2020-04-30   73.45      NaN
2020-05-01   72.27      NaN

 

결과 값을 보면 애플은 4월 10일, 삼성전자는 4월 30일, 그리고 5월 1일 데이터가 없다. 이는 두 나라의 공휴일이 다르기 때문에 생기는 결과이다. 시계열 데이터는 기본적으로 전일 값을 가져오거나 아니면 결측값을 삭제한다. 하지만 우리는 다양한 방법을 실습해보기로 한다.

 

1) 결측값 삭제

print(price.dropna())


결과 값
              AAPL     SSEC
Date                       
2020-04-01   60.23  45800.0
2020-04-02   61.23  46800.0
2020-04-03   60.35  47000.0
2020-04-06   65.62  48700.0
2020-04-07   64.86  49600.0
2020-04-08   66.52  48600.0
2020-04-09   67.00  49100.0
2020-04-13   68.31  48300.0
2020-04-14   71.76  49000.0
2020-04-16   71.67  49000.0
2020-04-17   70.70  51400.0
2020-04-20   69.23  50100.0
2020-04-21   67.09  49250.0
2020-04-22   69.03  49850.0
2020-04-23   68.76  49850.0
2020-04-24   70.74  49350.0
2020-04-27   70.79  49850.0
2020-04-28   69.64  50100.0
2020-04-29   71.93  50000.0

 

2) 평균

print(price.fillna(price.mean()))


결과 값
                 AAPL          SSEC
Date                               
2020-04-01   60.23000  45800.000000
2020-04-02   61.23000  46800.000000
2020-04-03   60.35000  47000.000000
2020-04-06   65.62000  48700.000000
2020-04-07   64.86000  49600.000000
2020-04-08   66.52000  48600.000000
2020-04-09   67.00000  49100.000000
2020-04-10  100.81116  49250.000000
2020-04-13   68.31000  48300.000000
2020-04-14   71.76000  49000.000000
2020-04-15   71.11000  56766.853933
2020-04-16   71.67000  49000.000000
2020-04-17   70.70000  51400.000000
2020-04-20   69.23000  50100.000000
2020-04-21   67.09000  49250.000000
2020-04-22   69.03000  49850.000000
2020-04-23   68.76000  49850.000000
2020-04-24   70.74000  49350.000000
2020-04-27   70.79000  49850.000000
2020-04-28   69.64000  50100.000000
2020-04-29   71.93000  50000.000000
2020-04-30   73.45000  56766.853933
2020-05-01   72.27000  56766.853933

 

3) 중간값

print(price.fillna(price.median()))


결과 값
              AAPL     SSEC
Date                       
2020-04-01   60.23  45800.0
2020-04-02   61.23  46800.0
2020-04-03   60.35  47000.0
2020-04-06   65.62  48700.0
2020-04-07   64.86  49600.0
2020-04-08   66.52  48600.0
2020-04-09   67.00  49100.0
2020-04-10  108.94  49250.0
2020-04-13   68.31  48300.0
2020-04-14   71.76  49000.0
2020-04-15   71.11  56250.0
2020-04-16   71.67  49000.0
2020-04-17   70.70  51400.0
2020-04-20   69.23  50100.0
2020-04-21   67.09  49250.0
2020-04-22   69.03  49850.0
2020-04-23   68.76  49850.0
2020-04-24   70.74  49350.0
2020-04-27   70.79  49850.0
2020-04-28   69.64  50100.0
2020-04-29   71.93  50000.0
2020-04-30   73.45  56250.0
2020-05-01   72.27  56250.0

 

4) 직전값

print(price.ffill())


결과 값
              AAPL     SSEC
Date                       
2020-04-01   60.23  45800.0
2020-04-02   61.23  46800.0
2020-04-03   60.35  47000.0
2020-04-06   65.62  48700.0
2020-04-07   64.86  49600.0
2020-04-08   66.52  48600.0
2020-04-09   67.00  49100.0
2020-04-10   67.00  49250.0
2020-04-13   68.31  48300.0
2020-04-14   71.76  49000.0
2020-04-15   71.11  49000.0
2020-04-16   71.67  49000.0
2020-04-17   70.70  51400.0
2020-04-20   69.23  50100.0
2020-04-21   67.09  49250.0
2020-04-22   69.03  49850.0
2020-04-23   68.76  49850.0
2020-04-24   70.74  49350.0
2020-04-27   70.79  49850.0
2020-04-28   69.64  50100.0
2020-04-29   71.93  50000.0
2020-04-30   73.45  50000.0
2020-05-01   72.27  50000.0
728x90