Share           Pin It
오랜만에 블로그 방명록을 통해서 들어온 질문에 대한 답변을 적어 봅니다. 

질문을 대략 요약하면 다음과 같습니다.
인천에 있는 대학에서 경영학과 4학년으로, 산업경영공학을 복수전공해서 졸업할 예정이다. 제조업 물류 쪽에서 일하고 싶지만, (이런 쪽으로 진로를 정하기 위해서 컴공과보다는) 산업공학과 대학원에 진학해서 데이터마이닝을 전공하고 싶다. 실험계획이나 통계 관련 수업은 이미 들어서 기초적인 지식은 있지만, 겨우 MS SQL만 사용할 정도로 프로그래밍 쪽은 기초가 거의 없다. 그래서, 대학원에서 다뤄야할 기본 프로그래밍 언어는 어떤 것이 있고, 빨리 배우려면 어떻게 해야 할까요?
질문을 대략 요약한 것이라서 제가 답글로 남긴 내용은 위의 요약만으로는 조금 이해하기 어려울 수도 있지만, 짧게 남긴 답글을 먼저 제시하겠습니다.
대학원에 진학하면 수업/숙제를 위해서 또는 프로젝트를 위해서 관련된 언어나 통계툴을 웬만큼 익히게 됩니다. 너무 걱정할 필요는 없을 것같습니다. 학교에서 논문 작성을 위해서는 매트랩을 많이 사용하지만, 라이센스 비용 등도 있고 현장에서 계속 사용하기 위해서는 R을 배우는 것을 추천합니다. 그리고 일반 범용 랭귀지를 배우고 싶다면 C나 자바보다는 요즘은 파이썬으로 시작하는 것도 추천합니다. 매트랩이나 R보다는 파이썬 책이나 한권 사서 먼저 익혀보세요.

최근 가천대학교 산업경영공학과의 최성철 교수가 적은 ‘산업공학과를 위한 프로그래밍 입문 파트1 링크 / 파트2 링크' 또는 ‘산업공학도가 데이터 과학하기'를 먼저 읽어보는 것이 충분히 도움이 될 것같습니다. (위의 포스팅을 페이스북에 올린 후에 최교수와는 페친이 됐는데, 학교 5년 후배였네요. 학교에 있는 동안 마주쳤을 법도 한데… 혹시 최교수가 제주에 올 일이 있어서 연락하면 한 번 만나봤으면 좋겠고, 관련 주제로 회사에서 세미나라도 해줬으면..)

이제껏 데이터마이닝 전공에 대한 몇 차례 글을 적으면서 애써 피했던 주제가 프로그래밍 관련 된 것입니다. 제가 각종 언어 (국어, 영어, 일본어 등의 자연어에서 부터 자연의 언어인 수학, 그리고 컴퓨터 언어인 프로그래밍 랭귀지들)에 자신이 없기 때문에 언어에 대한 적당한 조언자는 아닙니다. 그러나 개념적인 부분에서는 나름 잘 파악하고 있다고 생각하기 때문에 기술적이지 않은 선에서 (데이터마이닝과 관련한 언어 선택을 중심으로) 몇 자 적겠습니다.

96년도에 대학을 들어가서 처음 배운 컴퓨터 언어는 C 였습니다. 정말 못했습니다. 저희 때만 하더라도 포인터와 struct까지 다 배웠는데, 몇 년 후에는 배열정도까지만 배우도록 과정이 축소됐다는 얘기도 들었고, 어쩌면 지금은 C가 아닌 다른 언어로 시작할지도 모릅니다. 인터넷을 접하면서 자연스레 마크업을 다루고 Java도 조금 독학해서 지금은 Java (최근 자바8 등에서 차용된 최신 형태인 람다함수 등은 아직 사용하지 못하고, 여전히 아주 예전 스타일대로 자바 코딩중입니다.ㅠㅠ) 계열로 간단히 먹고 살 정도로 코드를 작성하고 있습니다. (잠시 스쳐간 소소한 언어들도 있지만) 대학원에서는 매트랩으로 수치 연산을 하고 실험 결과로 논문 작성을 주로 했고, 회사에 와서는 SAS로 데이터 가공을 주로 하고 있습니다. 그리고 최근에는 하둡+자바 환경으로 대용량 데이터 MR 작업을 주로 합니다.

진학하는 대학원 연구실이나 담당 교수에 따라서 조금씩 다르겠지만, 통계 위주의 연구실이라면 예전부터 사용하던 통계툴들이 있을 것입니다. 매트랩일 수도 있고, SAS를 사용하는 곳도 있고, 미니탭이나 매스매티카 등을 사용하는 경우도 있을 것입니다. 그리고 요즘은 R도 많이 사용할 듯합니다. 제가 대학원을 다닐 때는 그냥 매트랩으로 다 처리하고 졸업할 시점에 R에 대한 얘기를 처음 접했는데, 제대로 사용하지 못하고 그냥 졸업했습니다. (최근 R을 조금 공부했지만 그냥 코드의 흐름만 이해할 정도입니다.) 즉, 대학원 연구실의 성격이나 수강하는 수업의 교수 특성에 따라서 특정 통계툴을 사용하도록 강제(?)되기 때문에 미리 어떤 툴에 익숙해져야 겠다는 것이 조금 어리석은 생각일 수도 있습니다. 어차피 프로젝트 과제를 하거나 숙제를 하기 위해서는 그런 툴에 빨리 익숙해질 것이기 때문입니다.

그렇지만 논문 작성이 우선이라면 매트랩이나 R을 배울 것을 권합니다. 벡터나 매트릭스 연산이 많이 필요한 분야를 전공하고 싶다면 매트랩이 더 적합하고, 통계 분야로 공부하고 싶다면 R이 더 나은 선택입니다. 그리고 졸업 후에도 계속 사용하는 것이 목적이라면 R이 매트랩보다는 조금 더 매력적입니다. R만으로는 충분히 큰 데이터를 용이하게 다룰 수는 없지만, 다양한 빅데이터 기술들과 연계를 고려한다면 (프로그래밍에 취약한 분이라면) R의 대안이 거의 없다고 봐도 무관할 듯합니다.

대학원에서 과제를 진행하거나 졸업 후에 (학계가 아닌 산업계로) 취직할 때 상용 통계툴로만 해결 가능한 문제는 극소수로 제한됩니다. 그렇기에 범용 프로그래밍 언어 하나 정도는 익혀둘 필요가 있습니다. 다양한 데이터를 전처리하거나 후처리하는 과정에서 꼭 필요합니다. 그리고 웹을 통해서 도출된 결과를 보여주기 위해서는 웹 친화적인 언어를 배우는 것이 좋습니다. 그런 여러 가지를 고려한다면 적당한 대안으로 Java, 파이썬, 스칼라 Scala 정도가 있을 듯합니다. Perl이나 PHP도 일부에서는 사용하지만, 앞의 3개에는 못 미칩니다.

그런데 학교에서 연구하고 또 다양한 (특히 텍스트 형태의) 데이터를 가공하는 것이 목적이라면 파이썬이 가장 강력한 후보라고 생각합니다. Scala는 제가 아직 잘 모르는 언어라서 일단 생략합니다. 여러 종류의 문제에 맞는 오픈소스로 Java 기반의 라이브러리나 프로그램들이 많이 있지만, 과학 연구나 텍스트 마이닝을 위한 파이썬 라이브러리에는 (특히 최근에는) 못 미칠 듯합니다. 파이썬이 자바보다도 더 배우기도 쉽다고 하니 첫 언어 습득으로 파이썬은 좋은 선택입니다. (자바보다는 파이썬이 나중에 나온 언어라서 좀더 진화된 형태를 보여주는 듯함. 그에 비해서 자바는 기존의 C나 C++의 컨벤션을 많이 상속한 마지막 언어라는 느낌이 강함) 최근 구글(Go)이나 애플(Swift) 등에서도 새로운 랭귀지를 발표하는데, 이건 관련 앱을 만드는 등에 최적화됐으니 이 포스팅에서는 굳이 다룰 필요는 없을 듯합니다.

그래서 대학원에 진학하는 사람 그리고 산업계로 진출하려는 사람에게는 파이썬 + R이 가장 강력하고 적절한 조합이 아닐까?라는 생각을 해봅니다. 그런데 최근 이슈가 있는 빅데이터, 특히  Hadoop 기반의 MR 작업을 진행한다면 Java에 대한 이해가 있으면 좋을 듯합니다. 그러나 그런 것도 대부분 파이썬으로 커버가 되기 때문에 특수한 경우가 아니라면 (데이터 가공이 아닌 더 시스템에 치우친 분야로 취업한다거나..) 굳이 자바를 마스터할 필요는 없습니다. 파이썬이면 충분할 듯… 그리고 하나의 언어를 습득하고 나면 두번째, 세번째 언어는 나름 더 쉽게 습득할 수 있기 때문에 필요할 때 다시 배우면 됩니다. (먹고 살려면 배우게 됩니다.)

최근 회사 내에서도 이슈가 되기도 했지만, 빠른 빅데이터 처리 및 분석을 위한 것이라면 파이썬 + R + 하둡보다는 Scala + Spark 형태도 괜찮을 듯합니다. Scala는 Java에 더 진일보한 언어라서 자바를 배우는 것보다 바로 스칼라로 넘어가는 것도 현명한 선택일 듯합니다. (그러나 아직은 Scala는 자바나 파이썬보다는 범용성에서는 다소 떨어진다는 점을 고려해야 합니다. 범용성이란 단순 기능의 커버리지 뿐만 아니라 개발자 커뮤니티나 라이브러리 등을 두루 말하는 의미임.) Spark는 메모리 기반으로 머신러닝 ML 라이브러리를 제공해주고 스칼라에 최적화됐기 때문에 학교가 아닌 산업계에서 경력을 쌓고 유지하고 싶다면 Scala + Spark도 괜찮은 조합입니다.

대략 요약하면 학계에서 계속 경력을 쌓고 싶다면 매트랩이나 R (또는 SAS)를 선택해서 특화시키는 것이 좋을 것같고, 대학원 후에 취업이 목적이라면 R + 파이썬 조합이 괜찮을 듯하고, 그리고 회사에서 더 큰 임팩트를 주고 싶다면 Scala + Spark 조합이 좋을 듯합니다. 그러나 관련 분야에서 몇 년의 시간을 보내고 경력을 쌓다보면 매트랩도 하고 있고 R이나 SAS도 다루고 있고, 어떨 때는 파이썬으로 코딩하고 다른 경우는 또 자바로 코딩하고 있습니다. 대용량 데이터를 다루기 위해서 하둡+자바로 코딩하기도 하고, 더 빠른 분석 등을 위해서 Scala+Spark로 작업하고 있는 자신의 모습을 발견하게 될 것입니다. 당장 어떤 언어를 마스터해야겠다는 욕심보다는 상황에 맞게 빨리 습득하고 시도해보는 것이 중요합니다.

그리고 댓글에 짧게 적었듯이, 일단 프로그래밍 언어를 배워서 익숙해지는 것이 목적이라면 학원 등에 등록해서 수강하는 것도 좋겠지만, 그냥 동네 서점에 가서 파이썬 책 한권 구매해서 처음부터 읽어가면서 책에 나온 예시들을 직접 타이핑해가며 (C&P는 아니라고 생각됨) 연습해보고, 또 더 복잡한 문제를 위해서 인터넷에서 관련 오픈소스를 다운받아서 설치하거나 변경해보면서 연습하는 것만으로 충분할 듯합니다. 그리고 그루터의 정재화님이 올린 ‘프로그래머를 꿈꾸는 학부생들에게' 내용도 참조하시면 좋을 듯합니다.

저는 각종 언어에 젬병이기 때문에, 위의 글은 참조만 하시고 더 전문가들의 조언에 귀기울이시기 바랍니다.

==
페이스북 페이지: https://www.facebook.com/unexperienced


댓글을 달아 주세요

Share           Pin It

지난 글에서 (빅데이터) 분석 플랫폼에 대한 생각을 적었습니다. (참고. 데이터 분석 플랫폼에 대한 고민) 그냥 잊어버리려했지만 계속 머리 속에서 생각이 더 구체화되고 있습니다. '아키텍트가 필요하다' 글에서도 밝혔듯이 현실적으로 어려운 여건들이 많이 있지만, 전체 퍼즐을 완성하기 전에 부분 그림은 맞출 수 있을 것같다는 느낌이 옵니다. 데이터를 준비하는 과정은 서비스나 도메인에 따라서 최적화시켜야하는 부분이어서 지금 시점에서 구체적인 안을 제시할 수가 없고, 또 분석된 결과를 해석해서 더 가치있는 인사이트로 전개하는 것은 단기간에 해결될 수 있는 것도 아닙니다. 그리고 빅데이터를 위한 하드웨어 및 소프트웨어 인프라를 설계하고 개발하는 것도 제 영역/능력을 벗어난 일입니다. 그렇다면 현시점에서 당장 할 수 있는 것은 분석 시스템 자체의 기능을 공부하고 구현해두는 것밖에 없습니다. 그래서 현재 존재하는 다양한 빅데이터 관련 기술들을 조사해서 분석 시스템에 어떻게 활용될 것인가?를 먼저 생각해보기로 했습니다. 잘 진행이 된다면 팀 내에서 각각의 파트를 나눠서 공부해서 각 파트의 전문가를 한두명씩 양성할 수 있으면 좋겠다는 생각도 해봅니다.

하드웨어 인프라가 갖춰지면, 기본적인 소프트웨어 인프라는 설치하고 설정할 수 있어야 합니다. 모든 소프트웨어 패키지들을 설치할 필요는 없겠지만, 기본적으로 하둡 Hadoop 시스템이나 Hive와 Pig와 같은 스크립팅 시스템은 설치/설정할 수 있어야 할 것이고, 필요에 따라서 카산드라, MongoDB나 HBase와 같은 NoSQL도 설치/설정이 가능해야할 것이고, 그 외에 ZooKeeper와 같은 기반 환경 등도 최적화할 수 있어야 할 것입니다. 분석가의 입장에서는 조금 귀찮은 일이기도 하지만, 설치와 최적화라는 삽질을 통해서 더 시스템을 더 잘 이해하고 활용할 수가 있습니다. 팀에서 처음 하둡 등을 설치할 때, 저도 잘 모르지만 함께 참여해서 다양한 시도를 해봤더라면 지금 빅데이터 시스템을 더 잘 활용하고 있을텐데라는 후회가 늘 따릅니다.

이제 HW/SW 인프라라 세팅되었다면, Java나 Python과 같이 자신에게 편한 프로그래맹 랭귀지로 간단한 데이터에서 작동하는 MapReduce 알고리즘정도는 구현해볼 필요가 있습니다. 하이브나 피그와 같이 다양한 스크립팅 시스템도 개발/지원되고 있지만, 그것들은 테스트 환경이나 프로토타입을 위해서 장려될 뿐, 궁극적으로 서비스를 위해서는 좀더 네이티브한 랭귀지로 최적화, 안정화될 필요가 있습니다. 하둡이 Java로 구현되었기 때문에 자바를 통합 맵리듀스 구현이 가장 바람직하겠지만, 최근에 파이썬 등에서도 많이 최적화되었기 때문에 자신이 편한 개발환경에서 다양한 프랙티스를 해볼 것을 권합니다.

다음으로 필요한 것은 Hive나 Pig와 같은 스크립팅 랭귀지를 마스터하는 것입니다. 자바나 파이썬 등이 편한 개발자가 굳이 스크립팅 언어까지 배울 필요가 있을까?라는 생각도 듭니다. 더우기 사용성에 초점을 둔 스크립팅 언어는 컴파일이 필요한 네이티브들보다는 다양한 활용에 -- 비정형 데이터처리 등과 같은 -- 제약이 많습니다. 그러나 빠르게 구현해서 바로 실행시켜볼 수 있다는 장점이 있기 때문에, 프로토타이핑 단계에서는 스크립팅언어로 그리고 시스템화에서는 네이티브언어로 구현하는 것은 여러 모로 도움이 됩니다. 피그보다는 하이브가 더 SQL과 가깝기 때문에 팀내에서는 일단 하이브의 사용을 권장하고 있습니다. 그리고 밑에서 적겠지만 R을 이용하는 RHive를 사용할 것이라면 Hive에 익숙해질 필요가 있습니다.

그리고 데이터분석이라면 머신러닝을 빼놓을 수 없습니다. 다양한 문서들과 (검색) 로그들을 활용하기 위해서 단순 카운팅이나 몇몇 독립적으로 배포된 알고리즘들은 사용해보고 있지만, 일반적으로 머신러닝으로 알려진 ANN이나 SVM 등과 같은 것들을 비정형 빅데이터에 적용해보는 것은 아직 엄두도 못 내고 있습니다. 그러나 사람들의 생각은 모두 비슷한가 봅니다. 이미 Mahout이라는 이름으로 아파치에서 빅데이터를 위한 머신러닝 오픈프로젝트가 진행중입니다. 저도 Mahout이라는 이름만 들어봤지, 실제 어떻게 이용되고 있는지에 대한 정보는 없습니다. 대충 훑어보니 SVD, 베이지언, 클러스터링 등의 기능들이 포함되어있어서 안정화되면 분석플랫폼에서 아주 유용하게 쓸 수 있을 듯합니다. Mahout 얘기를 하다보니 학교 다닐 때 들었던 Weka라는 자바용 머신러닝 라이브러리가 얼핏 떠오릅니다. ... 아직은 초기/불안정한 단계에 있지만 Mahout도 초반부터 공부해둘 필요가 있을 듯합니다.

그리고 빅데이터가 뜨면서 함께 주목받는 통계 패키지가 있습니다. 바로 R 입니다. SAS나 매트랩 등의 고가의 소프트웨어에 비해서, R은 통계전공자들에게 늘리 이용되고 있는 오픈/프리 소프트웨어입니다. 그런데 R은 빅데이터/하둡과 연결되어 R이 가진 다양한 통계 기능/라이브러리를 빅데이터에 바로 이용할 수 있습니다. Mahout과 같은 빅데이터-네이티브가 아니라서 아직은 훨씬 더 불안정하고 제약사항이 많지만, 큰 프로그램을 구현하기에 앞서 기존의 패키지로 다양한 테스트를 해볼 수가 있기 때문에 유용합니다. 주변에서 R과 하둡을 함께 사용하는 팀이 있는데, 아직은 많이 불안정하다고 합니다. 그냥 초기에 히스토그램을 그려보거나 초기 파라메터값을 설정하는 용도정도의 제한된 사용만 하고 있다고 합니다. 레볼루션 애널리틱스의 R+Hadoop과 국내 NexR의 RHive가 현재 사용중입니다. 저도 일단은 R을 공부해보기로 했습니다. 책도 구입하고 웹의 다양한 튜토리얼도 보고 있지만, 오랜만에 새로운 랭귀지를 공부하는 거라서 쉽지가 않습니다. 매트랩에서는 행렬, SAS에서는 DataSet의 특성을 잘 파악하면 되었듯이, R에서는 벡터를 잘 이해/활용하면 R 좀 쓴다는 말을 들을 수 있을 것같습니다.

마지막으로 데이터 시각화 도구와 결과 리포팅 기능이 필요합니다. 이미 지난 글에서도 적었듯이 (참고, 데이터 시각화 도구들) 웹에서 데이터를 다양한 도표와 그림으로 시각화해주는 오픈소스들이 많이 있습니다. 물론 앞서 언급했던 R에서도 다양한 시각화가 가능합니다. 그러나 R은 여전히 불안정하고 또 웹을 통한 인터렉티브 그래프를 제공해줄 수가 없기 때문에, 자바스크립트 등을 이용한 웹 시각화 도구에 대한 공부가 필요합니다. 그리고 단순히 어떤 시각화 도구를 사용할 것인가보다는 데이터를 어떻게 표현하는 것이 가장 효과적인가에 대한 고민이 더 필요합니다. 예를들어, 같은 데이터라도 막대그래프가 적절할 때가 있고 파이그래프가 더 적절할 때가 있습니다. 그렇듯이 어떻게 보여줄 것인가? 그래서 어떤 효과를 낼 것인가?를 고민하는 것이 어떤 툴을 이용할 것인가보다 더 중요합니다.

요즘 계속 이런 저런 생각들로 머리가 복잡합니다. ... 두서없이 적었지만, 빅데이터 분석에 관심이 있는 초보자들에게는 그래도 도움이 되었으면 합니다. 앞으로는 좀 더 기술적인 것들도 능력이 되는대로 다루겠습니다.

(2013.01.18 작성 / 2013.01.23 공개)

댓글을 달아 주세요