brunch

You can make anything
by writing

C.S.Lewis

by 첨물 Mar 13. 2017

R 프로그램으로 불평등의 원인을 찾다

박근혜 대통령 탄핵 결정이 헌법재판소에서 인용되었다.

20여 분간 이정미 재판관의 판결 내용을 들으면서 가슴을 졸였고

마지막엔 눈물이 약간 맺혔다.

무엇일까? 이 기분...


그리고 생각했다.

뇌물죄, 돈, 자본주의...

수많은 사람들이 한정된 부를 나누어 가질 때 어떻게 나누어가져야 '공평'할까? 또는 '자연스러울까?'

그리고 '공평'함과 '자연스러움'은 항상 동일할까?

전자는 인간의 이성에 의해 '이렇게 되어야 좀 더 맞지'라는 도적적 판단이 들어가는 것에 반해

후자는 인간의 이성과 상관없이 '자연' 상태가 어떻게 존재하지?라는 관점이다.


갈릴레이가 여러 가지 증거를 가지고 '지구가 태양을 돈다'라고 말했을 때

당시 사람들은 그 주장이 직관적으로 이해가 되지 않았다.

당시 사회가 종교 사회였기 때문에 더 '신'의 이름으로 그 주장은 '맞지 않다.'라고 배척했다.

그러나 인간의 이성적 판단과 상관없이 '자연'은 나름의 규칙을 가지고 존재한다.

그리고 한참 후 인간은 '아... 지구가 도는 것이 맞는구나'하고 깨닫는다.


20세기 초 양자역학이 등장했을 때, 사물이 확률적으로 존재한다는 주장은 반직관적이었다.

아인쉬타인은 죽을 때까지 '신은 주사위 놀이를 하지 않는다.'라는 문장으로 '확률 분포 함수'로 사물의 존재를 설명하는 것에 의구심을 가졌다. 그러나 보어가 '신이 무슨 생각을 하든 말든 상관 말게' 하며 양자역학을 주장했고 결국 '벨의 부등식'을 통해 아인쉬타인이 틀렸음이 증명되었다. 그 이후 100년이란 시간이 지났지만 여전히 양자역학을 처음 접하는 물리학도는 그 반직관적임에 저항감을 가진다. 그러나 자연은 그것이 '자연스럽다'는 것을 계속 이야기하며 실험 결과로 자신을 보여준다.




빅데이터의 유행으로 'R 프로그램'을 배우고 있다.

그리고 몇 년 전에 읽었던 야노 가즈오의 '데이터의 보이지 않는 손'이란 책이 떠 올랐다.

애덤 스미스의 '보이지 않는 손'을 의식하며 작가는 썼으리라...

통계에서 보이는 '보이지 않는 손'이 무엇일까?

그는 간단한 실험을 이용하여 이를 설명하고자 했다.

아래와 같이 20x20 바둑판이 있다고 하자. 여기에 작은 구슬 7만 2천 개를 뿌린다고 하자. 그것도 무작위로...

그러면 아래 왼쪽 그림과 같이 한 칸에 들어가 있는 구슬수가 정규분포를 따른다.

그리고 재밌는 실험을 했다. 즉, 한 칸 한 칸씩 돌아가면서 자신이 가지고 있는 구슬을 앞/뒤/좌/우 중 한 개를 골라서 구슬을 준다. 이렇게 '공평한 교환 법칙'을 이용하여 구슬을 이동시키면서 전체적인 구슬 분포 곡선을 보게 되면 어떻게 될까? 작가는 아래 우측처럼 U분포가 된다고 한다. 즉 한 칸에 구슬이 아주 많은 곳도 있고, 전혀 구슬이 없는 칸도 있게 된다. '불공평'이 가중되는 것이다.


생각해보자. 한 칸 한 칸을 사람이라고 생각하고 여기에 한정된 자원을 '신'이 처음 배분을 한다.

 어떻게 배분을 해야 공평할까? 아니 자연스러울까?

랜덤, 무작위로 주었을 때 정규분포를 따르며 자원을 배분을 받는다고 할 때 이것이 불공평할까? 모두 같은 구슬을 가지고 있어야 공평할까? 궁금해서 직접 만들어보았다. 오픈 소스 프로그램... R




10 x 10 , 총 100명이 있다고 하자, 그리고 여기에 1000개의 구슬을 나누어준다.


1) 정규 분포 곡선을 따르도록 무작위로 자원을 배분한다. 가지고 있는 구슬의 수로 원의 크기를 표현했다.


그리고 '공평한 교환 규칙'을 적용했다. 즉 첫 번째 칸부터 상/하/좌/우 중 하나를 선택해서 구슬을 준다. 그리고 만약 가장 위쪽 칸이 위쪽으로 구슬을 준다고 하면 가장 아래 칸으로 구슬이 움직이도록 하여, 모두 '공평'하도록 했다. 그리고 첫 칸부터 마지막까지 이 교환을 한 것을 100번을 반복했다. 어떻게 되었을까?

결과는 아래와 같이 불공평하게 되었다. 즉 아주 많이 가진 자가 생겨나고 구슬이 없는 자도 생겨났다.


2) 처음 정규분포를 가지도록 구슬을 나누어 준 것이 영 꺼림칙했다. 이 초기 조건의 '불공평'이 최종 결과를 야기한 것이 아닐까 해서 처음에 모두 같은 수의 구슬을 가지도록 했다. 그리고 똑같이 100번의 교환을 했다.

결과는 어떻게 되었을 까?

결과는 '불공평'하게 구슬을 가지는 분포가 되었다.


자세히 보면 모두 같은 구슬을 가지고 있는 실험에서 교환이 시작되면 잠시 후 '정규 분포'의 형태를 띠다가 결국 U분포 형태가 되어버린다. 교환 횟수가 증가할수록 이 '불공평'은 더 심해진다.

아래는 처음 10개씩 나누어 가진 100명의 사람들이 자신의 주변으로 '공평한 구슬 교환하기'를 1000번 한 결과이다.

구슬 50개를 가진 자들이 2~3명 존재하고 구슬을 가지지 못한 자가 30까지 늘어난다.

무엇이 이들을 불공평하게 만들었을까? 아니면 자연은 이렇게 가는 것이 '자연스러운' 것일까? 인간이 단지 '공평', '불공평'이란 도적적 잣대를 임의로 만든 것이 아닐까?

야노 가즈오 교수는 '데이터의 보이지 않는 손' 때문이라고 한다.  수학으로만 존재하는 정규 분포가 실제 자연 세계에서는 좀처럼 발견하기 힘들고 오히려 U분포가 쉽게 관찰된다고... 심지어 인간이 1분당 팔을 흔드는 개수를 히스토그램으로 그려도 이 U분포를 띈다고 하면서...




동료의 도움으로 코딩의 콘셉트를 잡았고 R이란 강력한 도구를 이용하여 이를 구현해보았다.  아주 단순한 모델을 일단 따라 해 본 것이지만 이를 통해 사회 현상까지 생각해볼 수 있는 기회를 가지게 되어 즐거웠다.

그러나 여전히 풀리지 않는 이 모델의 숨겨진 '손'이 궁금했다.


코드가 궁금하시다는 분이 있어서... 첨부합니다.

 


## ggplot2 로드하기 ###

install.packages(“ggplot2”)

library(ggplot2)

## 1~10까지 random 숫자를 x 좌표 1000개, y좌표 1000개를 뽑아서 a1, a2에 넣기 ####

a1<-round(runif(1000)*9)+1

a2<-round(runif(1000)*9)+1

## 각 칸에 골고루 구슬을 10개씩 배치하기 ##

#a1<-rep(c(1:10),100)

#a2<-rep(1:10,each=100)

##a1, a2를 각각 x,y 좌표로 해서 matrix로 만들어서 m에 넣기 ####

m<-data.frame(cbind(a1,a2))

## x, y에 각각 몇개씩의 구슬이 들어있는지 y로 구하고 이것을 data.frame으로 만들어서 z에 넣기 ####

y<-table(m$a1,m$a2)

z<-data.frame(y)

## 구슬의 개수만큼 원의 사이즈를 비례하게 만들어서 x,y matrix에 표시하기 ####

ggplot(z,aes(x=Var1,y=Var2,fill=z$Freq))+geom_point(colour="grey",shape=21,size=z$Freq)+ xlab('x')+ylab('y')+ggtitle('구슬 분포')+labs(fill='구슬수')

## 구슬의 개수 히스토그램 그리기 ####

hist(y,main="구슬 옮기기", ylim=c(0,30), xlab="구슬 갯수", ylab="빈도수",col="#80fd3d", breaks=seq(0, 30, 2))

## 한칸씩 욺직이며 구슬 옮기기, 옮기는 횟수를 100번하기 ###

for (l in c(1:100)){

for (i in c(1:10)){

 for (j in c(1:10)) { 

## 구슬을 1개 이상일 때만 옮기기 ##

 if (y[i,j]>0){ 

### 옮기는 구슬의 개수 정하기 t ###

   t<-1

### 구슬을 옮길 때 상/하/좌/우 네가지 경우의 수를 임의로 정하기 k ###

     k<-(round(runif(1)*9)+1)%%4

## 옮기는 칸의 구슬은 t만큼 수를 줄이기

     y[i,j]<-y[i,j]-t    

## k=0 이면 왼쪽으로 구슬 t개를 주기 ##

    if(k==0){

      if(i==1){

            y[i+9,j]=y[i+9,j]+t }

            else {

            y[i-1,j] = y[i-1,j] + t

            }

      }

## k=1 이면 오른쪽으로 구슬 t개를 주기 ##

    else if(k==1){

       if(i==10){

            y[i-9,j]=y[i-9,j]+t }

            else {

            y[i+1,j] = y[i+1,j] + t

            }

      }

## k=2 이면 윗쪽으로 구슬 t개를 주기 ##

    else if(k==2){

       if(j==1){

            y[i,j+9]=y[i,j+9]+t }

            else {

            y[i,j-1] = y[i,j-1] + t

            }

      }

## k=3 이면 아래쪽으로 구슬 t개를 주기 ##

    else if(k==3){

       if(j==10){

            y[i,j-9]=y[i,j-9]+t }

            else {

            y[i,j+1] = y[i,j+1] + t

            }

      }

  }

}

}

## 구슬의 개수 히스토그램 그리기 ####

hist(y,main="구슬 옮기기", ylim=c(0,30), xlab="구슬 갯수", ylab="빈도수",col="#80fd3d", breaks=seq(0, 50, 2)) 

## 히스토그램 변화를 보기 위하여 지연 시간 0.1초씩 주기 ###

 Sys.sleep(0.1) 

}

## 최종 결과 보여주기  히스토그램 ##

hist(y,main="구슬 옮기기", ylim=c(0,30), xlab="구슬 갯수", ylab="빈도수",col="#80fd3d", breaks=seq(0, 50, 2))

## 구슬의 개수만큼 원의 사이즈를 비례하게 만들어서 x,y matrix에 표시하기 ####

z<-data.frame(y)

ggplot(z,aes(x=Var1,y=Var2,fill=z$Freq))+geom_point(colour="grey",shape=21,size=z$Freq)+ xlab('x')+ylab('y')+ggtitle('구슬 분포')+labs(fill='구슬수')

## 정규성 검사하기 ##

shapiro.test(y)



매거진의 이전글 2017년 마이크로비트 첫 모임
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari