R 데이터분석 예제: 붓꽃 Iris 데이터셋으로 배우는 분류와 시각화
데이터 분석을 시작하려고 할 때, 처음 접하게 되는 데이터셋 중 하나가 바로 붓꽃 Iris 데이터셋입니다. 이 데이터셋은 데이터 분석 기초 학습에서 자주 활용되는 대표적인 R 데이터분석 예제입니다. 붓꽃의 여러 가지 특성(꽃잎과 꽃받침의 길이와 너비)을 바탕으로, 각각의 샘플이 어떤 품종에 속하는지 분류하는 문제를 다룹니다.
이번 포스트에서는 R 데이터분석 예제로 Iris 데이터셋을 사용하여 데이터를 탐색하고 시각화하며, 간단한 분류 모델을 만드는 방법을 배워보겠습니다. 끝까지 읽으시면 분류와 시각화에 대한 중요한 정보를 얻을 수 있습니다!
Iris 데이터셋 개요
Iris 데이터셋은 붓꽃의 형태에 관한 정보를 담고 있으며, 데이터를 통해 붓꽃의 품종을 예측할 수 있는 문제를 해결하는 데 유용합니다. 데이터셋은 총 150개의 샘플로 구성되어 있으며, 각 샘플은 네 가지 특성(꽃받침 길이, 꽃받침 너비, 꽃잎 길이, 꽃잎 너비)을 가지고 있습니다. 이번 데이터분석 예제에서는 이 특성들을 바탕으로 세 가지 붓꽃 품종(Setosa, Versicolor, Virginica)을 분류하는 방법을 살펴보겠습니다.
데이터 로드 및 탐색
우선 R을 사용하여 Iris 데이터를 불러오고, 간단히 탐색해보겠습니다. R에는 iris
데이터셋이 내장되어 있기 때문에 별도의 설치 과정이 필요하지 않습니다.
R에서 데이터 로드
# Iris 데이터셋 불러오기
data(iris)
# 데이터 구조 확인
str(iris)
summary(iris)
head(iris)
iris
데이터셋은 다섯 개의 열로 구성되어 있으며, 각 열은 다음과 같은 변수를 포함하고 있습니다:
Sepal.Length
: 꽃받침 길이Sepal.Width
: 꽃받침 너비Petal.Length
: 꽃잎 길이Petal.Width
: 꽃잎 너비Species
: 붓꽃의 품종 (Setosa, Versicolor, Virginica)
데이터 구조 설명
위 코드를 통해 iris
데이터의 구조를 확인하고, 요약 통계를 살펴볼 수 있습니다. 각 특성별로 평균, 중앙값, 최소값, 최대값 등의 기초 통계 정보를 확인하면 데이터의 전반적인 분포를 쉽게 파악할 수 있습니다.
R 데이터분석 예제 데이터 시각화
데이터를 탐색한 후에는 이를 시각화하여 각 특성 간의 관계를 시각적으로 파악하는 것이 중요합니다. R의 ggplot2 패키지를 사용하면 간단하게 시각화를 수행할 수 있습니다. 이번 데이터분석 예제에서는 꽃잎과 꽃받침의 길이와 너비를 산점도로 표현해 보겠습니다.
R에서 산점도 그리기
# ggplot2 설치 및 로드
# install.packages("ggplot2") #ggplot2 패키지가 설치되어 있지 않은 경우는 설치하세요.
library(ggplot2)
# 꽃잎과 꽃받침의 길이, 너비 시각화
ggplot(iris, aes(x = Petal.Length, y = Petal.Width, color = Species)) +
geom_point(size = 3) +
labs(title = "꽃잎 길이와 너비에 따른 품종 분포", x = "꽃잎 길이", y = "꽃잎 너비")
이 코드를 실행하면 꽃잎의 길이와 너비를 기준으로 붓꽃의 품종별 분포를 시각화한 산점도를 확인할 수 있습니다. 품종별로 색을 다르게 지정했기 때문에, 데이터가 시각적으로 어떻게 분포되어 있는지 한눈에 알 수 있습니다.
이 시각화에서는 Setosa가 명확하게 다른 두 품종과 구분되며, Versicolor와 Virginica는 일부 겹치는 부분이 있다는 점을 확인할 수 있습니다.
K-최근접 이웃(K-NN) 분류 모델 구축
이제 간단한 분류 모델을 사용해 보겠습니다. 이번에는 K-최근접 이웃(K-NN) 알고리즘을 사용하여 붓꽃의 품종을 예측해 보겠습니다. K-NN은 새로운 데이터 포인트가 있을 때, 가장 가까운 K개의 이웃 데이터를 참조하여 그 데이터를 분류하는 간단하고 직관적인 알고리즘입니다.
R에서 K-NN 모델 구축
# 필요 패키지 설치 및 로드
install.packages("class")
library(class)
# 데이터셋을 훈련 및 테스트 세트로 나누기
set.seed(123)
index <- sample(1:nrow(iris), 0.7 * nrow(iris))
train_data <- iris[index, ]
test_data <- iris[-index, ]
# K-NN 모델 훈련 및 예측
train_labels <- train_data$Species
test_labels <- test_data$Species
knn_pred <- knn(train = train_data[, -5], test = test_data[, -5], cl = train_labels, k = 3)
# 예측 결과 확인
table(knn_pred, test_labels)
# 실행결과 데이터 #
test_labels
knn_pred setosa versicolor virginica
setosa 14 0 0
versicolor 0 17 0
virginica 0 1 13
위 코드는 K-NN 알고리즘을 이용하여 Iris 데이터셋의 붓꽃 품종을 예측하는 과정입니다. 훈련 데이터와 테스트 데이터를 나눈 후, 테스트 데이터에 대해 품종을 예측하고 그 결과를 실제 값과 비교합니다.
예측 결과 평가
예측 결과를 평가하는 방법 중 하나는 혼동 행렬(confusion matrix)을 사용하는 것입니다. 혼동 행렬은 모델이 얼마나 정확하게 예측했는지, 오분류된 샘플은 얼마나 되는지 한눈에 확인할 수 있게 해줍니다. 위 코드에서 table()
함수를 사용하여 예측값과 실제값을 비교하면 혼동 행렬을 출력할 수 있습니다. 그런데 실행결과만 봐서는 바로 그 의미 분석이 어렵습니다.
그래서 K-NN 분류 모델에서 성능을 평가할 때, 일반적으로 정밀도(precision), 재현율(recall), F1 점수 등과 같은 지표를 사용하여 모델의 성능을 구체적으로 분석할 수 있습니다.
caret
패키지 또는 e1071
패키지를 사용하면 쉽게 정밀도, 재현율, F1 점수를 계산할 수 있습니다. 여기서는 caret
패키지를 사용하여 이를 구하는 방법을 설명하겠습니다.
1. caret 패키지 설치 및 로드
먼저 caret
패키지를 설치하고 불러오겠습니다.
# 필요 시 패키지 설치
# install.packages("caret")
library(caret)
2. 혼동 행렬 생성 및 성능 평가
table()
함수를 사용해 직접 만든 혼동 행렬을 이용하여 성능 평가를 할 수 있지만, caret
패키지의 confusionMatrix()
함수를 사용하면 정밀도, 재현율, F1 점수 등을 자동으로 계산할 수 있습니다.
# 혼동 행렬 생성 및 성능 평가
confusion_matrix <- confusionMatrix(knn_pred, test_labels)
# 결과 출력
print(confusion_matrix)
이 코드를 실행하면 각 클래스별로 정밀도, 재현율, F1 점수는 물론 정확도(accuracy)까지 확인할 수 있습니다.
3. 결과 해석
confusionMatrix()
함수는 다양한 성능 지표를 포함한 결과를 반환합니다. 여기서는 주요 지표를 설명하겠습니다:
- 정밀도(Precision): 특정 클래스에 대해 예측한 값 중 실제로 그 클래스에 속하는 데이터의 비율입니다.
- 재현율(Recall): 실제 그 클래스에 속하는 데이터 중 올바르게 예측한 비율입니다.
- F1 Score: 정밀도와 재현율의 조화 평균으로, 두 값을 균형 있게 평가할 수 있습니다.
- Accuracy(정확도): 전체 데이터 중에서 정확하게 예측한 비율입니다.
4. 예시 결과
confusionMatrix()
함수로 구한 결과는 대략 다음과 같은 형태로 출력됩니다.
Confusion Matrix and Statistics
Reference
Prediction setosa versicolor virginica
setosa 14 0 0
versicolor 0 17 0
virginica 0 1 13
Overall Statistics
Accuracy : 0.9778
95% CI : (0.8887, 0.9994)
No Information Rate : 0.3556
P-Value [Acc > NIR] : < 2e-16
Kappa : 0.9662
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: setosa Class: versicolor Class: virginica
Sensitivity 1.0000 0.9444 1.0000
Specificity 1.0000 1.0000 0.9722
Pos Pred Value 1.0000 1.0000 0.9286
Neg Pred Value 1.0000 0.9667 1.0000
Prevalence 0.2889 0.3556 0.3556
Detection Rate 0.2889 0.3333 0.3556
Detection Prevalence 0.2889 0.3333 0.3833
Balanced Accuracy 1.0000 0.9722 0.9861
각 주요 지표의 해석:
- Sensitivity: 재현율(Recall)입니다. 예측한 값이 실제값과 얼마나 일치하는지를 나타냅니다.
- Specificity: 특정 클래스가 아닌 데이터를 얼마나 잘 예측했는지에 대한 지표입니다.
- Pos Pred Value: 정밀도(Precision)로, 예측한 것 중 맞춘 비율을 의미합니다.
- Neg Pred Value: 예측하지 않은 것 중 맞춘 비율을 의미합니다.
- Accuracy: 전체 예측에서 맞춘 비율입니다.
이러한 방법으로 모델의 성능을 더욱 구체적으로 평가하고 분석할 수 있습니다.
데이터 분석에서 흔히 하는 실수와 해결 방법
이번 데이터분석 예제를 진행할 때, 초보자들이 자주 범하는 실수들을 피하기 위한 몇 가지 팁을 소개하겠습니다.
- 데이터 전처리를 소홀히 함: 데이터를 분석하기 전에 반드시 결측값, 이상치 등을 처리해야 합니다. Iris 데이터는 결측값이 없지만, 다른 데이터셋에서는 반드시 전처리를 신경 써야 합니다.
- 적절한 K 값 선택: K-NN 모델에서
k
값을 적절히 선택하는 것이 중요합니다. 너무 작은 K 값은 과적합을 초래할 수 있고, 너무 큰 K 값은 중요한 패턴을 놓칠 수 있습니다. - 데이터 분할에 유의하지 않음: 훈련 데이터와 테스트 데이터를 나눌 때는 반드시 무작위로 데이터를 샘플링해야 합니다. 그렇지 않으면 모델이 특정 데이터에만 치우치게 될 수 있습니다.
FAQ
Q1: Iris 데이터셋은 어디에서 다운로드할 수 있나요?
A: Iris 데이터셋은 R에 기본적으로 내장되어 있어 별도의 다운로드가 필요 없습니다. data(iris)
명령어로 불러올 수 있습니다.
Q2: K-NN 모델에서 K 값은 어떻게 설정하나요?
A: K 값은 일반적으로 홀수로 설정하며, 교차 검증을 통해 최적의 K 값을 찾는 것이 좋습니다. 데이터셋의 크기와 분포에 따라 K 값이 달라질 수 있습니다.
Q3: 다른 분류 알고리즘도 사용해 볼 수 있나요?
A: 물론입니다! K-NN 외에도 로지스틱 회귀, 결정 트리, 랜덤 포레스트 등 다양한 분류 알고리즘을 실습해 볼 수 있습니다.
정리하기
이번 포스트에서는 데이터분석 예제로 Iris 데이터셋을 활용하여 기본적인 탐색적 데이터 분석과 시각화를 진행한 후, K-최근접 이웃(K-NN) 알고리즘을 사용하여 분류 모델을 구축해 보았습니다. Iris 데이터셋은 작고 간단하지만, 분류 문제를 학습하고 분석하는 데 매우 유용한 자료입니다. 이 예제를 통해 데이터 분석의 기본 개념을 이해하고, 더 복잡한 문제로 나아갈 수 있는 발판을 마련하셨길 바랍니다.
여러분도 이 예제를 기반으로 다른 데이터셋에 도전해 보세요!