본문 바로가기
파이썬 프로그래밍/딥러닝과 수학

지수가중이동평균(Exponentially Weighted Moving Average)-1

by Majestyblue 2022. 1. 24.

외국에 사는 사람이 대한민국 서울에 놀러가기 위해 인터넷에 '서울의 평균 온도'를 검색했다고 하자.

'기상청 날씨누리'에 따르면 서울의 연평균 온도는 12.8도이다. 외국인은 이 자료를 보고 서늘하다 생각해 두툼한 옷을 입고 '8월'에 휴가를 받고 입국했다. 공항에 내린 외국인은 무슨 생각을 했을까?

 

https://ko.weatherspark.com/y/142033/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD-%EC%84%9C%EC%9A%B8%ED%8A%B9%EB%B3%84%EC%8B%9C%EC%97%90%EC%84%9C-%EB%85%84%EC%A4%91-%ED%8F%89%EA%B7%A0-%EB%82%A0%EC%94%A8#Figures-Temperature

 

그림은 2021년 서울의 온도를 나타낸 것이다. 알다싶이 서울을 비롯한 우리나라는 연교차가 매우 크다. 

 

일주일 간 서울로 휴가를 받았을 때 날씨를 확인한다면 어느 날짜의 날씨를 확인할까? 당연히 휴가 가는 날의 날씨를 확인하지 않을까? 데이터도 마찬가지다. 어떤 데이터를 어떤 시각에서 바라볼지 생각해 봐야 한다. 

 

 

 

 

1. 평균(Average)

평균은 단순하게 전체 데이터 합을 데이터 갯수로 나눈 것이다. 수식으로는 아래와 같이 정의한다.

 

 

 

 

예를 들어 아래와 같은 고등학교 3년 수학 점수의 평균을 위와 같은 공식으로 구할 수 있다. 평균을 구하였을 때 학생 B가 학생 A보다 평균이 높다고 말할 수 있다. 

학생 A와 B의 고등학교 3년 수학 점수와 평균

 

 

 

 

 

 

2. 이동 평균(Moving Average)

인터넷을 보다가 재미있는 자료를 보았는데 학생의 답안을 보고 고뇌하는 선생님의 모습이였다.

문제를 보고 한참동안 웃었는데 나도 같은 교사 입장에서 참 고민이 되었을 것 같다. 사실 문제 자체가 성립이 안되는거지만 따지고 드는 것은 한도 끝도 없으니 일단 넘어가고, 

 

 

 

 

학생이 접은 답을 한 마디로 얘기 하자면 '이동 평균'을 본 것이다. 자, 이게 무슨 이야기인가? 위 표를 바탕으로 작성한 그래프를 보자

 

어떤 사람을 뽑을 때 '발전 가능성' 을 많이 보는데 대입에서 학업 향상도를 참고하는 경우도 있다. 자소서나 생활기록부에 자신의 실제 발전 사례를 구체적으로 작성하면 좋은데, 성적도 마찬가지로 위 학생이 얼마나 학업을 위해 노력했는지 알 수 있다. 

 

대략적으로, 학생A의 수학 점수는 상승하는 것 같고, 학생 B의 수학 점수는 조금씩 하락하는 것 같다. 이럴 때 볼 수 있는 것이 '이동 평균' 이라는 것이다.

 

이동 평균(Moving Average)는 2개 이상의 연속된 데이터 값(입력 값)의 평균을 계속적으로 계산하고 평균하는 방법이다. 

 

이동 평균 = (지난 얼마간의 합계 ) / (이동 평균에서 사용된 데이터의 수)

예를 들어 사용된 데이터의 수를 3이라고 하면

 

 

 

 

위의 식으로 구할 수 있다. 이동평균을 재귀적(recursion)으로 표현하면

 

 

 

 

 

따라서 n개의 데이터를 이용한 이동평균을 재귀적으로 표현한다면 아래와 같다.

 

 

 

 

이 식을 이용하여 위 학생의 이동 평균을 구해보자. n=3으로 정하였다. 즉 3개씩 평균을 낸다는 뜻이다.

 

 

얇은 선이 데이터, 굵은 선이 이동평균이다. 학생 A의 점수는 상승하는 것으로 보이고 학생 B의 점수는 하락하는 것으로 보인다. 이동 평균을 이용하면 보다 최근의 자료를 반영하며 데이터의 경향을 알 수 있는데 이는 노이즈를 제거하는 효과도 있다. 

 

 

 

 

 

 

 

 

 

 

3. 가중 평균(Weighted Average)

대입에서 고등학교 수학 점수를 반영하는데 예를 들어 1학년 20%, 2학년 30%, 3학년 50% 반영한다고 하자. 대학교 입장에서는 1학년 때 보다 3학년 때 수학 잘 하는게 중요하니까 학년이 올라갈 수록 비중을 크게 두었다. 그러면 위 학생의 점수는 어떻게 계산이 될까? 이럴 때 사용하는것이 가중 평균(Weighted Average)이다.

 

가중평균이란, 각 데이터에 중요도, 영향도, 빈도에 따라 가중치(Weight)을 곱하여 구해지는 평균이다.

각 데이터에 부여되는 가중치를 w(i) 라고 하면 가중 평균의 공식은 아래와 같다. 보통 가중치 w(i)의 합을 1이나 100으로 두면 좋다. 

 

 

 

 

 

위 학생의 1학년 20%, 2학년 30%, 3학년 50% 을 반영하여 계산해 보자.

 

단순 평균, 가중 평균 차이는 각각 약 2점, 약 2.6점으로 가중평균에서 점수가 더 차이나는 것 같지만 %으로 환산하면 단순 평균 약 2.6%, 가중 평균 약 0.78%으로 가중평균이 더 적다. 왜냐하면 학생 B의 경우 1학년 때 보다 3학년 때가 성적이 더 좋지 않아 반영이 적게 되었기 때문이다. 

 

 

 

 

 

 

 

 

4. 가중이동평균(Weighted Moving Average)

두 학생의 이동 평균을 구할 때 최근일 수록 더 중요하니까 가중치를 둘 수 없을까? 가중이동평균으로 계산할 수 있다. 

가중이동평균은 가중평균과 이동 평균을 합친 것이다. 단순 가중이동평균을 살펴보자면 가중치를 가장 최근을 n, 두번째를 n-1, ... 1이 될 때까지, 단조적으로 감소시키는 것이다. 표현식은 아래와 같다.

 

 

 

 

이 식을 이용하여 두 학생의 가중이동평균을 구해보겠다. n=3이다.

 

 

굵은 빨간색, 파란색 그래프가 각각 가중이동평균을 표현한 것이다. 이동평균과 큰 차이가 없어 보이지만 최근의 값을 비중을 더 준다는 점에서 조금의 데이터 변화가 보인다.

 

 

 

 

 

 

 

 

5. 지수가중이동평균(Exponentially Weighted Moving Average)

단순 가중이동평균을 구할 때 n=3으로 할 때 가중치를 최근 순서대로 3, 2, 1 순으로 부여했는데 너무 정직하게 가중치가 감소되는 느낌이다. 오래된 자료일 수록 더 극적으로 감소시키고 싶다. 이 때 지수가중이동평균을 사용할 수 있는데 가중치가 최근에서 멀어질 수록 지수 가중적으로(급격하게) 감소시키는 방법이다. 

 

지수가중이동평균은 아래와 같이 표현된다. 여기서 α는 ( 0 < α < 1 )인 값이다.

 

 

 

 

 

예를 들어 α = 0.9로 두었을 때 3번째 까지의 지수가중이동평균은 아래와 같다.

 

 

예시를 볼 수 있듯이 급격하게 감소된다. 데이터 n을 많이 잡을 수록 거의 처음의 데이터는 0에 가깝게 수렴한다는 것이 특징이다.  아래는 α = 0.9 일 때 두 학생의 지수가중이동평균을 구한 것이다. N개의 데이터 묶음이 아닌 점점 감소시키면서 더해야 하므로 재귀 식인 아래의 식이 훨씬 유용하다.

 

 

 

 

 

지수가중이동평균을 이용하면 경향성을 훨씬 눈에 띄게 볼 수 있다. 다른 말로는 어떤 데이터가 급격하게 바뀌는(튀는) 경우가 있더라도 크게 영향을 받지 않는다. 이동평균, 가중이동평균일 때 보다 훨씬 부드럽게 그려지는 것을 알 수 있다. 결과를 보면 A 학생이 B학생보다 성적은 낮아도 상승폭이 크다는 것을 알 수 있다. 발전가능성을 보았을 때 B 학생보다 A 학생에게 더 큰 점수를 줄 수 있다.

 

 

 

지금까지 평균, 이동평균, 가중평균, 가중이동평균, 지수가중이동평균을 순서대로 알아보았는데 이게 딥러닝과 무슨 상관일까? 딥러닝에서 데이터 경향을 알아보는게 굉장히 중요한데 지수가중이동평균이 도움을 줄 수 있다. 그리고 이 개념을 경사하강법에 적용할 것이다. 

 

다음 시간에는 첫 그림에서 나온 1년간의 서울 온도를 이용하여 파이썬으로 본격적 분석을 해 볼 것이다.