올해로 회사 10년차입니다.
학교 다닐때는 ATmega128을 다루기 위해 C언어와 ASM만 공부했습니다.
로봇 만드는 것과 전혀 상관 없는 (비싼 기계를 고치는) 회사에 입사하고 보니 프로그래밍을 할일이 없더군요.
어린 나이에 입사하고 보니 회사에서 대부분의 분들이 Excel을 주력으로 사용하시고 프로그래밍은 전혀 모르시는 분들이 많았습니다. 저도 뭐 Excel을 잘 모르긴 했지만.. 프로그래밍 했던 그런 경험들이 엑셀을 쉽게 만들어주더라구요.
그래도 그간 제가 해왔던 업무들은 데이터를 정리하는 수준이기 때문에 수치 해석이라던지 하는 분야는 접근하지 않는 반쪽짜리 엑셀 실력이었던거 같습니다. 이번에 좋은 기회를 얻어 순수하게 데이터를 수학적으로, 기술적으로 분석하는 업무를 할 수 있게 되었고, 엑셀로 PCA와 MLR로 데이터를 해석하는 것을 알게되어 복습 및 공유차 포스팅 작성합니다.
(엑셀로 만들어놓은 것은 결국 저만의 Library로 만들 수 있으니 한번쯤은 경험하는 것이 좋다고 생각합니다.)
나무 위키에서 가져온 트와이스 키, 몸무게, 발사이즈 입니다. (20.10.25)
도대체 왜 발사이즈가 있는지는 모르겠습니다만, 그 데이터는 다음과 같습니다.
이름 | 키 | 몸무게 | 발크기 |
나연 | 163 | 50 | 250 |
정연 | 168 | 49 | 230 |
모모 | 163 | 49 | - |
사나 | 163 | 45 | 230 |
지효 | 160 | - | 230 |
미나 | 163 | 46 | - |
다현 | 158 | 47 | 240 |
채영 | 159 | 46 | 235 |
쯔위 | 170 | - | 250 |
모모의 발크기, 지효의 몸무게, 미나의 발크기, 쯔위의 몸무게가 나무위키에 없습니다.
당연히 이것들을 (수학적으로) 알아내야겠죠. 모든 데이터는 비례한다라고 가정합니다.
엑셀로 두 데이터간의 상관관계를 아는 것은 매우 쉽습니다.(그래프를 그려 수식을 표현하면 됨.)
하지만 제가 할 것은 직접 수식을 짜서 만들것이기 때문에 약간의 번거로움이 있더라도 있더라도 따라하시는 것이 좋습니다.
모든 데이터가 있는 멤버만을 추려봅시다.
이름 | 키 | 몸무게 | 발크기 |
나연 | 163 | 50 | 250 |
정연 | 168 | 49 | 230 |
사나 | 163 | 45 | 230 |
다현 | 158 | 47 | 240 |
채영 | 159 | 46 | 235 |
첫번재로 발크기를 알아봅시다. "발크기 = A * 키 + B * 몸무게" 라고 생각할 수 있습니다.
위키백과에 선형 회귀 모델 추정 기법이라는 부분이 있습니다.
link : ko.wikipedia.org/wiki/%EC%84%A0%ED%98%95_%ED%9A%8C%EA%B7%80
여기에 보시면 수식이
임을 알수 있는데, 우리가 차용할 부분은 (X^TX)^-1(X^TY) 부분입니다.
저 행렬수식의 문제점은, 값이 여러개 가지고 있다면(역행렬이 존재하지 않으면) 계산을 할 수 없다는 것입니다.
물론 수식을 계산할 수 없다면, 애초에 계산할 이유가 없기 때문에.. 넘어가도록 하겠습니다.
키와 몸무게를 Transpose 하였습니다. 이렇게 하는 이유는 행렬식 계산하려고 하는건데요.
원래 데이터는 (5, 2) 의 행렬식입니다. Transpose 한 행렬식과 곱하게 된다면 이젠 (2, 5) (5, 2) 이 되서 행렬식을 곱하면 (2, 2)이 될겁니다.
XTX를 구했습니다.
두 행렬을 곱할때는 MMULT라는 함수를 사용하시면 됩니다.
위에서 구한 행렬의 역행렬을 구하도록 하겠습니다.
minverse 함수가 역행렬로 만들어주는 함수 입니다.
동일한 방식으로 XTY를 구하면 됩니다. XT는 구해놨으니 여기에 바로 y를 곱하면 됩니다.
XT가 (2, 5) 이고 Y는 (5,1) 이니 결과값으로 (2, 1)이 나올것으로 예상할 수 있습니다.
값을 전부 구했으니 마지막 수식인 (XTX)^-1(XTY) 를 구하도록 합니다.
그러면 (2, 2) (2, 1) 이므로 (2, 1)이 나오는것을 알 수 있습니다.
A와 B 값을 알았으니 A * 키 + B * 몸무게로 계산하시면 추정 발크기를 얻을 수 있습니다.
하지만 이렇게 하면 0, 0을 지나가는 선을 그어야한다는 식이 되버립니다.
그 방법을 해결하려면 상수를 하나 넣어주면 됩니다. 상수로 1을 넣고 위와같은 절차를 한번 더 진행해보겠습니다.
상수를 넣지 않는 방법 : Y = Ax1 + Bx2
상수를 넣는 방법 : Y = Ax1 + Bx2 + C
두 값의 오차는 큰 차이는 아니지만 수식의 차이가 있는 것을 알 수 있습니다.
이를 토대로 모모와 미나의 발크기는 다음과 같습니다. (간단하게 하기위해 임의로 반올림 처리 했습니다.)
모모 발크기 : 318 + (-1.6*163) + (3.86*49) = 242
미나 발크기 : 318 + (-1.6*163) + (3.86*46) = 230
모모와 미나의 몸무가 차이가 있으니 발크기가 차이가 나나 봅니다. 몸무게도 같은 방식으로 구해보겠습니다.
지효와 쯔위의 몸무게를 구하면 아래와 같습니다.
물론 실제로는 다르겠지만, 다중 선형 회귀 방정식을 사용할때 이렇다는 겁니다.
트와이스의 몸무게와 발크기를 추정하는 수식을 직접 구현해보았습니다.
엑셀로 해서 이렇지 실제로 Python의 numpy 등의 라이브러리를 사용하면 매우 쉽습니다.
많은 분들에게 도움이 됬으면 합니다.