※ 개인적으로 ADP 실기 문제들을 풀이하려고 합니다. 사용 언어는 'R 프로그래밍'입니다.
※ 코드 및 관련 의견 주심 감사하겠습니다.
문제 복기 참고 사이트
https://www.datamanim.com/dataset/ADPpb/00/20.html
ADP 20회 실기 문제 — DataManim
2-1번 데이터 전처리 각 가구의 15분간격의 전력량의 합을 구하고 해당데이터를 바탕으로 총 5개의 군집으로 군집화를 진행한 후 아래의 그림과 같은 형태로 출력하라. 군집화를 위한 데이터 구
www.datamanim.com
1-1. 데이터 확인 및 전처리
데이터 EDA 수행 (결측치 확인 및 처리 방안 논의)
날씨의 온도를 예측하는 것, 종속변수 : actual(최고온도)
df <- read.csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/adp/20/problem1.csv', stringsAsFactors = F)
# 데이터 구조 확인
str(df)
head(df)
tail(df)
# 변수별 기술통계 확인
library(psych)
describe(df)
# 결측치 확인
sum(is.na(df))
colSums(is.na(df))
먼저, 데이터의 구조, 변수별 기술통계, 그리고 결측치를 확인하였다.
데이터는 총 348개의 행과 12개의 변수로 이루어져 있었고, 결측치는 존재하지 않았다.
결측치가 존재하지 않기 때문에 따로 처리해 줄 필요가 없다.
또한, describe() 함수를 이용하여 변수별 기술통계를 확인하였을 때 특별히 문제가 되는 부분은 보이지 않았다.
실제 분석에 사용할 변수들(temp_2, temp_1, average, actual 등)은 데이터의 범위가 서로 크게 벗어나지 않았다.
데이터를 분할하기 전, 실제 분석에 사용할 변수들만으로 데이터를 새로 만들었다.
week 변수는 One-Hot Encoding을 수행하였다.
df <- subset(df, select = -c(year, month, day, friend))
## 범주형 변수 변환: One-Hot Encoding
df$week <- as.factor(df$week)
dummy <- dummyVars(" ~. ", data=df)
new_df <- data.frame(predict(dummy, newdata=df))
head(new_df)
데이터 분할 방법
library(caret)
idx <- createDataPartition(df$actual, p = 0.8, list = F)
train_df <- df[idx, ]
test_df <- df[-idx, ]
데이터는 caret 패키지의 createDataPartition() 함수를 이용하였고, 종속변수를 기준으로 8:2로 train과 test 셋을 나누었다.
1-2. Random Forest 모델 적합 및 검증
학습 및 예측 결과 해석
※참고 https://rpubs.com/phamdinhkhanh/389752
# 평가지표
library(Metrics)
eval_merics <- function(actual, pred){
metrics <- list(RMSE = rmse, MSE = mse, MAPE = mape, R2 = caret::R2)
round(sapply(metrics, function(x) x(actual, pred)), 4)
}
## RandomForest
RF <- train(actual ~., data=train_df, method='rf')
#RF <- randomForest::randomForest(actual ~., data=train_df)
RF_pred <- predict(RF, test_df)
RF_result <- eval_merics(test_df$actual, RF_pred)
예측 결과 검정 해석 및 중요변수 도출
varImp(RF)
랜덤포레스트의 예측 결과, RMSE: 5.6038, R2: 0.8183(81.83%)로 낮은 오차와 높은 설명력을 보인다.
랜덤포레스트의 중요변수를 도출하였을 때, temp_1 - average - forecast_acc 순으로 높게 나타났다.
변수 중요성 분석 및 그래프 출력
plot(varImp(RF))
1-3. SVM 모델 적합 및 검증
학습 및 예측 결과 해석
## SVM
SVM <- train(actual ~., data=train_df, method="svmRadial")
SVM_pred <- predict(SVM, test_df)
SVM_result <- eval_merics(test_df$actual, SVM_pred)
예측 결과 검정 해석 및 중요변수 도출
varImp(SVM)
서포트벡터머신의 예측 결과, RMSE: 6.4381, R2: 0.7672(76.72%)로 낮은 오차와 높은 설명력을 보인다.
서포트벡터머신의 중요변수를 도출하였을 때, temp_1 - average - forecast_acc 순으로 높게 나타났다.
변수 중요성 분석 및 그래프 출력
plot(varImp(SVM))
1-4. 모델 비교 및 향후 개선 방향 도출
랜덤포레스트(Random Forest) vs. 서포트벡터머신(SVM)
위의 결과에서 알 수 있듯이, 랜덤포레스트가 서포트벡터머신보다 낮은 오차와 높은 설명력을 보이고 있다.
따라서, 랜덤포레스트가 해당 데이터에서 더 적합한 모델이라고 할 수 있다.
두 모델의 장단점 / 추후 운영 관점에서 어떤 모델 선택?
랜덤포레스트(Random Forest)는 아무런 매개변수 튜닝이 없어도 다른 모델보다 높은 정확도를 나타내고, 더 많은 트리를 평균하면 과대적합을 줄여 더 안정적인 모델을 만든다. 다만, 더 많은 메모리를 사용하며 훈련과 예측 속도가 느리다.
서포트벡터머신(SVM)은 저차원과 고차원의 데이터에 모두 잘 작동한다. (데이터 특성이 적어도 됨) 그러나 데이터 전처리와 매개변수 설정에 신경을 많이 써야 하고, 분석에 어려움이 있다. 또한, 모델의 설명이 어렵다.
추후 운영 관점에서, 모델의 학습 시간만을 중점으로 생각한다면 SVM이 유리하다.
하지만, 데이터 분석은 모델 학습 시간도 중요하지만, 모델의 예측력과 정확도 측면도 중요하다.
따라서, 예측 오차가 낮으며, 모델에 대한 설명력이 높은 랜덤포레스트를 선택할 것이다.
모델링 관련 추후 개선 방향
지금까지 분석한 모델은 아무런 하이퍼파라미터 등을 조절하지 않고 수행한 것이다.
그렇기 때문에 추후 모델링을 개선하게 된다면, 랜덤포레스트의 파라미터를 조절하면서 가장 Best 값을 선택하여 모델의 성능을 높일 것이다.
'분석가 Step 0. 자격증 > ADP' 카테고리의 다른 글
[23회 실기] 기계학습 문제 풀이 1편 (0) | 2023.04.18 |
---|---|
[22회 실기] 기계학습 문제 풀이 (0) | 2023.04.13 |
[20회 실기] 기계학습 문제 풀이 2편 (0) | 2023.03.28 |
[17회 실기] 기계학습 문제 풀이 2편 (0) | 2023.03.24 |
[17회 실기] 기계학습 문제 풀이 1편 (0) | 2023.03.23 |