올해 초에 가천대학교 최성철 교수가 ‘데이터 과학을 위한 파이썬 프로그래밍’이란 책을 냈다. 아직 오프라인에서 만나진 못했지만, 옆 연구실에서 함께 한 대학원 후배의 책이기에, 그리고 제목이 ‘이건 네가 찾던 바로 그거야’라고 어필해서 책을 구입했다. (물론 회사의 도서구입비로…) 이 글은 저 책에서 내가 바랐던 점, 그래서 가장 실망했던 점 때문에 적는다. 좀 더 일찍 적었거나 아니면 다른 경로로 저자에게 피드백을 줬어야 하는 부분이다. 어쩌면 저자가 이미 새 책을 준비하고 있을지도 모르니 빠른 시일 내에 두 번째 책이 나오길 바란다. (압박이다.)
나는 파이썬을 잘 모른다. 소위 파알못이다. 취직 전에 2000년대 후반부터 학교 서점에 파이썬을 소개한 책들이 많이 진열돼있었다. 프로그래밍에 별로 흥미도 없거니와 파이썬도 다른 언어들처럼 일부에서 사용돼다가 또 유행이 지나갈 거라 생각해서 당시에는 책을 구입한다거나 파이썬을 공부해야겠다는 마음이 전혀 없었단. 그런데 몇 년의 시간이 지나고 데이터 과학과 기계학습, 인공지능이 대중의 언어 (물론 모든 대중이 이해한다는 의미는 아니다. 적어도 많은 이들이 뭔지는 몰라도 하도 시끄러워서 들어는 봤다는 의미다)가 되면서 파이썬이 그 선봉에 놓여있었다. 그래서 데이터 과학을 한다는 사람이 파이썬을 모른다면 앙꼬 빠진 붕어빵 신세가 됐다. 최근 조사에서 가장 많이 사용되는 언어로 파이썬이 수위에 올랐고, 최소한 데이터 과학 분야에서는 1위 언어다. 그래서 좋든 싫든 파이썬은 공부해야 하고 사용할 수 있어야 한다.
그럼에도 스스로 파알못이라 불렀듯이 나는 파이썬을 잘 모른다. 회사 업무를 진행하면서 간혹 파이썬을 사용해야 하는 경우는 있다. POC, 파일럿을 위해서 파이썬으로 코딩을 한다. 그런데 나는 개념 증명 이상의 코딩을 하지 않는다. 파이썬을 꾸준히 사용하면 이제 익숙해져야 할 텐데, 개념 증명이 끝나면 또 반년에서 1년 정도는 파이썬으로 더 이상 코딩하지 않는다. 그렇다 보니 새로운 프로젝트를 시작할 때면 다시 파이썬을 배워서 개념 증명을 하고, 또 잊어버리고 또다시 배우기를 반복하다 보니 여전히 파이썬 초보자의 티를 벗지 못했다. 그래서 현재도 파알못이다.
그런데 프로그래밍 언어는 데이터를 어떻게 처리하는지에 대한 개념, 원리와 실행을 이해하면 7~80% 이상은 마스터한 셈이다. 그 외의 문법은 큰 차이가 없다고 본다. 물론 더 정교하고 발전된 기술과 기교를 알고 있다면 더 쉽게 더 빠르게 더 안정적으로 프로그래밍할 수가 있다. 내가 파이썬에서 여전히 느끼는 이질감은 파이썬의 데이터 구조와 처리 방식 때문이다. 반복적으로 새로 주피터 노트북을 실행할 때마다 데이터를 어떻게 처리하지가 골치다. 적당한 에제를 가져와서 어찌어찌 해결은 하지만 여전히 파이썬의 데이터 구조를 제대로 이해하고 프로그래밍하고 있지는 않다.
서론이 길어졌지만, 최성철 교수의 책 제목을 봤을 때 ‘이 책에서는 데이터 과학에서 많이 활용되는 데이터 구조를 제대로 다뤄주겠구나’라는 기대감을 가졌었다. 단순히 파이썬의 기본 문법이 아니라, 데이터 처리에 필요한 데이터 구조를 명확히 설명해주겠지라는 기대였다. 필요할 때마다 인터넷에서 단판적으로 찾아보기는 하지만, 이걸 처음부터 끝까지 제대로 설명해주지 않아서 이 책이면 가능하겠지라는 기대였다. 하지만 기대는 충족되지 않았다. 여느 파이썬 책처럼 그저 기초 문법만 가르쳐줬다. 내가 진정으로 필요했던 것은 아래에도 적겠지만, 데이터 과학에 꼭 필요한 numpy나 pandas의 데이터 구조를 알려주고 어떻게 사용하거나 변환하는지였다.
아래에서 특정 라이브러리를 자세히 설명하지 않는다. 아직 제대로 알지도 못하고 제대로 활용하지도 않고 있기 때문이다. 그저 단편적으로 파이썬으로 코딩하면서 자주 사용하는 라이브러리를 정리해서 현재/앞으로 파이썬으로 데이터 과학을 하려는 이들에게 어떤 것을 공부하면 좋을지를 알려주기 위한 것이다. 설명도 부실하지만 특정 주제와 관련된 링크도 걸지 않을 거다. 그런 건 인터넷에 검색하면 바로 나온다.
서론이 참 길었다. …
프로그래밍에 흥미가 있고 잘하는 사람들이라면 기초 문법만으로 여러 프로그램을 만들 수 있을 거다. 하지만 모든 작업을 혼자서 해결하기 힘들기 때문에 여러 라이브러리를 사용한다. 파이썬이 최근 인기를 얻은 이유도 결국 잘 정의된 라이브러리가 많기 때문일 거다. 아래는 데이터 과학을 하면서 (실제 POC 프로그래밍을 하면서) 자주/종종 사용한 라이브러리가 어떤 것이 있는지를 알려주고, 혹시 파이썬으로 데이터 과학을 하려는 친구들에게 이런 라이브러리에 익숙해질 것을 조언하려는 거다. 개인적으로 적당한 예제와 구글만 있으면 어떤 프로그램도 작성할 수 있다고 생각한다. 그렇기에 여러분들도 아래에 나열한 라이브러리를 A부터 Z까지 세세히 읽고 기억하려 하기보다는 그 속의 개념과 원리만 파악하기만 하고, 구체적인 사용처는 나중에 직접 몸으로 경험하면서 익혀가길 바란다.
NumPy, Pandas
앞서도 짧게 적었지만 새로운 언어를 배울 때 가장 힘든 점 중 하나는 데이터 구조를 어떻게 정의하고 사용하는 지다. 언어에 내장된 데이터 구조와 활용법만 웬만큼 익히면 7~80% 이상은 해결된다고 믿는다. 데이터 과학에서는 보통 데이터를 벡터 vector나 행열 matrix로 표현한다. 파이썬 기본 문법으로도 이걸 구현할 수 있겠지만 이를 위해서 보통 NumPy와 Pandas를 많이 사용한다. 특히 Pandas는 DataFrame이라는 걸 정의하는데, 이는 데이터 과학 (특히 학계)에서 많이 사용하는 다른 언어인 R의 데이터 구조를 모사한 것이라서 데이터 과학자들이 많이 애용한다. 학계에서 상용 데이터 과학 도구/언어인 SAS를 대체하기 위해서 프리웨어인 R을 만들어서 많이 사용했고 그렇게 익숙해진 R의 데이터 구조를 파이썬에서 구현한 것이 Pandas라고 보면 된다. 요는 파이썬에서 기본 데이터를 처리하기 위해서 일단 Numpy나 Pandas로 데이터를 정의해야 한다. 최근에 pandas-profiling이라는 걸 알게 됐다. 직접 사용해볼 기회는 없었는데, EDA 작업을 편하게 해주는 유용한 도구니 직접 사용해볼 것을 권한다. EDA는 Exploratory Data Analysis의 약자로 주어진 데이터의 특성을 파악(탐색)하는 데이터 과학의 기초 과정이다.
** 이 글을 적기 위해서 ‘데이터 과학을 위한 파이썬 라이브러리’ 류의 검색을 해보니 SciPy라는 것도 여러 곳에서 소개하는데, SciPy를 직접 사용한 적은 없다.
Sk-learn
오늘날 데이터 과학을 한다는 것은 기계학습을 한다는 것과 거의 동격이다. 데이터 과학과 기계학습이 많이 겹치고 어떤 면에서 더 포괄적이다. 그렇지만 데이터 과학을 하는 과정에 여러 기계학습 알고리즘을 사용하지 않으면 다음 단계로 넘어가지 못한다. 간단한 EDA나 카운팅, 또는 통계 분석만으로 문제가 해결되는 경우도 많지만, 좀 더 고차원의 클러스터링이나 회귀분석 등을 사용해야 해결되는 문제들이 더 많다. 이런 여러 기계학습 알고리즘을 미리 구현해둔 라이브러리가 SciKit-Learn (sk-learn)이다. 그러니 sk-learn을 미리 익혀두고 어떤 알고리즘들이 구현돼있고 활용될 수 있는지 알아두면 좋다. 사실 대부분의 웬만한 알고리즘이 다 구현돼있어서 그냥 사용하면 된다. 간혹 최신 알고리즘이 구현돼있지 않을 수도 있으니 그런 것은 직접 구현하거나 다른 오픈소스를 찾아봐야 한다.
Gensim, NLTK
데이터 과학은 수치 데이터를 기본으로 한다. 모든 알고리즘은 일단 수치 벡터/행열로 표현된 인풋을 받아들인다. 그런데 인터넷 시대의 많은 데이터들은 텍스트나 이미지, 음성, 동영상 등의 비수치 데이터가 주를 이룬다. (이미지나 음성, 동영상 등은 직접 경험하지 않아서 이 글에서 보류함) NLP나 텍스트 마이닝을 전공하지 않더라도 데이터 과학에서 텍스트 데이터를 처리해야 할 때가 많다. 보통 텍스트 데이터를 수치 벡터/행열로 변환시켜서 작업을 하지만… 어쨌든 그런 텍스트 데이터 처리에 사용되는 많은 도구나 알고리즘은 Gensim이나 NLTK에 잘 정의돼있다. NLTK는 Natural Language ToolKit이란 이름처럼 전통적인 텍스트 처리 (토커나이징, 렘마티제이션, 스테밍, 스탑워드 등)에 좀 더 특화된 것이고, Gensim은 최근 등장한 LDA (Latent Dirichlet Allocation)나 Word2Vec 등의 단어, 문서의 벡터화에 좀더 특화됐다고 보면 된다.
TensorFlow, PyTorch, Keras
데이터 과학에서 기계학습 알고리즘을 적용한다면 다음은 딥러닝의 적용이다. Caffe나 Theano 등의 딥러닝 라이브러리도 있지만, TensorFlow와 PyTorch가 대표적이다. 구글이 만든 TensorFlow가 대중에 더 알려졌지만, 최근 PyTorch를 사용했다는 글도 많이 접하기 때문에 자신의 필요와 익숙함에 맞는 걸 선택하면 된다. 물론 둘 다 공부해두면 장땡이겠지만… 그리고 자신만의 Loss함수를 새로 정의한다거나 더 복잡한 딥러닝 구조를 만든다거나 그걸 필요가 없다면 그냥 Keras만으로도 충분하다. Keras는 TF나 PT의 복잡함을 encapsulation한 거라서 딥러닝 초보자들이 사용하기 좋다. 좀 더 개인화 된 loss함수나 복잡도가 요구되면 그때 TF 등을 더 공부하면 된다.
Matplotlib
데이터의 차원이 커지고 복잡도가 증가했고, 그리고 다양한 알고리즘으로 분석이 가능하지만 우리는 여전히 시각화를 통해서 데이터의 특성을 파악할 필요가 있다. 그래서 여러 방식으로 그래프를 그려봐야 하는데, 그럴 때 가장 기본적으로 사용하는 시각화 라이브러리가 Matplotlib이다. 더 설명은 생략… (그래프를 제대로 그려보지 않아서 설명할 능력도 없음. ㅠㅠ)
그 외에도 이미지를 위한 OpenCV 라이브러리도 있고 (잘 모름), JSON 같은 텍스트 데이터 포맷을 처리하는 것도 익혀둘 필요가 있다. 그 외에도 필요에 맞는 다양한 많은 라이브러리들이 있으니 구글신의 도움을 받아서 필요한 라이브러리를 찾아서 활용하기 바란다.