2월, 2015의 게시물 표시

R 완전 초보, 1시간 안에 탈출하기

Code School은 여러 프로그래밍 언어를 가르쳐주는 친절한 웹사이트입니다. 여기에 R에 관한 튜토리얼도 당연히 있습니다. 여러분이 R을 전혀 모른다고 해도 영어를 조금만 알면 이곳에서 R의 기초 문법 정도는 가뿐하게 배울 수 있습니다. 바로가기

패키지 stringr 아주 편리한 문자열 도구

R 사용자들의 가장 큰 불만 중의 하나는...? 아마 상당히 불편한 character 데이터 처리 방법이라고 생각합니다. 문자열을 가지고 흔히 하는 일을 생각해봅시다. 문자열 합치고 나누기 문자열의 어떤 부분을 추출하기 분자열의 일부를 바꾸기 빈 문자들(white space) 지우기 공백 문자 채우기 이외에도 정규식을 적용하여 어떤 패턴이 있나 확인하기 정규식을 적용하여 어떤 패턴에 해당되는 부분 추출하기 정도는 해줘야 하지요. R의 {base}는 sub(), gsub(), regex() 등의 함수를 제공합니다만... 너무 느리고 사용이 어렵습니다. 우리의 구세주는 Rice University 통계학과의 Hadley Wickham 교수입니다. 그가 개발한 {stringr}은 빠르고 간편합니다. 이제 구체적인 사례들을 생각하며 {stringr}을 배워봅시다. 경우에 따른 stringr 함수들 문자열 관련 str_c(): 합치기 str_count(): 세어 보기 str_dup(): 반복해서 덧붙이기 str_length(): 문자 길이 str_pad(): 빈 문자 속에 끼우기 str_split(): 나누기 str_split_fixed(): 고정해서 나누기 str_trim(): 빈문자들 제거 str_sub(): 시작과 끝 위치에 해당되는 부분 끊어오기 word(): 단어 추출 패턴 추출 str_detect(): 패턴 있나 검사 str_extract(): 패턴에 해당되는 것 추출 str_extract_all(): 패턴에 해당되는 것 모두 추출해서 list로 반환 str_locate(): 패턴의 위치 추출 str_locate_all(): 패턴의 위치 모두 추출해서 list로 반환 str_match(): 해당되는 그룹 패턴 추출 str_replace(): 패턴에 해당되는 부분 교체 str_replace_all(): 패턴에 해당되는 부분 모두 교체 패턴

Pearson Correlation: how to compute a p-value?

상관계수를 구해놓고 p-value를 알고 싶다면? 다수의 R 패키지가 '이정도는 알겠거니...' 해서 아예 계산값조차 제공하지 않는 것 중의 하나가 피어슨 상관계수의 p-value이기도 하다. 안보여준다고 계산 못하나? 직접 구해보자. p-value를 구하기 위해 먼저 피어슨 상관계수의 통계량이 t-분포를 따른다는 점을 이해하자. 또한 p-value를 구한다는 것은 가설검정을 하겠다는 뜻이다. 귀무가설: 상관계수(beta_0) = 0.0 상관이 전혀 없다는 것을 귀무가설로 잡으면 음이든 양이든 상관관계가 어느 정도 존재한다는 점을 입증하기 위해 위의 귀무가설을 기각(reject)시켜야 한다. 이때, t-statistics는 T(.) = (beta_hat - beta_0) / Se(beta_hat,degree of freedom) 으로 주어진다. Se는 표준오차, beta_hat은 추정한 correlation, degree of freedom은 자유도이다. 우선, DF (degree of freedom)은 비교하고자 하는 X와 Y 벡터의 개수인 nx와 ny의 합인 nx+ny에서 2를 뺀 값이다. DF = nx + ny - 2 beta_hat을 이미 알고 있다고 하자. > beta_hat = -0.8294 > Se = sqrt((1 - beta_hat^2) /DF) 이제 통계량을 구하자. > tstat = (beta_hat - 0)/Se p-value는 alpha = 5%일 때 양측 꼬리의 누적확률이므로 > pvalue = 2 * pt(-abs(tstat),DF) 이왕 커피 마시면서 쉬는 김에 가설 검정과 p-value의 관계에 대해서 조금 더 부연하겠다. 귀무가설: 평균 = 5 평균이 5라는 가설을 잡고 데이터를 모아 결과를 구했더니 7이 나왔다. 이래놓고 평균이 5라고 주장할 수 있는가? 데이터의 사이즈를 20, 표준편차를 2라고 하자. 표준화된 Z값을 구하면

데이터프레임, 변수에 설명 붙이기

R의 data.frame의 부족한 면 가운데 하나는 '변수에 대한 설명을 붙일 수 없다!'이다. 조금 귀찮은 방법으로 붙일 수 있다. {Hmisc} 가 필요하니 설치하자. 있으면 그냥 넘어간다. > install.packages("Hmisc") 사용법은 의외로 간단하다. > library(Hmisc) > aq <- airquality > label(aq)   Ozone Solar.R    Wind    Temp   Month     Day      ""      ""      ""      ""      ""      "" > label(aq$Ozone) <- "Numeric Ozone" > label(aq$Solar.R) <- "Solar radiation" > label(aq$Wind) <- "풍량" > matrix(label(aq))      [,1]             [1,] "Numeric Ozone"  [2,] "Solar radiation" [3,] "풍량"           [4,] ""               [5,] ""               [6,] ""               >

dplyr, 데이터프레임 손쉽게 다루기

{dplyr}패키지는 정말 완소 패키지입니다. 데이터프레임의 슬라이싱이나 select 함수 등이 좋은 결과를 보여주지만 직관적이지 않고 복잡합니다. {plyr}이 대안일 수 있습니다만 느립니다. 속 터지지요. C++를 기반으로 작성된 {dplyr}은 상당히 괜찮은 data handling 기능을 제공합니다. 반드시 알아야 하겠습니다. 설치를 하기 위해 > install.packages("dplyr") 이제 패키지를 부릅니다. > library(dplyr) 이번 포스트는 hflights 데이터를 사용하겠습니다. > library(hflights) > dim(hflights) [1] 227496     21 21개의 변수에 22만개의 행 데이터가 있습니다. 다루기 편하도록 data.frame객체를 {dplyr}의 tbl_df 객체로 변환하겠습니다. > hflights_df <- tbl_df(hflights) > hflights_df Source: local data frame [227,496 x 21] .... tbl_df 객체는 출력에서 이점이 있습니다. 22만개를 다 보여주는 대신 각종 요약 정보와 데이터의 일부를 간편하게 출력합니다. 직접 해 보세요. 데이터의 일부를 추출 행 데이터 중 일부를 추출하는 전통적인 방법은 > df[condition,] 이렇게 하여 condition의 TRUE, FALSE 벡터를 이용하는 것입니다. 편리하지만 참 이해하기 어려운 표현이기도 합니다. {dplyr}의 filter()함수와 chaining 연산자(%>%)를 이용해서 간단하게 처리합니다. > hflights_df %>% filter(Month==1,DayofMonth==1) Source: local data frame [552 x 21]    Year Month DayofMonth DayOfWeek DepTime ArrTi

Long-Form 그리고 Wide-Form

reshape2가 설치되었나? 만약 설치되지 않았다면 install.packages("reshape2") > require(reshape2) 예에서는 R에 포함된 airquality 데이터를 사용할 것이다. > head(airquality)   Ozone Solar.R Wind Temp Month Day 1    41     190  7.4   67     5   1 2    36     118  8.0   72     5   2 3    12     149 12.6   74     5   3 4    18     313 11.5   62     5   4 5    NA      NA 14.3   56     5   5 6    28      NA 14.9   66     5   6 열 이름을 보면 Ozone, Solar.R, Wind, Temp, Month, Day 이 중에서 Month, Day는 인덱스이고 나머지는 공기질에 관한 데이터다. 데이터의 세부 항을 열을 기준으로 배치했다. 만약 해당하는 월/일에 측정치가 없으면 NA로 처리된다. 이제 wide-form을 long-form으로 고쳐보자. > aql <- melt(airquality) 멜팅을 시키면 > head(aql)   variable value 1    Ozone    41 2    Ozone    36 3    Ozone    12 4    Ozone    18 5    Ozone    NA 6    Ozone    28 Month, Day를 포함하여 전체 열이 다 값으로 고쳐진다. 이것은 우리가 원하는 결과가 아니다. 인덱스를 떼어서 처리하자. > aql2 <- melt(airquality, id.vars=c("Month","Day")) > head(aql2)   Month Day variable value 1     5