1. 데이터 소개
<교육훈련 방법별 참여율>
-조사 일시: 2007~2017년
-자료갱신일: 2019년
-데이터 수: 10,005개
-분류: 산업별(제조업, 금융업, 비금융업), 교육방법(집체식 사내 교육훈련, 집체식 사외 교육훈련, 인터넷 학습, 우편통신 훈련, 국내 연수, 해외 연수, 외부 업체로 부터 기술지원)
HRD 관련 데이터를 찾다가 <교육훈련 방법별 참여율>이라는 데이터를 발견했다. 데이터를 눈으로 훑고 있었는데 신기한 교육방법을 밝견했다. 바로 "우편통신 훈련"이다. 교육 관련 학과에 다니지만 처음 들어본 교육 방법이다. 어쩔 수 없이 chatGPT에게 물어봤다.
우편통신 훈련은 우편을 이용하여 진행되는 교육 방법으로, 우편을 통해 교재와 문제지를 배송하고, 이를 수신한 학습자가 문제를 푸는 방식으로 이루어집니다. 이 방식은 대면 교육이 어려운 지역이나 시간적 제약이 있는 학습자들에게 유용하게 사용됩니다. 최근에는 이메일이나 온라인 공간을 통해 수업 자료를 제공하고, 학습자들은 인터넷을 통해 과제를 제출하고 피드백을 받는 방식으로도 우편통신 훈련이 이루어지고 있습니다. (by chatGPT)
어찌보면 이러닝 같기도 하고, 아닌 것 같기도 하다. 확실한 것은 이 교육방법은 이러닝에 밀려 없어질 것 같다. 교육 자료를 이제는 인터넷으로 주고받을 수 있기 때문이다.
본론으로 돌아가서 데이터를 보고 어떤 교육방법이 참여율이 높을지 궁금해졌다.(그리고 교육방법이 참여율에 유의한 영향을 주는지도...) 그래서 오늘은 이 데이터를 분석해 볼 것이다.
2. 데이터 전처리
머릿속에 어떻게 시각화 해야겠다는 청사진을 가지고 데이터를 보니 내가 원하는 모양이 아니었다. 열이 너무 많아서 나중에 그래프를 만들 때 문제가 생길 것 같았고, 산업별로 그룹화를 해야 해서 약간의 변형이 필요해 보였다.
library(dplyr)
library(ggplot2)
library(tidyr) #change data frame's shape
library(gridExtra) #arrange graph
PR_TM <- read.csv(file="/Users/baesuwan/Downloads/Participation rates by Training method.csv",header=F,fileEncoding="euc-kr")
PR_TM
cPR_TM <- PR_TM[-(1:4),] #remove row1~row4 because i don't need them
cPR_TM
names(cPR_TM) <- c("business","size","all_in","all_out","E_learning","mail_edu","domestic","abroad","outsourcing")
cPR_TM
우선 오늘 쓸 패키지들을 불러줬다. tidyr 패키지는 gather() 함수를 쓰기위해 gridExtra는 ggplot으로 만든 그래프를 나열하기 위해 사용했다. 파일을 불러와 보니 별로 쓸데없는 행들이 있어서 삭제했다. 그리고 한글로 된 열 이름을 영어로 변경해 줬다.
OB <- c("제조업","금융업","비finance")
YB <- c("manu","finance","Non_finance")
for (i in 1:3){
cPR_TM$business <- gsub(OB[i],YB[i],cPR_TM$business)
} #change korean to english
OS <- c("소규모","중규모","대규모")
YS <- c("small","medium","Large")
for (i in 1:3){
cPR_TM$size <- gsub(OS[i],YS[i],cPR_TM$size)
}
그리고 한글로 적힌 데이터들도 영어로 바꿔줬다.(나중에 그래프 만들 때 한글은 깨지기 때문!) 귀찮은 반복처리라서 오랜만에 for 문을 써줬다. 그리고 gsub()이라는 함수를 사용해서 특정 이름을 가진 데이터를 내가 원하는 이름으로 바꿀 수 있게 했다.
class(cPR_TM$all_in) #check data's type
cPR_TM[,3:9] <- sapply(cPR_TM[,3:9],as.numeric) #change data type from character to numeric
bz_cPR_TM <- cPR_TM %>%
group_by(business) %>%
summarise(all_in = mean(all_in),
all_out = mean(all_out),
E_learning = mean(E_learning),
mail_edu = mean(mail_edu),
domestic = mean(domestic),
abroad = mean(abroad),
outsourcing = mean(outsourcing)) #Average Participation rates by industry and trainig method
그리고 혹시나 해서 퍼센트들이 character로 데이터 타입이 되어있지 않을까? 의심했는데 역시 그랬다. 그래서 숫자형으로 바꿔줬다. 이것도 모든 열에 반복 적용해야 해서 sapply()라는 함수를 사용하여 간단하게 반복처리해줬다.
그 밑에 코드는 매우 복잡해 보이지만 그냥 산업별로 그룹화하고 summarise()를 이용해서 각 산업별로 각 교육방법에 따른 참여율을 평균 내준 것이다.
> bz_cPR_TM
# A tibble: 3 × 8
business all_in all_out E_learning mail_edu domestic abroad outsourcing
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Non_finance (%) 72.7 36.8 47.1 15.2 3.27 1.9 5.3
2 finance (%) 78.4 35.5 80.7 23.1 21.6 6.77 4.87
3 manu (%) 73.0 37.7 37.1 10.3 2.3 1.47 5.47
그랬더니 나온 결과다. 이것을 그래프로 만들고자 하니, 막막했다. x축을 어떤 것으로 해야 할지 y축을 어떤 것으로 해야 할지 감이 잡히지 않았다. 생각해 보니 교육방법이 열 이름으로 들어갈게 아니라 하나의 열에 각각의 데이터로 들어가야 했음을 깨달았다! 숫자도 하나의 열에 각각의 데이터로 들어가야 했다.
bz_cPR_TM2 <- bz_cPR_TM %>%
gather(key="Trainnig Method",value="mean",-business) #Categorizing education (check point!)
bz_cPR_TM2
> bz_cPR_TM2
# A tibble: 21 × 3
business `Trainnig Method` mean
<chr> <chr> <dbl>
1 Non_finance (%) all_in 72.7
2 finance (%) all_in 78.4
3 manu (%) all_in 73.0
4 Non_finance (%) all_out 36.8
5 finance (%) all_out 35.5
6 manu (%) all_out 37.7
7 Non_finance (%) E_learning 47.1
8 finance (%) E_learning 80.7
9 manu (%) E_learning 37.1
10 Non_finance (%) mail_edu 15.2
# … with 11 more rows
# ℹ Use `print(n = ...)` to see more rows
찾아보니 gather()라는 함수가 이런 역할을 해줬다. 즉, 기존의 열 이름을 새로운 열(Training Method)의 값으로 만들고 각각의 value를 또 다른 열(mean)에 매칭시켜 줬다. 그랬더니 위와 같은 결과가 나왔다. 내가 딱 원하던 그림이다.
3. 시각화
g1 <- ggplot(bz_cPR_TM2,aes(x=`Trainnig Method`,y=mean,fill=business))+geom_col()
g2 <- ggplot(bz_cPR_TM2,aes(x=`Trainnig Method`,y=mean,fill=business))+geom_col(position="dodge")
grid.arrange(g1,g2) #arrange two graphs
시각화는 어렵지 않았다. 이번에는 산업, 교육방법, 평균 이렇게 변수가 3개가 있어서 이것을 모두 처리해 주기 위해 fill이라는 인수를 사용했다. fill은 막대그래프 안을 나눠서 채우는 역할을 한다. 말로 설명을 쉽게 못하겠다. 위 코드를 실행하면 다음과 같은 결과가 나온다.

grid.arrange() 함수를 상용해 그래프를 한 번에 2개 보일 수 있도록 했다. 하나는 하나의 막대에 산업별로 차지하는 퍼센트를 쌓은 형태이고 하나는 산업별로 따로 막대그래프를 그린 형태이다. 더 가독성이 좋은 것은 밑에 그래프인 것 같다.
4. 결과 및 시사점
교육 방법 별로 보면 집체식 사내 교육이 가장 참여율이 높았고 해외 연수 형태가 참여율이 가장 낮았다. 그리고 산업별로 보면 금융업 분야가 이러닝 부분에서 참여율이 가장 높았다. 상대적인 비율로 보면 국내 연수가 금융업이 다른 산업분야보다 월등했다.
사실 분석을 다하고 나니 드는 생각이 있다. 어떤 분야든 사내 집체교육을 다른 교육들보다 많이 하고 참여도 의무적으로 하게 하기 때문에 참여율이 높은 게 아닐까?라는 생각을 했다. 이러닝도 요즘 뜨고 있는 분야이기도 하고 무엇보다 접근성도 좋으니 참여율이 높게 나타난 것 같다. 사이트에서 데이터에 대해 설명을 자세하게 안 해줘서 어떻게 비율을 구했는지도 몰라서 약간 아쉽다. 무엇보다도 참여율을 계산할 때 교육방법이라는 변수 말고 다른 변수를 통제했는지도 모른다. 이것을 모르기 때문에 교육방법이 참여율에 유의한 영향을 주는지도 의문이다. 집체교육에 비해 해외 연수 국내 연수는 그 수가 적을 것이다. 분명 내가 원하는 요인 빼고 이러한 다른 요인들이 통계에 유의하게 영향을 줬다고 본다.
그럼에도 오늘 분석은 나름 많은 도움이 되었다. 덕분에 우편통신 훈련이라는 말도 알게 되었고, 여러 가지 반복문과 gather() 함수까지 사용해 볼 수 있었다. 앞으로는 데이터를 전처리하고 시각화하기 이전에 그 데이터가 어떻게 왔고 어떤 의도로 만들어졌는지, 또 통계적으로 유의할지도 알아봐야겠다. 물론, 아직 통계학적 지식이 부족하긴 하지만 언젠가는 할 수 있지 않을까?...
'HR analytics' 카테고리의 다른 글
[데이터로 보는 인사이야기] People Analytics (0) | 2023.05.12 |
---|---|
기업의 규모와 업종별 교육 실시율 (2) | 2023.03.17 |