[R/R studio] 가설검정, 이상치, 결측치, PSM, 확률분포

 

통계적 추론(가설검정)

통계적 추론: 통계적 추론은 추정(표본집단->모집단, sample->population, 점추정&구간추정)과 가설검정으로 나눌 수 있다.

 

여기서 추정(estimation)은 위에서 약술한 바와 같이 표본을 이용하여 모집단의 어떤 미지의 값을 추측하는 과정을 추정이라고 한다.

가설검정(testing hypothesis)은 칼 포퍼라는 영국/오스트라의 철학자의 "과학은 반증가능성, 반박가능성, 시험가능성을 가져야 한다."는 반증주의에서 출발한다.

여기서 반증가능성이란 검증하려는 가설이 실험이나 관찰에 의해서 반증될 수 있는 가능성을 뜻한다.

그리고 이 가설검정 또한 표본을 이용하여 모집단에 대한 어떤 주장 또는 가설의 옳고 그름 혹은 채택(Accept) 기각(reject)을 결정하는 과정을 말한다.

 

여기서 "통계적으로 유의하다"라는 뜻은 "확률적으로 단순한 우연에 의한 결과가 아니다"라는 의미를 가질 수 있다는 뜻이다.

(전체 변동 중 에러 대비 이펙트가 얼마나 큰가)

 

가설검정은 다음과 같은 절차를 가진다.

1. 가설검정(귀무가설(null hypothesis, 평상시 알고있던 사실, =로 연결되는 명제, 아무런 변화나 효과가 없는 가설)과 대립가설(alternative hypothesis, 알고자 하는 사실, =/=(not equal)로 연결되는 명제, 차이가 있음을 나타내는 가설, 주장하고자 하는 가설)을 결정)

2. 검정통계량 산출(실제 데이터를 가지고 계산해낸 결과, 이 검정통계량으로 유의확률이 계산된다.)

3. 검정 유의수준 결정(유의수준(alpha): 연구자가 정하는 허용한계, 전체 실험 결과 중 몇번의 오차까지를 허용할 지)

4. 검정 결과 해석(유의확률(p-value)이 유의수준(기각역)을 넘지 못하면 대립가설을 채택하지 않는다(귀무가설을 기각하지 않는다), 아니면 대립가설을 채택(귀무가설을 기각))

 

기본적으로 가설검정은 귀무가설이 참이라는 가정을 깔고 진행하게 된다.

 

보통 통계학에서 statistical~ 이 붙으면 sample에 대해서 진행하는 것이라고 생각할 수 있다.

 

귀무가설에 대하여 채택/기각 및 참/거짓을 표로 나타내면 아래와 같다.

  귀무가설 채택 귀무가설 기각
귀무가설 참 O 잘못된 결론 (1종 오류, alpha)
귀무가설 거짓 잘못된 결론 (2종 오류, beta) O

여기서 1종오류는 사실 없는데(귀무가설 참) 있다고(귀무가설 기각) 하는 오류이고, 2종오류는 사실 있는데(귀무가설 거짓) 없다고(귀무가설 채택) 하는 오류이다.

여기서 1종오류와 2종오류 둘 중 어떤 것이 더 문제일까?

효과가 없는데 있다고 하는 것은 사기행위와 같으니 1종 오류가 더 문제가 크다. 말그대로 1종오류를 범하게되면 통계적으로 사기를 치게 되는 것이다!

그리고 대자연에서 우가우가 하던 시절 호랑이가 있는데 없다고 판단하는 오류를 범했던(2종 오류) 사람들은 전부 잡아먹혀서 2종 오류를 범하는 사람은 거의 없다는 썰도 있다. (믿거나 말거나)

 

그리고 여기서 1종 오류를 범할 확률의 최대 허용 한계를 유의수준이라고 한다.

 

즉, 유의수준(alpha)을 정했을 때, 이 유의수준보다 유의확률(p-value)이 적게 나와야 1종 오류가 발생할 확률이 유의수준보다 떨어지고, 비로소 실험자는 이것을 바탕으로 귀무가설을 기각하고 대립가설을 채택할 수 있게 된다.

 

여기서 유의확률을 제대로 이해하여야 하는데, 유의확률은 "대립가설이 주장하는 바가 맞는 정도"가 아니라 정확하게 "귀무가설이 옳지만, 귀무가설을 기각하고 주장한 대립가설이 1종 오류를 범할 확률이 5% 미만이다."라는 뜻으로 "해당 데이터는 유의미한 데이터이다."라는 뜻이다.

 

그리고 추가적으로 정말 특수한 경우가 아니면 양측검정을 하게 되며, 이 경우 각 단측에 대해서는 유의수준이 반으로 줄어들게 된다.

 

이상치/결측값 처리

사실 데이터 분석에 있어서 대부분의 시간과 에너지는 데이터를 수집하고 전처리하는데 사용하게 된다. 그리고 이 과정에서 필요한 부분이 EDA를 통해 데이터의 이상치(outlier)를 발견하고, 결측치를 확인하여 처리하는 것이다.

 

이상치(outlier)

이상치란 데이터의 전체적인 패턴에서 동떨어진 관측 값을 말한다. 즉, 아주 작은 값이나 아주 큰 값을 말하는데, 보통 y값에 대하여 다른 자료들과 동떨어진 데이터를 이상치(outlier)라고 말한다.

 

영향점((high) leverage point)

영향점이란 이상치와 비슷하게 전체적인 패턴에서 동떨어진 관측 값을 말하지만, 이상치와는 다르게 x축으로 극단적인 값을 가지는 것을 영향점이라고 따로 말한다.

 

그리고 두 수치를 전부 합쳐 influential observations라고 부른다.

 

보통 이상치와 같은 경우 box plot이나, scatter plot을 통해 시각적으로 확인하는 것이 가장 빠르고 확실하다. 혹은 domain knowledge로 말도 안되는 수치들을 확인 가능하다.

특히 단변수 박스 플롯의 경우 이상치를 제대로 파악할 수 없기 때문에 이변수 산점도로 확인해보는 것이 필요하다.

 

이상치는 연구자의 실수(데이터 기록 오류, 단위 오류, 실험 오류, 역코딩)일 때가 많지만, 자연적으로 발생하는 black swan일 수도 있기 때문에 무조건적으로 배제하면 안되고, 사실 숙고가 많이 필요하다.

 

이 이상치는 세가지로 구분이 가능한데, 첫번째는 의도적인 이상치(흡연에 대하여 10대를 대상으로 조사하였을 때), 두번째는 표본 이상치(표본을 잘못 뽑은 경우), 세번째는 자연 이상치(전체 사회인 연봉에 대하여 임원급을 넣는 경우) 등이 있다.

 

 

이제 이상치와 결측값을 어떻게 처리할까에 대한 이슈가 남았다.

여기서는 일단 가장 간단하게 삭제를 할 수 있다. 그러나 이 방법은 데이터 로스를 가져올 수 있다.

두번째로는 대치(imputation)라는 방법이 가능하다.

대치하는 방법으로는 전체 평균을 입력하는 방법, 혹은 통계적으로 해당 변수에 대한 예측 모델을 만들어서 예측(conditional imputation)이 가능하다.

또 다른 방법으로는, 상/하한을 결정한뒤 상/하한을 넘는 데이터에 대해서는 상/하한으로 맞춰주는 방법이 있다.

대치하는 경우 완전히 값이 random한 값을 대치할 수도 있지만, 보통 대부분의 경우 데이터마다 어떤 패턴을 가지고 있을 수 있기 때문에, EDA의 중요성이 강조된다.

이런 패턴이 있는 데이터의 경우 LOCF라 불리는 Last Observation Carried Forward방식, NOCB라 불리는 Next Observation Carried Backward방식, Moving Average방식 등이 있다.

 

결측값은 r studio에서

mice패키지의 md.pattern()함수

상관관계 파악가능한 cor()

VIM패키지의 VIM::aggr()함수

Amelia패키지의 missmap()함수 등으로 빠르게 확인이 가능하다.

 

그리고 이렇게 메꾼 결측치는, 두 세가지 정도의 다른 방법으로 결측치를 메꾼 뒤, sensitivity analysis를 통해 결과값이 일관성이 있다는 것을 보여주어, 대치방법에 민감하지 않다는 것을 보여준다.

 

삭제는 데이터의 손실을 가져오고, 대치는 틀린 값이 들어갈 수 있기에 연구방향에 따라 잘 선택하여야 한다.

 

 

Propensity Score Matching

경향 점수 매칭이라는 한국어 번역 그대로, 두가지 이질적인 데이터 셋에 대하여 경향성이 비슷한 두가지 데이터 셋으로 만들어 주는 것이다.

더 정확히는 공변량(covariate)들의 수준을 맞추어 통제한 후, 특정 독립변수가 종속변수에 미치는 영향의 정도를 제대로 파악할 수 있도록 하는 것이다.

이 경우가 왜 필요하나면, 전향적인 코호트(Cohort) 연구에서는 비슷한 집단을 구성하여 연구가 가능하지만, case-control과 같은 후향적 연구에서는 case가 control에 비해 수가 적어지기 때문에, 비슷한 집단을 만들어 주어야 할 필요가 있기 때문이다.

여기서는 보통 로지스틱 회귀분석을 통하여 대상 case에 해당하는 환자와 가장 비슷한 점수를 나타내는 control 환자를 매칭시킨다.

1:1의 경우가 확실하지만, 그럴 경우 loss되는 환자 데이터가 많아 보통 case하나 당 1~5의 컨트롤을 가져가는 경우가 많다.

MatchIt, optmatch 패키지를 통한 matchit(구분변수~맞춰줄 변수, 방법, data, ratio)함수로 구현이 가능하다.

요새는 IPW(inverse probability weighting)라는 방법으로 control환자 정보의 loss없이 확률의 역수를 각 환자에게 곱해주어 정보를 구하는 방법도 만들어졌다.

 

 

확률분포

확률 분포에 대해서는 추후에 더 자세히 다루는 포스팅이 있으면 링크로 추가.

정규분포는 평균과 분산이라는 2개의 모수를 가지는데, 여기서 평균은 location parameter, 분산은 shape parameter라고 불린다.

베르누이 분포는 이항분포이다.

포아송(poisson) 분포는 '건수(count)'에 대한 분포이지만, 가정사항이 빡세서 잘 활용되지는 않는다. 특히 이 가정사항 중 평균과 분산이 같아야 한다는 굉장히 빡센 조건이 들어가있다. 그래서 negative binomial distribution과 같은 대체 분포를 이용한다.

 

 

데이터 합치기

r에서는 단순 데이터 concat을 지원하는 -bind 함수와, 직접적으로 join을 실행하는 merge 함수가 있다.

같은 갯수의 column을 가지는 데이터를 위아래로 붙이는 함수는 rbind(row-bind)함수로

반대의 경우 좌우로 붙이는 함수는 cbind(column-bind)함수로 구현할 수 있다.

 

참고로 row는 행, column은 열이다.

 

그리고 merge함수의 경우 inner, left, right, full join을 각각 코드로 짜보자면 아래와 같다.

merge(df1, df2, by="기준컬럼", all=FALSE)

merge(df1, df2, by="기준컬럼", all.x=TRUE)

merge(df1, df2, by="기준컬럼", all.y=TRUE)

merge(df1, df2, by="기준컬럼", all=TRUE)

'Software > R' 카테고리의 다른 글

[R/R studio] 기본문법  (0) 2019.08.04

[R/R studio] 기본문법

 

기본적으로 여러 언어를 동시다발적으로 사용하다보니, 언어마다 문법의 세부 사항이 달라서 고생하고는 한다.

(한번 써서 에러나거나 기타 등등 이후에 또 고치고 등등...)


그래서 이번에 각 문법별로 정리한 것을 만들어보기로 하였다.

당연히 한번에 다 기억이 나지는 않을테니 언어를 쓸 때마다 하나씩 정리해보기로 하였다.

 

기본적으로 R은 세미콜론(;)을 써서 행 구분하지 않는다.

한줄에 여러 명령어 작성은 세미콜론(;)으로 연결시킨다.

패키지를 불러오는 명령어는 library()

'Software > R' 카테고리의 다른 글

[R/R studio] 가설검정, 이상치, 결측치, PSM, 확률분포  (0) 2019.08.06

+ Recent posts