
현재 저는 부스트캠프 AI Tech 7기 과정에서 데이터 시각화에 대한 내용을 배우고 있습니다.
그 중에서 Lineplot을 이동 평균을 이용하여 smoothing하는 방법에 대해서도 배울 수 있었습니다.
저는 어떻게 이동 평균을 사용하는 것이 lineplot을 정상화(?)시키는지 궁금해졌고 수식을 통해 제 스스로 납득할 수 있는 답을 구하고자 하였습니다. 그럼 시작하겠습니다.
먼저 왜 기존 정보를 손실시키면서까지 smoothing을 해야하는지 궁금하실 수도 있을 것 같습니다. 그 이유는 lineplot을 활용하여 시계열 데이터의 시간에 따른 추세가 어떻게 변하는지 확인하는 것이 주요한 목표이기 때문입니다.
추세를 확인하기 위해서는 정확한 정보를 모두 담고 있는 원본 lineplot보다야 적당히 noise를 제거한 lineplot이 더 보기 편리한 것이죠.
말씀드린대로, 이동 평균(moving average)을 통해 smoothing을 진행합니다.
이동 평균은 연속된 개의 데이터의 평균을 말하는데, 다음과 같은 예제에 대해서 이동 평균을 구해보도록 하겠습니다.
이에 대한 이동 평균을 저장한 배열 는 아래와 같이 구해집니다.
다시 돌아와서, 이동 평균이 어떻게 smoothing을 보장하는지에 대해서 생각해봅시다.
이동 평균 이 에 대해서 얼마나 많이 변하는지에 대해 고민해보면 그 힌트를 얻을 수 있습니다.
즉, 이동 평균을 이용하면 두 값의 변화량이 기존에 비해 배 작아지므로 smoothing이 되는 결론을 얻을 수 있습니다.
물론 의 값이 보다 배 이상 크다면 변화량이 오히려 커지는 경우도 존재하겠지만, 그 값이 상쇄되기 위해서는 번 더 이동평균을 계산해야하므로 데이터의 변동성이 더 작아지는 게 맞습니다.
이제 실제로 이동평균을 Python에서 어떻게 구하는지 알아봅시다. 앞서 설명한 수식이 머리아파도 걱정할 필요 없습니다. 왜냐하면...
coins = pd.read_csv('./archive/coin_Tron.csv')
fig, axes = plt.subplots(2, 1, figsize=(15, 7), sharey=True)
axes[0].plot(coins['Open'])
rolling_coins = coins.rolling(window=5)['Open'].mean() # 이동 평균 구하기!
axes[1].plot(rolling_coins)
plt.savefig('coin.jpg')
단 한 줄의 코드만으로도 이동 평균을 구할 수 있기 때문입니다! 좀 더 부가적인 설명을 하면 window가 수식에서의 이고, coins 데이터프레임의 Open 열에 대해서 이동 평균을 구하는 것입니다. 사용한 데이터셋은 암호화폐의 가격에 대한 값을 저장한 데이터셋입니다. 원래는 Bitcoin에 대해서 plot을 그려봤었는데 너무 급상승(...)하는 구간이 있어서 예쁘게 안나와서 다른 Tron이라는 암호화폐로 plot을 그렸습니다.

보시다시피 확실히 noise가 감소한 것을 확인할 수 있습니다!
앞으로 이렇게 매일매일 TIL을 남기고자 합니다. 이 도전이 얼마나 오래 지속될지 지켜봐주시면 감사하겠습니다. 감사합니다.