33번
- 요인factor는 분류할 때 쓰는 자료 형식data type입니다. 예를 들어 남자/여자라던가 개/고양이/토끼 같은 게 factor가 됩니다. 겉보기에는 문자열처럼 보이지만 사실 남자는 0 여자는 1 같은 숫자로 되어 있습니다.
- 요인에 summary()함수를 쓰면 각 요인의 개수를 세서 출력해줍니다. 그러니 15.4 밑을 보면 몇 번 나왔는지 알 수 있겠죠.
- double같은 numeric형식으로 변환할 때 as.numeric()을 쓸 수 있습니다. 사실 변환할 때는 항상 as.데이터타입() 함수를 사용합니다.
- 하지만 factor는 숫자라고 해도 평균값을 구할 수 없습니다. 토끼 3마리와 고양이 2마리가 있을 때, 평균은 2.5마리가 아니라 그저 토끼는 3마리 있고 고양이는 2마리 있는 겁니다.
35번
직접 해보시면 알겠지만 1은 행 방향이고 2가 열 방향입니다. apply()의 행렬 방향을 묻는 문제가 많이 나옵니다. 잘 모르겠다면 R기초 강좌에서 apply를 설명해두었으니 참고하세요.
36번
paste 함수는 다음과 같이 사용합니다. 자세한 실습은 R기초에 문자열 함수 설명을 참고하세요.
> airquality Ozone Solar.R Wind Temp Month Day 1 41 190 7.4 67 5 1 2 36 118 8.0 72 5 2 3 12 149 12.6 74 5 3 4 18 313 11.5 62 5 4 5 NA NA 14.3 56 5 5 > airquality['Month.Day'] = paste(airquality$Month, airquality$Day, sep = '-') > airquality Ozone Solar.R Wind Temp Month Day Month.Day 1 41 190 7.4 67 5 1 5-1 2 36 118 8.0 72 5 2 5-2 3 12 149 12.6 74 5 3 5-3 4 18 313 11.5 62 5 4 5-4 5 NA NA 14.3 56 5 5 5-5
44번
#스위스는 이렇게 생긴 출산율 내장 데이터입니다. swiss Fertility Agriculture Examination Education Catholic Infant.Mortality Courtelary 80.2 17.0 15 12 9.96 22.2 Delemont 83.1 45.1 6 9 84.84 22.2 Franches-Mnt 92.5 39.7 5 5 93.40 20.2 Moutier 85.8 36.5 12 7 33.77 20.3 Neuveville 76.9 43.5 17 15 5.16 20.6
모델은 역시 자주 나오는 선형 회귀입니다.
# .은 흔히 쓰이는 프로그래밍 은어인데, 전체 변수라는 뜻입니다. # 이 중에 - Examination 을 제외한 4가지 변수를 이용해 선형 회귀를 합니다. > model = lm(fomula = Fertility ~ . -Examination, data = swiss) Warning message: In lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : extra argument ‘fomula’ will be disregarded #summary함수를 써서 모델의 결과를 요약 정리해서 봅니다. > summary(model) Call: lm(data = swiss, fomula = Fertility ~ . - Examination) Residuals: Min 1Q Median 3Q Max -15.2743 -5.2617 0.5032 4.1198 15.3213 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 66.91518 10.70604 6.250 1.91e-07 *** Agriculture -0.17211 0.07030 -2.448 0.01873 * Education -0.87094 0.18303 -4.758 2.43e-05 *** Catholic 0.10412 0.03526 2.953 0.00519 ** Infant.Mortality 1.07705 0.38172 2.822 0.00734 ** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 7.165 on 41 degrees of freedom Multiple R-squared: 0.7067, Adjusted R-squared: 0.671 F-statistic: 19.76 on 5 and 41 DF, p-value: 5.594e-10
- 변동성을 몇 프로 설명하는지는... 하단에 있는 Multiple R-squared를 보면 알 수 있습니다. 한국어로는 설명력 또는 결정 계수라고 부릅니다.
- Education의 Estimate값을 보면 음수입니다. 출산율과 음의 상관관계가 있다는 뜻입니다. 교육수준이 높을 수록 출산률이 감소하겠네요.
- 무엇이 가장 유의한 변수인지는 t값의 Pr(>|t|)를 보면 알 수 있습니다. 가장 작은 게 가장 유의한 겁니다. 저희 모델에서는 상수 절편인 intercept를 무시하면... 교육수준이 가장 작습니다. e-05는 10^-5 라는 뜻인데요. 소수점 아래로 5칸 내려간다는 뜻입니다. 유의한 변수 일 수록 ***을 많이 달아주기 때문에 한 눈에 알아볼 수 있습니다.
- 모든 Pr(>|t|)값이 0.05보다 작으니 통계적으로 유의합니다. 선형회귀를 했으니까 출산률과 설명변수 간에 선형관계가 존재하겠네요.
45번
이번 문제에서 사용한 데이터는 미국 50개 주의 기대수명과 문맹률 등을 기록한 state.x77 내장 데이터입니다.
> state.x77 Population Income Illiteracy Life Exp Murder HS Grad Frost Area Alabama 3615 3624 2.1 69.05 15.1 41.3 20 50708 Alaska 365 6315 1.5 69.31 11.3 66.7 152 566432 Arizona 2212 4530 1.8 70.55 7.8 58.1 15 113417 Arkansas 2110 3378 1.9 70.66 10.1 39.9 65 51945 California 21198 5114 1.1 71.71 10.3 62.6 20 156361
안타깝게도 이 데이터는 행렬로 되어 있습니다. 그대로 넣으면 에러가 납니다. 데이터 프레임으로 바꿔줍니다.
> model = lm(formula = 'Life Exp' ~ Illiteracy, data = state.x77) Error in model.frame.default(formula = "Life Exp" ~ Illiteracy, data = state.x77, : 'data'는 행렬 또는 배열이 아닌 반드시 데이터 프레임이어야 합니다 > st = as.data.frame(state.x77) #띄어쓰기가 마음에 안 드니 이름도 좀 바꿔줍니다. > names(st)[4] <- c("LifeExp")
자 이제 또 선형 회귀를 하면 됩니다. 문맹률로 기대 수명을 예측하는 거죠. 선형 회귀는 정말 질리도록 하게 될 테니 잘 봐두세요.
> model = lm(formula = LifeExp ~ Illiteracy, data = st) > summary(model) Call: lm(formula = LifeExp ~ Illiteracy, data = st) Residuals: Min 1Q Median 3Q Max -2.7169 -0.8063 -0.0349 0.7674 3.6675 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 72.3949 0.3383 213.973 < 2e-16 *** Illiteracy -1.2960 0.2570 -5.043 6.97e-06 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 1.097 on 48 degrees of freedom Multiple R-squared: 0.3463, Adjusted R-squared: 0.3327 F-statistic: 25.43 on 1 and 48 DF, p-value: 6.969e-06
자 다시 문제로 돌아옵니다. 우리는 피어슨 상관계수를 구해야 합니다. 상관계수는 두 데이터가 얼마나 관련이 있는지 보여주는 계수입니다. 둘이 완전히 정비례하면 1의 값이 나오고, 전혀 비례하지 않으면 0이 나옵니다. 서로 완전히 반비례하는 관계라면 -1이 나올 겁니다. 예컨데 여러분이 공부한 시간과 ADsP시험 성적은 양의 상관관계가 있겠죠...
(당연하지만 피어슨 말고 다른 상관계수도 있습니다. 시험에는 안 나올 겁니다. 아마도.)
상관계수는 원래 공분산끼리 곱한 다음 평균을 나눠서 구합니다. 하지만 선형 회귀의 결과에는 그런 건 안 알려주죠. 그러면 어떻게 구할까요?
바로 결정계수 Multiple R-squared: 0.3463 를 이용해서 구합니다. 사실 잘 몰라도 선택지를 보면 눈치를 채죠. 상관계수를 제곱하면 결정계수가 나옵니다. 그러니 거꾸로 결정계수에 루트 씌워주면 상관계수가 나오죠.
피어슨 상관계수^2 = Multiple R-squared 결정계수
피어슨 상관계수 = sqrt(Multiple R-squared) #sqrt는 제곱근(루트)을 뜻하는 프로그래밍 함수입니다.
그런데 잠깐 아직 끝이 아닙니다. 9의 제곱근, 다시 말해 제곱해서 9가 되는 숫자는 3 말고 -3도 있죠. 그러니 플러스인지 마이너스인지 알아야 합니다. 저희 모형에서 Estimate 부분을 보면요. 상관관계가 음의 방향입니다. 당연히 상관계수도 음수인데, 제곱하면서 결정계수에서는 마이너스 부호가 안 보이는 겁니다. 사라진 마이너스 부호를 다시 붙여주면 답은 4번 입니다.
46번
다시 airquality 내장 데이터를 이용합니다.
#이번에도 선형 회귀를 합니다. > airmodel <- lm(formula = Ozone ~ Wind, data = airquality) #plot함수로 모델의 그래프를 2x2로 그리라 하면 잔차도와 q-q플롯이라는 걸 그려줍니다. > par(mfrow = c(2, 2)) > plot(airmodel)
이 중에 좌측 상단이 우리가 찾는 그래프입니다. 딱봐도 U모양으로 기울어진 게 바람을 매개변수로 오존을 예측하기는 글러먹었구나 알게 해줍니다. 잔차 간에 등분산성도, 종속변수와 설명변수 간에 선형성도 없습니다. 게다가 매우 위에 있는 117 같은 이상치도 보입니다.
하지만 이 잔차도를 보고 잔차들 간에 상관관계가 있는지, 독립성이 위배되는지는 알 수 없습니다.