R과 Python을 같이 써 보자 – RPy2(1)

이전글 – 왜 Python 이 아니라 R로 강의하는거야?

 

귀국하고 지난 1년 반 남짓한 기간 동안 데이터 사이언티스트로 살면서 필자가 싸워(?)야했던 오해 중 가장 큰 두 개를 꼽자면,

  • 빅데이터 = 용량만 많은 데이터
  • 데이터 사이언티스트 = 공대 출신 개발자

라는 잘못된 이해들이었다. 수 십개의 블로그 포스팅도 빅데이터란 유저들의 행동데이터를 말하고, 데이터 사이언티스트는 그 행동데이터에서 패턴을 추적하는 사람들이지, 프로그래밍하는 개발자가 아니라는 설명을 알리기 위해서였다고해도 과언이 아니다. 덕분인지 요샌 구인란을 보면 좀 정신차린(?!) 잡 포스팅이 올라온다. 데이터 사이언티스트 뿐 아니라, 심지어 데이터 엔지니어들에게도 수학, 통계쪽 지식이 필요하다는 (좀 오버스러운) 잡 포스팅을 심심치 않게 볼 수 있다.

(Source: 잡코리아)

그러다 요즘 만나는 새로운 편견이 하나 있는데, Python이 머신러닝을 배울 수 있는 (유일한!) 프로그래밍 언어(?)고, 나머지는 별로 관계가 없다는 오해다. 개인적으로는 개발자들이 이쪽 필드에 진입하겠답시고 코드 몇 줄 Copy&Paste 해 놓고 아는체하는 모양새가 굉장히 불편해서 개발용 언어인 Python에만 집중하는 한국 시장의 편견에 적지않게 당황스럽다.

이번 포스팅에서는 Python의 한계를 지적하고, R과 Python을 함께 써야할 때 쉽게 활용할 수 있는 플랫폼을 소개해보고자 한다.

 

Python = 머신러닝용 언어(X), 개발용 언어(O)

위에 쓴대로, 데이터 사이언스는 행동데이터에서 패턴을 찾는 작업, 즉 통계학 위에서 돌아가는 수학 모델링인데, TensorFlow라는 명령어 라이브러리가 하나 나왔다는 이유로 갑자기 Python 아니면 안 된다고 하는 “꼴”들이 참 우습다. 필자가 보스턴에서 처음 머신러닝을 들을 때만해도 수업 숙제들을 구현할 수 있는 라이브러리가 없어서 직접 코드를 다 쳤고, 그 무렵에 수업을 같이 듣거나, 미리 들었던 동료들이 R 라이브러리들을 만들었는데, 그 중 일부는 Amazon, HP 등의 대기업들의 지원을 받아 MXNet, H2O 등으로 발전해 있다. 써 본 사람들은 알겠지만, TensorFlow 가 나오던 2015년 이전부터 이미 활용되던 패키지들이고, 솔직히 계산 속도도 더 빠르고 활용처도 더 많다.

(H2O의 뒷 이야기를 보면, R로 빅데이터 계산하는데 한계를 느끼고 S라는 프로그램을 만들었다가, 이걸 나중에 Java, R 같은 프로그램에 얹을 수 있는 Add-in 형태로 진화시킨 이야기가 나온다. 요즘은 물론 Python에서도 작동한다.)

아마 많은 개발자들이 통계학을 제대로 공부해본 적이 없고, 통계학 기반으로 제대로 설명해주는 머신러닝 수업을 이해할 자신도 없으니, 그냥 평소에 하던대로 코드나 Copy&Paste하자는 생각으로 이쪽 업무를 바라보고 있고, Python에서 (제대로) 돌아가는 머신러닝 라이브러리가 Keras 기반 TensorFlow 밖에 없으니 그냥 TensorFlow = Machine Learning 라는 생각이 굳어지고 있는 듯하다.

안 그래도 개발자들이 데이터 사이언스 분야를 왜곡시키는 “꼴”이 불편한 필자 입장에서, 데이터 처리와 통계학 모델링 지원이 많이 부족한 개발자용 언어를 모르면 데이터 사이언스를 못하는게 아니냐나는 터무니 없는 편견이 좋게 보일 수는 없다.

(Source: RPy2)

필자 역시도 두 언어를 모두 활용하는 입장에서 어느 한쪽을 폄하하고 싶은 생각은 전혀 없고, 다만 두 언어가 출발점이 매우 다른 탓에 필요한 목적에 따라 적절하게 나눠서 써야 한다고 본다. 당장 필자의 기초 데이터 사이언스 수업은 수리통계학에 기반한 이해를 화면에 구현해야하기 때문에 R로 코드를 보여주고, 실제로 업무 중에도 데이터를 놓고 모델링 작업에 거의 대부분 R Studio를 켜놓고 작업한다. 물론 시스템에 얹어야하는 상황, 개발과 업무가 연계되어야 하는 상황에는 Python에서 모델을 돌린다. 이 때 R에서만 있는 함수를 써야하면 어쩔 수 없이 새로 함수를 만들거나 아니면 R 에뮬레이터를 돌린다. (RPy2) 반대로 Python에서만 구할 수 있는 함수 집합들 (ex. TensorFlow)을 R 작업중에 돌려야할 때도 마찬가지로 에뮬레이터를 돌린다 (rPython).

 

Python에 대한 데이터 사이언티스트의 불만 1 – 데이터 저장, 처리 과정

Python이 열심히 R의 데이터 처리, 통계학 기반 명령어 셋을 복사하고 있지만 (ex. pandas, statsmodels, scikit-learn), 태생이 개발자용 언어다보니 아직 부족한 점도 많고, 한계도 뚜렷하다. 당장 Python 2.7 버젼과 Python 3.x (upto 3.4), 그리고 Python 3.5 이후 버젼은 데이터 저장 방식이 완전히 다르다. 일단 Python 2.x 버젼과 Python 3.x 버젼은 명령어 셋마저 달라서 두 버젼간 호환이 안 된다. 개발자들이 쓰는 플랫폼이 대부분 Linux일텐데, 제일 많이 쓰는 Ubuntu 16.04는 Python 2.7을 지원한다. 그래서 빠른 개발을 시도하는 스타트업들에 가면 Java, C++대신 쉬운 Python을 쓰고 있는데, 정작 운영체제에서 지원하는 Python 2.7에 익숙해져 있다보니, 2.7 안 쓰면 작업 호환이 안 된다고 버젼을 강제로 낮춰달라고들 한다.

끝이 아니다. Python 3.4 미만 버젼에서는 데이터 Array가 시작하는 값이 0이었다. 쉽게 말해서 A라는 변수를 벡터로 지정하고 (1,3,5)이라는 값을 입력하면, 1이 A[0]에, 3이 A[1]에, 5가 A[2]에 저장이 된다. (Python이 데이터 처리를 위해 나온 언어가 아니라는 걸 명명백백하게 보여주는 예제가 아닐까 싶다. 왜 이게 1번에서 시작하는게 아니라 0번에서 시작하냐고….)

이것 때문에 R에서 데이터 전처리를 시켜놓고 Python을 에뮬로 R 위에 띄워서 작업하려면 데이터 벡터를 Python 위에서 다시 지정 해 줘야 했다. Python 위에서 직접 작업해도 내가 데이터를 벡터로 지정했을 때와 data frame으로 지정했을 때 불러오는 방식이 다르다는 걸 기억해야했던 것은 말할것도 없다. (data frame 이라는 개념도 최근에 추가되었다.) 그러다 Python 3.5 버젼 이후부터는 이걸 수정하는 바람에, 이전 버젼으로 짠 코드를 다시 수정했다. (이만큼 심하게 하위버젼이랑 호환 안 되는 언어가 얼마나 될려나…)

이제 버전업이 끝났으니 똑같은거 아니냐고?

R은 데이터 기본형을 data frame으로 저장해서 모델이 돌아가고, 복잡한 통계 모형들(머신러닝 포함)에 최적화된 형태로 데이터 포맷을 바꿀 수 있도록 Data Table이라는 개념이 있다. 당장 N명의 유저가 1시간 동안 1/100초 단위로 접속했던 웹페이지 리스트를 뽑는다고 생각해보자. data frame은 가로축-세로축의 2차원으로 데이터를 저장한다. (SQL 기반의 Database들도 마찬가지다.) 그런데, “유저-시간-웹페이지” 어느 관점에서 보는게 타당할까?

Excel에서 Pivot Table을 만들어보면 좀 감이 잡히겠지만, 말하려는 메세지에 따라 셋 중 어떤 값들을 X축, Y축에 놓아야할지가 다르고, 머신러닝 모델링은 당연히 3개(이상)의 축에서 패턴을 잡아내는 작업이기 때문에 (ex. PCA), 데이터를 단순하게 2차원으로 놓고 작업할 수가 없다. Python은 Data Table을 통계학 관점에서 지원해주질 않기 때문에, 이걸 2차원 데이터 여러개로 나눠서 처리하고, R은 N차원 데이터를 그 자체로 실시간 처리할 수 있는 플랫폼이다.

 

Python에 대한 데이터 사이언티스트의 불만 2 – 그래프 그리기

그래프 그리는건 말할 것도 없다. 개발자는 평소에 그래프를 그리는 사람이 아니다. 반면 통계학하는 사람은 다양한 종류의 그래프를 그려가면서 자신의 아이디어를 테스트하는게 일상사다. 당연히 R은 ggplot부터 Java Script 기반한 다양한 그래프 지원을 해 주고, Python은 이게 안 되니까 R의 ggplot을 import해서 그래프를 그린다. 아래는 Jupyter 노트북에 python pandas를 import해서 데이터를 data frame 형태로 저장하고, R ipython extension 으로 ggplot을 불러와서 데이터를 그래프로 표현한 것이다.

Python 유저 입장에서는 당연하게 보이는 이 과정들이 R 유저 입장에서 보면 매우 귀찮은 작업이다.

  • data frame을 만드는데 왜 pandas 활용해야 되는거야?
  • 뭐? Data Table은 지원 안 한다고? 그럼 데이터 포맷 변경할 때 수작업으로 해야됨???
  • 그래프 그릴려면 R 다시 불러와야된다고?
  • 그럴려면 R 에서 그리지 왜 Python 에서 억지로 불러와서 그리냐?

는 질문이 나올 수 밖에 없다. 그럼 R로 같은 작업을 하면 어떻게 될까?

library(ggplot2) #ggplot 라이브러리 불러오기

Letter <- c('a','a','a','b','b','b','c','c','c') X <- c(4,3,5,2,1,7,7,5,9) Y <- c(0,4,3,6,7,10,11,9,13) Z <- c(1,2,3,1,2,3,1,2,3) df <- data.frame(cbind(Letter, X, Y, Z)) #데이터를 column으로 합친다음, data frame으로 지정 ggplot(data = df) + #ggplot이 활용하는 데이터 셋 지정 geom_point(aes(x=X, y=Y), color = Letter, size = Z) #_point는 scatter plot, aes는 x,y축 지정 [/code] pandas를 불러와서 데이터 처리를 할 필요도, R 에뮬을 불러와서 ggplot을 써야할 필요도 없다. 직접 R console 창에 붙여서 확인해보시라. 똑같은 결과값을 볼 수 있을 것이다.

ggplot이 얼마나 강력한 그래픽 라이브러리인지 알 수 있는 몇 가지 예시를 들면, Business Intelligence 툴로 전세계 최고 명성을 자랑하는 Tableau가 버젼업을 하면서 새로 추가하는 그래프는 보통 연구팀에서 ggplot으로 그린다음에 Production 팀에 넘긴다는 말을 들은 적이 있다. Tableau 연구팀 Job Posting을 보면 당연하겠지만 Heavy experience in R visualization이라는 항목이 있다. 한번은 D3.js 기반으로 그려진 예쁜 그래프 하나를 Java Script 모르는 필자가 어떻게 구현할까 고민했던 적이 있었는데, R 그래프 라이브러리를 뒤져보니 ggplot 다음 버젼 베타 테스트 결과물 중 하나로 추가가 되어 있었다. 상황이 이렇다보니 Python도 R의 ggplot을 복제해내는 것보다 에뮬레이터로 불러 쓰는 방식으로 진화하고 있는 것이다.

 

R vs. Python 일까? 아니면 R + Python 일까?

그러나…

이렇게 실컷 R 자랑을 해놓고 Python의 데이터 관리 시스템에 불평했는데, R로 개발할 수 있냐고 물으면 별로 대답할 말이 없다. R에서 ShinyApp이라는걸 이용해서 웹페이지 만들 수 있도록 해 놨는데, 쓰는 사람도 별로 없고, 사용법도 간단하질 않고, 그렇다고 서비스의 퀄리티가 훌륭하냐고 물으면 그것도 아니다. 심지어 보안은 아예 지원되는 걸 본 적이 없다. (html 기반 시스템이 얼마나 많은 보안 취약점을 가지고 있는지 아는 분들은 다 아시리라.)

애시당초 개발용 언어가 아니니까.

정리하면,

Python:

  • 개발용 언어
  • 데이터 처리 및 분석 지원을 위해서 pandas, statsmodels, scikit-learn 같은 라이브러리들을 추가하는 중

R:

  • 데이터 처리 및 분석을 위해 만들어진 언어
  • ggplot, dplyr 등을 비롯한 시각화 툴의 역사가 깊고 라이브러리가 풍부함
  • 개발용으로는 쓸 수 없음

필자 역시 둘 다 쓰는게 편하지는 않다. 근데, 이걸 불평하면 안 된다는 생각이 드는게, 어지간한 개발자들은 GUI 지원이 부족한 운영체제인 Linux에 Java나 C++를 비롯한 다양한 프로그래밍 언어를 (어느정도는) 쓸 수 있는 사람들이다. 통계학 기반으로 학계에서 연구하는 사람들도 사정은 크게 다를 바 없다. Matlab과 R 두 언어 중 하나는 마스터, 다른 하나는 남들의 작업 결과물을 이해할 수 있는 수준으로 알고 있는 경우가 대부분이고, 전공별로 사정에 따라 SAS, SPSS 같은 통계 패키지형 프로그램을 주로 쓰는 경우도 많을 것이다. 단적으로 필자의 박사 시절 화면창에 가장 오래 떠 있었던 코딩 기반 프로그램은 Mathematica였다. 복잡한 SDE의 Analytic Solution을 찾기가 버거울 때 최소한 Solution의 형태를 가르쳐주고, 그걸 자동 시뮬레이션 그래프로 보여주는 정말 맘에 쏙 드는 프로그램 중 하나였기 때문이다.(참고로 논문에 쓴 그래프들은 다 Mathematica로 그렸다.)

말을 바꾸면 어차피 한 언어가 완벽하지 않으니, 필요한 목적에 따라 여러 언어를 쓰는게 그냥 상식처럼 되어 있다.

 

나가며 – 멀티 플랫폼에 익숙해지자

(Source: RPy2)

런던서 석사하던 시절, 보통 연구를 Matlab으로 작업하고 있었는데, Jon Danielsson 교수님의 교과서 쓰는 작업이나 ECB 프로젝트에 함께하면서 교수님이 주로 쓰시던 R로 작업하게 되었다. 새로 뭔가를 배운다는 즐거운 마음에 (교수님이 울트라 “갑”이고, 필자는 슈퍼 메가 울트라 “을”이었기 때문에 찍소리 못하고) R을 배워가면서 RA일을 했었는데, 스크립트형 언어라는게 어차피 비슷비슷하기 때문에 그나마 큰 불편없이 따라갔던 기억이 난다. 그리고, 거의 대부분의 언어가 A 언어에서 만든 코드를 B 언어에서 에뮬레이터로 돌릴 수 있도록 해 놓았기 때문에, Matlab으로 짜 놓은 함수를 R로 다시 만들기 힘들 때는 그냥 에뮬레이터를 띄워서 썼던 경험도 있다. 그런데 위에 길게 써 놨듯이 R과 Python은 그 갭이 좀 더 커서, 에뮬레이터를 띄워야하는 경우가 더 많을 것이다. (당장 ggplot같은 초대형 그래픽 라이브러리를 Python에서 만들려면……)

Python 위에서 R 코드를 돌릴 때는 RPy2라는 에뮬레이터를 쓰고, 반대로 R에서 Python 코드를 돌릴 때는 rPython을 쓴다. 필자가 Neural Net 수업 시간에 H2O나 MXNet과 더불어 Python 기반의 Keras 라이브러리의 명령어들 (TensorFlow 포함)을 R 위에서 돌리는데, 이 때 rPython을 활용하고 있다.

아마 한국의 많은 Wannabe 데이터 사이언티스트들이 Python이 전부인 줄 알고 있고, 최소한의 통계학만 쓰면서 데이터 처리가 얼마나 필수적인지 감을 못 잡은 상태로 있을텐데, 이번 포스팅을 시작으로 RPy2를 소개하는 몇 차례 시리즈 글을 연재해볼까 한다. 어차피 Jupyter 노트북을 쓰고 있었으면 모르는사이에 RPy2를 쓰고 있었을지도 모르는겠지만, 그냥 이번 기회에 두 언어를 모두 활용하는데 익숙해질 수 있는 정보를 좀 정리해보고 싶다.

You may also like...

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다