티스토리 뷰

Study/AI

[Statistics] Introduction to Random Variable (1)

생각많은 소심남 2015. 1. 27. 22:28

* 이 포스트는 edX에 열려있는 Statistics and R for the life science 의 강의를 실제로 해본 내용입니다.


통계학을 이용한 life science의 강의 내용 중 하나가 바로 이 포스트의 제목인 Random Variable을 포함한 Probability Distribution에 대한 내용을 다뤘다. 실제 R을 이용해서 왜 Random Variable을 뽑는지가 첫 강의였는데 잠깐 강의 내용을 들여보면 다음과 같다. 우선 지방과 체중간의 관계를 쥐를 통해서 보여주려는 결과를 가지고 다뤘고, 이에 대한 data handling을 보여주고자 했다. 그런데 실험을 해본 사람은 알겠지만 xx에 대한 효과를 보여주기 위해서는 필요한게 두가지가 있다. 바로 대조군과 실험군이다. 일단 우리가 사용하는 데이터는 고맙게도 다음과 같이 분류가 되어있다.


참고로 chow로 되어 있는 군이 controlled fat diet를 가진 쥐들이고 hf가 high fat을 가진 쥐들이다. 이 데이터를 femaleMiceWeights.csv 라는 파일로 가지고 있는데, R에서 이걸 다루려면 이 자료를 그대로 쓰는게 아니라 하나의 data frame으로 import해와야 한다. 방법은 두가지가 있다. 첫번째는 


와 같이 Environment 창에서 Import Dataset을 통해서 불러오는 게 있다. 이렇게 하면 csv 파일 내에서 data의 구분을 어떻게 할것인지, 혹은 header를 남길 것인지에 대한 세부적인 설정을 할 수 있다. 그런데 뭔가 이게 복잡하다 싶으면 그냥 read.csv 명령어를 통해서 읽어오면 된다.



이렇게 읽어오면 위의 Environment 창에도 나와있지만 dat이라는 dataFrame에 몇개의 변수와 몇개의 자료를 가졌는지를 보여주게 된다. 

앞에서도 소개되어 있지만 지금 쥐들은 두가지 군, 실험군과 대조군으로 이미 나눠져있다. 이 중 대조군에 대한 data만 보고 싶으면 이 dataFrame을 matrix라고 생각하고 자기가 원하는 범위를 설정하면 된다. 여기선 chow가 우리가 원하는 범위이고, 우리가 알고 싶은건 두번째 열에 있는 정보이므로 다음과 같이 하면 원하는 정보만 볼 수 있게 된다.


이걸 응용하면 hf 군의 정보만도 뽑아올 수 있겠다. 그런 이런 정보를 이용해서 chow 군과 hf 군의 평균에 대한 차이도 다음과 같이 구할 수 있다.

자 그럼 이걸 visualization을 해보면 좋겠는데 강의에서는 stripchart를 사용한다. 우선 이걸 사용하기 위해서 필요한 정보만 dat에서 뽑아야 하는데 잘 보면 첫번째 열은 군을 구분짓기 위한 정보이지 우리가 보여주고자 하는 목적과는 거리가 멀다. 따라서 split 함수를 써서 따로따로 분류를 해놓고 거기에 label만 달면 될 것 같다. 그래서 다음과 같이 하면 2개의 list로 구성된 s가 생성된다. 


실제로 environment에서도 s를 확인해보면 어떤 형태를 띄고 있는지를 알 수 있다. 


여기서 stripchart를 사용하게 되면 이쁜 그래프가 하나 나오게 된다.

여기서 그래프에 평균값을 나타내주는 선을 그려주면 조금더 명확하게 구분할 수 있을 것이다. 이때 사용하는 함수는 abline과 sapply인데 여기서 sapply 함수는 list안에 들어있는 값을 특정함수로 적용한 결과를 보여주는 함수다. 평균값을 구하는 함수가 mean이므로 sapply의 인자중 하나를 mean을 넣어주고 원래의 list 변수였던 s를 활용하면 s에 대한 평균을 보여주게 된다. 그걸 abline을 통해서 이어준 형태가 다음과 같다.

그런데 왜 지금까지 이런 걸 하고 있을까? 사실 위의 결과는 의미가 없다. 우리가 추구하고자 한 결론인 체중과 지방과의 관계가 확실히 있다를 보여주기 위해서는 지금과 같이 모든 케이스가 아닌, 어떤 것을 뽑던지간에 똑같은 결과를 보여줘야 한다는 것이다. 결국 앞에서 뽑은 데이터 중에 랜덤하게 일부만을 뽑았을 때도 똑같은 결과가 나와야 하는데 이를 위해서 사용하는 함수가 sample 함수다. 우선 hf군의 쥐 중에서 6마리만 랜덤하게 뽑아보려면 다음과 같이 한다.

앞에서 언급했다시피 strip 함수를 쓰면 list의 label을 달아줄 수 있는데 이 label 중 "hf"를 가진 자료형만 뽑아서 그 중에 6개만 sampling을 한 것이다. 결과는 다음과 같다.


참고로 지금과 같이 뽑는 과정은 sampling 과정 중에서 같은 것은 뽑지 않겠다는 옵션(replace=F)이 들어가 있는 상태인데 이걸 다음과 같이 해주면 같은 sampling 안에 같은게 들어가 있을 수 있다.



자 이제 그럼 이렇게 뽑은 데이터 중에서 30을 넘는 것을 구하려면 어떻게 될까? 그냥 단순하게 아까 분류한 highfat 자료에 logical operator를 사용해서 비교해주면 된다. 그런데 이렇게 해주면 어떤 자료가 30보다 큰지 True or False 로만 보여주게 된다. 물론 이 값만 가지고도 의미를 도출할 수 있지만, 이 True or False를 숫자로 변환해주는 과정도 생각해볼 수 있다. 그게 as.numeric 함수다. 결과를 한번 비교해보자.




댓글