02. 19 분석 피드백

2019. 2. 20. 09:58
  1. 필요한 자료를 몽땅가져오기 위해 inner join 한다면 -> 메인 테이블A의 key로 계속 B, C, ... key 연결
    순차적으로 할 시, B에 대해 또 C가 왕창 생겨서 엄청 뿔어난다.

  2. 각 테이블의 row가 다 똑같으면 inner join해도 상관없지만, 각각 row가 다른 상황 -> row가 제일 많은 메인테이블(Person테이블)left join으로 끼워넣어야함.
    아마도 메인 테이블이 가장 row가 많다. 각각의 부 테이블은 master테이블로서 row가 별로 없을 것이다.

  3. 데이터 그래프로 특이점이 발견되었다면, 그 데이터 세부적으로 더 분석해보기

ANOVA의 정의

ANalysis Of VAriance = 분산분석

  • 같은 카테고리라도 데이터(인종, 국가)마다 variance(분산) = variation(변동)의 평균이 다르므로 연구를 한다.
    ex> 전 세계 사람들의 BMI의 분산이 같다? -> 연구할 필요가 없다. / 같은 BMI라도 연구하는 곳마다 분산이 다르기 때문에, 연구할 가치가 있다.
  • 통계학은 variation(변동) = 분산이 우연에 의한 error인지 / effect있는 분산인지를 찾아내는 것이다.
  • 전체 변동 = factor A에 의한 변동 + factor B에 의한 변동 + ... + error가 다 포함되어있다. 이 전체 변동을 분할하여 어떤 요인에 의한 변동error에 비해 의미있는지를 밝힌다.

ANOVA를 이용한 3집단 비교( 그림내 분산->변동으로 수정해야함 )

  • 대 전제 : H0 : Ma = Mb = Mc (3집단의 평균이 모두 같다)

  • 3집단 이상부터는 분산 차이으로 -> 평균 차이를 해석한다.

    -위 그림처럼, 3집단의 평균차이는 명확하게 나타날 수 있다. 하지만 2집단간의 평균차이를 확인하기 위해서 각각을 3C2만큼 각각을 t-test해야한다.
    -분산분석을 활용해서 한번에 3집단 차이를 확인하는 원리는 아래와 같다.

    1) 3집단의 평균값을 찾는다.

    2) 3집단 평균 - 각 집단의 평균 (빨간색)의 차이를 보자.
    각 집단끼리 평균차이를 비교하는 것이 아니라, 전체 평균을 기준한 뒤 거기서의 차이만 비교하면 = 3집단의 평균차이도 비교 가능해진다.
    이것을 제곱해서 더하면, 분산의 개념이 된다. (분산 = 평균에서 떨어진 정도)

    3) 오른쪽 3집단간 평균의 차이가 별로 안나는 것과 비교했을 때,
    각 거리(편차)의 제곱(변동)을 다 더하면, 왼쪽 3집단이 훨씬 값이 크다 = 분산분석시 차이가 더 유의하게 나타난다.

  • 좀 더 자세히 알아보자.

    1) 3집단의 평균, 전체 평균이 있다.

    2) 위에서 말한 것과 유사하게 전체 변동(TSS) = 그룹내 변동 + 그룹간 변동으로 쪼갤 수 있다.
    그룹내 변동 : 각 그룹의 평균으로부터 떨어진 거리(의 제곱) = error
    그룹간 변동 : 전체평균을 기준으로 그룹의 평균까지의 거리(의 제곱) = effect
    전체 변동 = 그룹내 변동 + 그룹간 변동


    3) 그룹내 변동은 error이므로 적을 수록, 그룹간 변동은 effect이므로 높을 수록 3집단의 평균차이가 유의미해진다.
    전체 변동F검정F = effect(그룹간 변동)의 평균 / error(그룹내 변동)의 평균으로 측정되므로, error에 비해 effect가 얼마나 있는지로 구할 수 있다.

ANOVA(분산분석)의 종류

3개 집단 이상의 차이를 알아보는 ANOVA분석도 2개 집단의 비교인 독립표본 t-검정과 마찬가지로 아래 3가지 가정을 만족시켜야 시행할 수 있다.
1) 독립성
2) 정규성
3) 등분산성

  1. One way Anova(일원배치 분산분석) : 하나의 요인에 대한 3집단 이상의 분석

    • factor(독립변수) 1개 와 종속변수1개에서의 3집단 평균 비교
    • H0 : 3 집단간의 평균이 같다(차이없다, =) Ma = Mb = Mc
    • 전체변동 = factor 1에 의한 그룹간 변동(effect) + 그룹내 변동(error)
    • 자유도(df, Degree of freedom) : n개의 데이터 중 n-1개만 있으면 1개는 자동으로 알 수 있다. 이 때, 몇 개만 있으면 데이터를 알 수 있을까?에서 그 몇 개에 해당한다.
      ex> (1차원) 10개의 데이터 -> 9개만 있으면 다 알 수 있다.
      ex> (2차원 교차표) -> mxn행렬 -> m-1 * n-1 이 자유도이다.( 교차표에서 바깥쪽 합계는 미리 알고 있다고 가정하고 생각하면 된다.)
    • 분산분석의 과정 in SPSS
      1) 데이터에 따라 자유도가 결정
      2) 자유도에 의해 F분포가 정해짐
      3) 아노바 테이블에 의해 분석결과가 나옴 in SPSS
      (1) 그룹간(Between Groups) + 그룹내(Within Groups) = 전체(Total)변동의 값이 Sum of Square(편차를 제곱한 합=변동)으로 나타난다.
      (2) df(자유도)가 나타난다. 전체 -> 60개 데이터 -> 59 / 그룹간->3그룹이면 2 / 그룹내-> 전체자유도 59 - 그룹간 자유도 2 = 57 (그룹내 자유도 직접 구하는 법 모르겠음 )
      (3) Mean Sqaure = 변동들의 평균 = SS(변동들 합) / 자유도(n과 비슷)
      (4) F = 그룹간 변동들의 평균(MeanSquare) / 그룹내 변동들의 평균(MS)
      (5) Sig. = p-value 결정
      (6) 1), 2) 에서 정해진 F분포상에서 H0가 기각될지 안될지 판단함
    • 사후분석(Post-Hoc test = Multiple Comparison)
      1) H0( 집단간 평균차이 없다) 가 기각되었음 => 적어도 차이가 나는 집단이 하나는 존재 하는데, 어느 집단인지 구체적으로 알기 위한 것
      2) R상에서 알파벳이 다르게 나타나는 1개가 차이가 나는 집단이다
      ex> a b b : a만 평균차이가 나는 집단
    • 사후분석의 방법
      (1) 본페로니(가장 기본적이고 보수적) : 2개 집단끼리 nC2번 t-test를 하는데, 그때의 p-value의 유의수준을 0.05/n 으로 본다. 혹은 t-test에서 나온 p-value \* n 을 0.05와 비교한다.
      (2) 좀 더 완화시킨 방법들 : Tukey, scheffe, Duncan
      -Tukey : 반복수가 동일하다는 가정
      -Scheffe : 하나의 집단이 너무 클 때 사용
      -Duncan : 한꺼번에 세개를 비교할 때 사용
  2. Two way Anova : 두개 이상 요인에 대한 3집단 이상의 분석

    • facotor(요인)가 2개 이상이므로 전체변동 = factorA에 의한 변동 + factorB에 의한 변동 + error + A와 B의 상호작용 효과까지 고려해야한다.
      예를 들어, 수업 이해도(종속변수, 연속형)에 영향을 주인 요인으로서
      요인1 : 수업시 착석위치 ( 독립변수 X1 )
      요인2 : 출석점수( 독립변수 X2 ) 가 있다고 치자.
      이 때, 주성분X1 + X2이며, X1과 X2의 상호작용 효과인 X1:X2까지 고려해야한다. 그러므로, 구성될 수 있는 모델구성은 총 3가지다
      모델1 : Y ~ X1 + X2 (주성분만 포함)
      모델2 : Y ~ X1:X2 (상호작용 효과만 포함)
      모델3 : Y ~ X1 + X2 + X1:X2 = Y ~ X1 * X2

    • 상호작용 in R : 최대 2개 요인만 포함시키자.
      aov(종속변수(숫자) ~ 요인1(범주) + 요인2(범주) + 요인1\*요인2, data=data)
      결과로서 맨 마지막 줄의 Residuals = error에 비해, 각 요인들(주성분1, 주성분2, 상호작용효과3)들의 df(자유도) / Sum sq(변동(편차제곱)들이 합) / Mean sq(변동들의 평균) / F value(F검정 값:effect/error) / Pr(p-value)

    • 예시 들어보기 : 헤모글로빈 수치에 영향을 주는 요인2개 : 1)흡연이력 2)음주이력
      요인은 2개지만, 모델은 3가지 일 것이다.
      가설1 : 흡연이력에 따라 헤모글로빈 수치가 차이가 날 것이다.(Smoke effect)
      가설2 : 음주이력에 따라 헤모글로빈 수치가 차이가 날 것이다.(Alcohol effect)
      가설3 : 흡연이력(요인1)에 따른 헤모글로빈 수치의 양상(종속)음주이력 그룹(요인2)마다 다르다.(Interaction effect)
      (1) 상호작용 효과의 해석1 : Interaction plot(요인1는 x축, 요인2는 범례로 설정)한 뒤, 범례에 따라 변동이 있는지 없는지 본다.
      만약, 그래프가 평행하다면 : 요인2는 별로 영향이 없다. 만약, 그래프가 cross한다면, 요인1->종속변수에 요인2가 영향을 준다는 것을 의미한다.
      (2) 상호작용 효과의 해석2 : aov(헤모글로빈수치(종속변수) ~ 흡연이력(요인1) + 음주이력(요인2) + 요인1*요인2상호작용효과(요인1:요인2) )를 수행 한 뒤 summary()해보면, 3개의 모델이 생성되며 Pr(p-value)로 해석한다.
      만약, 상호작용효과(교호작용효과)에 대한 유의성 차이가 없다면 -> 요인1에 대한 종속변수가 요인2그룹마다 다르지 않다는 것을 의미. 상호작용효과를 제외하고 다시 aov()를 돌려야한다.
      (3) 상호작용효과를 제외한 이원배치 분산분석을 돌리는 것을 2 way ANOVA라 한다.

  3. 사후분석(Post-Hoc test, Multiple Comparison) : 3집단 이상에서 구체적으로 어느 두 집단끼리 차이가 있는지 확인

T 분포 ( Student's t - Distribution)

참고블로그 : https://m.blog.naver.com/PostView.nhn?blogId=mykepzzang&logNo=220853827288&proxyReferer=https%3A%2F%2Fwww.google.com%2F

  • 표본 평균으로 모집단의 정규분포 평균을 해석할 때 사용
  • 가설검정과 회귀분석에서도 자주 사용
  • 정규분포보다 꼬리가 더 두껍다. (n수가 작아도 예측범위가 더 넓다?)
  • 표본의 수(자유도도 관련)가 30이상이면 정규분포를 따르는 좌우대칭형
  • 만약 n수가 30이 안되면 t분포를 써서 예측해야한다.(좌우대칭형은 마찬가지)
  • t값( t score )로 두 집단간의 평균차이를 분석한다.
  • t score= 두 (표본)집단 평균의 차이 / 두 집단에서 계산된 표준편차(Sab)
    즉, 2집단의 표준편차(분산)이 고려된, 두 집단의 평균 차이
    두 표본의 평균차이가 크더라도, 한쪽이 분산이 엄청커서 벌어져있다고 가정해보자. 차이가 명확하게 안들어난다. 분산(표준편차)까지 고려한 평균의 차이가 t값이다.
  • ex> t분포에서 검정통계량 t가 크다? -> 분산고려되어 분자(A평균-B평균) 크다 -> 평균차이 크다!

T-test의 종류 3가지

  1. 단일표본 t검정
    • H0 : m = 50 (한 집단의 평균이 50이랑 같다)
    • 한 집단의 평균이 어떤 숫자와 같은지/다른지 비교한다.
  1. 대응표본 t검정

    • 1가지 가정이 만족되어야한다.
      1) 실험 후- 실험전 차이의 분포가 정규성을 따른다
      -만약, 정규성을 따르지 않는다면 => Wilcoxon signed rank test
    • H0 : 실험 전/후 간의 평균차이가 없다(=)
    • 한 집단의 실험 전/후 비교, 즉, 실험후 - 실험전 차이의 평균 = 0 인지/아닌지를 test
  2. 독립표본 t검정

    • 3가지 가정이 만족되어야한다.
      1) 두 집단간의 독립성 검정 : 사람이 판단함.
      -만약, 독립성이 없다 => 대응표본 t검정( 한집단의 전/후 )

      2) 각 집단의 정규성 검정( H0 : 정규분포를 따른다 -> p:0.05보다 커야 정규성 만족)
      (1) n > 30 : 중심극한정리(Central Limit Test)에 의해서 정규성 만족
      (2) 10 <= n <= 30 : Kolmogrov-Smirnov test or Shapiro-Wilk test
      (3) n < 10 : 정규성x로서 비모수적 방법 사용
      -만약, 정규성이 없다 => 비모수적 방법(평균비교x)인 Mann-Whitney test or Wilcoxon Rank-Sum test

      3) 두 집단간의 등분산성 검정( H0 : 두 집단의 분산은 같다 -> p:0.05보다 커야 정규성 만족)
      -만약, 두 집단이 분산이 다르다 => p가 0.05보다 작아서 등분산성을 만족하지 않으면 ->** 자유도를 수정하는 Welch t-test한다.
      **예외적으로 p-value가 0.05보다 커야 좋은 경우 2가지 : 정규성 검정, 등분산성 검정

    • H0 : 두 집단간에 평균차이가 없다(=)

    • 두 집단의 평균 차이를 본다.

  3. 보정된 t 검정

    • 두 집단가의 평균차이가 나긴 났는데, 다른 변수까지 끼워서 보정해놓고 검정한다.
    • 다른 변수를 보정시킨상태에서 해당 집단간의 차이가 유의하지 않다면, 그것은 진짜로 유의한 차이가 아닌 것이다.

상관계수

  • 숫자형 칼럼만 뽑는 2가지 방법 :
    1. str()확인후 직접 칼럼 여러개 인덱싱
    1. Filter( is.numeric, df )
# 데이터 준비
library(moonBook)
data(acs)

# 1. 상관계수(숫자-숫자)만 구하기 : na제거후 cor(칼럼인덱싱1, 칼럼인덱싱2)
cor(acs$height, acs$weight)
## [1] NA
cor(acs$height, acs$weight, use = "na.or.complete") # na 포함시 use옵션을 넣어줘야한다.
## [1] 0.6315767
# 2. 상관계수 매트릭스 : str() -> 숫자형칼럼만 뽑아서 cor(dataframe)
# - str()로 숫자형 칼럼만 인덱싱하여 df만들고 나서, dataframe 자체를 넣어준다.

str(acs) # age(1), EF(6), height(7), weight(8), BMI(9) 등
## 'data.frame':    857 obs. of  17 variables:
##  $ age             : int  62 78 76 89 56 73 58 62 59 71 ...
##  $ sex             : chr  "Male" "Female" "Female" "Female" ...
##  $ cardiogenicShock: chr  "No" "No" "Yes" "No" ...
##  $ entry           : chr  "Femoral" "Femoral" "Femoral" "Femoral" ...
##  $ Dx              : chr  "STEMI" "STEMI" "STEMI" "STEMI" ...
##  $ EF              : num  18 18.4 20 21.8 21.8 22 24.7 26.6 28.5 31.1 ...
##  $ height          : num  168 148 NA 165 162 153 167 160 152 168 ...
##  $ weight          : num  72 48 NA 50 64 59 78 50 67 60 ...
##  $ BMI             : num  25.5 21.9 NA 18.4 24.4 ...
##  $ obesity         : chr  "Yes" "No" "No" "No" ...
##  $ TC              : num  215 NA NA 121 195 184 161 136 239 169 ...
##  $ LDLC            : int  154 NA NA 73 151 112 91 88 161 88 ...
##  $ HDLC            : int  35 NA NA 20 36 38 34 33 34 54 ...
##  $ TG              : int  155 166 NA 89 63 137 196 30 118 141 ...
##  $ DM              : chr  "Yes" "No" "No" "No" ...
##  $ HBP             : chr  "No" "Yes" "Yes" "No" ...
##  $ smoking         : chr  "Smoker" "Never" "Never" "Never" ...
acs2 <- acs[ , c(1, 6, 7, 8, 9)] # 숫자형 칼럼만 뽑기
cor(acs2)
##        age EF height weight BMI
## age      1 NA     NA     NA  NA
## EF      NA  1     NA     NA  NA
## height  NA NA      1     NA  NA
## weight  NA NA     NA      1  NA
## BMI     NA NA     NA     NA   1
cor(acs2 , use = "na.or.complete")
##                age           EF       height      weight         BMI
## age     1.00000000 -0.062814463 -0.401352041 -0.42825035 -0.22291089
## EF     -0.06281446  1.000000000 -0.001477943  0.07494425  0.09332209
## height -0.40135204 -0.001477943  1.000000000  0.63285106 -0.00198798
## weight -0.42825035  0.074944253  0.632851060  1.00000000  0.76568388
## BMI    -0.22291089  0.093322093 -0.001987980  0.76568388  1.00000000
# 3. 상관계수 heatmap : corrplot(  cor(df, use="na.or.complete") )
# install.packages("corrplot")
library(corrplot)
## corrplot 0.84 loaded
corrplot(cor(acs2, use="na.or.complete")) # 원형

corrplot(cor(acs2, use="na.or.complete"), method = "square") # 사각형

corrplot(cor(acs2,use="na.or.complete"),method="ellipse") # 타원

corrplot(cor(acs2,use="na.or.complete"),method="number") # *상관계수 매트릭스 색으로

corrplot(cor(acs2,use="na.or.complete"),method="shade") # 사각형 + 빗금

corrplot(cor(acs2,use="na.or.complete"),method="color") # 사각형

corrplot(cor(acs2,use="na.or.complete"),method="pie") # pie차트 형식

상관계수의 종류별 테스트

  • 기본 : 1. 피어슨 상관계수 - 정규성을 따르는 숫자-숫자의 상관관계
  • 비모수 : 2. 스피어만 순위 상관계수, 3. 켄달의 타우
# 데이터 준비
# Filter( 칼럼에 대한 조건, data )를 통한 숫자형 칼럼 인덱싱
acs2 <- Filter( is.numeric , acs )
head(acs2)
##   age   EF height weight      BMI  TC LDLC HDLC  TG
## 1  62 18.0    168     72 25.51020 215  154   35 155
## 2  78 18.4    148     48 21.91381  NA   NA   NA 166
## 3  76 20.0     NA     NA       NA  NA   NA   NA  NA
## 4  89 21.8    165     50 18.36547 121   73   20  89
## 5  56 21.8    162     64 24.38653 195  151   36  63
## 6  73 22.0    153     59 25.20398 184  112   38 137
# 참고. 문자형 칼럼 인덱싱
acs3 <- Filter (is.character, acs)
head(acs3)
##      sex cardiogenicShock   entry              Dx obesity  DM HBP smoking
## 1   Male               No Femoral           STEMI     Yes Yes  No  Smoker
## 2 Female               No Femoral           STEMI      No  No Yes   Never
## 3 Female              Yes Femoral           STEMI      No  No Yes   Never
## 4 Female               No Femoral           STEMI      No  No  No   Never
## 5   Male               No  Radial          NSTEMI      No Yes Yes  Smoker
## 6 Female               No  Radial Unstable Angina     Yes Yes Yes   Never
# 0. 기본데이터를 이용해서, 산점도 + 선헝회귀선 + 상관관계 구해보기
data  <- data.frame(
  a = c(15,20,25,27,31,25,23,23,42,12,34,23,40),
  b = c(50,55,52,52,56,54,62,56,70,46,43,50,54)
)
plot(data$a, data$b)  # 산점도
# lm(data$a ~ data$b) # 두 변수간의 선형회귀를 통한 기울기+절편이 담겨있는 직선식
abline(lm(data$b ~ data$a)) # 산점도에 그린  y축 ~ x축 순서대로 해야 나온다!!

cor(data$a, data$b) # 상관계수
## [1] 0.433905
# 14번째 행으로 아웃라이어 추가
data[14,] = c(200, 230) # 아웃라이어 1개 추가로 인해 선형회귀 + 상관계수가 달라진다.

plot(data$a, data$b)  # 산점도
abline(lm(data$b ~ data$a)) # 산점도에 그린  y축 ~ x축 순서대로 해야 나온다!!

cor(data$a, data$b) # 상관계수
## [1] 0.9852541
# 1. 피어슨 상관계수 by cor와 상관계수 heatmap by corrplot
# 1_1. 상관계수
cor(acs2, use = "na.or.complete")
##                age          EF       height      weight          BMI
## age     1.00000000 -0.05240312 -0.399852042 -0.42569584 -0.221490011
## EF     -0.05240312  1.00000000 -0.014042881  0.06543177  0.090386043
## height -0.39985204 -0.01404288  1.000000000  0.63089489 -0.002069904
## weight -0.42569584  0.06543177  0.630894886  1.00000000  0.767190062
## BMI    -0.22149001  0.09038604 -0.002069904  0.76719006  1.000000000
## TC     -0.18357028  0.07467456 -0.077176366  0.01897155  0.084842113
## LDLC   -0.15973875  0.03663333 -0.039607198  0.05826248  0.105221247
## HDLC   -0.02621982  0.01099877 -0.085782836 -0.10664527 -0.058842589
## TG     -0.22143405  0.15153722  0.034817498  0.17231426  0.183409287
##                 TC        LDLC        HDLC          TG
## age    -0.18357028 -0.15973875 -0.02621982 -0.22143405
## EF      0.07467456  0.03663333  0.01099877  0.15153722
## height -0.07717637 -0.03960720 -0.08578284  0.03481750
## weight  0.01897155  0.05826248 -0.10664527  0.17231426
## BMI     0.08484211  0.10522125 -0.05884259  0.18340929
## TC      1.00000000  0.82328304  0.27272521  0.27757126
## LDLC    0.82328304  1.00000000  0.09587078  0.06600925
## HDLC    0.27272521  0.09587078  1.00000000 -0.15468035
## TG      0.27757126  0.06600925 -0.15468035  1.00000000
# 1_2. 히트맵
# install.packages("corrplot")
library(corrplot)
corrplot( cor(acs2, use = "na.or.complete"), method = "number") # 상관계수 matrix

corrplot( cor(acs2, use = "na.or.complete"), method = "color" ) # 상관계수 heatmap

# 2. spearman 순위 상관계수 : 비모수적 상관계수1
cor(acs2$height,acs2$weight,method="spearman", use = "na.or.complete") # 0.6379538
## [1] 0.6379538
# 3. kendall's tau : 비모수적 상관계수2
cor(acs2$height,acs2$weight,method="kendall", use = "na.or.complete") # 0.4749274
## [1] 0.4749274

산점도 매트릭스

# 1. 산점도 매트릭스 + 자신의 히스토그램 : psych 패키지 - pairs.panels( df ) 함수
# - na처리 안해도 알아서 해준다.
# install.packages("psych")
library(psych)
pairs.panels( acs2 )

# 2. 산점도 매트릭스 + 자신의 히스토그램 + @ : PerformanceAnalytics 패키지의 chart.Correlation 함수
# install.packages("PerformanceAnalytics");
library(PerformanceAnalytics)
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
chart.Correlation(acs2, histogram = TRUE, pch = 19) # baseplot의pch점의모양

XLHscroll.7z

엑셀이 설치된 컴퓨터에서 아래 압축파일의 압축을 풀고 설치만 해주면 끝!

사용법 : shift + 마우스 휠

+ Recent posts