이 과제는 Wisconsin Breast Cancer Diagnostic 데이터 집합을 가지고 유방암 진단을 하는 것이다.
KNN과 로지스틱 회귀의 2 방법을 사용하여 결과를 비교해 본다.
wbcd = read.csv("./wisc_bc_data.csv", stringsAsFactors=FALSE)
str(wbcd, list.len=7) # 변수 32개 중에 첫 7개만 보여준다.
'data.frame': 569 obs. of 32 variables: $ id : int 842302 842517 84300903 84348301 84358402 843786 844359 84458202 844981 84501001 ... $ diagnosis : chr "M" "M" "M" "M" ... $ radius_mean : num 18 20.6 19.7 11.4 20.3 ... $ texture_mean : num 10.4 17.8 21.2 20.4 14.3 ... $ perimeter_mean : num 122.8 132.9 130 77.6 135.1 ... $ area_mean : num 1001 1326 1203 386 1297 ... $ smoothness_mean : num 0.1184 0.0847 0.1096 0.1425 0.1003 ... [list output truncated]
첫 번째 변수는 ID이므로 분석에 사용되지 않는다.
두 번째 변수인 diagnosis가 반응변수이다. "M"은 Malignant(악성), "B"는 Benign(양성)을 의미한다.
나머지 30개의 변수들은 모두 연속형 예측변수이다.
# 분석에 사용되지 않는 첫 번째 변수를 삭제한다.
wbcd = wbcd[,-1]
str(wbcd, list.len=7)
'data.frame': 569 obs. of 31 variables: $ diagnosis : chr "M" "M" "M" "M" ... $ radius_mean : num 18 20.6 19.7 11.4 20.3 ... $ texture_mean : num 10.4 17.8 21.2 20.4 14.3 ... $ perimeter_mean : num 122.8 132.9 130 77.6 135.1 ... $ area_mean : num 1001 1326 1203 386 1297 ... $ smoothness_mean : num 0.1184 0.0847 0.1096 0.1425 0.1003 ... $ compactness_mean : num 0.2776 0.0786 0.1599 0.2839 0.1328 ... [list output truncated]
# 악성과 양성의 도수를 본다. (분석에 꼭 필요한 것은 아니다.)
table(wbcd$diagnosis)
B M 357 212
# wbcd$diagnosis를 팩터로 만든다. 그리고 수준 "B"와 "M"의 의미를 파악하기 쉽도록
# 이들에게 각각 레이블 "Benign"과 "Malignant"을 준다.
wbcd$diagnosis = factor(wbcd$diagnosis, levels=c("B", "M"), labels=c("Benign", "Malignant"))
table(wbcd$diagnosis)
Benign Malignant 357 212
# 악성과 양성의 비율을 본다. prop.table() (proportion of table) 함수를 사용한다.
round(prop.table(table(wbcd$diagnosis)), 3)
Benign Malignant 0.627 0.373
st.X = scale(wbcd[,-1])
# KNN에서 사용하는 "거리"가 의미를 가지도록 하기 위한 표준화 작업.
# 단, 반응변수인 첫 번째 변수는 제외.
test = 1:100 # 첫 100개의 레코드를 테스트 집합으로 사용할 것임.
# test.X, test.Y, train.X, train.Y를 얻는다.
..
# 이 부분에 코드를 넣을 것.
..
library(class) # knn() 함수를 사용하기 위함.
set.seed(1)
# KNN 분석을 하여 다음과 같은 출력을 얻는다. k=2를 사용한다.
..
# 이 부분에 코드를 넣을 것.
..
error_rate = 6.00%
test.Y knn.pred Benign Malignant Benign 34 5 Malignant 1 60
# .. 로 표시된 부분에 적절한 코드를 넣는다.
glm.fit = ..
# 인수 maxit=100를 넣으면 첫 번째 경고 메시지를 없앨 수 있다.
glm.pred.p = ..
glm.pred = rep("Benign", 100) # tentatively
.. # glm.pred.p > 0.5 이면 악성인 것으로 판단한다.
..
Warning message: “glm.fit: fitted probabilities numerically 0 or 1 occurred”
test.Y glm.pred Benign Malignant Benign 33 6 Malignant 2 59