Shingles & Lattice
library(lattice)
data('BankWages', package='AER')
data(mtcars)
간단하게 조건부 이변수 산점도 그리기
xyplot(x ~ y | g, dat)
- 만약 조건 변수
g
역시 연속형이라면, 그 결과는 다음과 같다.
xyplot(qsec ~ hp | mpg, mtcars)
모든 mpg
값에 대해 qsec ~ hp
의 산점도를 그리고 있어서 그다지 유용하지 않다.
table(mtcars$mpg)
## ## 10.4 13.3 14.3 14.7 15 15.2 15.5 15.8 16.4 17.3 17.8 18.1 18.7 19.2 19.7 21 21.4 21.5 22.8 24.4 26 27.3 30.4 ## 2 1 1 1 1 2 1 1 1 1 1 1 1 2 1 2 2 1 2 1 1 1 2 ## 32.4 33.9 ## 1 1
동수로 구간 나누기
변수 mpg
를 구간별로 나눠서 qsec와 hp의 산점도를 그리고자 한다면
다음과 같이 할 수 있다.
# equal.count(mtcars$mpg, # 구간 변수
# number=3, # 구간 갯수
# overlap=0) # 구간이 겹치는 정도
mpgequal <- equal.count(mtcars$mpg, number=3, overlap=0)
xyplot(qsec ~ hp | mpgequal, mtcars)
세 구간이 설정되었으면, 한 구간 안에는 거의 동일한 갯수의 점이 표시된다.
실제 표시되는 점의 갯수는 mpgequal 변수를 살펴봄으로써 확인 가능하다.
mpgequal
## ## Data: ## [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5 ## [23] 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4 ## ## Intervals: ## min max count ## 1 10.35 16.45 11 ## 2 17.25 21.45 11 ## 3 21.35 33.95 12 ## ## Overlap between adjacent intervals: ## [1] 0 2
mpg
= 10.35-16.45 구간에는 11개의 점이 나타남을 확인할 수 있다. 구간이 겹치는 경우도 있는데 구간2(17.25-21.45)와 구간3(21.35-33.95)는 겹치는 점이 있고, 갯수는 2개이다(Overlap between adjacent intervals).
구간의 갯수를 5개로 늘리고, overlap=
역시 0.2로 늘려보면 다음과 같은 결과를 얻는다.
mpgequal <- equal.count(mtcars$mpg, number=5, overlap=0.2)
xyplot(qsec ~ hp | mpgequal, mtcars)
mpgequal
## ## Data: ## [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5 ## [23] 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4 ## ## Intervals: ## min max count ## 1 10.35 15.25 8 ## 2 15.15 18.15 8 ## 3 17.75 21.05 8 ## 4 20.95 24.45 8 ## 5 22.75 33.95 9 ## ## Overlap between adjacent intervals: ## [1] 2 2 2 3
등구간 구획
구간의 길이를 일정하게 하는 게 더 나은 경우도 있다. 이럴 때 손쉽게 쓸 수 있는 방법은 다음과 같다.
require(dplyr)
mtcars <- mtcars %>% mutate(mpgCut = cut(mpg, breaks=5, include.lowest=TRUE))
xyplot(qsec ~ hp | mpgCut, mtcars)
cut
함수를 쓰면 손쉽게 등구간으로 구획이 가능하다. 이때 include.lowest=TRUE
를 잊지 말자. (include.lowest=FALSE
를 하면 구간이 (b1', b2], (b2,b3], …, (bn-1, bn] 이 되고, include.lowest=TRUE
를 하면 구간이 [b1, b2], (b2, b3], … (bn-1, bn]이 된다. 이때 b1'는 b1보다 조금 작아진다.)
만약 구간 사이에 조금의 overlap
(겹침)이 필요한 경우는 어떻게 해야 할까? 이미 마련되어 있는 함수로는 다소 까다로운 부분이 있어서 다음의 equal.interval()
함수를 만들었다.
equal.interval = function(v, breaks=10, na.rm=FALSE, overlap=0) {
stopifnot(inherits(breaks, 'numeric') &
inherits(v, 'numeric'))
if (length(breaks) == 1) {
int = (max(v, na.rm=na.rm)-min(v, na.rm=na.rm))/breaks
br1 = min(v, na.rm=na.rm) + seq(0,breaks-1)*int - overlap/2*int
br2 = min(v, na.rm=na.rm) + seq(1,breaks)*int + overlap/2*int
return(shingle(v, cbind(br1,br2)))
} else {
br1 = breaks[-length(breaks)]
br2 = breaks[-1]
int = br2 - br1
br2 = br2 + overlap/2*int
br1 = br1 -overlap/2*int
#print(int)
#print(br1)
#print(br2)
return(shingle(v, cbind(br1, br2)))
}
}
구간을 그려보면 다음과 같다.
## Testing
x <- rnorm(1000)
eqi1 = equal.interval(x, breaks=3, overlap=0.1)
eqi2 = equal.interval(x, breaks=c(-1,0,1), overlap=0.1)
plot(eqi1)
plot(eqi2)
이제 실제 데이터에 적용해 보자. 동일한 조건에 overlap=
을 늘려나가니 mpg
에 어느 정도 일정하게 고정했을 때 qsec
와 hp
의 관계 좀 더 뚜렷하게 보이는 듯 하다(?).
mpgInt = equal.interval(mtcars$mpg, breaks = 6, overlap=0.1)
xyplot(qsec ~ hp | mpgInt, mtcars)
mpgInt = equal.interval(mtcars$mpg, breaks = 6, overlap=0.2)
xyplot(qsec ~ hp | mpgInt, mtcars)
mpgInt = equal.interval(mtcars$mpg, breaks = 6, overlap=0.3)
xyplot(qsec ~ hp | mpgInt, mtcars)
Leave a comment