2016년 4월 7일 목요일

로지스틱 회귀 모델

야구 선수들에 대한 3개의 데이터들을 관찰하고 있다고 가정하자.

키, 몸무게, 일생누적연습시간이다.

1. 189cm, 80kg, 1000시간
2. 173cm, 70kg, 1400시간
3. 180cm, 60kg, 110시간
4. 167cm, 70kg, 10022시간
....

그리고 이 선수들의 2014년도 성공여부가 Y, N으로 주어졌다.

즉,

1. 189cm, 80kg, 1000시간,  Y
2. 173cm, 70kg, 1400시간,  N
3. 180cm, 60kg, 110시간,   N
4. 167cm, 70kg, 10022시간, Y
....

와 같다.

자, 이와 같은 데이터가 많이 있다고 할 경우, 우리는
야구선수들의 키, 몸무게, 일생누적연습시간에 따른 2014년도 성공여부에 대한 모델을 만들 수 있다.

Y또는N이라는 2개의 분류 중 하나를 결정하는 것이기 때문에
로지스틱 회귀 모델이라는 것을 한번 사용해보자.


위에 해당하는 데이터는 존재하지 않으니까 임의로 생성을 하겠다.

R에서 데이터를 임의로 생성해서 data frame으로 만드는 과정부터 시작하겠다.

우선은 선수들의 키 정보를 임의로 생성하자.

height <- sample(165:200, 100, replace=T)

165:200 사이에서 중복 포함해서 100개의 숫자를 임의로 뽑아서 height라는 벡터에 넣었다. 

동일한 방법으로 몸무게와 연습시간을 임의로 생성한다. 

weight <- sample(60:100, 100, replace=T)
practice_hour <- sample(1000:10000, 100, replace=T) 

여기에다가 Y와 N까지 임의로 값을 주자. 

success <- sample(c('y','n'), 100, replace=T) 

자 그럼, 이 네가지 vector들을 묶어서 data_frame 으로 만들자. 

baseball.player <- data.frame(height, weight, practice_hour, success)

여기까지 진행한 것에 대한 데이터를 살펴보면 다음과 같다.

그럼, 이제 로지스텍 회귀모델을 돌려보자.

m <- glm(success ~., data=baseball.player, family="binomial")

파라메터 1: sucess를 설명해주는 모델을 만들어주세요~
파라메터 2: data는 baseball.player라는 data.frame을 봐주시구요~
파라메터 3: 2값중 하나로 구분해주세요~

모델은 m에 저장이 되었다.
그럼, 모델 m이 훈련 데이터에 대해 어떤 적합성을 가지는지 살펴보자.

f <- fitted(m)
f를 출력해보면 0~1 사이의 소수점값들이 들어가 있다.

이는, success가 Y일 확률을 생성한 모델에 의해 계산한 것이다.

그럼, 그 확률이 0.5 보다 크면 Y라고 하고, 낮으면 N 이라고 해보자.

 success.calc <- ifelse(f > 0.5, 'y', 'n')

모델에 의해 분류한 결과가 success.calc에 저장되었고  

원래 정답은 success 에 저장되어 있다.   

둘이 얼마나 같은지 비교해보자. 
result <- success.calc == success
result에는 success.calc와 success가 같으면 TRUE, 아니면 FALSE가 들어가 있다. 

sum(result) 
TRUE의 개수를 세보자.  


본인이 직접 해봤을 때는 

0.39를 기준값으로 하니, 맞은 개수가 55개였다. 



즉, 훈련 데이터를 반 조금 넘게 맞춘 모델이 생성된 것이다.

아무래도 데이터가 랜덤하게 생성이 되었으니, 모델도 의미있게 나오기가

힘들다.


그래도 로지스텍 회귀 모델의 개념과 사용법은 충분히 설명이 되었으리라 믿는다. (:






댓글 없음:

댓글 쓰기