긍정오류와 부정오류

2021. 7. 21. 01:29야구데이터분석 공부

긍정오류란 없는데 있다고 하는 오류이다.

부정오류란 있는데 없다고 하는 오류이다.

말만 들으면 무슨말인지 어려울수도 있다.

예를 들어보면 야구심판들이 스트라이크가 아닌데 스트라이크 라고 잘못 판단하는 오류는 긍정오류

스트라이크가 맞는데 아니라고 판단하는 오류는 부정오류이다.

 

긍정오류든 부정오류든 오류가 높을수록 분석에 사용된 요인과 모델은 배제할 필요가 있다.

판별을 위해 일반적으로 많이 사용되는 세가지 모델이 있다. 

1. 선형판별

2. 비선형 2차함수 판별

3. KNN

 

선형판별과 비선형 판별은 모수 판별분석이라서 현실에 대한 가정이 필요하다.

KNN은 현실에 대한 가정이 필요하지 않고 데이터를 통해 그려지는 경계선을 그린다.

그릴땐 가장 가까운 K개 점들의 거리를 고려해서 그려낸다.

KNN의 약점은 오버피팅이다. 

오버피팅은 어떤 데이터에만 적용되게(fit) 될수도있다는 의미이다.

한 모델에 완벽할수있지만 다른모델에는 약할수있다. 

그리고 찾아내는 과정에서 훈련용과 검증용을 8:2 로 나눠준다.

 

메이저리그 데이터를 이용해서 타자들이 내셔널리그인지 아메리칸리그인지 판단하는 모델을 만들어보자

판별모델을 만들기 위해서는 어떤 판별요인을 사용할 것인가를 결정해야한다.

타율,장타율을 고려해볼수도 있지만, 두리그의 차이가 컸다면 이미 문제가 생겼을것이다.

가장 잘 알려진 두 리그의 차이인 지명타자의 유무가 있다.

앞에서도 봤듯이 아메리칸리그팀의 타자들이 몸에 맞는 볼의 빈도가 내셔널리그팀의 타자들에 비해

높을 개연성이있다. 그리고 아메리칸 리그 감독들은 장타를 칠수있는 지명타자를 사용하기 때문에

장타율의 비율이 투수가 지명타자에 서는것보다 높을것이라는 예측이다.

그럼 장타율을 대변하는 2루타와 몸맞는볼을 보면 리그를 좀더 정확하게 구분할수 있을것이다.

 

library(Lahman)
b <- subset(Batting,yearID>1998&yearID<2012&AB>250)
b$X2Br <- b$X2B/b$AB #2루타
b <- subset(b,lgID == 'AL' | lgID == 'NL')
b$lgID <- ifelse(b$lgID == "AL",1,0)
b <- data.frame(b$yearID,b$X2Br,b$HBP,b$lgID)
colnames(b) <- c("yearID","X2Br","HBP","lgID") #년도,2루타비율,몸맞는볼,리그ID
b <- na.omit(b)

 

년도, 2루타비율, 몸맞는볼 , 리그ID를 넣은 데이터 b를 만든다.

이 데이터에 세가지 알고리즘을 적용한다.

선형판별,2차항 비선형판별, KNN

선형판별과 2차항 비선형판별은 모수판별 분석이기 때문에 적용에 대한 가정이 필요하다.

판별되는 경계선이 선형에 가까우면 선형판별, 포물선처럼 곡선에 가까우면 2차항 판별을 선택한다.

 

train <- subset(b,!(yearID == 2011))
test <- subset(b,yearID == 2011)
var_train = train[c(2,3)]
var_test = test[c(2,3)]
lg.train = train$lgID
lg.test = test$lgID

test 데이터와 train 데이터로 나눠준다.

 

판별정확성 = (정확한 예측값)/(긍정오류)+(부정오류)

 

1. 선형판별 모델

library(MASS)
#lda 선형모델 
ldafit <- lda(lgID~X2Br+HBP, data =test)
ldapred <- predict(ldafit)
a <- table(ldapred$class,test$lgID)
a
(a[1,1]+a[2,2])/(a[1,1]+a[2,1]+a[1,2]+a[2,2]) #판별정확성

0.5485075

2. 비선형 2차함수 판별모델

#qda 비선형모델
qdafit <- qda(lgID~X2Br+HBP, data = test)
qdapred <- predict(qdafit)
b <- table(qdapred$class,test$lgID)
b
(b[1,1]+b[2,2])/(b[1,1]+b[2,1]+b[1,2]+b[2,2])

0.5447761

3. KNN

#KNN
library(class)
knnpred <- knn(var_train,var_test,lg.train, k =3)
c <- table(knnpred,lg.test)

(c[1,1]+c[2,2])/(c[1,1]+c[2,1]+c[1,2]+c[2,2])

0.5634328

 

선형판별모델 = 54.85 %

 

비선형판별모델 = 54.48%

 

KNN = 56.34%

 

KNN이 가장 높은 확률을 보여준다.