현대 사회에서 통계는 광범위하게 사용되고 있다.

 

과학자나 수학자 뿐아니라 경영학자와 비즈니스맨 까지 자신의 이론과 주장을 뒷받침하기 위해 사용되는 강력한 무기이다. 통계학이 발달하지 않았다면 세상은 좀 더 무모했을지도 모른다.

 

통계는 확률과 한 쌍이어서 보통 확률과 통계론, 통계와 학률이란 식으로 묶어놨다. 결국 하나만 알아서는 효용이 떨어지니 두개 다 알아야 한다는 말이다.

 

한국도 이제 개발자들이 많아졌는데 IT 수학이라는 개념이 잘 잡히지는 않는 것 같다. 오히려 원래 수학 머리가 있는 사람들이 하는 일이 되가는 부분도 있다. 이것은 우리나라만의 현실은 아니고 전 세계적으로 봤을 때도 수긍이 간다. 특히 인도 사람들은 수학에 특출난 이과들이 많다. 때문에 일치감치 인도의 IT기술자들이 실리콘 밸리에 진출했으며 온라인 상에도 인도인들이 운영하는 수학과 IT기술 강좌가 늘어나고 있다.

 

사실 대부분의 개발에는 수학이 필요없는 것들이 많다. 그러나 새로운 기술을 배워나갈 수록 수학이 필요할 가능성이 높아진다. 소프트웨어의 세계에서 수학과 비슷한 것은 알고리즘이라 불러도 좋을 것 같다. 수학이 어떤 세상의 문제를 설명하고 해결하는 과정을 일반적으로 제시한다면 알고리즘은 그 문제를 실제로 풀고 구현하도록 한다. 수학은 이론적이고 컴퓨터공학은 실전적이다.

 

'구글의 알고리즘이 나를 인도해서...' 라는 말이 컴퓨터 프로그램이 당신이 원하는 것을 찾아내서 당신의 문제를 해결해준다는 것이다. 알고리즘은 수학의 원리로 이루어져 있다. 그러니까 요즘 유행하는 프론트엔드 개발자라도 수학을 언제까지 미룰 수만은 없다. 프론트엔드 조차도 고급의 기술을 사용하기 위해서 최소한의 수학적 지식이 필요하다는 것은 의심의 여지가 없다. 어느 언어나 마찬가지다.

(프로그래밍은 수학이 아니라 블록 쌓기라고 주장하는 사람도 있으나 블록 쌓기도 결국 수학의 일종이다)

 

IT수학이라는 개념이 좀 없으니까 나름의 목표와 기준을 만들 필요가 있다.

 

필자의 개인적 목표는 IT수학은 1차적으로 중학 수학정도를 자유자재로 사용하는 것이다. 그냥 문제만 풀어서는 안되고 그 내용들을 컴퓨터 프로그램에 실제로 구현하는 것을 목표로 한다.

 

누구나 한번은 배웠던 중학수학. 중학수학의 문제는 사람들이 쉽다고 생각하는 것이다. 언제부터 보통의 사람이 현재 중학수학의 지식을 당연시 했었던가? 인류의 조상인 사피엔스가 살았던 30만년동안 수학이란 것은 없었다. 아니 그들은 수학적인 생각을 했을지 모르지만 기록이 남아있지 않다.

 

피타고라스의 정리에 대한 내용은 기원전 수천년전의 이야기로 당시 인류중에서 최고의 현인이 발명한 개념이었다. 중학생이 쉽게 이해할 수 있는게 아닌 것만은 분명하다.

 

잡설이 길었는데 기회가 되면 이런 것들을 더 다뤄보고 싶다.

 

2차적인 목표는 차츰 생각해봐야겠으나 일단 중학 수학의 내용을 소프트웨어에 완벽하게 구현할 정도가 되면 훌륭할 것이다. 수학이 더 이상 머리속에 존재하는게 아닌 컴퓨터에서 돌아가는 것이다.

 

 

* IT수학, 이번 포스팅에서는 기초 통계용어에 대한 내용이다

 

다 알고는 있는 것 이지만 IT수학을 위해 한번 더 들여다 보기로 한다.

 

1. 평균

 

평균은 영어로 average 혹은 mean 이라고 한다. 공식적으로은 이렇다.

 

 

평균 = 집단의 요소들의 합 / 집단의 요소들의 수

 

쪼금 헷갈린다. 그럼 이렇게도 표현된다.

 

분자가 a 1 부터 쭈욱  a n번 까지 있고 다 더한 것을 n 번으로 나눈다.

 

이렇게 일반화가 된다.

가운데는 시그마 표시가 있다. 위의 식과 똑같다.

 

평균은 예를 들어보면 이해가 빠르다. 보통 시험점수를 이야기하는데 그건 식상하니까 연봉을 가지고 평균을 내보겠다.

 

이름 연봉
박대리 3200
김이사 5500
양사장 6200
박실장 4300
왕대표 7200
유회장 9000
최대장 5700

 

일곱 사람 연봉의 평균을 내려면 우선 연봉을 다 더해야 한다.

 

더한 후에 총원 7명으로 나눈다.

 

mean_data = [3200, 5500, 6200, 4300, 7200, 9000, 5700]
sum = 0
number = len(mean_data)

for salary in mean_data:
    sum += salary

print(f"합계 : {sum} 총원: {number} 평균: {int(sum/number)} ")

 

평균은 5,871만원이다.

 

7명이 번 연봉을 다 합치니 4억이 넘었는데 그것을 7명에게 동일한 금액으로 분배하여 주니 5800만원이 되었다. 돈을 적게 버는 박대리는 기뻐할 일이고 많이 버는 유회장의 경우는 난리칠 문제가 된다.

 

1인당 국민 총소득 같은 통계도 같은 원리다. 2019년도에 한국의 1인당 국민 총소득이 32,000달러가 되는데 식으로 보면 국민 총소득에서 총인구를 나누었다.

 

여기서 가상으로 한 통계는 7명만 대상으로 한 것이지만 국가가 조사한 것은 수천만명의 데이터를 바탕으로 한 것이므로 더 신뢰성이 높다.

 

kosis.kr/statHtml/statHtml.do?orgId=101&tblId=DT_2KAA902 국민 총소득 국가별

 

KOSIS

 

kosis.kr

물론 소득의 평균을 낸다고 하더라도 많이 번 사람이 있고 못번 사람이ㅠ 있다. 많이 번 사람이 못번 사람에게 돈을 줘야하는 이유는 당연히 없다. 통계에는 어떤 의도가 없다. 그냥 100명을 데려다 놓고 통계를 내보니까 이런 숫자가 나왔다는 것이다.

 

그럼 이렇게 사람마다 차이가 있는데 모든 사람들을 모아서 하나로 퉁 친다는 것은 좀 한계가 있다. 개별적 사람에 대한 의미를 얻고 싶다면 무엇을 하겠는가? 

편차

이때 필요한 정보가 편차이다. 편차는 개별 값들이 평균과 얼마나 떨어져 있는지 말한다.

 

우리의 평균이 5871만원(소수점은 제외한다)이므로

 

이름 연봉 편차
박대리 3200 -2671
김이사 5500 -371
양사장 6200 329
박실장 4300 -1571
왕대표 7200 1320
유회장 9000 3129
최대장 5700 -171
합계 41100 0

 

마이너스인 편차는 평균보다 작다는 것이다. 평균을 기점으로 잘나가는 사람과 못나가는 사람이 가려진다. (소득만 가지고 판단하면)

 

흥미로운 것은 편차를 모두 더하면 0이 된다는 것이다. 위에서는 소수점 아래를 잘랐기 때문에 약간의 오차가 존재한다. 편차를 모두 더해서 0이 된다는 것은 평균이 제대로 구해졌다는 말이기도 하다.

 

mean_data = [3200, 5500, 6200, 4300, 7200, 9000, 5700]
sum = 0
number = len(mean_data)

for salary in mean_data:
    sum += salary

mean = int(sum/number)

print(f"합계 : {sum} 총원: {number} 평균: {mean} ")

deviation = []

for salary in mean_data:
    data = salary - mean
    deviation.append(data)
print('\n# ----- 편차 출력 ----- #\n')
print(deviation)

 

이제 편차들의 평균을 구해보고 싶은데 이들을 모두 더해봤자 0이 되서 의미있는 값을 만들 수가 없다. 편차가 보여주는 것은 개별적으로 평균에서 얼마나 떨어져 있는가밖에 알수가 없다. 그것도 적은 수는 알아보기 쉽지만 데이터가 조금만 늘어나도 의미가 없다. 결국 상징적인 값을 찾기 위해서 다음 단계인 분산을 구해야 한다.

 

분산

 

분산(variance)편차 제곱(squared deviations)의 평균값(mean value)이다.

 

편차를 제곱후에 모두 더한 후 다시 총원으로 나누면 평균값이 된다.

 

소스코드는 이전 코드에서 이어진다.

import math

variance_data = []
sum = 0

for value in deviation:
    data = math.pow((value), 2)
    variance_data.append(data)

print('\n# ----- 편차 제곱 ----- #\n')
print(variance_data)

for value in variance_data:
    sum += value

variance = sum/len(variance_data)
print(f'분산: {int(variance)}')

 

편차가 1000단위면 제곱하면 100만 단위가 된다. 분산은 306만이다. 값이 커지긴 했지만 정확도는 높아진 느낌이다.

 

그런데 원 데이터가 4000, 3000 등 천단위였다. 분산의 단위를 예전 단위로 바꾸면 좀 더 원래 숫자와 비교가 쉬울 것 같다. 분산에 루트를 사용하면 표준편차 Standard Deviation 가 된다.

 

표준편차

마지막은 표준편차는 아래와 같다.

standard_deviation = math.sqrt(variance)
print(f'표준편차: {int(standard_deviation)}')

1749만원이다. 그러니까 여기 7명의 데이터들은 연봉차이가 좀 심한 편이다.

 

박대리가 3200 받는데 유회장이  9000 받으니까 개별적으로는 6000만원이나 되는 큰 차이도 있다. 이 둘의 평균이었다면 6000 정도였을 것이니 표준편차가 더 벌어졌을 것이다. 한 집단에서 사람마다 버는 금액이 큰 차이가 나는 것은 표준편차의 차이로 설명할 수 있다. 그게 왜 차이가 나는지 까지는 설명할 수 없겠지만 적어도 얼마나 차이가 나는 것인지에 대한 좀더 정확한 인사이트를 줄 수 있을 것이다.

 

공유하기

facebook twitter kakaoTalk kakaostory naver band