ch0nny_log

[빅데이터분석] R _ 53. 이원 교차표의 거짓 긍정과 거짓부정 해석 본문

빅데이터 분석(with 아이티윌)/R

[빅데이터분석] R _ 53. 이원 교차표의 거짓 긍정과 거짓부정 해석

chonny 2024. 7. 11. 13:44

■ 유방암 데이터 코드 이원 교차표

# 필요한 패키지 설치 및 로드
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단계: 데이터 수집
wbcd <- read.csv("c:\\data\\wisc_bc_data.csv", stringsAsFactors = TRUE)
nrow(wbcd)  # 569
ncol(wbcd)  # 32

# 2단계: 데이터 탐색
# 1. 결측치 확인
colSums(is.na(wbcd))

# 2. 종속변수의 데이터 비율
table(wbcd$diagnosis)
prop.table(table(wbcd$diagnosis))

# 3. 데이터 스케일링 (최대최소 정규화)
wbcd2 <- wbcd[, c(-1, -2)]  # 환자번호(id)와 정답컬럼(diagnosis)를 제외
normalize <- function(x) { return((x - min(x)) / (max(x) - min(x))) }
wbcd_n <- as.data.frame(lapply(wbcd2, normalize))
summary(wbcd_n)

# 3단계: 모델 훈련
# 훈련 데이터와 테스트 데이터를 분리합니다. 90% 학습, 10% 시험
set.seed(10)
train_indx <- createDataPartition(wbcd$diagnosis, p = 0.9, list = FALSE)

# 기계를 학습 시킬 훈련 데이터와 테스트 데이터 생성
wbcd_train <- wbcd_n[train_indx, ]
wbcd_test <- wbcd_n[-train_indx, ]
nrow(wbcd_train)  # 513
nrow(wbcd_test)   # 56 

# 기계를 학습 시킬 훈련 데이터의 정답과 테스트 데이터의 정답 생성
wbcd_train_label <- wbcd$diagnosis[train_indx]
wbcd_test_label <- wbcd$diagnosis[-train_indx]
length(wbcd_train_label)  # 513
length(wbcd_test_label)   # 56

# 4단계: 모델 성능 평가
accuracies <- data.frame(k = integer(), accuracy = numeric())

set.seed(10)
for (i in seq(1, 57, 2)) {
  result1 <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_label, k = i)
  accuracy <- sum(result1 == wbcd_test_label) / length(wbcd_test_label) * 100
  accuracies <- rbind(accuracies, data.frame(k = i, accuracy = accuracy))
  print(paste(i, '개 일때 정확도 ', accuracy))
}

# 정확도 데이터 프레임 확인
accuracies

설명: 위의 결과를 보면 k=7인 경우가 암환자와 정상환자를 다 맞췄으니 제일 좋은 하이퍼 파라미터임 (100% 가 나오기는 쉽지 않음.)

 

※ 정확도 100% 이하일 경우 이원교차표를 활용해야함. (100% 이하인 경우)

설명: 56명의 환자중에 2명 틀리고 다 맞춤

※ 위 출력값 해석 및 설명
1. TP (True Positive)  실제 값이 악성(M)이고모델이 악성(M)으로 예측한 경우 19
2. TN (True Negative) 실제 값이 양성(B)이고 모델이 양성 (B) 으로 예측한 경우 35
3. FP (False Positive) 실제 값이 양성(B)인데 모델이 악성 (M) 으로 예측한 경우 0
4. FN (False Negative) 실제 값이 악성(M)이고 모델이 양성(B)으로 예측한 경우 2

-> 의료쪽에서는 FN 값은 꼭 0 으로 나타나야됨 

-> Positive = 관심범주 (암)

설명: 데이터 분석가는 위와 같은 데이터를 제공해야하고 최종 선택 모델은 사용하는 사람이 결정하면됨.

( 정확도만 가지고 결정할 수 있는 다른 성능 지표도 같이 제공해줘야됨)

문제1. 유리의 종류를 분류하는 knn모델의 이원 교차표를 출력하시오. 
# 필요한 패키지 설치 및 로드
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")
if (!require("mlbench")) install.packages("mlbench")

library(readr)
library(dplyr)
library(caret)
library(class)
library(plotly)
library(mlbench)


# Digits 데이터셋 로드
data("Glass", package = "mlbench")

# 데이터셋의 특성 출력
str(Glass)

# 데이터셋의 행과 열의 수 출력
print(dim(Glass))  # 행과 열의 수 출력
print(summary(Glass))  # 데이터셋 요약 정보 출력
head(Glass)

nrow(Glass)
unique(Glass$Type)

# 2단계: 데이터 탐색
# 1. 결측치 확인
colSums(is.na(Glass))

# 2. 종속변수의 데이터 비율
table(Glass$Type)
prop.table(table(Glass$Type))

# 3. 데이터 스케일링 (최대최소 정규화)
Glass2 <- Glass[, c(-10)]  # 정답컬럼를 제외
normalize <- function(x) { return((x - min(x)) / (max(x) - min(x))) }
Glass_n <- as.data.frame(lapply(Glass2, normalize))
summary(Glass_n)

# 3단계: 모델 훈련
# 훈련 데이터와 테스트 데이터를 분리합니다. 90% 학습, 10% 시험
set.seed(10)
train_indx <- createDataPartition(Glass$Type, p = 0.9, list = FALSE)

# 기계를 학습 시킬 훈련 데이터와 테스트 데이터 생성
Glass_train <- Glass_n[train_indx, ]
Glass_test <- Glass_n[-train_indx, ]
nrow(Glass_train)  # 196
nrow(Glass_test)   # 18

# 기계를 학습 시킬 훈련 데이터의 정답과 테스트 데이터의 정답 생성
Glass_train_label <- Glass$Type [train_indx]
Glass_test_label <- Glass$Type[-train_indx]
length(Glass_train_label)  # 196
length(Glass_test_label)   # 18

# 4단계: 모델 성능 평가
accuracies <- data.frame(k = integer(), accuracy = numeric())

set.seed(10)
for (i in seq(1, 57, 2)) {
  result1 <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_label, k = i)
  accuracy <- sum(result1 == wbcd_test_label) / length(wbcd_test_label) * 100
  accuracies <- rbind(accuracies, data.frame(k = i, accuracy = accuracy))
  print(paste(i, '개 일때 정확도 ', accuracy))
}

# 정확도 데이터 프레임 확인
accuracies


final_result<-knn(train=Glass_train, test=Glass_test, cl=Glass_train_label, k=7)
library(gmodels)
confusionMatrix(final_result,Glass_test_label)​