5가지 데이터 사이언티스트의 필수 스킬셋 (Re-newed)

0
907

SharpestMinds라는 실리콘밸리 스타트업이 있다. 데이터 사이언티스트 되고 싶은 분들이 취직할 때까지 무료로 포트폴리오를 봐 주고, 취직하면 헤드헌팅 수수료를 받는 서비스다.

멘토 분들이 전직 데이터 사이언티스트들이라는데, 본인이 정말 실력있으면 저런 회사를 운영할 필요도 없고, 신입도 굳이 저런 회사의 도움을 받을 필요가 없는 그런 효율적인 노동시장이 운영되면 참 좋겠지만, 주니어 레벨의 데이터 사이언티스트 시장도 여느 노동시장과 다를바 없이 Information Asymmetry가 있고, 또 직장에서 잘 적응하기 위해 미리 알고 있으면 좋을법한 지식이라는게 분명히 존재하는 것 같다.

SharpestMinds의 어느 시니어 분이 TowardsDataScience.com에 올려놓으신 글을 우연히 보게 됐는데, 공감이 되는 부분도 있고, 아닌 부분도 있어서, 또 지난 2년 남짓 데이터 사이언스 강의하며, 직접 업무 뛰며, 관계자들 만나며 얻은 경험을 담아 데이터 사이언티스트의 필수 스킬셋이 뭘까에 대한 좀 깊은 고민을 담은 글을 하나 드린다.

SharpestMinds의 글 2개를 먼저 소개한다.

 

1. 수리통계학 모델링 지식

파비 블로그를 오랫동안 보신 분들은 이미 지겹도록 봤겠지만, 수리통계학 모델링 지식 수준이 일정 레벨 미만이면 데이터 사이언티스트 자격이 없다고 생각한다. 또, 경력이 쌓이면 연봉 수준이 오르겠지만, 수리통계학 지식 수준의 높낮이를 1번 기준으로 연봉 Range를 산정하고, 그 다음에 후술하는 다른 능력치가 경험에 따라 얼마나 축적되었느냐에 따라 연봉 수준이 결정된다고봐도 틀리지 않을 것이다.

개발자들이 자꾸 착각해서 자기들이 데이터 사이언티스트 후보인줄 알고 있으니까 그쪽 예시를 들면, 알고리즘 문제를 백번 풀어봐야 동접자수 백만명이 넘어가는 게임 서버를 운영하는데 직접적인 도움은 안 된다는 걸 경험으로 이해하고 있을 것이다. 여기서 알고리즘은 R, Python 써 본 경험을 말하고, 동접 백만명의 서버 운영을 위해 알아야하는 서버/DB쪽 지식이 바로 수리통계학 모델링 지식이라고 보면 된다.

예전에 데이터 사이언티스트 채용 글에도 썼던 것처럼, 대학원에서 배울법한 아래의 수리통계학 지식은 많이 알수록 좋다.

  • 시계열 및 Sequence형 데이터 처리 (Autoregressive process, VAR, Kalman filtering, Fourier Transform 등)
  • 패널 (Panel) 데이터 처리 (Bargava-Sargan, Arellano-Bond)
  • 베이지안 통계학 (Thompson sampling 아이디어를 적용하는 모델들 ex. Bandit, Temporal-difference, Metropolis-Hasting 등)
  • Predictive modeling (Online learning, FTRL 계열 모델들)
  • Multi-task learning
  • 네트워크 이론 (Eigen centrality를 활용한 Node별 ordering 경험 or 환상형 네트워크에서 propagation 효과를 풀어낸 경험)
  • 게임이론 (Cho and Kreps, Trembling-Hand-Equilibrium 등 uncertainty case)

왜냐고? 머신러닝이라는게 사실은 계산통계학인데, 그 계산통계학 방법론들은 수리통계학을 쓰는 전공으로 길게 훈련을 받은 분들이 만들어낸 방법이니까. 그런 지식 중 일부를 회사 업무에 어떻게 활용하느냐에 따라 사업 내용도 바뀌고, 결과물도 바뀔 수 있을테니까.

On-the-job 데이터 사이언티스트가 그런 계산 테크닉을 새로 만들어내야 할 필요는 없지만, 최소한 그런 계산 테크닉들을 바로바로 이해할 수 있는 수준의 수학적 훈련은 받아놨어야 새로 나오는 “기술(?)”에 바로바로 대응하는 시니어가 될 수 있지 않을까?

 

2. 해당 업무에 대한 비지니스적 이해 + 적용할 수 있는 직관

위의 수리통계학 지식은 어떤 맥락에서 어떻게 쓸 수 있을지에 대한 센스가 없으면 그냥 책 속의 지식으로 끝난다.

대학원에서 열심히 공부하신 분들이 정작 직장에가서 배운 지식을 못 써먹고 있는 이유가 회사 업무에 별로 필요가 없어서일수도 있지만, 그런 직관을 키워본 적이 없기 때문에, 좀 심하게 말해서 머리가 굳었기 때문에 적용을 못하고 있는 것이다. 그런 분께 대학원 학위는 그냥 잉여 학위가 되어버리겠지.

아주 단순한 예시를 하나 들어보자. 경제학에서 쓰는 Cobb-Douglas 함수가 있다. (위의 방정식 참조) 노동과 자본이라는 요소 결합으로 생산량이 결정되는 단순 방정식을 이용해 공급곡선을 도출하는 굉장히 수학적인 논리 구축 작업 때 배운다. 그런데, 지식이 그 수준에 머물러 있으면 경제학은 실생활에 하나도 못 쓰는 이상한 학문이 되고 만다.

Senior Data Scientist로 있으면서 회사 내의 Confluence page들을 보던 중에, Multi factor가 영향을 주는 경우를 모델링 하려고 다른 Data Scientist가 위의 Cobb-Douglas 함수를 그대로 써 놨더라. 두 변수가 노동과 자본대신 CPC, 과거 반응율 등등의 광고시장 Metric 값으로 바뀌었던 점이 좀 달랐고, 그런 변수들이 광고지면 입찰가에 영향을 주는 작업이 Linear 관계가 아니니까 일단 이렇게 시작한다고 설명을 달아놨던데, 학교에서 배운 지식을 현업에 어떻게 응용할 수 있는지에 대한 아주 간단한 예시가 될 수 있을 것 같다.

각 변수가 얼마나 큰 영향을 미치는지를 a, b 값으로 표현하는 저 방정식에 Log를 취하면 우리가 알고 있는 Linear regression과 거의 동일한 방정식 형태가 된다. 그리고 t, t+1 기 사이의 log값 차이는 변화율 값이다. 이런 단순한 지식을 이용해서 광고지면 입찰가 모델과 결과값이 얼마나 크게 괴리가 나는지, 영향을 줬던 다른 요소들 (회사 기밀이다), 향후 모델 테스트 방식 같은 정보들을 상세하게 정리해놨던데, 그 분이 어떤 학문으로 훈련 받았건 상관없이, 광고지면 구매하는 과정을 잘 이해하고, 수학 모델링을 어떻게 활용할 수 있는지 뛰어난 직관을 갖고 있었기 때문에 할 수 있던 작업이 아니었나 싶다.

몇 달전 어느 물리학 박사과정 생이 데이터 사이언스 수업 끝에 “수학적인 부분은 일부러 깊게 안 들어가셔서 그런지 어렵지 않았는데, 이 분야에서는 그런걸 어떻게 적용한다는 직관이 정말 훨씬 더 중요한 것 같네요.” 라고 하더라.

 

3. 쪼개볼 수 있는 예리한 분석력

Data Analyst라는 직업군이 Data Scientist로 오해받는 경우를 자주보면서, “분석”이라는 단어를 쓰기가 참 걱정되는데, 달리 더 좋은 표현을 못 찾겠다.

어떤 연구를 한다는 건, 남들이 어떤 작업을 해 놨는지 살펴보고 이해한 다음에, 그걸 그대로 베끼는게 아니라 자기만의 새로운 “각도”를 추가하는 작업이라고 생각한다. 당연히 남들이 해 놓은 결과물을 이해할 수 있는 지적인 훈련도와 내공을 갖추고 있어야하고, 남들이 생각해보지 못한 관점에서 해당 연구 과제를 새롭게 볼 수 있는 능력이 아카데믹이 인정하는 “분석” 능력이다. 아카데믹들은 이런 능력을 “Analytic Mind”라고 표현하기도 한다.

쉬운 예시를 들면, 우리 회사 매출액이 올랐던 이유로 A, B, C, D가 나와있었는데, 혹시 Y도 포함되지 않을까, 그리고 그 Y가 A~D와는 전혀 관계없는 독립변수가 아닐까는 관점에서 출발해서, Y를 포함시켜야되는 이유를 합리적으로 정립하고 (연구자들이라면 그걸 수학 모델로 만들어야하겠지만, 굳이 직장에서는..), 실제 데이터를 이용해서 Y값이 매출액에 영향을 줬는지, Y값이 A~D와 전혀 관계없는 요소인지, 혹시 Y값은 다른 외부 요소에 어떤 영향을 받은건 아닌지를 살펴보는 작업이다.

좀 더 고난이도 예시를 들면, 벽돌깨기 게임을 학습하는 자동화 알고리즘 (타칭 “인공지능”)을 만든다고 할 때, 공이 움직이는 위치를 전부 스캔해서 입력하면 학습도 엉망으로 되고, 그 전에 아마 수학적인 관점에서 발산하는 결과를 얻을 것이다. 왜 발산하는지 (왜 딥러닝에 집어넣었는데 Learning이 안되는거지라고 생각하며) 단순히 값 바꿔보면서 백 번, 천 번의 실험으로 경험적으로 이해는 할 수 있을지 몰라도, 해결 방법을 찾기는 힘들 것이다. Experience Replay라는 걸 공부하고나면 이해되겠지만, 공 움직임같이 Sequence형 데이터에서 Autocorrelation이 생기는 부분(i.e. 연결된 움직임)을 제거해주지 않으면 선형대수적으로 Rank problem이 생긴다. 이 때, 시계열에 관련된 통계학 훈련이 잘 되어 있다면 Autocorrelation을 제거할 수 있는 여러 아이디어들을 Thought experiment로, 수식으로 정리해서 결과를 예측해볼 수 있기도 하고, 또 해당 게임의 작동 방식을 잘 이해하고 있으면 그에 맞춰서 데이터를 변형시키는 것도 가능한 옵션이다. 참고로, Experience Replay는 Sequence의 다른 부분에 있는 데이터를 도구변수 (Intrumental variable)처럼 활용해서 Autocorrelation을 제거해준다. 아마 당시에 가능한 옵션들이 Random Sampling을 해서 데이터의 Autocorrelation을 축소시키거나, 공의 움직임 스캔값을 선으로 바꿔 입력하는 것 정도가 있었을 것 같은데, 스캔 데이터 값을 보고 판단했으리라.

위에서 보듯이, 문제를 경험적으로가 아니라 체계적으로 인식하고, 그 해결을 위한 아이디어를 테스트해보는데, 그 테스트가 합리적인 테스트가 되기 위해서는 위에서 말한 수리통계학 모델링 지식, 그 지식을 활용할 수 있는 직관이 필수적이다.

참신한 생각이라는 표현을 좀 바꾸면, 남들이 생각해보지 못했던 각도에서 같은 결과를 바라보고, 그 분석 과정에서 기존의 생각을 더 단단하게 굳히거나, 새로운 관점을 추가할 수 있게되는 맥락이라고 생각하면 맞을 것 같다.

이런 훈련 없어도 “그냥 딥러닝에 다 집어넣으면 알아서 찾아주던데요?” 라고 생각하시는 분들께는 이 글을 바친다.

 

4. “My own” 포트폴리오

데이터 사이언티스트가 되고 싶다는 사람들, 학원에서 어떤 훈련을 받았다는 사람들, 혼자서 열심히 공부해봤다는 사람들 거의 대부분이 갖고 있는 포트폴리오를 보면 인터넷에서 쉽게 찾을 수 있는 타이타닉 데이터, MNIST 데이터를 이용한 작업 결과물들이다.

예외가 있을 수도 있겠지만, 그런 마르고 닳도록 남들이 가져다 쓴 데이터로 본인의 뛰어난 분석력을 보여주는데는 한계가 있을 수 밖에 없다. 되려 자기가 남의 결과물을 잘 베끼는 사람이라는 증거가 되기 십상이다.

지원하는 회사가 있는 산업의 관련 데이터를 뒤져서, 그 데이터를 그 회사에는 이렇게 쓰지 않을까는 생각을 담은 포트폴리오를 만드는 사람은 왜 그렇게 드물까?

그런 포트폴리오 만드는데 분명히 시간이 많이 걸릴 것이다. 그런데, 남들보다 더 뛰어나고 싶으면 계속 훈련해야하는거 아닌가? 내 이력서가 남들보다 덜 뛰어나다면 이런식으로 남들이 하지 않는 작업을 추가해놔야 조금이라도 더 면접관의 눈에 들지 않을까?

데이터 사이언티스트 인턴 채용 공고를 내고 받았던 지원서 중에, 네트워크 모델을 이용해서 병이 퍼져나가는 속도를 최소화할 수 있는 구조에 대한 고민을 담은 포트폴리오를 본 적이 있다. 학부 고학년 수업의 기말 레포트 정도에 해당하는 포트폴리오였는데, 우리 파비가 그런 인턴을 키울 수 있을만큼 여유있는 큰 조직이었다면 한번쯤 그 학생의 내공을 따져봤을 거라고 생각한다. 지금쯤 어딘가 다른 조직에서 성장하고 있으실텐데, 언젠가 꼭 한번 만나보고 싶은 분이다.

단순히 Regression 복잡하게 넣은 Neural net이니 SVM을 돌리는 수준의 공부를 한 분이 아니라, 수학을 이용한 모델링을 배우고 쓸려는 노력을 한 흔적이 보였기 때문이다. Recruiter의 시선을 사로잡는 포트폴리오에 대한 감이 좀 잡히셨으면 한다.

plus, 남들이 다 하니까 따라하는지는 모르겠는데, Kaggle에 굳이 얽매일 필요가 있는지 모르겠다. Kaggle처럼 몇 % 맞다는 결과값에 희열을 느끼는 집단이 주어진 데이터를 쥐어짜는 방법에만 집중하는게 되려 수리통계학 훈련도를 높이는데 장애물이 되지 않을까 싶다.

명심하시라. 데이터 사이언스 업무에서 포트폴리오는 내가 이것저것 많이 해 봤다고 자랑하는 용이 아니라, 나의 수리통계학적 내공을 상대가 가늠할 수 있는 도와주는 매개체일 뿐이다.

 

5. 데이터 베이스 관련 지식

일단 SQL을 할 줄 모르면 거의 업무를 할 수 없을 것이다. 회사에 들어가면 엔지니어들이 자료구조론에 대한 깊은 이해, 비지니스가 잘 돌아가도록 데이터 베이스를 짜 놨을텐데, 원하는 방식으로 DB에서 데이터를 추출해야 위에서 말한 내용을 적용할 수 있기 때문이다.

그래서 회사 들어가려면 SQL부터 먼저 공부해라고 말하는 분들도 많다. 당장 Select, from 한번 안 쳐 봤으면 아무리 금방 배우는 지식이라고 해도 회사 입장에서 선뜻 채용하기는 어려울 것이다.

면접 질문으로 Join을 Outer join으로 걸었을 때, Inner join으로 걸었을 때 어떤 결과가 나오는지 정도는 나올 수 있고, 이 정도 질문은 무사히 대답해야 면접관의 표정이 밝아지지 않을까?

더불어, 업무를 하다보면 자료 구조가 어떻게 바뀌었으면 좋겠다는 고민도 생길 것이고, 그런 이야기를 데이터 엔지니어들과 커뮤니케이션 해야할 일이 엄청나게 많아진다. 그들과 대화가 잘 풀려나가야 회사 업무를 원활하게 할 수 있을텐데, 어쩔 수 없이 자료구조론을 공부할 수 밖에 없을 것이다. 보통 데이터 무결성 (Integrity)에 관련된 질문들을 하고, 배열 (Array) vs. 리스트 (List) 저장 방식의 차이점에 대해서도 묻고, 좀 엉망인 DB Table들을 배열해 놓은 다음, 효율적으로 바꿔라는 과제를 던지기도 한다.

업무를 하다보니, 위의 내용이 데이터 엔지니어에게만 필수 지식이 아니라, 데이터 사이언티스트도 그 분들과 대화가 가능한 수준까지는 지식 수준을 올려놔야한다는 사실을 깨달았다.

혹시나 면접관 중에 데이터 엔지니어를 만날지 모를텐데, 미리 공부하고 가시는걸 추천한다. 수학, 통계학에 비해 그렇게 긴 시간을 투자해야할 만한 지식도 아니다.

 

(6. Python, R 코딩 능력)

안 쓰면 안 될 것 같아서 마지막에 추가하는 능력인데, 사실 그렇게 중요한지 잘 모르겠다. 위의 다른 능력들, 수학/통계학을 이용한 모델링 능력, 직관을 기르는 사고 훈련 등등이 잘 갖춰지기 위해서 어쩔 수 없이 손으로 뭔가 돌려봐야할텐데, 그런 코딩 언어는 세상에 참 많이도 있다.

연구실에 가보면 아직도 Matlab을 쓰시는 분들이 많을텐데, 버튼 하나로 작업 결과물을 Java, C로 변환해주고, 잘 모르는 사람들이 “딥러닝 개발자 = TensorFlow 경험자”라고 단순하게 생각하는 TensorFlow도 지원해준다. 연구실에서 더 희귀하게 보이지만 퀄리티 좋은 프로그램으로 Mathematica라는 것도 있다. 학교에서 그런 언어로 작업하셨던 분들이 직장가서 Python이나 R같은 비슷한 Script형 언어에 적응하는데 얼마나 긴 시간이 걸릴까? 1달 이상 걸리면 그 분의 연구 실적을 다시 확인해봐야 된다.

언어들이 다 비슷하기 때문에, 그냥 회사에서 많이 쓰는 언어에 맞추면 된다. Python을 많이 쓰면 거기에 맞추고, R 좋아하면 거기에 맞추고, 둘 다 쓰신다고들 하면 같이 맞춰주고, 속도 느려서 LLVM 언어들로 넘어가고 싶다면 Julia라는 대체재도 있다. Julia는 속도를 더 빠르게 해 주려고 언어 레벨에서 TensorFlow 컴파일링을 직접 지원한다. 아마 이렇게 돌려보면 Python 대비 10배 가까운 계산비용 절감을 경험할 수 있을 것이다. 사실 구글이 만든 TensorFlow는 C와 Java였다. Python이 아니라. 여담으로, 구글이 TensorFlow를 처음 내놓았을 때부터 지금까지 Python 버젼은 C 버젼이 Python에서 돌아갈 수 있도록 포팅해놓은 버젼이었던 탓에 가장 오류가 많이 생기는 버젼이었다. 그래픽 카드라는 시스템을 직접 제어해야하는데, 당연히 C로 프로그램을 짜야하지 않았을까?

다시 한번 강조하지만, 코딩을 잘하는 것과 개발을 잘하는 것은 1:1 동치 관계가 아니다. 학교 연구실에서도 코딩하고 있다는 사실, 그들의 아카데믹 코딩 중 일부가 일반에 알려진 머신러닝이라는 사실을 꼭 짚고 넘어가고 싶다.

정리하면, 코딩을 배울게 아니라, 기초가 되는 수학/통계학을 배우고, 그걸 내가 쓰는 코딩 언어로 어떻게 표현하는지를 익히면서 코딩 지식도 넓히고, 배우는 수학 모델에 대한 이해도를 조금씩 늘리는 방식이 맞는 접근법인 것 같다. (딱 대학원에서 이런 교육을 받지 않나?)

 

나가며 – 불나방들이 나가고 난 다음

요즘 대기업들이 채용하는 데이터 사이언티스트 팀을 보면 확실히 예전보다 더 박사과정에서 모델링 훈련을 거친 사람들 위주로 선별하고 있다는 이야기를 자주 듣게 된다. 꼭 학위가 있어야 된다고 생각하지 않지만, 돈을 지불하는 사용자 입장에서 상대방의 훈련 레벨을 가늠하기 가장 좋은 근거자료는 학벌과 학력이기 때문일 것이다.

한동안 IT업계의 많은 업무들이 개발, 디자인처럼 Rocket Science없이 돌아간 덕분에 “뭘 해봤다”는 포트폴리오 위주로 인재 채용이 이뤄졌던 경향이 있었고, 그런 분위기와 맞물려 데이터 사이언티스트라는 직업도 직장경력, 포트폴리오 중심으로 돌아갔었다. 그런데, 그런 인력이 할 수 있는건 베끼기에서 한발자국 더 나간 수준에 불과하다는 사실을 시장이 빠른 속도로 깨닫고 있는 것 같다. 링크에 있는 “불나방”들이 파이썬으로 라이브러리 좀 써보고 직장가서 배우면 되는거 아니냐는 태도로 접근했었다가, 그 글의 댓글에서 보듯이 학자들이 시장을 정화시켜 나가는 중이고, 공고들도 최소 조건으로 석사를 요구한단다.

더 나아가서는 데이터로 뭘 해 봤는데 별로 되는건 없고, 언론 플레이용 화려한 미사어구만 잔뜩하고, 된다는건 우리 회사에서 크게 쓸모도 없다는 사실도 함께 깨닫고 있는 중이신 것 같더라.

일을 떠나서, 몇 년간 관련 기초 지식을 가르쳐보며 느낀건, 역시 체계적으로 수리통계학 훈련을 받은 사람들이 코딩 잘 하던 사람들보다 이 업무에 더 맞는다는 사실, 그래서 더더욱 대학원에서 정식 교육을 받은 사람들이 이 시장에 진입해야하지 않나는 생각을 하게 된다. 대학원에서 충실히 훈련 받고, 아직 세상에 자신의 칼날을 보여주기 전에 한 끝의 벽을 못 넘고 있으신 분들 (중 일부)에게 위의 정보가 도움이 되지 않을까 싶다.

공부하시는데, 구직하시는데 건투를 빈다.