Category: R

  • 수직 histogram 그리기

    수직 histogram 그리기

    산점도와 같은 그래프 옆에 수직 방향으로 density plot이나 histogram을 그리고 싶을 때가 있다. Density plot은 지난번에 언급하였으니 이번에는 histogram을 그리는 방법으로 구글에서 찾아보았다. Histogram은 수직 방향으로 그려주는 옵션이 없기 때문에 이와 유사한 barplot을 이용한 방법이다. dplyr도 배웠으니, ggplot2도 배워야 하나 싶기도 하지만, 일단 기본 기능으로 그려보았다.

    왼쪽 그래프의 우측 margin과 우측 그래프의 좌측 margin을 0으로 두면 볼만하다.

    layout(matrix(data=c(1, 1, 1, 1, 1, 2),  nrow=1, byrow=T))
    
    par(mar=c(5, 4, 4, 0)+ 0.1)
    boxplot(
      데이터
      ,axes = F
    )
    axis(1, at = c(seq(1, 100, 10), 100), c(seq(1, 100, 10), 100))
    axis(2, at = seq(0, 1, 0.2), seq(0, 1, 0.2), las = 1)
    
    par(mar=c(5, 0, 4, 3)+ 0.1)
    barplot(hist(데이터, plot = FALSE, breaks = seq(0, 1, 0.01))$counts, axes = F, space = 0, horiz=TRUE, xlab= "", ylab="")
  • dplyr

    R에서 자료를 추출하거나 다룰 때 subset을 기반으로 사용했다. 자료가 아주 크지 않다면 느린 처리 속도는 무시할 수 있다. 하지만 시대의 흐름인 dplyr로 움직이고 있다. 오전에 프로즌 기다리면서 전에 짜두었고, 현재 진행 중인 연구 코드를 dplyr로 변환하여 보았다. 몇몇 부분은 기존의 코드를 사용할 수 밖에 없었지만, 거의 대부분 변환하였고 실행 속도는 매우 빨라졌다.

    하나 까다로운 부분이 있다면 특정 결과가 1~4개 정도 있는 항목을 순차적으로 정리할 때이다. 나는 top_n()으로 정리하기는 했는데 top_n(4, )로 할 경우 1개 있는 경우도 보이고, 4개 있는 경우도 보이고, 6개 있는 경우는 4개만 보인다. setdiff()를 반복적으로 하는 것으로 일단 해결했다. 이 부분이 subset이 조금 더 편했다.

  • require()

    R을 사용한지 거의 10년이 되어가는데 이제야 library()와 require()를 구별할 수 있게 되었다. 일단 둘 다 패키지를 불러온다는 점에 있어서는 동일하다.

    패키지가 없을 경우 library()는 오류 메세지를 출력한다.

    require()은 True/False로 결과를 반납한다. 패키지가 있으면 패키지가 로딩이 된다. 이를 이용하면 패키지가 없을 때 패키지를 설치하도록 하는 것을 구현할 수 있다. CDM 연구로 다른 사람들 스크립트를 볼 때 이런것도 좀 챙겼으면 더 빨리 알 수 있었을 텐데.

    if (!require('caret')) {install.packages('caret')}
  • doMC 패키지

    내가 분석하는 경우에 다중코어가 지원되는 경우가 거의 없어서 열심히 알아보지 않은 건데, 이번에 기계학습을 돌려보면서 꽤 빨라지는 것을 확인했다. 설정도 딱히 없다.

    registerDoMC 명령어로 사용할 코어수를 설정하고, getDoParWorkers로 사용중인 코어수를 확인한다.

    library(“doMC”)
    registerDoMC(cores = 4)
    getDoParWorkers()

    그런데 여기서 문제가 생길 수도 있다.

    내가 다중 코어를 이용하고자 하는 이유는 caret패키지를 이용해서 예측 모델 선정을 위한 것이다. caret 패키지와 관련된 자료를 검색해 보면 다음의 내용이 있다.

    https://topepo.github.io/caret/model-training-and-tuning.html#the-traincontrol-function

    trainControl과 관련된 것 중에서 allowParallel이 있는데 이게 기본적으로 True로 보인다.
    trainControl function | R Documentation

    설정 충돌인지 꼬인건지는 모르겠는데 registerDoMC(cores = 4) 이렇게 한참 진행하면 갑자기 느려지는 경우가 있다. 4C8H CPU에서 2500%를 찍는 이런 일이 생긴다. registerDoMC(cores = 1)로 설정을 해두어도 670% 정도로 여러 코어를 사용하는 것을 볼 수 있고, 속도가 제대로 나온다.

    학습 모델에 따라서 코어 설정을 변경해 주는 것이 필요할 것 같다.