---
title: "데이터 품질 진단 보고서"
author: "Report by dlookr package"
date: "`r Sys.Date()`"
output: 
  prettydoc::html_pretty:
    toc: true
    number_sections: true
    theme: cayman
    highlight: github
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

```{r load_packages, echo=FALSE, warning=FALSE, message=FALSE}
library(xtable)
library(magrittr)
library(dlookr)
library(dplyr)
library(kableExtra)
```

# 데이터 진단
## 개괄적 진단
### 전체 변수의 개괄적 진단

```{r overview, echo=FALSE, warning=FALSE, message=FALSE}
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") 

```


### 결측치 진단
```{r missing_data, echo=FALSE, warning=FALSE, message=FALSE, comment=""}
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")
}
```


### 유일값 진단(문자형 및 범주형)
```{r unique_date_category, echo=FALSE, warning=FALSE, message=FALSE, comment=""}
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보다 큰 변수가 없습니다.")
}
```


### 유일값 진단(수치형)
```{r unique_data_numeric, echo=FALSE, warning=FALSE, message=FALSE, comment=""}
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보다 작은 변수가 없습니다.")
}
```


## 데이터 진단 상세
### 범주형 변수의 진단
```{r diagnose_catagory, echo=FALSE, warning=FALSE, message=FALSE, comment=""}
diagn_category <- diagnose_category(edaData, top = 10)

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("범주형 변수가 없습니다.")
}
```


### 수치형 변수의 진단
```{r diagnose_numeric, echo=FALSE, warning=FALSE, message=FALSE, comment=""}
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)
```{r numeric_zero, echo=FALSE, warning=FALSE, message=FALSE, comment=""}
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("수치형 변수가 없습니다.")    
}
```


### 수치형 변수의 진단 (음수)
```{r numeric_minus, echo=FALSE, warning=FALSE, message=FALSE, comment=""}
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("수치형 변수가 없습니다.")    
}
```

# 이상치 진단
## 이상치 개요
### 수치형 변수의 이상치 진단
```{r outliers, echo=FALSE, warning=FALSE, message=FALSE, comment=""}
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("수치형 변수가 없습니다.")    
}
```


## 이상치 상세
```{r detail_outliers, echo=FALSE, warning=FALSE, message=FALSE, comment="", fig.height=4, fig.width=6, 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 <- 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("수치형 변수가 없습니다.")    
}
```


