[R] Do It R 8편 t검정, 상관분석
카테고리: R
💡 R을 처음 배우기 위해 공부한 책입니다.
책에서 공부한 내용을 정리하고, 이를 기반으로 직접 문제를 만들어 풀이해보는 식으로 학습했습니다.
KBO, MLB 야구 기록들을 csv 파일로 크롤링하여 문제에 사용했고,
야구 데이터 패키지인 Lahman
을 토대로 문제를 만들기도 했습니다.
책 소개
13. 통계 분석 기법을 이용한 가설 검정
13-1. t검정
t-test는 두 집단 평균에 통계적으로 유의한 차이가 있는지 알아볼 때 사용하는 통계 분석 기법이다. R에 내장된 t.test()
를 이용하면 된다.
우선 mpg
데이터를 불러와 class
, cty
변수만 남기고 class
는 compact
와 suv
만 남긴다.
mpg <- as.data.frame(ggplot2::mpg)
mpg_diff <- mpg %>%
select(class, cty) %>%
filter(class %in% c("compact", "suv"))
t.test
는 data
매개변수에 분석할 데이터를 입력하고, 두번째 인수에 비교할 두 값을 ~기호로 연결해준다. 집단의 분산이 같다면 var.equal
에 T
를 지정한다.
t.test(data=mpg_diff, cty~class, var.equal=T)
#결과
Two Sample t-test
data: cty by class
t = 11.917, df = 107, p-value < 2.2e-16
alternative hypothesis: true difference in means between group compact and group suv is not equal to 0
95 percent confidence interval:
5.525180 7.730139
sample estimates:
mean in group compact mean in group suv
20.12766 13.50000
p-value
가 유의확률을 의미한다. 일반적으로 **p-value
가 0.5 미만**이면 집단 간 차이가 통계적으로 유의하다고 해석한다.
❓ 문제.
2019년 MLB에서 포지션 별로 도루 개수가 유의미한 차이가 있는지 알아보려고 한다. 비교대상은 유격수와 포수이고, 40경기 이상 출전한 선수를 대상으로 한다.
💡 정답.
bat_2019 <- Batting %>%
filter(yearID==2019 & G>=40)
fie_2019 <- Fielding %>%
filter(yearID==2019)
player_2019 <- left_join(bat_2019, fie_2019,by="playerID")
player_2019_SB <- player_2019 %>%
select(playerID, POS, SB.x) %>%
filter(POS %in% c("SS","C"))
head(player_2019_SB)
t.test(data = player_2019_SB, SB.x~POS, var.equal=T)
#결과
Two Sample t-test
data: SB.x by POS
t = -5.5016, df = 173, p-value = 1.336e-07
alternative hypothesis: true difference in means between group C and group SS is not equal to 0
95 percent confidence interval:
-7.625180 -3.598501
sample estimates:
mean in group C mean in group SS
1.057971 6.669811
13-2. 상관분석
상관분석은 두 연속 변수가 서로 관련이 있는지 검증하는 기법이다. 상관계수(correlation coefficient)로 두 변수가 얼마나 관련되어 있는지 알 수 있다. 상관계수는 -1에서 1의 값을 지니고 절댓값이 1에 가까울수록 관련성이 큼을 의미한다. 양수면 정비례, 음수면 반비례 관계이다.
R에 내장된 cor.test()
를 이용하면 상관분석을 할 수 있다.
economics <- as.data.frame(ggplot2::economics)
cor.test(economics$unemploy, economics$pce)
#결과
Pearson's product-moment correlation
data: economics$unemploy and economics$pce
t = 18.63, df = 572, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.5608868 0.6630124
sample estimates:
cor
0.6145176
여러 변수의 관련성을 한 눈에 알아보고자 할 경우, 상관행렬을 만들면 된다. R에 내장된 mtcars
데이터를 이용해 상관행렬을 만들어보자. cor()
을 이용하면 상관행렬을 만들 수 있다.
mpg cyl disp hp drat wt qsec vs
mpg 1.00 -0.85 -0.85 -0.78 0.68 -0.87 0.42 0.66
cyl -0.85 1.00 0.90 0.83 -0.70 0.78 -0.59 -0.81
disp -0.85 0.90 1.00 0.79 -0.71 0.89 -0.43 -0.71
hp -0.78 0.83 0.79 1.00 -0.45 0.66 -0.71 -0.72
drat 0.68 -0.70 -0.71 -0.45 1.00 -0.71 0.09 0.44
wt -0.87 0.78 0.89 0.66 -0.71 1.00 -0.17 -0.55
qsec 0.42 -0.59 -0.43 -0.71 0.09 -0.17 1.00 0.74
vs 0.66 -0.81 -0.71 -0.72 0.44 -0.55 0.74 1.00
corrplot()
을 이용하면 상관행렬을 히트맵으로 시각화할 수 있다.
install.packages("corrplot")
library(corrplot)
corrplot(car_cor)
corrplot(car_cor, method="number")
col <- colorRampPalette(c("#BB4444","#FFFFFF","#77AADD","#4477AA"))
corrplot(car_cor,
method='color', #색깔로 표현
col = col(200), #색상 200개 선정
type = 'lower', #대각성분 아래쪽 행렬만 표시
order = 'hclust', #유사한 상관계수끼리 군집화
addCoef.col = 'black', #상관계수 색깔
tl.col = 'black', #변수명 색깔
tl.srt = 45, #변수명 45도 기울임
diag = F) #대각성분 제외
❓ 문제.
MLB의 타자 스탯들 간의 상관행렬을 만들고 이를 시각화하라. 단, 2018년부터의 데이터를 사용하고, 스탯은 가중출루율, 타율, 볼넷대비삼진, 순수장타율, 출루율, 도루성공률, 장타율, 병살타, 안타를 사용하라.
💡 정답.
install.packages("corrplot")
library(corrplot)
Batting_cor <- Batting %>%
filter(yearID>=2018) %>%
mutate(wOBA = round((0.691*(BB-IBB) + 0.722*HBP + 0.884*(H-X2B-X3B-HR) + 1.257*X2B + 1.593*X3B + 2.058*HR)/(AB+BB-IBB+SF+HBP),3)) %>%
mutate(avg = round(H/AB,3)) %>%
mutate(spb = round(SO/BB,3)) %>%
mutate(BABIP=round((H-HR)/(AB-SO-HR+SF),3)) %>%
mutate(OBP = round((H+BB+HBP)/(AB+BB+HBP+SH),3)) %>%
mutate(SBA = round(SB/(SB+CS),3)) %>%
mutate(SLG = round(((H-X2B-X3B-HR)+X2B*2+X3B*3+HR*4)/AB,3)) %>%
filter(AB>=100) %>%
filter(!is.na(SBA)) %>%
select(wOBA, avg, spb, BABIP, OBP, SBA, SLG, RBI, GIDP, H)
bat_cor <- cor(Batting_cor)
corrplot(bat_cor)