% !Rnw root = DataQuality_Report_KR.Rnw
<<environment, echo=FALSE, warning=FALSE, message=FALSE>>=
options(warn = -1)

library(dlookr)
library(magrittr)
library(dplyr)
library(knitr)
library(kableExtra)

opts_chunk$set(fig.path = 'figure/minimal-', fig.align = 'center',
               fig.show = 'hold', warning = FALSE, message = FALSE)
options(replace.assign = TRUE, width = 90)

change_under <- function(x) {
  gsub("_", "\\\\_", x)
}

options(knitr.table.format = "latex")
digit <- 3

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

N <- nrow(edaData)
@

\chapter{데이터 진단}
\section{개괄적 진단}
\subsection{전체 변수의 개괄적 진단}
<<overview, echo=FALSE, results='asis'>>=
diagn_overview <- diagnose(edaData)

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

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

kable(diagn_overview, booktabs = TRUE,
      caption = cap, digits = digit, longtable = TRUE,
      format.args = list(big.mark = ",")) %>%
  kable_styling(latex_options = c("striped", "scale_down")) %>%
  kable_styling(latex_options = c("hold_position")) %>%
  kable_styling(latex_options = c("repeat_header")) %>%
  cat()
@

\subsection{결측치 진단}
<<missing_data, echo=FALSE, results='asis'>>=

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

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

  kable(diagn_missing, booktabs = TRUE,
      caption = cap, digits = digit, longtable = TRUE,
      format.args = list(big.mark = ",")) %>%
    kable_styling(latex_options = c("striped", "scale_down")) %>%
    kable_styling(latex_options = c("hold_position")) %>%
    kable_styling(latex_options = c("repeat_header")) %>%
    cat()
} else {
  cat("\n\n결측치가 포함된 변수가 없습니다.\n\n")
}
@

%\clearpage

\subsection{유일값 진단(문자형 및 범주형)}
<<unique_date_category, echo=FALSE, results='asis'>>=

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


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

  kable(diagn_uniq_cat, booktabs = TRUE,
        caption = cap, digits = digit, longtable = TRUE,
        format.args = list(big.mark = ",")) %>%
    kable_styling(latex_options = c("striped", "scale_down")) %>%
    kable_styling(latex_options = c("hold_position")) %>%
    kable_styling(latex_options = c("repeat_header")) %>%
    cat()
} else {
  cat("\n\n유일값의 비율이 0.5보다 큰 변수가 없습니다.\n\n")
}
@

%\clearpage

\subsection{유일값 진단(수치형)}
<<unique_data_numeric, echo=FALSE, results='asis'>>=

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

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

  kable(diagn_uniq_num, booktabs = TRUE,
        caption = cap, digits = digit, longtable = TRUE,
        format.args = list(big.mark = ",")) %>%
    kable_styling(latex_options = c("striped", "scale_down")) %>%
    kable_styling(latex_options = c("hold_position")) %>%
    kable_styling(latex_options = c("repeat_header")) %>%
    cat()
} else {
  cat("\n\n유일값의 비율이 0.1보다 작은 변수가 없습니다.\n\n")
}
@

%\clearpage

\section{데이터 진단 상세}
\subsection{범주형 변수의 진단}
<<diagnose_catagory, echo=FALSE, results='asis'>>=
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) 목록"

  kable(diagn_category, booktabs = TRUE,
        caption = cap, digits = digit, longtable = TRUE,
        format.args = list(big.mark = ",")) %>%
    kable_styling(latex_options = c("striped", "scale_down")) %>%
    kable_styling(latex_options = c("hold_position")) %>%
    kable_styling(latex_options = c("repeat_header")) %>%
    cat()
} else {
  cat("\n\n범주형 변수가 없습니다.\n\n")
}
@

\subsection{수치형 변수의 진단}
<<diagnose_numeric, echo=FALSE, results='asis'>>=
diagn_numeric <- diagnose_numeric(edaData)

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

  kable(diagn_numeric, booktabs = TRUE,
        caption = cap, digits = 4, longtable = TRUE,
        format.args = list(big.mark = ",")) %>%
    kable_styling(latex_options = c("striped", "scale_down")) %>%
    kable_styling(latex_options = c("hold_position")) %>%
    kable_styling(latex_options = c("repeat_header")) %>%
    landscape() %>%
    cat()
} else {
  cat("\n\n수치형 변수가 없습니다.\n\n")
}
@

%\clearpage

\subsection{수치형 변수의 진단 (zero)}
<<numeric_zero, echo=FALSE, results='asis'>>=
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) 목록"

    kable(diagn_zero, booktabs = TRUE,
          caption = cap, digits = digit, longtable = TRUE,
          format.args = list(big.mark = ",")) %>%
      kable_styling(latex_options = c("striped", "scale_down")) %>%
      kable_styling(latex_options = c("hold_position")) %>%
      kable_styling(latex_options = c("repeat_header")) %>%
      cat()
  } else {
      cat("\n\n0을 포함한 수치형 변수가 없습니다.\n\n")
  }
} else {
  cat("\n\n수치형 변수가 없습니다.\n\n")  
} 
@

%\clearpage

\subsection{수치형 변수의 진단 (음수)}
<<numeric_minus, echo=FALSE, results='asis'>>=
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 <- "수치형 변수의 진단 (음수) 목록"

    kable(diagn_minus, booktabs = TRUE,
          caption = cap, digits = digit, longtable = TRUE,
          format.args = list(big.mark = ",")) %>%
      kable_styling(latex_options = c("striped", "scale_down")) %>%
      kable_styling(latex_options = c("hold_position")) %>%
      kable_styling(latex_options = c("repeat_header")) %>%
      cat()
  } else {
    cat("\n\n음수를 포함한 수치형 변수가 없습니다.\n\n")
  }
} else {
  cat("\n\n수치형 변수가 없습니다.\n\n")  
} 
@

%\clearpage

\chapter{이상치 진단}
\section{이상치 개요}
\subsection{수치형 변수의 이상치 진단}
<<outliers, echo=FALSE, results='asis'>>=
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 <- "수치형 변수의 이상치 목록"

    kable(diagn_outlier, booktabs = TRUE,
          caption = cap, digits = digit, longtable = TRUE,
          format.args = list(big.mark = ",")) %>%
      kable_styling(latex_options = c("striped", "scale_down")) %>%
      kable_styling(latex_options = c("hold_position")) %>%
      kable_styling(latex_options = c("repeat_header")) %>%
      cat()
  } else {
    cat("\n\n이상치를 포함한 수치형 변수가 없습니다.\n\n")
  }
} else {
  cat("\n\n수치형 변수가 없습니다.\n\n")    
}
@

\clearpage

\section{이상치 상세}
<<detail_outliers, tidy=TRUE, tidy.opts=list(width.cutoff=65), size="small", echo=FALSE, results='asis'>>=
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 <- change_under(variables[i])
      cap_table <- paste0(cap, "의 이상치 정보")

      cat(sprintf("\\subsubsection{변수 : %s}\n", cap))

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

      kable(outlier_df, booktabs = TRUE,
          caption = cap_table, digits = 2,
          label = paste0("detail_outliers", i),
          format.args = list(big.mark = ",")) %>%
      kable_styling(latex_options = c("striped")) %>%
      kable_styling(latex_options = c("hold_position")) %>%
      cat()

      if (N >= 5000) {
        png(filename = sprintf("./figure/out%s.png", i), width = 600, height = 400)
      } else {
        cairo_pdf(filename = sprintf("./figure/out%s.pdf", i), width = 6, height = 4)
      }
      
      plot_outlier(edaData, variables[i])
      dev.off()

      cap_fig <- paste0(cap, "의 분포현황")

      cat("\\begin{figure}[!ht]\n")
      cat("\\centering\n")
      
      if (N >= 5000) {
        cat(sprintf("\\includegraphics[width=0.7\\textwidth]{figure/out%s.png}\n", i))
      } else {
        cat(sprintf("\\includegraphics[width=0.7\\textwidth]{figure/out%s.pdf}\n", i))
      }
      
      cat(sprintf("\\caption{%s}\n", cap_fig))
      cat("\\end{figure}\n")

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

<<option_undo, echo=FALSE>>=
options(warn = 0)
@

