iris <- read.csv("iris2.csv", header=T, stringsAsFactors = T)
str(iris)
# 필요한 패키지 설치 및 로드
if (!require("readr")) install.packages("readr")
if (!require("dplyr")) install.packages("dplyr")
if (!require("caret")) install.packages("caret")
if (!require("class")) install.packages("class")
if (!require("plotly")) install.packages("plotly")
library(readr)
library(dplyr)
library(caret)
library(class)
library(plotly)
# 1단계: 데이터 수집
nrow(wine)
ncol(wine)
# 2단계: 데이터 탐색
# 1. 결측치 확인
colSums(is.na(iris))
# 2. 종속변수의 데이터 비율
table(iris$Species)
prop.table(table(iris$Species)) # 데이터의 비율이 동일함
setosa versicolor virginica
0.3333333 0.3333333 0.3333333
# 3. 데이터 스케일링 (최대최소 정규화)
iris2 <- iris[, c(-5)] # 정답 type 제외
iris2
normalize <- function(x) { return((x - min(x)) / (max(x) - min(x))) }
iris2_n <- as.data.frame(lapply(iris2, normalize))
summary(iris2_n)
# 3단계: 모델 훈련
# 훈련 데이터와 테스트 데이터를 분리합니다. 90% 학습, 10% 시험
set.seed(10)
train_indx <- createDataPartition(iris$Species, p = 0.9, list = FALSE)
train_indx
# 기계를 학습 시킬 훈련 데이터와 테스트 데이터 생성
iris_train <- iris2_n[train_indx, ]
iris_test <- iris2_n[-train_indx, ]
nrow(iris_train)
nrow(iris_test)
# 기계를 학습 시킬 훈련 데이터의 정답과 테스트 데이터의 정답 생성
iris_train_label <- iris$Species[train_indx]
iris_test_label <- iris$Species[-train_indx]
length(iris_train_label)
length(iris_test_label)
# 4단계: 모델 성능 평가
accuracies <- data.frame(k = integer(), accuracy = numeric())
set.seed(10)
for (i in seq(1, 57, 2)) {
result1 <- knn(train = iris_train, test = iris_test, cl = iris_train_label, k = i)
accuracy <- sum(result1 == iris_test_label) / length(iris_test_label) * 100
accuracies <- rbind(accuracies, data.frame(k = i, accuracy = accuracy))
print(paste(i, '개 일때 정확도 ', accuracy))
}
# 정확도 데이터 프레임 확인
accuracies
k accuracy
1 1 100
2 3 100
3 5 100
4 7 100
5 9 100
6 11 100
7 13 100
8 15 100
9 17 100
10 19 100
11 21 100
# plotly로 라인 그래프 시각화
fig <- plot_ly(accuracies, x = ~k, y = ~accuracy, type = 'scatter', mode = 'lines+markers', line = list(color = 'lightgreen'))
fig <- fig %>% layout(title = "K 값에 따른 정확도",
xaxis = list(title = "K 값"),
yaxis = list(title = "정확도"))
fig