R분석/함수

[R샘플] 내추럴브레이크(Jenks Natural Breaks)

L2R 2023. 1. 19. 17:29
728x90

양적 변수(quantitative variable)를 데이터 분류(data classification)하는 R 코드 샘플입니다.

등간격(Euqal Interval), 등분위(Quantile), 내추럴브레이크(Jenks Natural Breaks) 함수를 다루고 있습니다.

 

데이터 분류 방법에 대한 설명은 아래 링크를 참고하시기 바랍니다.

 

https://lion2ryan.tistory.com/20

 

데이터 분류(data classification) feat. Jenks Natural Breaks

양적 변수(quantitative variable)를 데이터 분류(data classification)하는 방법입니다. 등간격(Euqal Interval), 등분위(Quantile), 내추럴브레이크(Jenks Natural Breaks) 에 대해 알아봅니다. 1~36 사이 임의의 16개 변수

lion2ryan.tistory.com

 

내추럴브레이크 함수(getJenksBreaks)를 사용하기 위해서는 BAMMtools 라이브러리 설치가 필요합니다.

 

library(tidyverse)
library(BAMMtools)

samples = data.frame("value" = c(1,2,2,8,9,10,16,17,22,25,26,28,29,33,34,36))
grade = 4

#등분위(Quantile)
#동일한 비율로 등급 구분
#(예)학생들의 성적을 상위20%까지 A, 20~40%사이는 B학점, ... 으로 분류
quantile_rate = nrow(samples)/grade

df_quantile = data.frame("value"=0, "grade"="")
df_quantile = df_quantile[-1,]
for(i in 1:grade)
{
  tmps = samples$value[((i-1)*quantile_rate+1):(i*quantile_rate)]
  df_quantile = df_quantile %>% add_row(value=tmps, grade=chartr("123456789", "ABCDEFGHI", i))
}
print(df_quantile)

#등간격(Equal Interval)
#동일한 간격으로 등급 구분
#(예)학생들의 성적(0~100점)을 등간격 방법을 이용하여 80점 이상은 A, 60~80점은 B, 40~60점은 C등급, ... 으로 분류
equaliterval_rate = (max(samples)-min(samples))/grade

df_equaliterval = data.frame("value"=0, "grade"="")
df_equaliterval = df_equaliterval[-1,]
for(i in 1:grade)
{
  tmps = (samples %>% filter(value>=((i-1)*equaliterval_rate+min(samples)) & 
                               value<=(i*equaliterval_rate+min(samples))))$value
  df_equaliterval = df_equaliterval %>% add_row(value=tmps, grade=chartr("123456789", "ABCDEFGHI", i))
}
print(df_equaliterval)

#내추럴브레이크
jenks <- getJenksBreaks(samples$value, grade+1, subset = NULL)
jenks[1] = min(samples$value)-1 #첫 인덱스 값은 min 값이므로 min 보다 1작은수부터 범위 정한다.

df_jenks = data.frame("value"=0, "grade"="")
df_jenks = df_jenks[-1,]
for(i in 2:length(jenks))
{
  tmps = (samples %>% filter((value>jenks[i-1]) & (value<=jenks[i])))$value
  df_jenks = df_jenks %>% add_row(value=tmps, grade=chartr("123456789", "ABCDEFGHI", i-1))
}
print(df_jenks)

 

728x90