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
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) 중복치와 결측치 확인
- 모든 것을 온라인으로 받다보니, 중복치와 결측치가 발생할 수 있다.
- 따라서 해당 내용이 있는지 확인한다.
## [1] 5
- 중복치가 5개 인것으로 확인이 된다.
- 중복치를 제거하는 것은 간단하다.
data3 <- data2 %>% distinct()
## 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")
소결론
- 데이터 전처리는 중요하다. 그러나, 시간이 조금 걸린다.
- 설문조사에서 특히 문제가 되는 부분은 문자열 데이터를 수치형 데이터로 변환해주는 문제가 있다.
- 이를 프로그래밍으로 해결하면 보다 쉽게 접근할 수 있다.
- 이제 본격적으로 분석을 해보자.