11.2 커널 밀도 곡선
다음으로, 커널 밀도 추정함수를 가지고 그린 커널 밀도 곡선(kernel density curve)를 그려보겠습니다.
히스토그램은 빈도를 가지고 그리며, geom_histogram()
함수를 사용하며, 계단식으로 각이 져 있는데요, 커널 밀도 곡선(kernel density curve)은 확률(모두 더하면 1)을 이용하여 그리고, geom_density()
함수를 사용하며, smoothing 된 곡선으로 되어 있습니다.
11.2.1 기본 커널 밀도 곡선
커널 밀도 곡선을 그리는 기본적인 절차는 다음과 같습니다.
ggplot(Cars93, aes(x = Price))
:Cars93
을 데이터 세트로 사용하며,aes( )
함수 안에 x 축에 표시할 변수로Price
를 지정해 줍니다. 이ggplot()
함수로 기본 그래프를 작성하지만 아무런 결과도 표시가 되지 않습니다.+
: 기본 그래프와 다음에 나올 그래프 관련 함수들을 연결해 줍니다.geom_density()
: 기본 그래프를 커널 밀도 곡선 형태로 시각화 해줍니다.
이제 Cars93
데이터 세트에서 가격(Price
) 변수를 커널 밀도 곡선으로 그려 보겠습니다.
library(ggplot2)
library(MASS)
## 기본 커널 밀도 곡선
# 가격 커널 밀도 곡선(Kernel Density Curve)
ggplot(Cars93, aes(x=Price)) + # 그래프의 기본 틀을 설정합니다. 데이터와 X축을 지정합니다.
geom_density() # 커널 밀도 곡선을 그려줍니다.
11.2.2 색의 지정과 곡선 추가하기
이번 절에서는 커널 밀도 곡선의 옵션 설정에 대하여 간단한 예를 들어 살펴보겠습니다. 이를 위해 커널 밀도 곡선을 k1
~ k3
까지의 변수에 치환하겠습니다.
11.2.2.1 곡선의 색과 아랫 부분의 색 지정
다음은 커널 밀도 곡선의 색(colour
)의 지정과 커널 밀도 곡선 아랫 부분을 채워 넣은 색(fill
)을 지정하고, 또한 fill
색의 투명도(alpha
)를 설정한 커널 밀도 곡선이 k1
입니다.
library(MASS)
# 다양한 옵션을 설정한 가격 커널 밀도 곡선(Kernel Density Curve)
<- ggplot(Cars93, aes(x=Price)) +
k1 geom_density(fill = "yellow", # 곡선 밑부분을 "yellow" 색으로 채웁니다.
colour = "red", # 커널 밀도 곡선의 색을 "red"로 표시합니다.
alpha = .2) + # fill 색의 투명도를 20%로 설정합니다.
ggtitle("곡선의 색과 곡선 아래 부분의 색 지정(투명도 포함)") # 그래프의 제목을 지정합니다.
k1
11.2.2.2 geom_line()
함수의 이용
이번에는 geom_density()
함수에서 곡선을 지우고(colour =NA
), geom_line()
함수를 이용한 밀도 함수로 대체해 보겠습니다. 이때, geom_line()
함수의 모수로 stat = “density”
를 설정합니다. 그리고 ggplot()
함수의 결과를 k2
변수에 치환합니다.
<- ggplot(Cars93, aes(x=Price)) +
k2 geom_density(fill = "yellow",
colour = NA, # 커널 밀도 곡선을 지웁니다.
alpha = .5) +
geom_line(stat = "density") + # 커널 밀도 곡선을 추가합니다.
ggtitle("geom_line() 함수의 이용")
k2
11.2.2.3 축 값의 범위 지정
X 축의 차량 가격(Price
)에 대한 확률을 나타내는 Y축의 값의 범위를 설정해 보겠습니다. 이는 expand_limits()
함수를 이용하여 설정할 수 있는데, 앞에서의 커널 밀도 함수를 보면 확률 값이 0.06
을 넘지 않는 것을 알 수 있습니다.
이제 expand_limits()
함수의 인수로 y = c(0, 0.06)
으로 설정해 보고 그래프를 다시 그려 보겠습니다. 그리고 그 결과는 k3
변수에 대입하겠습니다.
<- ggplot(Cars93, aes(x=Price)) +
k3 geom_density(fill = "yellow",
colour = NA,
alpha=.5) +
geom_line(stat = "density") +
expand_limits(y = c(0, 0.06)) + # y 축값의 범위를 지정합니다. 0 ~ 0.06
ggtitle("Y 축 범위의 지정")
k3
# 하나의 페이지에 여러 개의 플롯을 그리기 : multiplot() 함수 이용
multiplot(k1, k2, k3, cols = 1)
참고로 x
축의 값을 40 ~ 60
으로 제한하고자 할 때는 xlim(40, 60)
을 추가해 주면 됩니다.
ggplot(Cars93, aes(x=Price)) +
geom_density(fill = "yellow",
colour = NA,
alpha=.5) +
geom_line(stat = "density") +
expand_limits(y = c(0, 0.06)) +
xlim(40, 60) + # x 축 값의 범위를 지정합니다. 40 ~ 60
ggtitle("X,Y 축 범위의 지정")
## Warning: Removed 91 rows containing non-finite values (stat_density).
## Warning: Removed 91 rows containing non-finite values (stat_density).
11.2.3 stat_density()
함수의 이용
geom_*()
함수들은 기본적인 stat_*()
함수를 가지고 있습니다.5 args(geom_density)
로 확인해 보면 geom_density()
함수는 stat = "density"
를 알고리즘으로 사용하고 있습니다.
geom_density()
함수의 경우에는 stat_density()
함수가 여기에 해당하며, geom_density()
함수 대신에 stat_density()
함수를 이용할 수 있습니다.
## 기본 커널 밀도 곡선
# 가격 커널 밀도 곡선(Kernel Density Curve)
ggplot(Cars93, aes(x=Price)) +
stat_density(colour = "black", fill = NA)
자세한 사항은 ? stat_density()
로 확인하기 바랍니다.
11.2.4 그룹별 커널 밀도 곡선
지금까지의 커널 밀도 곡선은 연속형 데이터인 차량 가격(Price
)을 시각화한 것입니다.
이번 절에서는 이러한 가격(Price
)에 대한 커널 밀도 곡선을 차량의 유형별(Type
) 별로 따로 시각화해 보겠습니다. 이때 차량의 유형 변수 Type
은 요인(factor)형 변수입니다.
그룹별 커널 밀도 곡선도 앞에서의 그룹별 히스토그램과 마찬가지로 aes()
함수, facet_grid()
, 그리고 facet_wrap()
함수를 이용하여 작성할 수 있습니다.
11.2.4.1 aes()
함수의 모수 이용
# 차종(Type)별 가격 커널 밀도 곡선
ggplot(Cars93,
aes(x=Price,
colour = Type)) + # 그룹변수(요인변수)를 colour에 지정해 줍니다.
geom_density(fill = "yellow",
colour = NA,
alpha=.5) +
geom_line(stat = "density") +
expand_limits(y = c(0, 0.06)) +
ggtitle("차종(Type)별 가격 커널 밀도 곡선")
11.2.4.2 facet_grid()
함수 이용
facet_grid()
함수를 이용해서도 그룹별 커널 밀도 곡선을 그릴 수 있습니다.
# 차종(Type)별 가격 커널 밀도 곡선
ggplot(Cars93, aes(x=Price)) +
geom_density(fill = "yellow",
colour = NA,
alpha=.5) +
geom_line(stat = "density") +
expand_limits(y = c(0, 0.06)) +
facet_grid(Type ~ .) + # Type 별로 그래프를 표시해 줍니다.
ggtitle("차종(Type)별 가격 커널 밀도 곡선")
# 차종(Type)별 가격 커널 밀도 곡선
ggplot(Cars93, aes(x=Price)) +
geom_density(fill = "yellow",
colour = NA,
alpha=.5) +
geom_line(stat = "density") +
expand_limits(y = c(0, 0.06)) +
facet_grid(. ~ Type) + # Type 별로 그래프를 표시해 줍니다.
ggtitle("차종(Type)별 가격 커널 밀도 곡선")
11.2.4.3 facet_wrap()
함수 이용
facet_wrap
함수를 이용해서도 그룹별 커널 밀도 곡선을 그릴 수 있습니다.
# 차종(Type)별 가격 커널 밀도 곡선
ggplot(Cars93, aes(x=Price)) +
geom_density(fill = "yellow",
colour = NA,
alpha=.5) +
geom_line(stat = "density") +
expand_limits(y = c(0, 0.06)) +
facet_wrap( ~ Type) + # Type 별로 그래프를 표시해 줍니다.
ggtitle("차종(Type)별 가격 커널 밀도 곡선")
11.2.5 커널 밀도 곡선의 최정점 표시하기
커널 밀도 곡선의 최정점 값(Peak Value)을 구하고 수직선을 추가해 보도록 하겠습니다.
11.2.5.1 최정점 값 구하기
커널 밀도 함수의 최정점이 되는 X와 Y를 구하기 위한 절차는 다음과 같습니다.
- 커널 밀도 함수의 최정점 값을 구합니다. 즉 확률밀도의 최대값을 구합니다. (Y의 최댓값)
- Y의 최댓값이 되는 X 축의 값을 구합니다.
이를 R 스크립트로 구현하면 다음과 같습니다.
## 최정점이 되는 X, Y 값 구하기
# 1) Y값 구하기
<- density(Cars93$Price)
den <- max(den$y)
Y Y
## [1] 0.05
# 2) X값 구하기
<- which.max(den$y)
index.X <- den$x[index.X]
X X
## [1] 16
11.2.5.2 커널 밀도 곡선에 최정점 표시하기
geom_vline() 함수를 이용하여 앞에서 구한 y 피크값의 x 좌표를 입력해주면 커널 밀도 곡선의 최대 피크값 위치에 수직선(vertical line)을 추가할 수 있습니다.
# 커널 밀도 곡선에 최정점 표시하기
ggplot(Cars93, aes(x=Price)) +
geom_density(fill = "yellow",
colour = NA,
alpha=.5) +
geom_line(stat = "density") +
expand_limits(y = c(0, 0.06)) +
ggtitle("커널 밀도 곡선에 최정점 표시하기") +
geom_vline(xintercept = X, # Y값이 최대가 되는 X축의 값을 지정합니다.
color = 'blue', # 수직선의 색을 지정합니다.
size = 1.5, # 수직선의 두께를 지정합니다.
linetype = "dotted") # 수직선의 형탤르 지정합니다.
- 참고 자료 : https://rfriend.tistory.com/485
11.2.6 히스토그램과 커널 밀도 곡선 겹쳐 그리기
히스토그램과 커널 밀도 곡선을 겹쳐서 그려보도록 하겠습니다.
# 히스토그램과 커널 밀도 곡선을 겹쳐서 그리기
ggplot(Cars93, aes(x = Price,
y = ..density..)) + # Y축을 ..density..로 설정합니다.
geom_histogram(binwidth = 5, fill = "blue", colour = "white", alpha = 0.5) +
geom_density(fill = NA, colour = NA, alpha = 0.8) +
geom_line(stat = "density") +
expand_limits(y = c(0, 0.06)) +
ggtitle("히스토그램과 커널 밀도 곡선을 겹쳐서 그리기")
11.2.7 Theme의 사용
히스토그램에서 Theme을 사용하였듯이, 커널 밀도 곡선에서도 Theme을 사용할 수 있습니다. 앞에서 사용한 theme 부분을 그대로 복사해서 붙여 넣으면 앞의 theme을 그대로 사용할 수 있습니다. 다음의 예에서 ggplot2::theme_classic() +
이하 부분은 히스토그램에서 Theme을 사용에서 사용한 부분을 그대로 복사해서 붙여 넣은 내용입니다.
# Theme의 사용
ggplot(Cars93, aes(x = Price,
y = ..density..)) +
geom_histogram(binwidth = 5, fill = "blue", colour = "white", alpha = 0.5) +
geom_density(fill = NA, colour = NA, alpha = 0.8) +
geom_line(stat = "density") +
expand_limits(y = c(0, 0.06)) +
ggtitle("히스토그램과 커널 밀도 곡선을 겹쳐서 그리기") +
::theme_classic() + # 그래프 테마 지정
ggplot2::theme(axis.title.x = element_text(size = 10,
ggplot2face = "italic",
color = "gray",
angle = 0,
vjust = 0.5),
axis.title.y = element_text(size = 10,
face = "bold.italic",
color = "gray",
angle = 0,
vjust = 0.5)) + # X축과 Y축의 서식 스타일 지정
::scale_y_continuous(labels = scales::comma) # Y 값의 천단위에 콤마 표시 ggplot2
연습문제
1. Cars93 데이터 세트에 있는 연속형 변수를 커널 밀도 곡선으로 시각화 하려 합니다.
1-1. MPG.highway
변수에 대한 기본 커널 밀도 곡선을 작성하시오.
ggplot(Cars93, aes(x = MPG.highway)) +
geom_density() +
ggtitle("기본 커널 밀도 곡선 : MPG.highway")
1-2. MPG.highway
변수에 대한 기본 커널 밀도 곡선 아래의 채우기 색은 투명도 0.2의 “yellow”로 하고, 커널 밀도 곡선의 색은 “blue”로 지정하시오.
ggplot(Cars93, aes(x = MPG.highway)) +
geom_density(colour = "blue",
fill = "yellow",
alpha = 0.2) +
ggtitle("기본 커널 밀도 곡선 : MPG.highway")
2. MPG.highway
변수에 대하여 자동차 유형(Type
) 변수를 그룹으로 하여 그룹별 커널 밀도 곡선을 작성하시오.
단,
- 커널 밀도 곡선 아래의 채우기 색은 자동차 유형(
Type
)별로 색을 달리하시오. - 커널 밀도 곡선의 색은 “white”로 지정하시오.
- 그룹별 커널 밀도 곡선은
facet_wrap( , ncol = 3)
함수를 이용하시오.
ggplot(Cars93,
aes(x = MPG.highway,
fill = Type,)) +
geom_density(colour = "white") +
facet_wrap( ~ Type, ncol = 3)
ggtitle("자동차 유형별 MPG.highway 커널 밀도 곡선 : facet_wrap() 함수 이용")
## $title
## [1] "자동차 유형별 MPG.highway 커널 밀도 곡선 : facet_wrap() 함수 이용"
##
## attr(,"class")
## [1] "labels"
3. MPG.highway
변수의 히스토그램과 커널 밀도 곡선을 겹쳐서 작성하시오.
단,
- 구간의 갯수(
bins =
)는 15개로 설정하시오. - 히스토그램의 채우기 색은 투명도 0.5의 “blue,” 테두리 색은 “white”로 지정하시오.
- 커널 밀도 곡선의 채우기 색은 투명도 0.2의 “yellow,” 곡선의 색은 “red”로 지정하시오.
ggplot(Cars93, aes(x = MPG.highway,
y = ..density..)) +
geom_histogram(bins = 15, fill = "blue", colour = "white", alpha = 0.5) +
geom_density(fill = "yellow", colour = "red", alpha = 0.2) +
geom_line(stat = "density") +
ggtitle("히스토그램과 커널 밀도 곡선을 겹쳐서 그리기")
stat_*() 함수에 대한 설명을 참고하기 바랍니다.↩︎