Data Management

자료 입력

income.kor<-read.table("labor_income_kor.txt", header=T, row.names=1)
income.kor
##          percentage.workers percentage.labour.income
## 0-5                    19.1                      1.7
## 5-10                   12.3                      3.6
## 10-20                  22.8                     12.8
## 20-30                  14.4                     13.6
## 30-40                   9.8                     13.0
## 40-60                  12.0                     22.5
## 60-80                   5.4                     14.1
## 80-100                  2.3                      7.8
## 100-200                 1.6                      7.7
## 200-300                 0.1                      1.2
## 300-500                 0.1                      0.8
## 500-1000                0.0                      0.6
## 1000-                   0.0                      0.6
str(income.kor)
## 'data.frame':    13 obs. of  2 variables:
##  $ percentage.workers      : num  19.1 12.3 22.8 14.4 9.8 12 5.4 2.3 1.6 0.1 ...
##  $ percentage.labour.income: num  1.7 3.6 12.8 13.6 13 22.5 14.1 7.8 7.7 1.2 ...

barplot() 을 그리기 위하여 height 를 설정하려면 width를 파악하여야 함. 그러기 위해서 소득 구간을 row.names의 구간으로부터 설정.

income.breaks<-c(0,5,10,20,30,40,60,80,100,200,300,500,1000,2000)

width에 해당하는 각 소득구간의 폭을 계산

income.widths<-diff(income.breaks)
income.widths
##  [1]    5    5   10   10   10   20   20   20  100  100  200  500 1000

각 기둥의 면적이 해당 소득구간의 퍼센티지와 같게 해주려면 각 퍼센티지를 width 로 나눠줘야 함.

height.workers<-income.kor[,1]/income.widths
round(height.workers, digits=3)
##  [1] 3.820 2.460 2.280 1.440 0.980 0.600 0.270 0.115 0.016 0.001 0.000
## [12] 0.000 0.000

아무런 argument 도 설정하지 않고 barplot() 을 그리면

barplot(height.workers, income.widths)

각 bar 의 이름을 row.names에서 가져오면

names.bar<-rownames(income.kor)
names.bar
##  [1] "0-5"      "5-10"     "10-20"    "20-30"    "30-40"    "40-60"   
##  [7] "60-80"    "80-100"   "100-200"  "200-300"  "300-500"  "500-1000"
## [13] "1000-"

bar 의 이름을 넣어 다시 그리되, bar 사이의 공간을 없애면

barplot(height.workers, income.widths, names.arg=names.bar)

실제 인원은 거의 없는 것처럼 보이는 5억원 이상의 구간을 합쳐야 할 필요. 자료를 재구성하면,

income.kor.2<-income.kor[1:11,]
income.kor.2[11,]<-apply(income.kor[11:13,], 2, sum)
income.kor.2
##         percentage.workers percentage.labour.income
## 0-5                   19.1                      1.7
## 5-10                  12.3                      3.6
## 10-20                 22.8                     12.8
## 20-30                 14.4                     13.6
## 30-40                  9.8                     13.0
## 40-60                 12.0                     22.5
## 60-80                  5.4                     14.1
## 80-100                 2.3                      7.8
## 100-200                1.6                      7.7
## 200-300                0.1                      1.2
## 300-500                0.1                      2.0
rownames(income.kor.2)
##  [1] "0-5"     "5-10"    "10-20"   "20-30"   "30-40"   "40-60"   "60-80"  
##  [8] "80-100"  "100-200" "200-300" "300-500"
rownames(income.kor.2)[11]<-"300-  "
income.kor.2
##         percentage.workers percentage.labour.income
## 0-5                   19.1                      1.7
## 5-10                  12.3                      3.6
## 10-20                 22.8                     12.8
## 20-30                 14.4                     13.6
## 30-40                  9.8                     13.0
## 40-60                 12.0                     22.5
## 60-80                  5.4                     14.1
## 80-100                 2.3                      7.8
## 100-200                1.6                      7.7
## 200-300                0.1                      1.2
## 300-                   0.1                      2.0
income.breaks.2<-c(0,5,10,20,30,40,60,80,100,200,300,500)
income.widths.2<-diff(income.breaks.2)
height.workers.2<-income.kor.2[,1]/income.widths.2
names.bar.2<-rownames(income.kor.2)

다시 barplot()을 작동시키되 회색 대신 흰색을 넣고, bar 사이의 공간을 없애면

barplot(height.workers.2, income.widths.2, names.arg=names.bar.2, space=0, col="white")
title(main="Korea Income Earners' Distribution", xlab="Income Class (Million Won)", ylab="% per Million Won")

1억 이상의 구간을 합치기 위하여 자료를 다시 손보면,

income.kor.3<-income.kor.2[1:9,]
income.kor.3[9,]<-apply(income.kor.2[9:11,], 2, sum)
rownames(income.kor.3)[9]<-"100-   "
income.breaks.3<-c(0,5,10,20,30,40,60,80,100,200)
income.widths.3<-diff(income.breaks.3)
height.workers.3<-income.kor.3[,1]/income.widths.3
names.bar.3<-rownames(income.kor.3)

1억 이상의 구간을 합쳐 barplot을 그리면,

barplot(height.workers.3, income.widths.3, names.arg=names.bar.3, space=0, col="white")
title(main="Korea Income Earners' Distribution", xlab="Income Class (Million Won)", ylab="% per Million Won")

같은 방법으로 소득규모에 대하여 세 개의 barplot을 그리려면, 우선 자료를 정리하고.

height.income<-income.kor[,2]/income.widths
height.income.2<-income.kor.2[,2]/income.widths.2
height.income.3<-income.kor.3[,2]/income.widths.3

세 개의 barplot을 연속으로 그리기 위하여 par(mfrow=c(3,1)) 설정

par(mfrow=c(3,1))
barplot(height.income, income.widths, names.arg=names.bar, space=0, col="white")
barplot(height.income.2, income.widths.2, names.arg=names.bar.2, space=0, col="white")
barplot(height.income.3, income.widths.3, names.arg=names.bar.3, space=0, col="white")

par(mfrow=c(1,1))

barplot 보다 누적도표가 분포의 윤곽을 살피는 데 더 낫다는 점을 상기하면, 누적분포를 구하는 일부터 시작하여야 함. 자료로부터 이미 아는 사실이지만, cumsum()함수의 활용겸 확인차 계산해보면

income.kor.cum<-apply(income.kor, 2, cumsum)
income.kor.cum
##          percentage.workers percentage.labour.income
## 0-5                    19.1                      1.7
## 5-10                   31.4                      5.3
## 10-20                  54.2                     18.1
## 20-30                  68.6                     31.7
## 30-40                  78.4                     44.7
## 40-60                  90.4                     67.2
## 60-80                  95.8                     81.3
## 80-100                 98.1                     89.1
## 100-200                99.7                     96.8
## 200-300                99.8                     98.0
## 300-500                99.9                     98.8
## 500-1000               99.9                     99.4
## 1000-                  99.9                    100.0

누적도표를 그리려면 첫 시작은 (0, 0)이어야 함에 유의. 마침 income.breaks 와 맞춰보면 income.kor.cum 의 첫 행을 0으로만 추가해 주면 되는 일임. xlim 을 좁혀가면서 분포 윤곽 파악.

par(mfrow=c(2,2))
plot(x=income.breaks, y=c(0,income.kor.cum[,1]), type="b", ann=F)
title(main="Cumulative Income Earners' Distribution", xlab="Income (Million Won)", ylab="Cumulative % of People")
plot(x=income.breaks, y=c(0,income.kor.cum[,1]), type="b", xlim=c(0,500), ann=F)
title(main="Cumulative Income Earners' Distribution", xlab="Income (Million Won)", ylab="Cumulative % of People")
plot(x=income.breaks, y=c(0,income.kor.cum[,1]), type="b", xlim=c(0,200), ann=F)
title(main="Cumulative Income Earners' Distribution", xlab="Income (Million Won)", ylab="Cumulative % of People")
plot(x=income.breaks, y=c(0,income.kor.cum[,1]), type="b", xlim=c(0,100), ann=F)
title(main="Cumulative Income Earners' Distribution", xlab="Income (Million Won)", ylab="Cumulative % of People")

par(mfrow=c(1,1))

소득 자체의 누적분포에 대해서도 같은 방법으로 그려보면

par(mfrow=c(2,2))
plot(x=income.breaks, y=c(0,income.kor.cum[,2]), type="b", ann=F)
title(main="Cumulative Income Distribution", xlab="Income (Million Won)", ylab="Cumulative % of Income")
plot(x=income.breaks, y=c(0,income.kor.cum[,2]), type="b", xlim=c(0,500), ann=F)
title(main="Cumulative Income Distribution", xlab="Income (Million Won)", ylab="Cumulative % of Income")
plot(x=income.breaks, y=c(0,income.kor.cum[,2]), type="b", xlim=c(0,200), ann=F)
title(main="Cumulative Income Distribution", xlab="Income (Million Won)", ylab="Cumulative % of Income")
plot(x=income.breaks, y=c(0,income.kor.cum[,2]), type="b", xlim=c(0,100), ann=F)
title(main="Cumulative Income Distribution", xlab="Income (Million Won)", ylab="Cumulative % of Income")

par(mfrow=c(1,1))

이제 두 누적분포를 한 장에 살피는 방법을 생각해보자. \(x\) 축을 사람, \(y\) 축을 소득으로 하여 두 점을 이어주면 어떤 결과가 나오는 지 살펴 보자.

people<-c(0, income.kor.cum[,1])
income<-c(0, income.kor.cum[,2])
plot(x=people, y=income, type="b", ann=F, xaxt="n", yaxt="n")
lines(x=0:100, y=0:100, type="l")
axis(side=1, at=people, labels=people)
axis(side=2, at=income, labels=income)
abline(h=c(0,100), lty=2)
abline(v=c(0,100), lty=2)
title(main="Lorenz Curve of Korea Income", xlab="Earners Cumulated", ylab="Income Cumulated")

초승달 부분에 빗금을 치고 싶다면,

plot(x=people, y=income, type="b", ann=F, xaxt="n", yaxt="n")
lines(x=0:100, y=0:100, type="l")
axis(side=1, at=people, labels=people)
axis(side=2, at=income, labels=income)
abline(h=c(0,100), lty=2)
abline(v=c(0,100), lty=2)
title(main="Lorenz Curve of Korea Income", xlab="Earners Cumulated", ylab="Income Cumulated")
polygon(x=c(people, 0), y=c(income,0), density=10, angle=135)

이 곡선의 이름은?