주의: 이 글은 직장에서 일했던 3년 중 2년 동안 개인적으로 공부한 내용을 담은 것이며, 전공이 이 분야도 아니기 때문에 잘못된 정보가 있을 수 있습니다. 다 수강하지 못한 온라인 강의, 같이 일했던 후배 친구들, 그리고 구글링을 통해 출처를 다 기억할 수 없는 많은 글들이 출처입니다. 2년 공부한 내용이더라도 현업에서 다른 분야의 업무와 섞어서 맡았기 때문에 실무에서 깊이도 부족합니다.
세 가지 중 첫 번째, Regression
지금 작성하게 될 예시는 제조, 유통, 물류와 관련이 있는 기업에 중요한 내용입니다. 예를 들어 어떤 고객이 저녁에 토마토 파스타를 만들기 위해 토마토홀을 구매해서 직접 소스를 만드려고 한다고 가정합시다. 그 고객이 평소 이용하던 제조, 유통, 물류 기업에서 토마토홀을 구매하려고 했는데, 재고가 부족해서 구매할 수 없는 상황에 처했습니다. 기업은 고객경험에 부정적인 영향을 줬고, 판매기회를 놓쳐 발생하지 못한 매출이 생기게 됩니다. 반대의 경우도 생각해볼 수 있습니다. 수요가 적은데 지나치게 많은 양의 제품을 생산한 것입니다. 남는 재고를 보관할 공간이 충분하지 않다면 난감한 상황에 이르게 됩니다. 심지어 특정 산업은 판매하지 못한 재고를 하루가 지나면 버릴 수밖에 없는 경우도 있습니다.
위 내용을 통해 수요예측이 중요한 이유를 알 수 있습니다. 날짜별로 제품을 몇 개 생산해야 하는지 생산을 계획해야 합니다. 얼마 전의 기간이나 이전 연도 비슷한 시점의 판매수량을 참고할 수도 있고, 과거에 보였던 판매수량을 가중평균하거나 이동평균으로 계산할 수도 있습니다. 저는 단순한 계산법에서 전통적 시계열 분석(ARIMA, Seasonal ARIMA)을 통해 예측을 하기도 했었고, ML(Machine Learning)을 활용해 예측하기도 했습니다. 지금까지 내용을 통해 알 수 있는 것은 ML을 통해 하나의 숫자를 생성해낼 수 있다는 것입니다. 예시는 시계열 데이터이지만 그 외 데이터 역시 마찬가지입니다. 즉 ML을 통해 Regression이 가능하다고 요약할 수 있겠습니다.
두 번째, Classification
사실 분류가 Regression보다 더 많이 활용되는 것으로 알고 있습니다. 그렇기 때문에 분류가 더 중요한 내용일 수 있습니다. (그리고 글의 흐름과 상관없지만, 어디선가 봤던 내용으로 분류에 비해 Regression 분야는 상대적으로 덜 발전되어 있다고 알고 있습니다.)
주의: 실무에서 분류 모형을 활용할 기회가 없었습니다. 부족하거나 잘못된 내용이 있을 수 있습니다. 스스로 공부하면서 여러 DataSet을 가지고 분류 모형을 사용한 경험은 있습니다.
우선 간단한 예시부터 살펴보겠습니다. 아래와 같은 DataSet이 있다고 가정합니다.
UID | 다리 수 | 귀여움 | 무서움 | 분류 |
---|---|---|---|---|
1 | 8 | 0 | 1 | 거미 |
2 | 4 | 1 | 0 | 고양이 |
3 | 4 | 1 | 0 | 고양이 |
4 | 8 | 0 | 1 | 거미 |
5 | 4 | 1 | 0 | 고양이 |
6 | 8 | 0 | 1 | 거미 |
7 | 4 | 1 | 0 | 고양이 |
8 | 8 | 0 | 1 | 거미 |
요약하면 다리 수가 8개이고 귀여움은 0이면서 무서움은 1인 동물은 거미, 다리 수가 4개이고 귀여움은 1이면서 무서움은 0인 동물은 고양이로 갖춰진 DataSet입니다. 그런데 Label이 고양이인지 거미인지 알 수 없지만, 다리 수, 귀여움, 무서움의 값을 알고 있는 어떤 Data가 있다면 학습시켜놓은 것을 바탕으로 Label이 무엇일지 예측할 수 있을 것입니다. 즉 다리 수, 귀여움, 무서움이 각각 4, 1, 0의 값을 갖고 있는 Data가 들어오면 Label을 고양이로 채울 수 있을 것입니다. 마찬가지로 8, 0, 1의 값을 갖고 있는 Data가 들어오면 Label을 거미로 채울 수 있을 것입니다. 다른 방식으로 표현한다면 우리가 지금까지 고양이라고 알려진 많은 동물들을 본 경험을 바탕으로 유사한 동물을 봤을 때 고양이라고 인식할 수 있는 것과 비슷합니다.
아래는 Random Sample을 통해 DataSet을 구성하고 Random Forest를 활용해 분류 예측을 하는 R Script입니다. 먼저 간단한 설명부터 시작합니다.
install.packages("randomForest")
install.packages("data.table")
library(randomForest)
library(data.table)
### trainDataSet Creation
trainSampleLeg = sample(x = c(4, 8), size = 10000, replace = TRUE)
trainDataSet <- data.table(trainSampleLeg, cute = as.factor(0), scary = as.factor(0), label = as.factor(0))
trainDataSet[trainDataSet$trainSampleLeg == 4, ]$cute <- as.factor(1)
trainDataSet[trainDataSet$trainSampleLeg == 8, ]$cute <- as.factor(0)
trainDataSet[trainDataSet$trainSampleLeg == 4, ]$scary <- as.factor(0)
trainDataSet[trainDataSet$trainSampleLeg == 8, ]$scary <- as.factor(1)
trainDataSet[trainDataSet$trainSampleLeg == 4, ]$label <- as.factor(0)
trainDataSet[trainDataSet$trainSampleLeg == 8, ]$label <- as.factor(1)
nrow(trainDataSet[trainDataSet$trainSampleLeg == 4, ]) # 5007
nrow(trainDataSet[trainDataSet$trainSampleLeg == 8, ]) # 4993
colnames(trainDataSet) <- c("legNum", "cute", "scary", "label")
as.factor(trainDataSet$label)
### testDataSet Creation
testSampleLeg = sample(x = c(4, 8), size = 3000, replace = TRUE)
testDataSet <- data.table(testSampleLeg, cute = as.factor(0), scary = as.factor(0), label = as.factor(0))
testDataSet[testDataSet$testSampleLeg == 4, ]$cute <- as.factor(1)
testDataSet[testDataSet$testSampleLeg == 8, ]$cute <- as.factor(0)
testDataSet[testDataSet$testSampleLeg == 4, ]$scary <- as.factor(0)
testDataSet[testDataSet$testSampleLeg == 8, ]$scary <- as.factor(1)
testDataSet[testDataSet$testSampleLeg == 4, ]$label <- as.factor(0)
testDataSet[testDataSet$testSampleLeg == 8, ]$label <- as.factor(1)
nrow(testDataSet[testDataSet$testSampleLeg == 4, ]) # 1511
nrow(testDataSet[testDataSet$testSampleLeg == 8, ]) # 1489
colnames(testDataSet) <- c("legNum", "cute", "scary", "label")
### RandomForest
randomForestTrain <- randomForest(label ~ legNum + cute + scary, data = trainDataSet, ntree = 500, mtry = floor(sqrt(3)))
forestPred = predict(randomForestTrain, testDataSet[, 1:3])
testSetLabel <- testDataSet$label
confusionMatrix(table(forestPred, testSetLabel))
Confusion Matrix 결과
Confusion Matrix and Statistics
testSetLabel
forestPred 0 1
0 1511 0
1 0 1489
Accuracy : 1
95% CI : (0.9988, 1)
No Information Rate : 0.5073
P-Value [Acc > NIR] : < 2.2e-16
Kappa : 1
Mcnemar's Test P-Value : NA
Sensitivity : 1.0000
Specificity : 1.0000
Pos Pred Value : 1.0000
Neg Pred Value : 1.0000
Prevalence : 0.5073
Detection Rate : 0.5073
Detection Prevalence : 0.5073
Balanced Accuracy : 1.0000
'Positive' Class : 0
Regression에서 설명한 것처럼 기업이나 금융기관에서 활용하는 예시로 설명할 수도 있습니다. 예를 들어 산업, 기업에 따라 임의의 기간 동안 고객이 특정 기업에 가입되어 있는 경우를 생각해볼 수 있습니다. 이동통신사, 보험사를 생각해볼 수 있는데, 둘 모두 기업의 고객이 중간에 이탈할 수 있는 가능성을 가지고 있습니다. 만약 과거의 Data를 통해 현재 고객 중 이탈이 예상되는 고객이 있다면, 이 고객을 Target으로 이탈을 방어할 수 있는 어떤 활동을 계획하고 실행할 수 있을 것입니다. 고객 이탈 예측과 관련해 Random Forest 모형을 사용한 R Script 내용을 아래 링크에 남기겠습니다. 연습 삼아 해본 것이기 때문에 수준이 높지 않습니다.
https://github.com/panther222128/R/blob/master/Bank Data Random Forest
Regression, 분류를 위해 활용하는 모형의 알고리즘이나 수리적 해석은 이 글에서 다루지 않을 것입니다. 만약 직접 검색해서 알아보시겠다면 아래 키워드로 검색해보시는 것을 추천드립니다.
Naive Bayes Classifier, Decision Tree, Bagging, Boosting, Random Forest, Support Vector Machine
조금 더 나아가면 AdaBoost, XGBoost 등 여러 가지 모형이 있습니다.
세 번째, Clustering
저에게 가장 생소한 내용입니다. 위에 Classification은 분류가 되어 있는 DataSet을 준비할 수 있었습니다. 그런데 분류가 되어 있지 않은 DataSet만 있는 경우도 있을 수 있습니다. 즉 위 Classification의 예시에서 Label이 아예 존재하지 않는 것입니다. 이와 같은 DataSet에서 패턴을 발견하고 구조를 찾아내는 것이 Clustering입니다. 사용자의 정보를 활용해 유사한 집단에 속하도록 예측하고 그 사용자에게 적합한 정보를 제시하는 추천 알고리즘에도 활용하는 것으로 알려져 있기도 합니다.