knitr::opts_chunk$set(echo = TRUE)
#library(xtable)
library(magrittr)
library(dlookr)
library(dplyr)
library(kableExtra)

데이터 진단

개괄적 진단

전체 변수의 개괄적 진단

edaData <- get("edaData", .dlookrEnv)

N <- NROW(edaData)

diagn_overview <- diagnose(edaData)

names(diagn_overview) <- c("variables", "type", "missing value(n)",
                           "missing value(%)", "unique value(n)",
                           "unique value(n/N)")

cap <- "개괄적 데이터 품질 진단 목록"

knitr::kable(diagn_overview, digits = 2, caption = cap, format = "html",
             format.args = list(big.mark = ",")) %>% 
  kable_styling(full_width = FALSE, font_size = 15, position = "left") 

결측치 진단

diagn_missing <- diagn_overview %>%
  filter(`missing value(n)` > 0) %>%
  arrange(desc(`missing value(n)`))

if (NROW(diagn_missing) > 0) {
  cap <- "결측치 포함 변수의 목록"

  knitr::kable(diagn_missing, digits = 2, caption = cap, format = "html",
               format.args = list(big.mark = ",")) %>% 
    kable_styling(full_width = FALSE, font_size = 15, position = "left") 

} else {
  cat("\n\n결측치가 포함된 변수가 없습니다.\n\n")
}

유일값 진단(문자형 및 범주형)

diagn_uniq_cat <- diagn_overview %>%
  filter(type %in% c("character", "factor", "ordered")) %>%
  filter(`unique value(n/N)` >= 0.5) %>%
  arrange(desc(`unique value(n/N)`))

if (NROW(diagn_uniq_cat) > 0) {
  cap <- "유일값의 비율이 0.5 이상인 변수 목록"

  knitr::kable(diagn_uniq_cat, digits = 2, caption = cap, format = "html",
               format.args = list(big.mark = ",")) %>% 
    kable_styling(full_width = FALSE, font_size = 15, position = "left") 
} else {
  cat("유일값의 비율이 0.5보다 큰 변수가 없습니다.")
}

유일값 진단(수치형)

diagn_uniq_num <- diagn_overview %>%
  filter(type %in% c("numeric", "integer")) %>%
  filter(`unique value(n/N)` <= 0.1) %>%
  arrange(`unique value(n/N)`)

if (NROW(diagn_uniq_num) > 0) {
  cap <- "유일값의 비율이 0.1 이하인 변수 목록"

  knitr::kable(diagn_uniq_num, digits = 2, caption = cap, format = "html",
               format.args = list(big.mark = ",")) %>% 
    kable_styling(full_width = FALSE, font_size = 15, position = "left") 
} else {
  cat("유일값의 비율이 0.1보다 작은 변수가 없습니다.")
}

데이터 진단 상세

범주형 변수의 진단

diagn_category <- diagnose_category(edaData, top = 10, type = "n")

if (NROW(diagn_category) > 0) {
  names(diagn_category)[5] <- "ratio(%)"

  diagn_category <- diagn_category %>% 
  filter(rank <= 50)

  cap <- "범주형 변수의 상위 10 수준(levels) 목록"

  knitr::kable(diagn_category, digits = 2, caption = cap, format = "html",
               format.args = list(big.mark = ",")) %>% 
    kable_styling(full_width = FALSE, font_size = 15, position = "left") 
} else {
  cat("범주형 변수가 없습니다.")
}

수치형 변수의 진단

diagn_numeric <- diagnose_numeric(edaData)

if (NROW(diagn_numeric) > 0) {
  cap <- "수치형 변수의 진단 목록"

  knitr::kable(diagn_numeric, digits = 2, caption = cap, format = "html",
               format.args = list(big.mark = ",")) %>% 
    kable_styling(full_width = FALSE, font_size = 15, position = "left") 
} else {
  cat("수치형 변수가 없습니다.")
}

수치형 변수의 진단 (zero)

if (NROW(diagn_numeric) > 0) {
  diagn_zero <- diagn_numeric %>%
    filter(zero > 0) %>%
    select(variables, min, median, max, zero) %>%
    mutate(`zero ratio(%)` = zero / N * 100) %>%
    arrange(desc(zero))

  if (NROW(diagn_zero) > 0) {
    cap <- "수치형 변수의 진단 (zero) 목록"

    knitr::kable(diagn_zero, digits = 2, caption = cap, format = "html",
                 format.args = list(big.mark = ",")) %>%
      kable_styling(full_width = FALSE, font_size = 15, position = "left") 
  } else {
    cat("0을 포함한 수치형 변수가 없습니다.")
  }
} else {
  cat("수치형 변수가 없습니다.")    
}

수치형 변수의 진단 (음수)

if (NROW(diagn_numeric) > 0) {
  diagn_minus <- diagn_numeric %>%
    filter(minus > 0) %>%
    select(variables, min, median, max, minus) %>%
    mutate(`minus ratio(%)` = minus / N * 100) %>%
    arrange(desc(minus))

  if (NROW(diagn_minus) > 0) {
    cap <- "수치형 변수의 진단 (음수) 목록"

    knitr::kable(diagn_minus, digits = 2, caption = cap, format = "html",
                 format.args = list(big.mark = ",")) %>% 
      kable_styling(full_width = FALSE, font_size = 15, position = "left") 
  } else {
    cat("음수를 포함한 수치형 변수가 없습니다.")
  }
} else {
  cat("수치형 변수가 없습니다.")    
}

이상치 진단

이상치 개요

수치형 변수의 이상치 진단

if (NROW(diagn_numeric) > 0) {
  diagn_outlier <- diagn_numeric %>%
    filter(outlier > 0) %>%
    select(variables, min, median, max, outlier) %>%
    mutate(`outlier ratio(%)` = outlier / N * 100) %>%
    arrange(desc(outlier))

  if (NROW(diagn_outlier) > 0) {
    cap <- "수치형 변수의 이상치 목록"

    knitr::kable(diagn_outlier, digits = 2, caption = cap, format = "html",
                 format.args = list(big.mark = ",")) %>% 
      kable_styling(full_width = FALSE, font_size = 15, position = "left") 
  } else {
    cat("이상치를 포함한 수치형 변수가 없습니다.")
  }
} else {
  cat("수치형 변수가 없습니다.")    
}

이상치 상세

if (NROW(diagn_numeric) > 0) {
  diagn_outlier2 <- edaData %>%
    diagnose_outlier(diagn_outlier$variables)

  cols <- c("이상치 개수", "이상치 백분율 (%)", "이상치 산술평균",
            "이상치를 포함 산술평균", "이상치 제외 산술평균")

  if (NROW(diagn_outlier2) > 0) {
    variables <- diagn_outlier2 %>%
      select(variables) %>%
      unlist

    for (i in seq(variables)) {
      cap <- sprintf("%s", variables[i])

      cat(sprintf("variable : %s", cap))
      cap_table <- paste0(cap, "의 이상치 정보")

      outlier_df <- data.frame(Measures = cols,
                               Values = as.vector(t(diagn_outlier2[i, -1])))

      knitr::kable(outlier_df, digits = 2, caption = cap_table, format = "html") %>% 
        kable_styling(full_width = FALSE, font_size = 15, position = "left") %>% 
        print()

      plot_outlier(edaData, variables[i])

      cat("<br><hr>\n\n<br>")
    }
  } else {
    cat("이상치를 포함한 수치형 변수가 없습니다.")
  }
} else {
  cat("수치형 변수가 없습니다.")    
}


choonghyunryu/dlookr documentation built on June 11, 2024, 9:12 a.m.