Date:     Updated:

카테고리:

태그: , ,


💡 R을 처음 배우기 위해 공부한 책입니다. 책에서 공부한 내용을 정리하고, 이를 기반으로 직접 문제를 만들어 풀이해보는 식으로 학습했습니다. KBO, MLB 야구 기록들을 csv 파일로 크롤링하여 문제에 사용했고, 야구 데이터 패키지인 Lahman을 토대로 문제를 만들기도 했습니다.


책 소개

Do it! 쉽게 배우는 R 데이터 분석


13. 통계 분석 기법을 이용한 가설 검정

13-1. t검정

t-test는 두 집단 평균에 통계적으로 유의한 차이가 있는지 알아볼 때 사용하는 통계 분석 기법이다. R에 내장된 t.test()를 이용하면 된다.

우선 mpg 데이터를 불러와 class, cty 변수만 남기고 classcompactsuv만 남긴다.

mpg <- as.data.frame(ggplot2::mpg)
mpg_diff <- mpg %>%
  select(class, cty) %>%
  filter(class %in% c("compact", "suv"))

t.testdata 매개변수에 분석할 데이터를 입력하고, 두번째 인수에 비교할 두 값을 ~기호로 연결해준다. 집단의 분산이 같다면 var.equalT를 지정한다.

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)