ch 11 - Data Import & Label Encoding in R

Page content

Intro

  • 설문조사가 끝났으면 이제 정리를 해야 한다.
  • 일련의 과정은 보통 코딩이라 부른다.

(1) 주요 패키지

  • 이번 포스트부터 gt 패키지를 사용하려고 한다.
    • gt: ggplot2와 같이 Table를 문법으로 컨트롤 할 수 있도록 구현된 패키지이다.
    • kableExtra: HTML로 출력할 수 있도록 도와주는 패키지이다.

문제점

  • SmartPLS 프로그램을 쓴다 하더라도 기본적으로 모든 데이터의 entry는 수치형으로 일단 바뀌어 있어야 한다.
  • 우선 데이터를 불러와서 확인해보자.
library(tidyverse)
library(gt)
library(kableExtra)


# 데이터 불러오기
data <- read_csv("data/thesis_mater.csv")

data %>% 
  head() %>% 
  kable() %>% 
  kable_styling("striped") %>% 
  scroll_box(width = "100%")
EI_1 EI_2 EI_3 EP_1 EP_2 EP_3 ER_1 ER_2 ER_3 SS_1 SS_2 SS_3 SC_1 SC_2 SC_3 SR_1 SR_2 SR_3 F1 F2 F3 NF1 NF2 NF3 Firm_Age Firm_Size WE1 WE2 WE3 gender founder_employee age_of_respondent Education_Level Business_Area
2 3 4 3 3 4 3 2 4 1 1 3 3 3 3 2 2 1 2 2 3 3 1 3 5 years above Above 15 members No, I don't have experience Yes Yes Female Employee 30-39 Undergraduate School Others
5 5 2 3 5 3 4 4 4 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 Less than 2 years Less than 5 members No, I don't have experience No Yes Male Employee Younger than 30 Undergraduate School Media and Entertainment
1 2 2 1 1 2 1 2 1 2 2 1 1 2 2 1 2 1 2 1 1 1 1 1 5 years above Less than 5 members As founder or employee, I have startup experiences more than 3 times No Yes Female Founder of Company Younger than 30 Undergraduate School Others
3 3 2 1 2 1 2 1 3 2 1 3 1 1 1 2 3 3 3 3 2 3 2 2 Less than 2 years Less than 5 members No, I don't have experience Yes Yes Male Employee Younger than 30 Undergraduate School Others
5 3 5 2 5 4 4 4 4 4 5 4 5 5 5 5 5 5 4 5 4 4 5 5 3-4 years Less than 5 members As founder or employee, I have startup experiences more than 3 times No Yes Male Founder of Company 30-39 Undergraduate School Others
1 3 3 1 3 3 2 3 1 4 1 2 3 3 1 2 2 1 1 2 3 1 3 1 5 years above 5-9 members As founder or employee, I have startup experience, one time No No Female Employee Younger than 30 Undergraduate School Others
  • 위 데이터에서 보면 알 수 있듯이, WE1 ~ Business_Area 까지의 데이터는 모두 문자로 되어 있다.
  • Python에서는 LabelEncoder라는 것이 있다.
  • R에서는 기본 문법인 factor만 있어도 가능하다.

Factor의 활용

  • 이제 본격적으로 코딩을 시작한다.
  • 데이터 전처리에서 쉬운 방법은 없다.

(1) 기본

  • 가상의 데이터를 만든 후 factor를 활용하자.
temp <- data.frame(x = c(1, 1, 2), 
                   gender = c("Female", "Male", "Male"))
temp
##   x gender
## 1 1 Female
## 2 1   Male
## 3 2   Male
  • 이제 gender를 변환하자.
temp$gender <- as.numeric(factor(temp$gender))
temp
##   x gender
## 1 1      1
## 2 1      2
## 3 2      2
  • factor로 변환한 뒤, as.numeric으로 형 변환을 하면 쉽게 바꿀수는 있다.
  • 위와 같이 형변환을 하면 1이 무엇을 의미하는지, 2는 무엇을 의미하는지 알 수 없게 된다. (즉, 정보의 손실이 올 수 있다.)

(2) 응용

  • 이제 factor를 조금 더 활용해 본다.
  • 같은 가상의 데이터를 사용한다.
temp <- data.frame(x = c(1, 1, 2), 
                   gender = c("Female", "Male", "Male"))

temp$gender <- as.numeric(factor(temp$gender), 
                          levels = c("Female", "Male"), 
                          labels = c(1, 2))

temp
##   x gender
## 1 1      1
## 2 1      2
## 3 2      2
  • 결과는 똑같다. 그러나, 각 label에 대한 해석이 보다 명확해지기 때문에 추후 분석결과보고서를 작성할 때 보다 쉽게 작성할 수 있다.

(3) 적용

  • 이제 내 데이터에 적용해보자.
  • 적용해야 할 변수는 모두 Firm_Age ~ Business_Area 까지이다.
  • 여기에서 하나의 Rule을 만들어야 한다.
    • 각 범주마다 하나씩 맞추는 노가다는 지양해야 한다.
    • 따라서, 범주의 값은 모두 알파벳순으로 정렬한다.
    • 이를 프로그래밍으로 해결한다.
temp <- data.frame(x = c(1, 1, 2), 
                   gender = c("Female", "Male", "Male"),
                   grade = c("A", "B", "C"))

temp
##   x gender grade
## 1 1 Female     A
## 2 1   Male     B
## 3 2   Male     C
  • 데이터가 하나 더 생겼다. 다음과 같은 함수를 만든다.
factor2numeric <- function(x) {
  # input 변수가 문자형인지 확인하여 다음 코드를 실행한다. 
  # 만약 문자가 아니면 `else` 코드로 넘어간다. 
  if(is.character(x) == TRUE) { 
      # levels 함수를 사용하면 알파벳으로 자동 정렬해준다.
      char_levels <- levels(factor(x)) 
      
      # 변환되기 전 factor의 `level`를 확인한다.
      print("----변환 시작 전----")
      print(char_levels)   
      
      # factor형으로 변환했다. 
      x <- factor(x, 
                  levels = char_levels, 
                  labels = c(1:length(char_levels))) # 이 코드는 labels 숫자로 정의한다. 
     
       # 변환되기 전 factor의 `level`를 확인한다.
      print(levels(x)) 
      print("----변환 종료----")
  } else {
    # 에러 메시지를 출력한다
    print("This is not character!!")
  } 
  return(x)
}

# 전체 데이터에서 character인 데이터를 사용자 정의 함수를 적용하였다. 
data2 <- data %>% 
  mutate_if(is.character, factor2numeric)
## [1] "----변환 시작 전----"
## [1] "3-4 years"         "5 years above"     "Less than 2 years"
## [1] "1" "2" "3"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "10-14 members"       "5-9 members"         "Above 15 members"   
## [4] "Less than 5 members"
## [1] "1" "2" "3" "4"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "As founder or employee,  I have startup experience, one time"        
## [2] "As founder or employee, I have startup experiences more than 3 times"
## [3] "As founder or employee, I have startup experiences, two times"       
## [4] "No, I don't have experience"                                         
## [1] "1" "2" "3" "4"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "No"  "Yes"
## [1] "1" "2"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "No"  "Yes"
## [1] "1" "2"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "Female" "Male"  
## [1] "1" "2"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "Employee"           "Founder of Company"
## [1] "1" "2"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "30-39"           "40-49"           "50 or above"     "Younger than 30"
## [1] "1" "2" "3" "4"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "Graduate School"      "High School"          "Undergraduate School"
## [1] "1" "2" "3"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
##  [1] "E-Commerce"                 "Education"                 
##  [3] "Energy"                     "Enterprise Services"       
##  [5] "Fintech"                    "Logistics"                 
##  [7] "Manufacturing"              "Media and Entertainment"   
##  [9] "Medical and Healthcare"     "Online to Offline Commerce"
## [11] "Others"                     "Real Estate and Household" 
## [13] "Transportation/Automotive"  "Travel"                    
##  [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14"
## [1] "----변환 종료----"

(4) 중복치와 결측치 확인

  • 모든 것을 온라인으로 받다보니, 중복치와 결측치가 발생할 수 있다.
  • 따라서 해당 내용이 있는지 확인한다.
sum(duplicated(data2))
## [1] 5
  • 중복치가 5개 인것으로 확인이 된다.
  • 중복치를 제거하는 것은 간단하다.
data3 <- data2 %>% distinct()
  • 이번에는 결측치를 확인한다.
colSums(is.na(data3))
##              EI_1              EI_2              EI_3              EP_1 
##                 0                 0                 0                 0 
##              EP_2              EP_3              ER_1              ER_2 
##                 0                 0                 0                 0 
##              ER_3              SS_1              SS_2              SS_3 
##                 0                 0                 0                 0 
##              SC_1              SC_2              SC_3              SR_1 
##                 0                 0                 0                 0 
##              SR_2              SR_3                F1                F2 
##                 0                 0                 0                 0 
##                F3               NF1               NF2               NF3 
##                 0                 0                 0                 0 
##          Firm_Age         Firm_Size               WE1               WE2 
##                 0                 0                 0                 0 
##               WE3            gender  founder_employee age_of_respondent 
##                 0                 0                 0                 0 
##   Education_Level     Business_Area 
##                 0                 0
  • column마다 결측치를 확인한 결과 모두 0인 것을 확인할 수 있다.

(5) 결과 확인

  • 이제 변환된 결과를 확인한다.
# 결과값을 확인한다. 
data3 %>% 
  head() %>% 
  kable() %>% 
  kable_styling("striped") %>% 
  scroll_box(width = "100%")
EI_1 EI_2 EI_3 EP_1 EP_2 EP_3 ER_1 ER_2 ER_3 SS_1 SS_2 SS_3 SC_1 SC_2 SC_3 SR_1 SR_2 SR_3 F1 F2 F3 NF1 NF2 NF3 Firm_Age Firm_Size WE1 WE2 WE3 gender founder_employee age_of_respondent Education_Level Business_Area
2 3 4 3 3 4 3 2 4 1 1 3 3 3 3 2 2 1 2 2 3 3 1 3 2 3 4 2 2 1 1 1 3 11
5 5 2 3 5 3 4 4 4 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 3 4 4 1 2 2 1 4 3 8
1 2 2 1 1 2 1 2 1 2 2 1 1 2 2 1 2 1 2 1 1 1 1 1 2 4 2 1 2 1 2 4 3 11
3 3 2 1 2 1 2 1 3 2 1 3 1 1 1 2 3 3 3 3 2 3 2 2 3 4 4 2 2 2 1 4 3 11
5 3 5 2 5 4 4 4 4 4 5 4 5 5 5 5 5 5 4 5 4 4 5 5 1 4 2 1 2 2 2 1 3 11
1 3 3 1 3 3 2 3 1 4 1 2 3 3 1 2 2 1 1 2 3 1 3 1 2 2 1 1 1 1 1 4 3 11

파일 내보내기

  • 이제 SmartPLS에서 사용할 수 있도록 csv 파일 형태로 내보낸다.
write_csv(data3, "~/Desktop/thesis_master2.csv")

소결론

  • 데이터 전처리는 중요하다. 그러나, 시간이 조금 걸린다.
  • 설문조사에서 특히 문제가 되는 부분은 문자열 데이터를 수치형 데이터로 변환해주는 문제가 있다.
    • 이를 프로그래밍으로 해결하면 보다 쉽게 접근할 수 있다.
  • 이제 본격적으로 분석을 해보자.