Category Archives: 데이터과학 Data Science

Faiss – 고속 벡터 검색 엔진으로 유사도 검색하기, Vector Search Engine

Faiss는 Facebook Lab에서 만든 벡터 검색 엔진입니다.

Faiss는 벡터 갬색 엔진이고 유사도 검색을 하거나 추천, 기계학습로 만든 모델을 활용해서 응용 서비스를 만들 때 사용합니다.

별거 아닌거처럼 보이지만 불가능한 것을 가능하게 만들어 주는 매우 유용한 라이브러려입니다.

라이브러리이기 때문에 자체로 서비를 제공하는 것은 아니고 이 라이브러리를 이용해서 Backend, Frontend 서비스를 개발하거나 응용 프로그램에 넣을 수 있습니다.

벡터 검색 엔진

벡터 검색 엔진이 뭔지를 설명해야 하는데요. 보통 그래프 서치라고도합니다. 이것들은 주로 수치를 찾는 것을 말하는데 지도검색 같은데서도 사용하는 것으로 매우 쓸모가 많은 엔진입니ㅏㄷ.

일반적으로 검색 엔진이라고 말하면 흔히 텍스트를 검색하는 것을 생각합니다. 구글의 웹 검색, 네이버 검색, 다음 검색 같은 것은 검색 포털이요. 그게 아니면 Elastic Search나 Lucene갈은 검색 엔진을 생각할 텐데요.

하지만 벡터 검색은 텍스트가 아닌 벡터를 빠른 속도로 찾는 것을 말합니다. 벡터는 수열을 말합니다.

아래와 같이 10개의 숫자가 묶여 있으면 이걸 10차원 벡터라고 합니다. 숫자가 100개 있으면 100차원 벡터, 1000개면 1000차원 벡터입니다.

이런 것들이 수억개가 있고 수억개 중에 어떤 벡터와 가장 가까운 벡터를 찾아야 한다면 문제가 어려워집니다.

가장 가까운 것을 주어진 입력 벡터와 수억개의 벡터를 모두 하나씩 연결해서 서로의 거리를 계산한 다음 가장 가까운 것을 찾아야 하기 때문입니다.

가장 가까운 것을 찾는데 수십분이 걸릴 수 있습니다. 이러면 실제 서비스에서는 쓸 수 없습니다.

어떤 사용자가 온라인 서적 판매사이트에 접속했을 때 그 사람에게 책을 추천해줘야 하는데 추천할 책 목록을 검색하는데 10분씩 걸린다면 서비스에 적용하지 못합니다. 다른 서비스도 마찬가지구요.

Faiss는 인덱싱 방식을 다르게 해서 데이터가 많아도 짧게는 밀리초 단위 길게는 수초 이내에 결과를 찾아 줍니다. 즉 온라인 추천 서비스에 빠르게 적용하는 추천 시스템 등을 개발하는데 사용할 수 있습니다.

Python Faiss library

Faiss는 Python wrapper를 공식 지원하고 있습니다. c++로 만들어졌으니까 다른 언어로도 연결해서 사용할 수 있습니다. Go lang이나 Node.js, Kotlin 같은 것을 쓰면 Python 보다는 성능이 더 좋을 것입니다.

깃헙 레파지토리: https://github.com/facebookresearch/faiss

레파지토리에 있는 것을 설치해도 되고 그냥 pip를 이용해서 설치해도 됩니다.

gpu 버전을 설치하고 싶으면 gpu 버전ㅇ로 명시해서 설치하면 됩니다.

사용법은 매뉴얼을 봐야 하겠지만 기본 사용법은 쉽습니다.

Faiss로 유클리디안 거리로 벡터 검색하기

아래 코드는 유클리디안 거리(Euclidean Distance)로 찾는 예제입니다.

이런 것은 KNN (K-nearest-neighbor) 와 같은 기계학습 모델에 사용하는 것입니다. KNN은 판별 모델에서 사용할때 매우 강력한 알고리즘이지만 검색할 때 너무 느리고 자원을 많이 사용하는 문제로 인해서 실제로는 거의 사용을 못하는 알고리즘이지만 Faiss를 이용하면 이걸 쓸 수 있습니다.

Faiss 색인을 생성할 때 벡터의 차원을 지정해주고, Index의 유형도 결정을 해줘야 하는 것이 중요합니다. 검색은 입력한 k의 갯수만큼 리턴하게 되어 있고 벡터의 색인 번호와 거리를 리턴하게 되어 있늡니다.

색인 번호는 그냥 입력한 입력한 벡터의 순번입니다.

Faiss로 코사인 유사도로 검색하기

유클리디안 거리(Euclidean Distance)로 가장 가까운 벡터를 찾으면 특정 차원의 양적 수치에 따라는 거리가 가깝다고 판별되는 편향의 문제가 있습니다. 이게 문제가 될 때가 있고 그렇지 않을 때가 있는데 이것은 문제의 도메인에 따라 다릅니다. 그러니까 문제가 주어진 환경에 따라 그때그때 다르다는 뜻입니다.

이런 문제를 피하는 방법은 유사도를 계산할 때 거리측정 방법을 유클리디안 거리를 사용하지 않고 코사인 유사도를 사용해서 벡터의 방향이 가까운 것을 찾는 것입니다. 보통 검색엔진들도 이 방법을 기본으로 사용합니다.

Faiss도 이걸 지원하는데 예제는 아래 코드를 보시면 되고 앞서 설명했던 유클리디안 거리 기반의 검색과 다른 점은 index를 생성할 때 타입을 다르게 생성해야 하고 벡터를 노말라이즈 해줘야 한다는 것입니다. 벡터가 이미 노말라이즈되어 있다면 안해도 됩니다.

노트북 코드

위 코드의 노트북은 깃헙 레파지토리에 올려 두었습니다.

https://github.com/euriion/python-exams/blob/main/faiss/faiss-exam.ipynb

다음 번에는 기회가 되면 Faiss를 이용한 간단하고 빠른 추천 엔진을 만드는 예제를 올려보겠습니다.

데이터 분석 – R로 스타벅스 지역별 매장수 분석, 데이터 크롤

R언어로 스타벅스 매장 데이터를 크롤해서 분석하는 간단한 예제 스크립트입니다.

전체 코드는 글 아래 쪽에 있습니다.

코드 설명

예제에서 하려는 것

간단하게 재미 삼아하는 토이(toy) 분석입니다. 실제 분석 프로젝트에서는 이 보다는 더 심도가 깊게 해야 합니다.

이 분석의 실제 목적은 R로 데이터 크롤을 해서 분석은 어떻게 하는 것인지 설명하는 것입니다. 분석 리포트에서는 크롤한 데이터를 이용해서 인사이트를 도출하고 탐색적데이터분석(EDA)를 어떻게 하는지 예제로 보여줍니다.

이 분석에서 해보려고 하는 것은 스타벅스의 매장 목록을 가져와서 각 시도별, 구군별로 어느 지역에 스타벅스 매장이 가장 많은지 어떤 인사이트가 있는지 살펴보고 또 지역별 인구수와 스타벅스 매장 수와 관계가 있는지를 확인해 보는 간단한 분석입니다.

분석에 들어가기 전에 상식적으로 식음료 판매 매장들은 유동인구가 많은 곳에 자리를 잡는 것이 일반적이기 때문에 당연히 지역별 인구수와 스타벅스 매장 수는 관련이 있을 것이라고 추측할 수 있습니다.

그래서 서울이라면 강남 지역에 스타벅스가 가장 많을 것이라고 추측해 볼 수 있습니다. 서울은 강남에 오피스가 가장 많아서 직장이들도 많고 유동 인구도 많습니다. 정말 그런지 확인은 해봐야 겠지요.

그래서 여기서 확인해 볼 가설은 “스타벅스 매장의 위치는 지역의 인구수 또는 유동인구와 관련이 있을 것이다.” 라는 것입니다.

너무 뻔한 것이어서 굳이 세심하게 분석할 필요가 없다고 생각할지 모르지만 하지만 이미 알고 있거나 너무 뻔한 사실도 실제로 그런지 확인하는 것도 유의미합니다.

의외성이 많아지는 요즘 세상은 알고 있던 상식이 실제와는 다른 경우도 많기 때문입니다.

먼저 알아야 할 것

이 포스트에서 하려는 것을 할 때 꼭 알아야 할 정보와 필요한 것은 3가지입니다.

  • 매장의 위치 데이터 제공처
  • 매장의 위치데이터 데이터를 크롤(스크랩)하는 법
  • 크롤한 데이터를 잘 정제, 정돈하는 법

R언어 사용법 등은 당연히 알아야 하는 것이라 목록에는 안 적었습니다.

Python이나 다른 언어로 해도 되지만 여기서는 R언어로 하겠습니다.

데이터를 얻어 오는 곳

이런 정보가 어디 있는지는 검색을 해서 알아내야 합니다. 검색해보니 대충 아래와 같은 것이 제일 만만해 보입니다.

먼저 스타벅스 매장 주소 데이터는 스타벅스 웹사이트에서 가져오면 되는데 csv나 엑셀 파일로 다운로드하게 지원하지 않으니 웹페이지의 내용물을 읽어서 파싱(parsing)해야 합니다.

이 작업은 웹 스크랩이라고 하는데 흔히 크롤이라고 부릅니다. 사실 원래 크롤과 스크랩은 서로 차이가 많습니다만 이 글에서는 그냥 널리 알려진 대로 크롤이라고 하겠습니다.

또 스타벅스 웹페이지는 지도상에 매장의 위치를 표시하기 위해서 Ajax로 데이터를 호출하는 방식을 사용하는데 이것의 방식을 알아내서 어떻게 데이터를 가져와야 하는지도 알고 있어야 합니다.

보통 크롬이나 파이어폭스의 개발자도구를 사용해서 알아내는데 연습과 방법을 익히는데 시간과 노력이 필요합니다. IT활용능력, 웹개발능력과 관련이 있는 것이라서 이것까지 설명하려면 설명이 길어지므로 이것을 알아내는 방법은 여기서는 생략합니다. 다음 기회에 다른 포스트에서 하겠습니다.

이 글에 소스코드를 넣어 두었으니 이미 완성된 코드를 참고 참고하세요.

인구데이터는 국가통계포털 웹사이트에서 가져오면 됩니다. csv나 excel로 다운로드 할 수 있게 지원하므로 매우 편합니다만 그래도 역시 데이터 정제, 정돈 작업은 좀 필요합니다.

인구데이터는 여기 말고도 받을 수 있는 곳이 더 있습니다. 더 편한곳이 있으면 그냥 거기를 이용하세요.

데이터를 크롤하는 법

R언어는 텍스트 파일을 파싱하거나 json 데이터를 처리하는 것이 조금 복잡한 편에 속합니다. R언어가 수치와 벡터 계산에 중점을 두기 때문에 이런 텍스트 처리에는 매우 약합니다.

하기가 까다롭다는 말입니다.

이런 것을 하려면 Python이나 Javascript가 더 나은 선택이지만

R언어로 이걸 하면 한 코드에서 데이터 크롤, 정제, 분석, 시각화까지 한 번에 할 수 있어 관리가 편하고 나중에 코드를 다시 볼 때 전체 흐름을 이해하기 편하다는 장점이 있습니다.

어쨌든 R언어에서 httr, urltools, jsonlite 패키지의 사용법을 익히면 됩니다.

데이터 정제, 정돈

데이터랭글링이라는 것을 할 텐데 이런 작업은 tidyverse 패키지에 포함된 여러 패키지를 이용하는 것이 가장 세련되고 좋은 방법입니다.

그리고 시각화는 ggplot2를 사용하겠습니다.

결과

스타벅스 전체 매장수: 1658개

1658개로 나옵니다. 스타벅스는 모두 신세계에서 운영하는 직영점이라고 알려져 있고 관리가 웹사이트 관리가 잘 되고 있을 것이라고 생각돼서 이 수치는 맞을 것입니다.

수천개는 될 것 같지만 제 예상보다는 적습니다.

시도별 매장수

시도별 매장수는 역시 서울이 가장 많고 그 다음은 경기도, 부산 순입니다. 인구수가 많은 시도에 매장이 더 많은 것을 알 수 있습니다.

네 당연하죠. 물론 지역별로 로컬 카페나 다른 프렌차이즈, 브랜드의 커피매장이 더 인기가 있는 지역이 있을 수도 있으니 이 가설이 틀렸을 여지는 있습니다.

차트로 보며 시도별 매장수의 규모를 더 직관적으로 확인할 수 있는데 서울특별시와 경기도를 합치면 다른 시도를 다 합친 것 보다 더 많습니다.

우리나라 스타벅스 매장은 수도권에 크게 집중되어 있습니다.

구군별 매장수

구군별로 매장수를 살펴보면 역시 서울 강남구가 가장 많습니다. 한국에서 아마 인구밀도가 가장 높은 지역이며 유동인구와 일과시간에 직장인이 가장 많이 있는 곳입니다.

그 다음은 역시 유동인구가 가장 많고 오피스밀집 지역이며 인구밀도가 높은 서울 중구입니다. 중구에는 명동, 충무로, 을지로가 있습니다.

그 다음은 서울 서초구인데 서초구는 강남구와 인구밀도는 비슷하지만 오피스공간 보다는 주거지역이 훨씬 많기 때문에 강남구나 중구에 비해서 낮시간에 직장인이 아주 많지는 않습니다. 그래도 괘나 많습니다.

그리고 그 다음은 경기도 성남시인데 성남에는 분당과 판교가 있으며 성남전체의 인구도 많으므로 이것도 당연합니다.

서울-강남구에 스타벅스가 압도적으로 많으며 다른 대형 지역구들도 제법 많습니다. 앞서 말했듯이 이 지역은 직장인들이 주중에 많이 머무는 지역들입니다. 물론 여기 나온 인구수는 거주 인구수이기 때문에 직장인이 주중에 많다는 것과의 상관관계를 다시 확인해야 할 필요가 있습니다만 알려진 바로는 매우 특별한 경우를 빼면 거주인구가 많은 지역에 직장도 많습니다.

인구수와 매장수의 상관관계

시도별 인구수와 스타벅스 매장수의 상관관계를 보면 상관계수가 0.89로 강한 상관이며 검정에서 대립가설 채택으로 상관이 있다는 결과가 나옵니다.

더 해볼 것

상관관계를 볼 때 단순 인구수가 아닌 면적을 인구수로 나눠서 인구밀집도를 구한 다음에 상관관계를 보는 것이 더 합리적이겠지만 면적데이터를 가져와서 붙여야 하니 귀찮아서 생략하겠습니다.

또 구군별로도 면적데이터를 가져와서 구군별로도 인구수와 스타벅스 매장수가 상관이 있는지 확인해 보는 것도 필요합니다만 이것도 생략하겠습니다.

혹시 해보고 싶으시면 아래 소스를 보시고 고쳐서 직접 한 번 해보세요.

결론 및 인사이트

매장수와 지역의 인구밀집도는 관계가 있습니다.

시도별, 구군별로 모두 상관관계가 있습니다.

따라서 스타벅스매장이 많은 곳은 인구밀집도가 높은 지역일 가능성이 큽니다.

인구밀집도는 유동인구수와 상관관계가 있는 것으로 알려져 있습니다.

스타벅스 매장이 많은 곳(있는 곳)은 유동인구가 많은 곳입니다.

마약 누군가 많은 유동인구가 필요한 점포를 개업하려고 한다면 스타벅스 부근에 개점하면 됩니다.

길거리 음식을 팔거나 판매하려면 패션 팟업스토어, 푸드 트럭을 열려면 스타벅스 근처에 하면 잘 될 것입니다. 물론 그게 가능하다면 말이죠.

전체 스크립트

소스 파일

https://github.com/euriion/r-exams/blob/main/starbucks_analysis.R

소스 내용

여기까지 입니다.

데이터과학자가 되려면 뭘 배워야 하나?

데이터과학자가 되기 위해서 필요한 것들이라는 주제로 포스트를 몇개 작성하였었지만 더 간략한 것을 원하는 분들이 많다는 것을 알았습니다.

간단하게 말하면 지금은 아래의 4가지입니다.

  1. SQL
  2. R 또는 Python 언어
  3. Linux (리눅스)
  4. Algebra (수학)

여기에서 SQL, R, Python, Linux는 다해서 1 ~ 2년 배운다면 기초적인 일을 할 수는 있습니다. 그게 그렇게나 오래 걸리나? 라고 생각하실 지 모르겠지만 그렇게 만만한 것들 아닙니다.

SQL은 책 보고 SQLd 자격증 준비하면서 같이 공부하세요.

R, Python은 책 읽고 인터넷 강좌 들으세요. 그리고 코드 따라하기를 여러 번 해보세요.

Linux도 책 사서 보거나 인터넷 자료 뒤져 보시고, 인터넷 강좌 보고 그 후에 연습을 하면 됩니다.

문제는 수학입니다. 수학은 선형대수학, 미적분, 미방까지 해야 하고 논리적 사고방식과 숫자를 다루는 연습까지 되야 하기 때문에 속성으로 훈련이 안됩니다.

그리고 결국 나중에 좋은 기계학습모델을 만들거나 좋은 수리 모형을 만들 수 없게 되고 역량이 떨어지게 됩니다. 결국 본인의 몸값도 높일 수 없게 됩니다. 인터넷 강의 들으면서 날마다 무지막지하게 공부하시면 됩니다.

물론 수학을 원래 잘하는 분들은 괜찮겠습니다만 그런 분들 별로 없습니다.

데이터과학자가 되고 싶은데 어떻게 해야 하나요? 질문/답변 Q&A

최근에 데이터과학자(Data Scientist)가 되려면 뭘 배워야하고, 어떻게 해야하며, 커리어는 어떻게 키워나가야 하는지 물어보는 분들이 다시 늘어서 이런 내용으로 포스팅을 한 번 해보려고 했었습니다.

짧고 이해하기 쉽게 해보자라는 생각으로 제가 받았던 질문에 대한 답변형식으로 적습니다.

※ 글에서는 데이터사이언티스 (Data Scientist) 대신 데이터과학자라고 적습니다.

데이터과학자는 뭐하는 사람인가요?

하는 일은 데이터를 처리하고 분석해서 통찰을 얻고 사실을 검증합니다. 그리고 그 결과를 결정권자에게 주고 좋은 결정을 할 수 있게 도와줍니다.

중요한 것은 “데이터 기반 (Data Driven)”이라는 것과 “결정을 돕는 다”는 것입니다. 데이터과학자가 결정을 하지는 않습니다. 하지만 판단은 합니다. 과학적으로 판단하고 논리에 따라 합리적인 의견을 결정권자 또는 의뢰인에게 전해줍니다. 그리고 심사숙고하지 않은 즉흥적 결정, 충동적 결정, 막연한 결정을 하지 못하도록 돕습니다.

예를 들면 게임회사의 데이터과학자라면 특정 게임 A의 아이템들의 가격을 올려야 할지 내려야 할지에 대한 판단을 하고 그 결과를 기획자 및 전략담당자에게 알려준다거나 하는 것입니다.

데이터과학자는 개발자가 아닌 거죠?

네.

대부분 이렇게 아니라고 대답합지만 사실은 개발자인 것도 맞습니다. 그런데 개발자라고 하지 않는 이유는 개발자라고 대답하는 순간 데이터과학자에게 개발을 물어보고개발일을 맡기기 때문입니다. 그것 말고도 할 일 많으니까 그냥 아니라고 대답합니다.

뭘 공부하면 되나요?

확률/통계, 수학, 프로그래밍, 데이터 베이스(SQL)를 배워야 합니다.

수학은 고등학교 수준이면 되나요?

고등학교 과정의 고급 수학 과정을 무난하게 다 기억하고 있다면 수학을 굉장히 잘하는 것입니다. 무난하게 한다는 것은 고등학교 졸업을 의미하는 것이 아닙니다.

흔히 선형대수학, 미적분학 까지는 해야 한다고 말하는데, 이걸 잘하면 훨씬 유리합니다. 잘 못하면 지금부터 시작해도 안 늦습니다. 포기하지만 않는다면요.

데이터과학자가 되려면 얼마나 걸리나요?

타이틀을 데이터과학자로 명함에 넣어주는 것은 회사가 해주는 것이므로 회사마다 다릅니다.

괜찮은 데이터과학자라는 말을 들으려면 대략 제 경험으로 유사 학문을 전공한 사람은 5년 정도는 현장에서 훈련하면 되고. 전공자라면 3년이면 되는 것 같습니다. 적성에 안맞는 사람은 몇년이 되어도 제대로 못합니다.

아주 잘하는 것은 그 이상의 시간이 걸립니다.

참고로 박사학위 소지와 데이터과학을 잘하고 못하고는 크게 관련없습니다. 개인의 능력차이와 학습량의 차이입니다.

데이터과학자는 전망이 좋은가요?

무슨 전망이요? 미래에서는 인공지능, 로봇이 모든 사람들의 일을 뺏을 것이라서 어둡습니다. 데이터과학자도 예외는 아닙니다.

급여는 많이 받나요?

아직까지는 다른 직군에 비해 많이 받는 편이라고 봅니다. 최근에 데이터과학자 숫자가 많이 늘어서 이제 많이 높지는 않습니다.

랭귀지는 Python을 배워하나요? R을 배워야 하나요?

둘다 해야 합니다.
둘다 못하겠고 꼭 하나만 하고 싶다면 Python을 하면 됩니다.

그래도 다시 말하면 데이터과학을 하려면 둘다 하는 것이 나중에 매우 좋습니다.

둘 다 하라고 하는 이유는 R과 Python은 각각 문제해결이나 일처리를 쉽고 빠르게 할 수 있는 영역이 있습니다. 하나만 알게 되면 그런 문제를 해결할 때 때로 굉장히 어렵고 힘들게 해결해야 할 수 있습니다.

디지털마케팅을 하고 싶은데 데이터 분석, 데이터 과학을 할 줄 알아야 하나요?

몰라도 됩니다.

알면 좋습니다. 하지만 필수는 아닙니다. (당연한 것이지만)

엑셀은 잘하는데 엑셀로는 데이터과학을 못하나요?

할 수 있습니다. 하는 사람도 많습니다.

다만 “모냥빠진다!”, “없어보인다!”라고 해서 기피할 뿐입니다.

문제를 쉽게 해결할 수 있는 쉬운 방법을 사용해서 해결하는 것이 가장 좋은 것입니다. 엑셀로 쉽게 할 수 있는 것은 엑셀로 하면 됩니다. 하지만 엑셀만으로 모든 문제를 해결할 수는 없습니다. 아마도.

회사에서 SAS, 매트랩을 씁니다. 계속 이걸로 데이터과학해도 되나요?

다니는 회사/연구소에서 SAS 또는 매트랩을 주력으로 사용하고 있고 선임자가 매니저가 그걸 쓰도록 말했다면 그렇게 하는 것이 신상에 좋습니다. 뭐 잘 아시겠지만요.

하지만 취업, 이직, 커리어전환, 오픈소스 패키지 사용, 새 알고리즘이나 패키지사용, 비용 등을 볼때 R 또는 Python을 선택하는 것이 낫습니다.

회사에서 못쓰게 한다면 따로라도 공부해 두세요.

데이터 과학을 위한 R과 Python

데이터 과학을 할 때 사용할 컴퓨터 언어로 R이 좋은지 Python이 좋은지에 대한 비교글은 구글 검색을 하면 비교적 많은 자료를 얻을 수 있을 것입니다. 사람들이 논쟁하기에 딱 좋은 주제이기 때문입니다. 어차피 사람마다 차이가 있기 때문에 명확하게 결론을 내기는 어려우니 대충 하기 나름이다라고 하면 욕먹을 일도 없습니다.

그래서 이 주제도 R과 SAS 비교와 같이 결론이 잘 나지 않고 애매모호하게 끝을 맺게 됩니다만.

R은 표준어법에 따르면 “아르”로 읽는 것이 맞습니다. 그래서 글을 쓸때도 “R는”, “R가” 처럼 조사를 맞춰서 써야 하는 것이 맞습니다만 이게 너무 어색해서 그냥 “알”로 하겠습니다.

무엇을 선택하는 것이 유리한가?

데이터사이언스(Data science) 또는 데이터분석( Data Analysis)같은 것을 하려고하는데 아니면 이제 막 시작하려고 하는데 요즘 유행인 R, Python같은 것들 중에서 “무엇을 배워야 하는가? ” 또는 “무엇을 선택해야 나중에 유리한가?”라는 것입니다.

대세는 Python인 것 같은데 Python을 해야 하는지 아니면 좀 더 통계 분석가나 과학자들이 쓸 것 같아 보이는 R을 선택할 것인지 말입니다.

어떤 도구를 선택하느냐에 대해서 물어보면 전문가 또는 경험자들의 대답은 언제나 사용하는 사람에 따라 다르고 환경에 따라 다르다고 합니다. 그게 답이라는 것은 누구나 압니다.

하지만 사람들이 원하는 답은 그것이 아닐 것입니다. 뭔가를 선택하게 해주는 것입니다.

랭귀지를 선택할 때 고려할 것

데이터 분석이나 데이터 과학을 하는데 있어 컴퓨터 랭귀지를 선택할 때 고려할 것들에 대해서 몇가지를 적어봅니다.

  • 범용성이 높은 것을 선택
  • 사람들이 많이 쓰는 것을 선택
  • 가격이 비싸지 않은 것을 선택
  • 쉽게 구할 수 있고 쉽게 사라지지 않을 솔루션을 선택 (의존성이 적은 것을 선택)

범용성이 높다는 것은 여기저기 다양한 용도로 쓸 수 있는가를 말합니다. Python이 범위가 가장 넓고 좋습니다. R은 범용적으로 쓸 수 없는 것은 아니지만 실제로는 통계 또는 데이터분석에만 적합하다고 보는 것이 맞습니다. 사실 R은 범용적으로 쓸 수 없다고 해야 더 정직한 답변일 것입니다.

현재 데이터과학자들이 많이 쓰는 컴퓨터 언어는 Python, R순입니다. SAS나 Julia같은 것도 많이 씁니다만 Julia는 아직 사용자 층이 두텁지 않습니다. 그 외에 다른 일반 컴퓨터 랭귀지는 데이터 분석, 데이터 과학을 하는데 적합하지 않습니다.

그래서 결국 선택할 것은 Python과 R로 좁혀집니다.

결국 이대로라면 Python을 쓰는 것이 좋습니다.

혹시 Java나 C++ 같은 저수준 랭귀지로는 데이터분석이나 데이터과학을 못하는가?

우선 이것부터 얘기하면 컴퓨터 랭귀지 중에 범용성이 가장 좋은 Java, C++, C# 같은 것들을 배우면 Python이나 R을 배우지 않아도 되는것 아닌가? 라는 의문일 것입니다.

결론을 말씀드리면 생산성이 너무 떨어져서 이 언어들로는 데이터 분석이나 데이터 과학을 빠르게 하기 어렵습니다.

못하는 것은 아닙니다만 효율이 떨어집니다.

그래도 저수준에 조금이라도 가까운 것은 Python입니다.

만약 C++를 할 수 있거나 후에 반드시 익히겠다면 R이든 Python이든 뭘 고르더라도 좋습니다. C++로 만든 모듈을 붙여 넣어서 R과 Python을 직접 강화시킬 수 있으니까요.

데이터 과학에서의 R과 Python의 공통점, 차이점, 장단점

대화형 작업의 중요성

대화형 작업(interactive working mode)이란 어떤 분석이나 모델을 만드는 코드를 처음부터 끝까지 다 작성한 후에 일괄 실행하는 것이 아니라 부분부분 완성해 가면서 완성한 부분 또는 일부만 실행해서 그 결과를 계속해서 확인하고 고치는 방식을 말합니다.

데이터 분석과 모델링에서는 이 대화명 작업이 필수입니다. 잘못된 것, 예상한 것과 다르게 된 것, 데이터에 클린징 작업, 모델링 작업은 처음부터 끝까지 주욱 흐름에 따라 코딩하고 한 두번 훑어 보고실행한다고 다 끝나지 않습니다. 계속해서 같은 코드를 반복해서 고치고 수정하고 결과를 보고는 것을 반복해서 보정해 나간 후 최종 완성합니다.

이 작업을 효율적으로 하려면 코드를 분할해서 작성한 부분까지 완성을 하고 다음 부분으로 넘어가는 것을 지원하는 것이 좋습니다.

여기에서는 R의 손을 들어주고 싶습니다.

R과 Python중 하나를 선택

아직도 선택을 못했겠지만 이 2개 중 하나를 선택해야 합니다.

앞서 설명한 바 있습니다만 R과 Python은 둘 다 모두 스크립트(script) 언어이면서 둘다 대화형 언어(Interpretor)이기도 합니다.

스크립트 언어라는 것은 C++이나 Java 처럼 컴파일을 하거나 중간코드를 빌드하지는 않는 것을 말하는 것이고 대화형 언어라는 것은 코드를 입력하고 그 결과를 즉시 확인할 수 있다는 것입니다.

그래서 가능하다면 R과 Python을 둘 다 하는 것이 훨씬 좋습니다. 하지만 R이 PYthon보다는 학습장벽이 매우 높기 때문에 둘 중에 어떤 것을 먼저해야 하냐고 묻는다면 Python을 먼저 선택하는 것이 대체로 유리합니다.

선택할 때 고려할 것

위에서 말씀드린 몇 개의 중요한 항목을

선택을 할 때 이렇게 하시면 됩니다.

  • 앞으로 통계 분석을 더 많이 하게 될 것 같다. R
  • 시각화가 편하고 빠르면 좋겠다. R
  • 일괄 처리 작업이나 텍스트마이닝 같은 처리도 하고 싶다. Python
  • 기계학습 모델을 자주 만들고 많이 만들것 같다. Python
  • 데이터 전처리와 이관, 자동화 같은 것도 해야 한다. Python
  • 최신 통계 패키지가 많아야 한다. R
  • 최신 기계학습 패키지가 많아야 한다. Python
  • 딥러닝을 해야 한다. Python
  • IOT도 해야 한다. Python
  • 시계열 분석, 수리 통계, 금융 분석 이런 고급 통계나 수학과 관련된 것을 할 것이다. R
  • 빅데이터 플랫폼들에 접속해서 비정형 데이터를 가져오거나 처리해야 한다. Python
  • 웹개발도 좀 해야 한다. Python
  • 웹개발도 해야 하지만 위젯 정도나 간단한 시각화 수준이면 된다. R (Shiny가 있으므로)
  • 주로 연구하고 논문쓰는 일을 많이 할 것 같다. R
  • 나는 의사이고 실험을 많이 한다. R
  • 분석 리포트를 많이 쓰거나 논문을 많이 써야 한다. R
  • 바이오인포메틱스이고 유전자 데이터 이런 일과 관련이 있다. Python
  • 클라우드의 자원 활용모 하게될 것 같다. Python

대부분 R과 Python 둘다 가능한 것이지 둘 중에 더 유리한 것 하나를 답으로 했습니다.

자 대체로 PYthon을 선택하면 된다는 쪽으로 보여집니다만 위에 열거한 것들에서 선택된 것의 숫자만 보고 그렇게 판단하시면 안됩니다.

R의 좋은 점

R을 옹호하는 입장이 되서 장점을 어필해보면.

R의 강점은 커뮤니티와 커뮤니티에서 제공되는 패키지가 있습니다. 최신 통계 분석, 알고리즘이나 기법들이 패키지가 가장 빨리 제공되고 있으며 품질도 상당히 좋습니다.

대부분 패키지를 만들어서 제공하시는 분들이 그 분야의 석박사이거나 교수들입니다. 100% 믿을 수 있는 것은 아니지만 보통은 쓰는 사라들보다 그 부분에 대해서는 훨씬 전문적인 분들이라서 믿고 쓸 수 있습니다.

또 패키지가 중앙집중식으로 엄격하게 관리되고 있습니다. 패키지가 등록될 때 절차도 까다롭고 검증도 까다롭습니다. 그래서 패키지가 작동하지 않는다거나 하는일이 거의없고 오래된 패키지들도 비교적 관리가 잘됩니다.

Python의 좋은 점

PYthon을 옹호하는 입장에서 장점을 어필해보면.

쓰는 사람이 워낙 많아서 자료를 구하기 쉽고 샘플 코드를 구하기도 쉽습니다.

랭귀지가 배우기 쉬운 편입니다. 물론 그렇다고 해서 책 한 권 읽고 바로 할 수 있을 만큼 젼짜 쉽다는 얘기는 아닙니다.

그래서 어떻게 뭘 하면 되는데?

“하는 일” 또는 “하려고 하는 일”의 직군이

  • 엔지니어, 개발자 쪽에 가깝다면 Python
  • 분석가, 연구원에 가깝다면 R
  • 과학자는 둘 다 해당됩니다. 둘 다 하면 좋고 둘 중 하나만 해도 됩니다. 적어도 지금은 말이죠.

작성한 코드의 실행 속도 문제

구현체의 성능은 Python이 R보다 빠릅니다. 단순하게 비교할 수는 없지만 작성한 코드의 실행 속도가 대부분 Python이 R보다 빠릅니다.

텍스트 데이터, 음성, 비디오 같은 비정형 처리는 Python도 느립니다만 R은 정말 느립니다. 물론 해결책이 없는 것은 아니지만 이런 것은 순수하게 R로 해결하기 어려운 경우가 많습니다.

물론 코드의 실행 속도가 데이터과학에 가장 중요한 요소는 아닙니다. 그리고 어차피 속도가 요구되는 고속 모듈들은 Python이나 R모두 C++작성된 것을 호출해서 사용하는 방식이 대부분입니다.

R은 편리를 위한 언어이지 처리 속도를 고려한 언어는 아닙니다. 물론 Python도 처리 속도가 빠른 언어가 아닙니다. 계산 속도가 빠른 것도 아닙니다.

계산 속도가 빠른 것은 Julia가 있습니다. 새로운 도전을 좋아하고 이렇 신문물에 선구자로 깃발꽂기를 좋아한다면 Julia를 해보는 것도 좋겠습니다.

Excel, Tableau, SAS, SPSS 같은 것들로는 데이터 과학을 할 수 없는가?

할 수 있습니다.

어떤 종류의 작업에 더 적합하고, 능숙한지에 따라 다릅니다. 중요한 사실은 훈련된 능숙한 데이터 과학자 일수록 사용할 수 있는 랭귀지가 툴이 많다는 것입니다.

데이터 과학은 데이터 과학 도구 사용법을 익히는 것이 아니라 데이터에서 원하는 사실을 찾고 그것을 토대로 좋은 결정을 하기 위해서 필요한 도구는 뭐든 가져다 쓰고 과학적인 결과를 얻어 내는 것입니다.

R과 Python 중 하나를 먼저 배우고 다른 것을 마저 배울때

두 언어는 만들어진 철학이 매우 다릅니다. 그래서 하나를 배우고 나면 다른 하나를 배우기가 어렵습니다. 배울 때나 사용할 때 각각 의 언어에 따라 사용자가 관점을 많이 바꿔야 이해할 수 있는 것들이 많기 때문입니다.

즉, 하나를 배우고 다른 하나를 배울 때 이점이 별로 없습니다. 오히려 방해가 될 수 있습니다.

그래서 R과 Python을 둘 다 배우는 것은 매우 어렵습니다.