이래저래 요즘 앞으로 장래의 계획에 대해서 생각해보고 있다.
앞으로의 경력을 어떻게 만들어 나갈 것인가? 흥미로운 분야는 없을까? 등등….
그러다.. 이런 저런 기회를 통해 “생물정보학”과 같은 내가 지금까지 해오던 것들과 도메인 자체가 다른 것들에 대해서 주변에 지인들을 통해 많은 정보를 얻고 있다. 이런 분들이 주변에 있다는 것은 참으로 고마운 일이 아닐 수 없다.
지금껏 해온 일들이 웹 마이닝 (Web Mining)분야였는데, 도메인을 바꿔볼 때가 된듯도 하고…
그러다 가상의 세계를 만들어 놓은 온라인 게임 분야에서 데이터 마이닝을 실험해 보기 아주 최적의 환경이라는 생각을 얼마전에 하게 되었다.
일단 온라인 게임은 실제 세상을 대변하고 사람들이(악하던, 선하던) 자신의 또 다른 인생을 만들어 가는 곳이다. 랜덤하게 의사 결정을 하기 보다는 이전에 자신이 가지고 있던 생각과 경험을 기반으로 캐릭터를 키워 나가는 공간인 것이다.
그러니까.. 한마디로 실제 세상을 함축시켜 놓은 그런 공간이다. 구매가 이루어 지고, 심지어는 결혼식도 하고… 게임 내에서 취미 생활까지 영유하는 그런 가상의 공간이다.
그럼 이곳에서 사용자 데이터로 뭘 할 수 있을까?
당연하다… 아이템 구매할때 아마존에서처럼 아이템 추천엔진을 구축해 아이템을 추천해주는 기능도 생각해 볼 수 있을 것이다. 또한 결혼도… 중매 사이트에서처럼 프로파일 분석을 통해서 커플 매칭 엔진을 만들 수도 있다. 뭐 이런건 실제 세계에도 있는거니 능히 생각해 볼 만한 엔진들이다.
이 밖에… CRM관점으로 다가서면… 처음 게임을 경험하는 사람의 이탈률이 가장 큰 시점을 파악해 내는게 가능할 것이다. 게임 플레잉 시간이 어느정도일때 인가?, 레벨은?, 그 때 그들이 가지고 있는 아이템은? 등등의 정보를 실제 세계보다 더 정확하게 획득해서 데이터베이스화 시킬 수 있을것이다.
물론 실제 이탈하는 게이머들의 분류도 필요할 것이다. 이들의 게임 복귀 가능성을 이전 복귀한 유저와 특정 기간동안 아예 로그인 자체를 안한 사용자들을 기반으로 학습을 통해 새로운 유저의 재접속 가능성을 확률정보로 알아 볼 수 있을것이다. 이 결과를 통해 적절한 떡밥만으로 재접속이 능히 가능할 만한 유저들에게 실제 떡밥을 던지는게 가능할 것이다. 예를 들어 무료 아이템을 준다는지…..등등…
게임에서의 데이터 마이닝은 실 세계의 데이터를 마이닝하는 것보다 더 정확한 프로파일 정보를 알아낼 수 있는 장점이 있다. 왜냐면 완전한 로그인 기반이며 캐릭터 설정, 아이템 구매 현황, 누구랑 자주 대화하고 그들이 사용하는 단어가 무엇인지를 분석함으로 게임 세계에서의 사용자를 실세계보다 더 정확하게 분석이 가능하기 때문이다.
아마도 실제 데이터를 확인해 보면 이보다 더 많은 아이디어를 도출 할 수 있을 거란 생각을 해본다. 한가지 아쉬운건 이 분야에서 실제 일하시는 분들과 한번정도 이야기 해볼 수 있는 기회가 있었으면 하는 생각을 해본다.
여튼 데이터가 많은 곳이 확실히 재미가 있을거란 생각은 여전히 맞는거 같다.
R을 써본 사람은 아시겠지만 R은 거의 shell환경에서 커멘드라인을 통해 작업을 할 수 밖에 없는 기본 환경을 제공하는데 그런 사용상 사용자에 친숙하지 않은 환경을 보완하기 위해 R commander가 나오게 되었다.
물론 R commander 역시 R을 처음 접할때부터 사용하면 이 역시 만족할만한 환경이 아님을 알 수 있으나, 처음부터 R 커멘드라인을 사용해온 사람이라면 이정도의 환경이라도 얼마나 편한지 잘 알 수 있을 것이다.
그럼 Mac용 R commander 설치를 진행해보자. (윈도용은 더 간단하다.)
1. 일단 적당한 R버전을 선택해 다운 받는다. 한국은 이곳에서 받으면 된다.
2. 이곳에서 TclTk를 받아 설치한다.
3. 일단 R.app을 실행해 R 콘솔을 띄우고 “install.packages(“Rcmdr”, dependencies=TRUE)” 명령을 실행한다. 물론 Packages & Data의 Package Installer를 사용해 “Rcmdr”을 검색해 설치해도 된다.
4. 일단 Rcmdr라이브러리 로딩을 하기 전에 X11 윈도우 서버를 구동시켜야 한다. 별도의 명령어보다 R 콘솔 상당 메뉴에 있는 메뉴 버튼중 “X” 라는 버튼을 클릭하면 된다. 그렇게 하면 쉘이 하나 뜨는데. 그 화면이 보인다면 성공적으로 구동이 된 것이다.
5. 이제 “library(Rcmdr)”을 실행해 보자.
그럼 아래와 같은 화면을 보여줄 것이고 필요한 라이브러리를 다운받을 것이냐 하는 팝업 윈도우가 하나 뜨는데 받아서 설치한다고 응답하면 된다.
> library(Rcmdr)
Loading required package: car
Loading required package: MASS
Loading required package: nnet
Loading required package: survival
Loading required package: splines………….
로딩 중에 경우에는 car패키지가 없다고 해서 car패키지를 직접 설치해주고 진행했다. 물론 다른 패키지도 없으면 직접 설치해 주면 된다.
이 밖에 다른 필요 모듈들은 자동으로 다운받아 설치가 된다.
이렇게 해서 올라온 화면은 아래와 같다.
R commander의 최대 장점은 R에 어떤 통계 분석 기능이 있는지 한눈에 메뉴를 보고 확인이 가능하다는 것이다.
메뉴 트리는 이곳에서 볼 수 있다.
데이터를 불러오는 메뉴 통계량을 구하는 메뉴와 모델 분석을 할 수 있는 메뉴, 그리고 정규분포 t-분포를 이용한 데이터 분석 메뉴와 같은 것이 있다. 각기 서브 메뉴들이 있으니 확인해 보면 될듯 하다.
일단 Data메뉴에서 Data in packages -> Read data set from an attached package..를 선택하고 뜨는 팝업창에서 datasets의 cars를 선택한다. 이 데이터는 주행 속도와 제동거리 이 두가지 컬럼을 가진 데이터셋이다.
뭐 뜬금없지만 예전에 데이터의 정규성을 측정하는 방법을 알려 달라는 질문이 있었던 관계로 shapiro테스트를 해보도록 하겠다.
일단 cars 데이터가 로딩되었다고 하고..
Statistics -> Summaries -> Shapiro-Wilk test of normality를 선택하고 검정하고자 하는 컬럼을 지정해준다. 일단 속도로 지정을 하면 아래와 같은 결과가 Output Window에 나타나는걸 볼 수 있다(정규성 검정을 하기 데이터가 적합하지 않지만 일단 예제를 보여주기 위한 목적이니..).
아래 결과를 보면 p-value가 나오는데 이것을 기반으로 귀무가설을 검정할 수 있다. 대부분의 경우에 p-value가 0.05보다 크면 귀무가설을 지지하게 되니 아래 테스트는 정규성을 보여주는 데이터라 할 수 있을것이다.
> data(cars, package=”datasets”)
> shapiro.test(cars$speed)
Shapiro-Wilk normality test
data: cars$speed
W = 0.9776, p-value = 0.4576
자동차 속도와 제동거리는 양의 상관관계가 있을 거라는 예상을 할 수 있는데, 이를 위해 Statistics -> Summaries -> Correlation matrix를 선택해 확인해 보고자 하는 두 컬럼을 지정해주고 Pearson product-moment를 선택해 준다. 그럼 아래와 같은 결과를 볼 수 있다.
> cor(cars[,c("dist","speed")], use=”complete.obs”)
dist speed
dist 1.0000000 0.8068949
speed 0.8068949 1.0000000
예상했다시피.. 역시 속도와 제동거리는 0.8 정도의 강한 상관관계를 보여주고 있다.
마지막으로 scatter plot를 그려보도록 하자.
역시 이것도 메뉴에서 Graphs->Scatterplot를 선택하고 x,y출 선택을 해주면 된다. 자세한 옵션이 궁금하면 팝업 설정창의 Help버튼을 눌러서 매뉴얼 페이지를 확인하도록 한다.
사용해보면 알겠지만 R commander는 단순히 명령 메뉴와 GUI를 연결해준 역할만을 하고 있는 환경이다. 하지만 일일이 명령어를 외우지 않아도 되는게 이 GUI 환경의 가장 큰 장점이라고 할 수 있겠다. 게다가 트리 구조의 메뉴 목록은 개개 명령어를 같은 성격의 것들과 함께 기억하기 편한 구조라서 실제 명령어를 메뉴 구조를 통해서 학습해보는 것도 괜찮은 접근방법이라 생각한다. `
R commander는 R을 이용해 통계학 공부를 시작하는 학생들에게 상당히 유용한 R GUI환경이라고 생각한다. R을 실행하면 덩그러니 커멘드 프롬프트가 뜨는 걸로 끝나는 작업 환경은 개발자가 아닌 일반학생들이나 일반 유저들에게는 큰 장벽이 될 수 있기 때문이다.
Tags: R, R commander
뉴머러티.. 흥미롭게 읽은 책이나… 전에 읽었던 슈퍼크런처보다는 약간 주변을 맴도는 듯한 느낌이 드는 책이다. 역시 같은 소재이지만 교수가 쓴 책하고 디테일의 차이가 있는거 같다.
책 두께는 얇은데 종이 재질이 얇고 글자 줄 간격이 빼곡해 넘기는 재미는 없는 책이다. 하지만 그동안 번역서가 나오길 기대한 책이고 몇 안되는 데이터 마이닝 활용 수기(?) 책중에 하나라서 즐겁게 머리 식힐겸 봤다.
최근 개인적으로 모 대기업에서 DNA 데이터 분석하는 분과 이야기 할 기회도 있었는데, 이 책의 ‘환자’ 챕터와 어느정도 관련이 있어보였다. 그분과 식사 하면서 특정 병으로 죽은 사람들 DNA데이터들만 있으면 어느 부분의 DNA에서 그 질환의 발병원인이 되었는지.. 기계학습으로 풀어낼 수 있을거라는 이런 저런 생각도 하게 되었고… (여기서 생각했던게… feature selection이였는데… DNA를 학습 데이터라고 하면 그 데이터를 기반으로 각 DNA 단위를 feature로 줘서 병 발현에 가장 중요한 영향을 끼친 부분이 어딘지 feature ranking을 구하면 될거란 어렴풋한 생각들…하지만 1사람 데이터가 정제후 3T정도가 된다고 하니 대용량 프로세싱은 필수라고 한다.)
모 이런 비슷한 이야기들이 책에 많이 나와 있다.
책을 보면서 특히 환자 챕터에서 사용자의 행동 데이터를 기반으로 병의 발현을 예상하는 부분은 충분히 가까운 시일내에 사업화도 가능할 거란 생각도 해본다. 이미 핸드폰이나 각 가정의 인터넷 그리고 컴퓨터의 보급 수준만 보더라도 먼 미래 이야기는 아닌듯 싶다.
나도 역시 사용자 데이터를 기반으로 하는 어플리케이션을 만들고 있고 그 퍼포먼스가 얼마나 마법과 같은 느낌을 주는지 알고 있어서 큰 느낌은 없이 읽었으나… 이 분야에 대해서 조금이나 호기심이 있으신 분들에게는 흥미로운 책이 될거라 생각된다.
오늘 드디어 커밋을 하고 말거라는 각오를 하고 출근했다. 코드 리뷰 시작한 다음날 ship! 메시지를 받았으나 코드 커밋 직전에 Regression test fail을 보고 나서 애매한 클래스 구조를 다시 설계하고 좀더 세밀한 테스트를 하게 되었다. 이 와중에 다른 사람들이 만들어 놓은 코드들에 대해서 상당히 많은 부분을 이해하게 되는 계기가 된듯 하다.
코드 커밋 전에 반드시 확인해야 될 부분은 내가 코드 수정하거나 기능 추가한 부분이 다른 언어 그러니까 한글 이외의 20개가 넘는 언어셋에 대한 퍼포먼스 테스트를 전혀 흐트러 뜨리지 않아야 된다는 것을 확인해야 된다. 이를 위한 테스트가 Regression테스트이다. C++로 개발하는 바, 예전에 C코드도 점점 C++ 클래스 구조로 리펙토링을 해나가는 찰나이고 어느 한 부분이라도 상속관계라든가 virtual 함수에 대한 잘못된 오용들이 만들어 내는 결과는 참담하기 그지 없다. 이런 클래스 구조는 사실 깊게 들여다 보지 않고 구조에 대해서 충분한 이해를 하지 않고 코딩하면 바로 Regression 테스트 실패 메시지를 경험하게 된다. 차라리 명확한 코드를 뽑길 원한다면 클래스를 쓰지 않는게 나을지도 모르겠다는 생각을 수십번은 한거 같다.
코드 수정량이 많을 경우에 Regression 테스트 실패 메시지는 상당히 곤혹스럽기 그지 없다. 왜냐면 데이터를 기반으로 테스트를 수행하는 경우 어느 부분때문에 이런 데이터 결과가 나오는지 결과만 보고 예측하기가 거의 불가능하기 때문이다(내 프로젝트는 Machine Learning 프로젝트이다. 따라서 더 힘들다). 따라서 모든 코드 수정사항에 대해서 디버깅을 해야 한다. 코드 수정 전으로 돌아가서 하나하나 다시 작업하고 중요한 시점마다 테스트를 다시 수행하고 하는 과정을 반복하며 거의 2주라는 시간을 보냈다. 이 2주의 시간은 간만에 C++클래스 구조라든지 디자인 패턴에 대해서 고민하게 만드는 시간이였다. 실제로 몇몇 디자인 패턴을 적용했고 그 덕분에 코드의 재활용성과 간략함은 증대된거같다. 하지만 다른 언어에 대한 충분한 이해가 없는 관계로 추상화가 거의 한글 위주로 되어 버린점도 없지 않다. 그러나 이 부분은 점점 해당 언어 개발자들이 리펙토링 해나갈 것이라 믿고 있다.
여튼 온늘 성공적으로 커밋을 했고 커밋 빌드 및 테스트도 무사히 완료 하게 되었다. 게다가 이전 버전과 퍼포먼스 비교 결과도 메일링으로 기분좋게 쏜 상태다.
항상 코드 작업 후에 느끼는 것은 테스트의 중요성이다. 이 테스트는 플랫폼의 안정성을 유지시켜 주는 핵심 가이드 라인이라고 할 수 있다. 따라서 테스트는 할 수 있는 거면 뭐든지 하게끔 강제하는게 정말 중요하다고 생각한다.
나는 이런 강건한 플랫폼이 생산하는 효율성에 대해서 잘 알고 있다. 플랫폼 자체가 강건하고 버전이 상승할때마다 이전것 이상의 퍼포먼스와 더불어 안정성을 보장한다면 이를 사용하는 서비스 엔지니어들의 리소스 낭비를 획기적으로 절감할 수 있다. 만일 자신의 회사에서 서비스를 운영하는 엔지니어들이 비정상적으로 많고 이의 업무 원인들이 서비스 개선이 아닌 서비스 유지를 위한 문제(예를 들어 서버의 런타임 오류들) 해결들이 대다수라면 반드시 플랫폼이 안정적으로 업그레이드 되는지 확인해봐야 할 것이다. 그리고 플랫폼 개발 과정에 테스트 코드들이 들어가 있는지 확인하고 코드 커밋 이전에 이 부분에 대해서 확실히 패스하는지 확인하는 과정을 거쳐야 할 것이다. 물론 이전에 코드 리뷰도 필수다.
물론 이 모든 과정을 거치기란 상당히 귀찮고 곤혹스러운 과정이 아닐 수 없다. 그리고 엔진 개발자들이 이런걸 지킨다고 해서 그들이 직접 이익을 보는게 아닐 수도 있다. 어떨때는 서비스에 문제가 생길때 다이내믹하게 해결하는 모습이 조직에서는 더 멋지게 보일 수도 있다. 심지어는 외부적으로는 안정적으로 돌아가는 서비스를 만드는 엔진 개발자들의 존재감이 없어 보이기도 한다. 따라서 이런 개발 조직 문화는 팀장 보다는 그 위 CTO레벨에서 추진해 나가는게 맞다고 생각한다. Hudson의 테스트 fail이 적게 나는 팀에게 연말에 경품을 준다든지.. 뭐 그런 재미난 제도도 큰 도움이 될 것이다.
오늘 사실 Regression test failure 뿐만아니라 Hudson에서 돌린 unit test에서 segmentation fault가 발생했다. 개발머신에서는 나지 않던 오류였는데, 역시 다른 리눅스 머신에서 테스트를 돌리니 이런 문제가 부각되기도 하는거 같다.이런 경우 발빠르게 valgrind를 돌려서 5분만에 오류 부분 찾아 고쳐 다시 커밋해서 지금은 잘 돌아간다. 뭐 이정도 코드량에 이정도 문제면 양반이다.
여튼 소프트웨어 개발 여정은 상당히 곤혼스럽고 복잡한 과정임에는 분명하다. 하지만 어찌하겠나… 이런 과정 하나하나가 진정 강건한 소프트웨어 개발을 위해 필요한 과정이니 말이다.
인사이트에서 신간이 나와 오늘 다시 책을 한권 받았다. 이전 책은 다 읽지도 못했는데, 이번책은 살펴본지 20분만에 리뷰를 쓰게 되었다. ^^;
이 목차만으로도 책을 열어보고 싶은 욕구들이 마구마구 일어나고, 실제 열어보면 그리 부담없이 읽을 수 있는 내용들이여서 너무 좋다.
제일 처음 열어본 목차가 무엇인지는 내가 지금 어떤 개발과정을 겪고 있는지를 쉽게 짐작이 가능하게 한다.
지금 하고 있는 일을 코드리뷰고..아마도 가장 관련있는 부분은 바로 2장 “무지를 드러내라” 일 것이다. 물론 여기에는 코드리뷰 관련된 내용이 전혀 없지만 매우 관련성 있는 내용을 드러내고 있다.
개인적으로 프로그래머로서 가장 힘든 일은 남에게 무지를 드러내는 일일 것이다. 이 부분은 다른 사람들과 코드를 공유하고 매번 자신의 성과에 대해서 대, 내외적으로 프리젠테이션을 하면서 반드시 드러나게 되어 있는 부분이다. 사실 코드리뷰시에도 동일한 것들이 드러나게 되는데, 이 코드를 보는 것만으로도 이 사람이 특정 분야에 대한 지식이나 코드 설계 능력이 어떻게 되는지 대부분 드러나게 되어 있다. 따라서 이 리뷰과정 자체가 리뷰를 받는 입장에서는 쉽지 않은 과정이다. 아마도 이런 부분 때문에 많은 소프트웨어 개발 팀에서 도입하려다 실패하지 않을까 생각해본다.
그래서 이 책에서는 “무지를 드러내라!” 라고 언급하고 있다. 무지를 드러내고 배움으로서 다시 같은 잘못을 하지 않고 점점 성장하는 모습을 보여주는게 중요하다라고 언급한다.
“당신의 평판은 어떤 지식을 알고 있느냐가 아니라 학습하는 능력이 얼마나 좋은지를 기반으로 쌓여갈 것이다.”
이 밖에 대부분 내용을 보지 않고서도 충분히 예측할 수 있는 목차들이 좀 있다.
“소스를 활용하라”, “일하면서 성찰하라”, “배운 것을 기록하라”, “배운 것을 공유하라”, “피드백 루프를 만들어라”
등등..
위 내용 대부분은 내가 개발자 생활을 7년가까이 해오면서 블로그에서 계속 고민해 오던 것들이다. 게다가 요즘 하려고 하는 일은 논문 쓰기인데… 이는 배운것을 기록한다는 의미와 공유한다는 의미 모두를 함축하고 있다는 사실이 그리 놀랍지 않다.
이 책의 목차만으로 내용을 예측하고 각 챕터 첫번째 줄만 보더라고 크게 공감할 수 있는것은 아마도 저자와 개발이라는 공통분모를 가지고 살아와서 그럴것이다. 개발자는 현재의 개발실력 그리고 과거에 개발할 것들도 중요하지만 무엇보다 필요한건 주변의 피드백을 긍정적으로 받아들이고 이를 자신의 것으로 소화시켜 실력을 키우는데 힘쓰는 자세라고 생각한다. 따라서 차라리 개발자는 도를 닦는 도인이 가깝다고 생각해본다.왜냐면 스스로 자신을 깨는 과정을 반복해야 하며 남의 비평과 평가를 기분나빠하지 않고 스스로 피와 살이 되게끔 노력해야하기 때문이다. 뭐 이 이야기는 예전에 쓴 겸손한 개발자를 존경한다는 내용과 크게 다르지 않을 것이다.
지금도 터미널을 열고 열심히 C++ 코딩을 하고 있지만, 개발을 잘 하기는 결코 쉽지가 않다. 책에서는 맨토를 찾으라고 하지만 역설적이게도 그런 맨토를 바로 자신의 회사에서 찾기는 매우 힘들다. 하지만 다행스럽게도 이 책 자체가 훌륭한 맨토 역할을 어느정도 해줄거라 믿어본다. 왜냐면 내가 지금까지 느끼고 생각해 왔고 행동해 왔던 부분들이 상당부분 수록되어 있고 구체적인 행동방침(?)들도 있기 때문이다.
개발자로서 아직 갈길이 멀어 누구의 맨토가 될 자신은 없지만, 누군가 초보 프로그래머로서의 소양을 기르고 싶어한다면 이책을 추천해줄 수 있을거 같다. 게다가 술술 읽히는 내용하며….쩝





최근 댓글