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()                          # 커널 밀도 곡선을 그려줍니다.
가격 커널 밀도 곡선

Figure 11.15: 가격 커널 밀도 곡선

Go Top

11.2.2 색의 지정과 곡선 추가하기

이번 절에서는 커널 밀도 곡선의 옵션 설정에 대하여 간단한 예를 들어 살펴보겠습니다. 이를 위해 커널 밀도 곡선을 k1 ~ k3 까지의 변수에 치환하겠습니다.

11.2.2.1 곡선의 색과 아랫 부분의 색 지정

다음은 커널 밀도 곡선의 색(colour)의 지정과 커널 밀도 곡선 아랫 부분을 채워 넣은 색(fill)을 지정하고, 또한 fill 색의 투명도(alpha)를 설정한 커널 밀도 곡선이 k1입니다.

library(MASS)

# 다양한 옵션을 설정한 가격 커널 밀도 곡선(Kernel Density Curve) 
k1 <- ggplot(Cars93, aes(x=Price)) +           
        geom_density(fill = "yellow",          # 곡선 밑부분을 "yellow" 색으로 채웁니다.
                     colour = "red",           # 커널 밀도 곡선의 색을 "red"로 표시합니다.
                     alpha = .2)  +            # fill 색의 투명도를 20%로 설정합니다.
        ggtitle("곡선의 색과 곡선 아래 부분의 색 지정(투명도 포함)")        # 그래프의 제목을 지정합니다.
k1
가격 커널 밀도 곡선 : 선과 면 색 지정

Figure 11.16: 가격 커널 밀도 곡선 : 선과 면 색 지정

11.2.2.2 geom_line() 함수의 이용

이번에는 geom_density() 함수에서 곡선을 지우고(colour =NA), geom_line() 함수를 이용한 밀도 함수로 대체해 보겠습니다. 이때, geom_line() 함수의 모수로 stat = “density”를 설정합니다. 그리고 ggplot() 함수의 결과를 k2 변수에 치환합니다.

k2 <- ggplot(Cars93, aes(x=Price)) +           
        geom_density(fill = "yellow",          
                     colour = NA,              # 커널 밀도 곡선을 지웁니다.
                     alpha = .5)  +            
        geom_line(stat = "density") +          # 커널 밀도 곡선을 추가합니다.
        ggtitle("geom_line() 함수의 이용")      
k2
가격 커널 밀도 곡선 : geom_line() 함수 이용

Figure 11.17: 가격 커널 밀도 곡선 : geom_line() 함수 이용

11.2.2.3 축 값의 범위 지정

X 축의 차량 가격(Price)에 대한 확률을 나타내는 Y축의 값의 범위를 설정해 보겠습니다. 이는 expand_limits() 함수를 이용하여 설정할 수 있는데, 앞에서의 커널 밀도 함수를 보면 확률 값이 0.06을 넘지 않는 것을 알 수 있습니다.

이제 expand_limits() 함수의 인수로 y = c(0, 0.06)으로 설정해 보고 그래프를 다시 그려 보겠습니다. 그리고 그 결과는 k3변수에 대입하겠습니다.

k3 <- ggplot(Cars93, aes(x=Price)) +          
        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
옵션을 설정한 다양한 커널 밀도 곡선

Figure 11.18: 옵션을 설정한 다양한 커널 밀도 곡선

# 하나의 페이지에 여러 개의 플롯을 그리기 : multiplot() 함수 이용
multiplot(k1, k2, k3, cols = 1)                
옵션을 설정한 다양한 커널 밀도 곡선

Figure 11.19: 옵션을 설정한 다양한 커널 밀도 곡선

참고로 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).
커널 밀도 곡선 : X축과 Y축의 값 범위 지정

Figure 11.20: 커널 밀도 곡선 : X축과 Y축의 값 범위 지정

Go Top

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() 함수 이용

Figure 11.21: 가격 커널 밀도 곡선 : stat_density() 함수 이용

자세한 사항은 ? 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)별 가격 커널 밀도 곡선")
차종별 가격 커널 밀도 곡선

Figure 11.22: 차종별 가격 커널 밀도 곡선

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)별 가격 커널 밀도 곡선")
차종별 가격 커널 밀도 곡선 : facet_grid()

Figure 11.23: 차종별 가격 커널 밀도 곡선 : 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)별 가격 커널 밀도 곡선")
차종별 가격 커널 밀도 곡선 : facet_grid()

Figure 11.24: 차종별 가격 커널 밀도 곡선 : facet_grid()

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)별 가격 커널 밀도 곡선")
차종별 가격 커널 밀도 곡선 : facet_wrap()

Figure 11.25: 차종별 가격 커널 밀도 곡선 : facet_wrap()

Go Top

11.2.5 커널 밀도 곡선의 최정점 표시하기

커널 밀도 곡선의 최정점 값(Peak Value)을 구하고 수직선을 추가해 보도록 하겠습니다.

11.2.5.1 최정점 값 구하기

커널 밀도 함수의 최정점이 되는 X와 Y를 구하기 위한 절차는 다음과 같습니다.

  1. 커널 밀도 함수의 최정점 값을 구합니다. 즉 확률밀도의 최대값을 구합니다. (Y의 최댓값)
  2. Y의 최댓값이 되는 X 축의 값을 구합니다.

이를 R 스크립트로 구현하면 다음과 같습니다.

## 최정점이 되는 X, Y 값 구하기
# 1) Y값 구하기
den <- density(Cars93$Price)
Y <- max(den$y)
Y
## [1] 0.05
# 2) X값 구하기
index.X <- which.max(den$y)
X <- den$x[index.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")                # 수직선의 형탤르 지정합니다.
커널 밀도 곡선의 점점에 수직선 표시하기

Figure 11.26: 커널 밀도 곡선의 점점에 수직선 표시하기

Go Top

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("히스토그램과 커널 밀도 곡선을 겹쳐서 그리기")
히스토그램과 커널 밀도 곡선 겹쳐 그리기

Figure 11.27: 히스토그램과 커널 밀도 곡선 겹쳐 그리기

Go Top

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("히스토그램과 커널 밀도 곡선을 겹쳐서 그리기") +
ggplot2::theme_classic() +                                         # 그래프 테마 지정
  ggplot2::theme(axis.title.x = element_text(size  = 10, 
                                             face  = "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축의 서식 스타일 지정
  ggplot2::scale_y_continuous(labels = scales::comma)              # Y 값의 천단위에 콤마 표시
히스토그램과 커널 밀도 곡선 겹쳐 그리기 : Theme의 사용

Figure 11.28: 히스토그램과 커널 밀도 곡선 겹쳐 그리기 : Theme의 사용

Go Top

연습문제

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("히스토그램과 커널 밀도 곡선을 겹쳐서 그리기")

Go Top


  1. stat_*() 함수에 대한 설명을 참고하기 바랍니다.↩︎