카테고리 보관물: 미분류

R과 Python 중 데이터과학에 더 적합한 언어는?

요즘 추세로 본다면 데이터과학, 데이터분석, 딥러닝, 기계학습 등을 하려면 R과 Python 중 하나를 선택해야 합니다.

R과 Python은 둘 다 모두 스크립트(script) 언어이면서 둘다 대화형 언어(Interpretor)이기도 합니다.

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

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

대답은 Python 입니다.
현재는 Python을 먼저 선택하는 것이 대체로 유리합니다.

그럼 R은 생각할 필요도 없는 것인가? 라고 묻는다면 당연히 그렇지 않습니다. 자신이 어떤 쪽의 일을 할 것인지 하고 있는지, 어떤 스타일로 하는지에 따라 달라질 수 있습니다.

데이이터과학 랭귀지를 선택할 때 고려할 것

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

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

대부분 R과 Python 둘다 가능한 것이지만 둘 중에 더 유리한 것 하나를 답으로 적어두었습니다. 경험을 바탕으로 적은 것입니다. 의견의 차이가 있을 수 있지만 무분별한 비난은 사절합니다.

위의 목록을 쭉 훑어보면 대체로 PYthon이 답인 경우가 많으니 그냥 Python 선택하면 된다는 쪽으로 보여집니다만 위에 열거한 것들에서 선택된 것의 숫자만 보고 그렇게 판단하면 안됩니다.

R의 좋은 점

R을 옹호하는 입장이 되서 장점을 어필해 보겠습니다.

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

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

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

Python의 좋은 점

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

Python을 쓰는 사람이 워낙 많아서 자료를 구하기 쉽고 샘플 코드를 구하기도 쉽습니다. 사용자 층이 두텁다고 하죠. 이제 가장 사용자가 많은 랭귀지가 되었습니다.

Python은 다런 언어에 비해 배우기 쉬운 편입니다. 물론 그렇다고 해서 책 한 권 읽고 바로 할 수 있을 만큼 정말 쉽다는 얘기는 또 아닙니다. 다른 랭귀지에 비해서 비교적 쉽다는 거입니다.

직군별로 간단하게 선택하는 방법

“하는 일” 또는 “하려고 하는 일”의 직군을 보고 간단하게 선택할 때는 이렇게 하면 됩니다.

  • 엔지니어, 개발자 쪽에 가깝다면 Python
  • 분석가, 연구원에 가깝다면 R
  • 그냥 과학자라면 아무렇게나 하세요. 아마 둘 다 안 쓸 가능성이 큽니다.

기획자, 세일즈, 비즈니스 직군인데 분석용 언어를 배워보려면 어떤 것을 써야 하나?

데이터분석이나 데이터과학을 하려고 하는데 그 일이 꼭 컴퓨터랭귀지를 쓰지 않아도 엑셀이나 다른 도구로 할 수 있는 것이 아닌지 먼저 확인해 보세요. 대부분 간단한 것은 다 할 수 있습니다.

그럼에도 불구하고 취미이든, 도전이든, 자기계발이든, 미래를 위해서 이든, 컴퓨터 언어를 하나 배우고 싶다면?

Python을 선택하면 됩니다.

왜냐면 R이 더 안좋아서가 아니라 배우기 더 어렵기 때문입니다.

그다지 궁금하지 않겠지만 이 포스트를 보고 또 Python에 너무 편향된 것이 아니냐고 하실 분들이 있을 것 같아서 마지막으로 말씀드리면 저는 Python 보다는 R을 더 좋아합니다.

Banker’s Rounding – 은행원 방식 반올림

아실지 모르겠지만 반올림은 여러가지 계산 방식이 있습니다. 한가지가 아닙니다.

이 차이를 모르면 소숫점이 있는 수치 계산을 하다가 반올림 처리 방식의 차이로 인해 오차가 생겼다고 생각하고 정합성을 맞추려다 헤메는 경우가 있을 수도 있습니다.

물론 평생 이런 일이 없을 수도 있습니다.

제가 학생이던 시절에 금전 계산을 자동으로 복잡하게 하는 정산 소프트웨어를 의뢰받아 만든 적이 있었는데, 의뢰인이 제시해준 계산 방법과 확인용 정산 출력물을 기반으로 계산 소프트웨어를 작성하는 흐름으로 진행했었습니다. 단위 계산이 조금 복잡했고 반복 계산을 한 뒤에 복잡하게 역산하는 것을 한 뒤에 총 결과를 산출하는 것이었습니다. 요즘 용어로 바꾸자면 최적화 비슷한 것이었습니다.

그런데 문제가 생겼습니다.
만들 때 적은 양의 데이터로 단위 계산을 몇 개 실험해서 해본 뒤에 나온 결과를 보고 정확하게 계산되었는지를 정확하게 확인했고 문제가 없었습니다, 그 후에 전체 계산을 수행하는 것을 진행해서 총합을 확인해보니 정답지와 결과값이 미세하게 달랐습니다. 다시 단위 계산을 몇개 임의로 선택해서 결과가 어떻게 다른지 점검해 봤는데 몇개가 다르게 나온다는 것을 알았습니다. 이 문제의 원인을 찾느라 시간을 쓸데없이 허비한 적이 있습니다.

물론 이 차이로 인해 큰 일이 생기는 것은 아니었습니만 숫자는 틀려도 문제의 원인을 알지 못하면 곤란하다는 의뢰인의 말에 원인을 찾아야 했습니다.

찾아 본 결과 원인은 제가 사용하던 컴퓨터 랭귀지에서 제공하는 round 함수가 사사오입이 아닌 뱅커스 라운딩(Bankers’ rounding)을 채택했기 때문에 발생한 문제였고 round 함수를 사사오입 방식의 다른 round로 변경해서 해결했었습니다. 그 뒤로는 round를 하게될 일이 있으면 반드시 사용하는 소프트웨어의 round가 사사오입 방식인지 뱅커스 라운딩인지 확인을 하고 작업을 시작하는 습관이 있습니다. 그게 아니면 오차가 좀 크더라도 정합성을 위해서 무조건 소숫점이하는 절사 시켜버리곤 했습니다. 물론 요즘은 이것마저도 잘 하지 않는 늙은이가 되었습니다만.

어쨌든 그 당시에는 컴퓨터 랭귀지의 기본 함수에 버그가 있는 줄 알고 컴파일러 판매회사에 문의하려고 했었으나 함수 매뉴얼을 먼저 찾아보니 천절하게 설명을 해 두었더군요. 함수 매뉴얼을 자세히 읽지 않은 제가 문제였던 것이고 그리고 관련 자료를 더 찾아보고는 제가 반올림에 대해서 상당히 무식했다는 사실을 알았습니다.

“세상에 반올림 방법은 딱 하나 인 줄 만 알았어” 라고 생각했습니다. 배운 것이 그것뿐이라서요.

앞서 말씀드린 것 처럼 반올림은 여러가지 방식이 있습니다. 꽤 많은 방식들이 있습니다만 우리가 흔히 접할 수 있는 것은 위에서 말한 2가지인 사사오입과 뱅커스 라운딩입니다.
이 포스트에서 사사오입과 뱅커스라운딩의 차이를 설명하겠습니다.

사사오입( 四捨五入 ) 반올림

우선, 흔히 아는 반올림은 사사오입(四捨五入, Normal rounding)인데 4는 버림, 5는 올림을 뜻합니다. 보통은 우리는 그냥 “반올림”이라고 하지만 명확환 구분과 설명을 위해서 “사사오입”이라고 하겠습니다.
사사오입 방식은 영어로는 Round, away from zero (0으로부터 멀어지는 이라는 뜻) 라고 합니다.
사사오입으로 소숫점이 있는 숫자들을 정수로 반올림한다고 하면 다음과 같은 결과가 나옵니다.

0.4 반올림 하면 0
0.5 반올림 하면 1
0.6 반올림 하면 1
1.4 반올림 하면 1
1.5 반올림 하면 2
1.6 반올림 하면 2
2.4 반올림 하면 2
2.5 반올림 하면 3
2.6 반올림 하면 3

잘 알고 있는 그 방식입니다.

뱅커스 라운딩

뱅커스 라운딩 올려질 값이 5인 경우에 만들어질 수의 끝이 짝수가 되도록(짝수에 수렴) 하는 방식입니다.

영어의 다른 표현으로는 Round, half to even (절반을 짝수쪽으로)라고 합니다. 금융권에서 많이 채택해서 쓰기 때문에 뱅커스 라운딩이라는 별칭으로 많이 불립니다. 미국의 경우이고 한국 금융권에서도 이것을 채택해서 쓰는지는 모르겠습니다.
어쨌든 뱅커스라운딩으로 계산하면 다음과 같이 됩니다. 굵은 글씨 부분을 자세히 보세요.

0.4 반올림 하면 0
0.5 반올림 하면 0
0.6 반올림 하면 1
1.4 반올림 하면 1
1.5 반올림 하면 2
1.6 반올림 하면 2
2.4 반올림 하면 2
2.5 반올림 하면 2
2.6 반올림 하면 3
2.45 반올림 하면 2

사사오입과 뱅커스라운딩 둘을 비교 해보면 이렇습니다.

대상값 / 방식사사오입뱅커스 라운딩
0.400
0.510
1.411
1.522
1.622
2.422
2.532
2.633
4.554
4.444554
사사오입가 뱅커스라운딩의 비교표

뱅커스 라운딩은 미국 측정 계산의 표준이라고 알려져 있습니다. 직접 물어봐서 확인해 보지 않았지만 온라인 문서에 그렇게 적혀 있습니다. 그래서 최신의 컴퓨터 언어나 계산 관련 소프트웨어들에서 기본으로 지원하는 반올림 함수는 우리가 아는 사사오입 방식이 아닌 뱅커스 라운딩을 사용하는 것이 많습니다. 소프트웨어들이 여전히 미국산이 많기 때문인데 특히 과학계산 용도로 쓰는 것들이 그렇습니다.

반올림?

사사오입은 엄밀히 말하면 반올림이 아닙니다. 우리가 쓰는 반올림은 영어로 round라고 하는데 round라고 하는 것의 원래 뜻은 숫자를 단순하게 만드는 것을 말합니다.

round 는 둥글게 심플하게 밋밋하게 한다는 뜻입니다.

그래서 “무조건 올림”은 영어로 round-up이라고 하고 “무조건 내림”은 영어로 round-down이라고 합니다. round라는 단어가 들어 있지만 “무조건 내림”과 “무조건 올림”은 반올림이 아닙니다. 반만 올리는 것이 아니라 그냥 올리고 내리는 것이지요.

그리고 사사오입 반올림의 영문 표현이 away from zero인데 뜻을 보면 5를 0에서 멀어지게 하는 것이라서 반올림이라고 표현하는 것에 무리가 있다고 합니다. 반면 half to even 방식은 짝수방향으로 반을 올려주거나 절사하기 때문에 이것이 진짜 반올림 방식 중 하나입니다.

하지만 이미 관행으로 다들 사사오입을 반올림이라고 말하기 때문에 편의상 여기에서도 모두 합쳐서 다 “반올림”이라고 하겠습니다.

뱅커스 라운딩을 사용하는 이유

계산과정에서 반올림 때문에 발생하는 오차를 줄이기 위해서 고안된 것입니다. 반복계산을 하면서 반올림이 계속 반복되면 결국 오차를 만들게 되는데 반복 계산 후 최종 결과에서 이 반올림들에 의해 발생하는 오차를 줄이도록 하려는 것입니다.

숫자 0과 1이 있습니다. 이 사이에 존재하는 소숫점 첫째자리까지의 수만 보면 다음과 같이 9개의 숫자가 있습니다. 10개가 아닙니다.

0.10.20.30.40.50.60.70.80.9

이 숫자들을 다 반올림한다고 할 때 0.5는 정확하게 한가운데 있기 때문에 절사해서 버릴 것인지 1로 올려줄 것인지가 고민이 됩니다. 그리고 어느쪽으로 하든 오차를 만듭니다. 사사오입 방식은 5를 항상 위로 올리기 때문(away from zero)에 여기서 숫자가 원래 올리지 않았을 때 보다 오차가 커지는 일이 많아집니다. 그리고 잘 생각해 보면 어딘가 공평하지 않은 구석이 있다는 것을 느낄 수 있습니다.

대신 뱅커스 라운딩처럼 짝수쪽으로 수렴하게 해서 조금은 더 공평해집니다. 그리고 이 방식이 오차가 덜 발생한다는 것은 오래전에 여러가지 방법과 실험을 통해 증명되었다고 합니다.

그외의 반올림 방식

위키피디아의 rounding 페이지를 보면 반올림(rounding)방식이 상당히 많다는 것을 보고 놀랄 수 있습니다. 반올림 문제는 메소포타미아에도 기록이 남아 있는 오래된 문제라고 되어 있습니다. 그리고 뱅커스 라운딩이라고 불리는 half to even 방식은 1940년도 나온 것이라고 적혀 있습니다. 오래되었죠.

위키피디아: https://en.wikipedia.org/wiki/Rounding

반올림 비교표

너무 많은 round를 알 필요는 없겠지만 대략 아래와 같은 것이 있습니다.

round 함수의 방식 차이로 인한 정합성 문제

뱅커스 라운딩을 기본으로 채택해서 제공하는 컴퓨터 언어나 소프트웨어가 생각보다 좀 많습니다.

R, Python3과 같은 것들이 그렇습니다. 그 외의 랭귀지도 꽤 많습니다. Excel과 RDBMS 같은 소프트웨어의 반올림 함수는 대부분 우리가 아는 “사사오입”으로 되어 있습니다. 그러다보니 행수가 많은 데이터에서 나누기, 곱하기 같은 것들이 여러번 반복하고 그 결과를 모두 합한다거나 평균을 구한다거나 하면 동일한 데이터를 가지고 계산을 해도 사용하는 컴퓨터 언어나 툴에 따라 양쪽의 결과값에 미묘한 차이가 발생합니다.

즉, round함수의 방식이 다른 것을 각각 따로 어떤 데이터의 사칙 연산을 하면서 반올림이 섞인 계산을 반복하는 경우에는 양쪽에서 똑같이 계산해도 round의 방식으로 인해 서로 결과값이 안맞는 문제가 발생합니다.
이때 정합성 오류가 부동소숫점 연산 문제나 반올림 방식의 차이로 인한 문제라는 것을 알면 그것은 해결하기도 어렵고 원인을 알면 오차를 감수하고 넘어갈 수도 있지만, 그것을 모르면 오차가 어디서 발생했는지 원인를 찾기 위해서 시간을 허비하게 됩니다.

버그인지 계산을 잘못한 것인지…

그래서 차이가 있다는 것을 알고 있는 것이 좋습니다.
물론 뱅커스 라운딩을 기본으로 채택한 것들은 별도로 사사오입을 지원하는 함수를 따로 제공하는 것이 많습니다. (아닌 것도 있는데 그럴 때는 구현해야 합니다)

컴퓨터 언어, 소프트웨어의 기본 반올림 방식

직접 몇 개를 확인해 봤습니다. 결과는 아래 테이블에 있습니다.

언어/소프트웨어방식
Linux shell (printf)뱅커스 라운딩
R뱅커스 라운딩
Python2사사오입
Python3뱅커스 라운딩
C/C++사사오입
Object-C사사오입
C#뱅커스 라운딩
Visual Basic뱅커스 라운딩
Go사사오입
Ruby사사오입
Scala사사오입
PHP사사오입
Julia뱅커스 라운딩
Javascript사사오입
Java사사오입
Erlang사사오입
Pascal뱅커스 라운딩
Cobol뱅커스 라운딩 (기본으로 되어 있습니다. 변경 가능해요)
Fortran사사오입
Excel사사오입
Google Spread Sheet사사오입
MySQL사사오입
Hive사사오입
Redshift (PostgreSQL?)사사오입
BigQuery사사오입
Oracle사사오입
SQLite사사오입
Matlab사사오입
Mathematica뱅커스 라운딩
WolframAlpha뱅커스 라운딩 (매쓰메티카와 같은 언어를 쓰므로)
Tableau사사오입 (시각화 도구는 역시 짤 없습니다)

정리하면

  • Linux에 있는 printf뱅커스 라운딩 (리눅스 코맨드마다 다를 수도 있겠지만 이것만 확인했어요)
  • Java 계열사사오입
  • 닷넷(.net) 계열뱅커스 라운딩 (.net이 아닌 MFC를 확인 안해봤습니다. 귀찮아요)
  • 데이터에 중점을 둔 것들은 사사오입
  • 과학, 공학에 중점을 둔 것은 뱅커스 라운딩
  • 함수형 언어뱅커스 라운딩
  • 시스템 개발에 중점을 둔 언어는 사사오입
  • Python은 2에서 3으로 바뀔 때 뱅커스 라운딩을 기본으로 바꿈
  • 시각화 도구는 DB에서 데이터를 끌어와서 표현하는 일이 많기 때문에 DB와 같은 방식을 사용

그리고 매우 오래전부터 사용해온 소프트웨어들은 일관성과 변경한 후 달라질 정합성으로 인해 별도로 뱅커스 라운딩 함수를 사용할 수 있게 제공하고 기본 함수의 방식을 바꾸지는 않는 것 같습니다.

하지만 뱅커스 라운딩이 더 권고되는 표준이기 때문에 새로 만들어지는 것들은 뱅커스 라운딩을 지원해야 한다고 하는 사람이 많습니다.

데이터베이스의 경우에는 잘 쓰고 있는데 어느날 업그레이드를 하고 나서 계산값이 달라지거나 합계를 했는데 총합이 달라지거나 하게 되면 문제가 커질 수도 있을 것입니다.

반올림의 인해 엄청난 문제가 발생하는 경우는 일상 생활에 별로 없겠습니다. 하지만 수능점수같은 것은 반올림 문제로 학생의 인생이 바뀔 수도 있어서 매우 골치가 아플것 같습니다. 작은 차이가 큰 문제를 만드는 경우도 있습니다.

뭘 하시든지 정밀한 수치 확인이 필요한 작업을 혹시 하게 되는 경우를 위해서 알아두면 좋을 것 같습니다.

워드프레스 구텐베르크에서 Mermaid 다이어그램 그리기

graph LR M --> e e --> r r --> m m --> a a --> i i --> d

위와 같은 다이어그램을 그리는 R패키지중에 DiagrammeR라는 것을 소개드리면서 Mermaid에 대한 설명을 잠깐 했었습니다.  

지난 포스트 링크입니다.
DiagrammeR – R 다이어그램 그리기

워드프레스 구텐베르크 편집기를 사용할 때 조금 손이 가지만 그래도 워드프레스의 설정에서 고난의 삽질을 하지 않고 간단하게 Mermaid를 사용하는 방법을 설명드리려고 합니다. 데이터사이언스와 관련없는 포스트는 이 블로그에는 잘 안쓰지만 일탈을 해봤습니다.

구텐베르크 Gutenberg

Mermaid를 워드프레스(WordPress)에서 사용하는 방법을 설명하기전에 구텐베르크 얘기를 먼저 해야 하겠습니다.

워드프레스가 글 편집기로 구텐베르크(Gutenberg)라는 것을 쓰도록 유도한지가 꽤 된 것 같습니다. 이 포스트를 쓰는 시점으로부터 수개월 전으로 기억합니다. 원래 구텐베르크가 워드프레스에 기본 패키지에 포함되어 있지는 않는 것 같은데  “편집기로 구텐베르크 써보지 않겠어?” 라는 식으로 관리자화면에서 자꾸 물어보길에 예전에 무심결에 눌러서 플러그인을 설치한 후에 제 블로그도 구텐베르크로 작성하고 있습니다. 그 뒤로는 전 너무 멀리 와버렸습니다. ‘ㅁ’;

구텐베르크는 포스트를 쓰면서 블럭 단위로 콘텐트를 나눠서 관리하고 편집하는 방식인데 위지윅(WYSIWYG)에 중점을 더 둔 편집방식입니다. 물론 그전 방식인 클래식 에디터를 같이 쓸 수 있습니다만 클래식 편집기로 작성한 글은 클래식편집기로만 열리고 구텐베르크로 작성한 것은 구텐베르크 편집기로 열립니다. 

구텐베르크 편집기를 쓰면 편리한 점이 더 많아서 저는 구텐베르크를 주로 쓰고 있습니다. 구텐베르크라는 이름처럼 출판 편집을 위한 소프트웨어를 사용하는 기분이 듭니다.

구텐베르크는 사용하려면 적응기간이 조금 필요합니다. 버그도 아직 꽤 있습니다. 복잡한 구조의 포스팅을 안하시는 분들께는 좋겠고 복잡한 요소들이 잔뜩 있는 포스트를 장벽이 큽니다.

기존에 잘 쓰던 플러그인과 충돌을 하거나 작동이 안되는 부분도 꽤 많아서 플러그인을 별도로 찾아서 추가 설치해야 하거나 포기해야 하는 부분도 상당합니다. 그래서 클래식 편집기에서는 플러그인만 설치하거나 익숙하게 했던 작업도 구텐베르크를 쓰면서 부터는 많이 힘들어졌습니다.

워드프레스에 Mermaid.js 추가하기

워드프레스에 Mermaid.js를 사용하려면 Mermaid.js와 CSS하나만 추가해주면 됩니다. 그런데 이게 플러그인이 없으면 추가하기가 조금 곤란합니다. 현재까지 제대로 지원하는 플러그인은 못찾았고 functions.php를 수정하는 방법이 일반적인데 그렇게하고 싶지는 않았습니다.  저렇게 하면 워드프레스를 업그레이드하거나 테마를 바꾸거나 하면 난장판이 되었던 경험이 있습니다.

그래서 간단하게 붙이는 방법은 글편집에서 워드프레스 구텐베르크 타입에 HTML 요소라는 것이 있어서 블럭 유형을 HTML으로 바꾸고 다음과 같이 HTML 코드를 넣으면 됩니다.

소스 코드에서 js 파일의 링크과 css는 적당히 최신의 것으로 찾아서 바꾸시면 되고 Mermaid코드를 넣을 때 code 태그에 class를 mermaid로 지정하시는 부분이 핵심입니다. code 태그 대신 div나 pre 태그를 사용하면 “>” 기호와 다른 특수문자들을  인코딩(특수기호들을 &#으로 시작하는 코드로 바꾸는 것)하기 때문에 Mermaid.js가 다이어그램 문법을 해석하지 못해서 그림이 표현이 안됩니다. 현재 워드프레스에서는 code 태그의 안쪽은 HTML 인코딩을 하지 않습니다.

위의 소스코드에서 js와 css 파일을 인클루드하는 것은 따로 보관해 두거나 전에 작성했던 포스트에서 복사해서 붙이기는 방법을 쓰고  Mermaid 코드 부분만 따로 작성해서 code 태그 안쪽에 붙여 넣으면 Mermaid 다이어그램을 붙여 넣을 수 있습니다.

DiagrammeR – R 다이어그램 그리기

R 패키지중에 DiagrammeR라는 다이어그램(diagram)을 그릴 수 있게 해주는 것이 있습니다. 다이어그램은 플로우차트(flow chart), 간트 차트(gantt chart), 시퀀스 다이어그램 (sequence diagram)같은 것입니다.

RStudioDiagrammeR 스크린샷

다이어그램을 그릴 때 쓰는 도구는 Visio (Windows 쓰시는 분들) 아니면 OmniGraffle (Mac 쓰시는 분들) 아니면 PowerPoint 와 같이 손으로 그리는 것들이 있고 GraphViz 또는 Mermaid와 같이 정해진 문법을 텍스트로 입력하면 해석해서 시각적으로 표현해주는 도구가 있습니다.

DiagrammeRGraphVizMermaid를 묶어서 연동해 놓은 패키지인데 3가지 방식으로 그래프를 그리게 해줍니다.

  1. Mermaid 문법을 텍스트로 입력한 후 텍스트를 해석해서 렌더링
  2. GraphViz 문법을 텍스트로 입력한 후 텍스트를 해석해서 렌더링
  3. R함수를 사용해서 노드와 엣지를 구성하고 렌더링

패키지를 사용하던 중 GraphViz는 원래 C로 만들어진 binary이므로 R에서 연동해서 사용할 수 있습니다만 Mermaid는 Javascript로 만들어져서 이 두가지를 어떻게 한꺼번에 연동해서 그래프를 시각적으로 표현하게 했는지 갑자기 궁금했습니다.
그래서 살펴봤더니 GraphViz.js와 Mermaid.js를 가져다 연동한 것이고 렌더링된 결과를 표현할 때는 htmlwidgets 패키지를 사용하는 것입니다.
그러니까 결국 웹브라우저를 열고 Javascript를 이용해서 렌더링하는 방식입니다.

그래서 R-GUI에서 렌더링을 하게 되면 웹브라우저가 열립니다.  RStudio에서 렌더링을 시도하면 연동이 되어서 웹브라우저가 실행되지 않고 그래프 패널에 바로 렌더링된 결과를 표현해 줍니다.  위에 넣어 놓은 스크린샷 이미지에서 확인할 수 있습니다.

앞서 말한 렌더링을 하는 세가지 방식중에 Mermaid 문법을 사용하는 것과 GraphViz 문법을 사용하는 것은  RStudio에 연동되어서 파일을 편집할 수 있게 제공하고 있기때문에 R 코드에서 DiamgrammeR 패키지를 로딩할 일이 없게 만들기도 합니다.

RStudioDiagrammeR를 연동해서 .mmd 확장자를 가지는 Mermaid 파일과 .dot 확장자를 가지는 Graphviz dot 파일을 바로 편집하고 코드 하일라이트도 되고 렌더링할 수 있도록 해줍니다.
아래의 링크에서 내용을 확인할 수 있습니다.

https://blog.rstudio.com/2015/05/01/rstudio-v0-99-preview-graphviz-and-diagrammer/

위의 3가지 방식 중 2가지는 앞서 말씀드린 것 처럼 RStudio와 연동으로 인해 DiagrammeR 패키지의 함수를 사용할 일이 없게 만들지만  DiagrammeR 함수를 이용한 방식의 렌더링을 사용하면 data.frame에 있는 데이터를 연동해서 그래프를 그릴 수 있습니다. 이게 가장 큰 장점이지요.

아래는 각각의 방법으로 만든 간단한 장난감 예제입니다. 

Mermaid 문법을 이용한 렌더링

Mermaid 문법을 이용한 예제입니다.

GraphViz 문법을 이용한 렌더링

GraphViz 문법을 이용한 예제입니다.

GrammerR의 R 함수를 이용한 렌더링

전통적인 스타일의 R 함수를 사용한 예제입니다. 아래의 함수들은 DiagrammeR 최신 패키지를 설치해야만 됩니다. 최근에 함수 이름에 변화가 있었던 모양입니다.

dplyr와 연동한 DiagrammeR

역시 RStudio에서 만은 부분을 기여한 패키지인 만큼 dplyr 스타일의 매우 스타일리쉬한 파이프라인 형태의 코딩도 지원합니다.

추가로 네트워크 분석 관련 패키지인 igraph에서 생성한 객체를 DiagrammeR 형태로 변환하는 함수들도 제공합니다.  사용해 보지는 않았습니다. ^^;

SPSS syntax를 R로 변환해주는 웹서비스 translate2R

SPSS 신택스를 R 코드로 자동변환해주는 웹사이트가 나왔습니다. Use R! 2014에서 발표했나보네요.

Use R! 컨퍼런스는 쓸만한 것이 꽤 많이 발표되는 좋은 컨퍼런스입니다.

온라인에서 SAS나 다른 랭귀지를 R 로 변환해 주는 곳을 볼 수 있는데요. 주로 용역인 곳이 많습니다.

그러니까 코드를 등록해주거나 요청을 하면 실제로는 사람이 하는 것이죠. 자동 변환이 잘 안되기 때문일텐데요.

제가 SPSS를 쓰지 않으니 모르겠지만 서서히 자동변환이 나오긴 하는 군요. 웹사이트 도메인을 보면 독일에서 만든 것 같습니다.

자세한 내용은 eoda의 사이트를 참조하세요. 현재는 무료 베타인데 나중에 상용화될지 어떨지는 잘 모르겠습니다.

참조: eoda 웹사이트

Reproducible Research – 재현가능연구

Reproducible Research에 대한 포스팅입니다.

이게 뭔지? 어떻게 하는 것인지? 이런 것들에 대한 내용입니다.

Reproducible Research는 연구나 분석을 할 때 사용한 코드, 데이터, 리포트를 한꺼번에 넣어서 다른 사람들이 받으면 그대로 재현이 가능하도록 하게 배포하고 공유하자는 계몽운동입니다.

어헐… 리서치 분야의 새마을운동인가?

사실 히스토리는 꽤 오래되었습니다. 17세기 부터라고 하는데 그 시대 사람이 아니어서 모르겠구요.
제가 알고 있는 최근 관련 사건은 2006년 Duke 대학의 논문(암세포 관련) 사건인데, 배포된 논문을 재현하는데 시간이 너무 걸려서 문제점을 나중에야 발견했고 그 사이에 그 논문을 근거로 시작한 연구 5개가 졸지에 중단된 사건입니다.

코드와 데이터와 리포트를 한꺼번에 배포하는 것이라고 했는데.
그러면 “Reproducible Research는 코드하고 데이터하고 PDF를 한꺼번에 압축해서 주면 되는거네?” 라고 생각할 수 있습니다.

그렇게 하는 사람도 아직 많습니다. ^^. 하지만 핵심요체는 이런걸 더 쉽게 하자는 것이고 피드백도 쉽게 받을 수 있어야 한다는 것입니다.

Reproducible Research는 소프트웨어 구현체를 위한 개발소스를 배포하는 것에 대한 것이 아닙니다. 단편적인 예로 논문을 배포할 때 논문에 사용한 코드와 데이터와 설명을 한꺼번에 배포하는 것 정도로 이해하면 빠를 것 같습니다.

압축파일로 전달하거나 하는 것은 완전히 종료된 연구결과는 그렇게 해도 되겠지만 어떤 것들은 자신의 연구 결과물도 계속 고쳐나갈 수도 있기 때문에 그렇게 하면 번거롭습니다. 그래서 코드를 계속 형상관리하고 자동으로 생성해서 배포하려고 많이 합니다.

우선 하기전에 몇가지 의문에 대해서 살펴보면…

어느 분야에서 쓰는 것이냐?

  • 연구소, 아카데미 등 학술쪽이 메인입니다.

    각종 논문 양산소들

  • 데이터 분석

    굉장히 좋습니다.

  • 데이터 사이언스

    설마 데이터 사이언스가 주구장창 구현체 개발만 하는 것이 아니라면…

꼭 논문을 쓰거나 어떤 연구소에서 연구를 하는데만 쓰는 것은 아닙니다. 메인이 그쪽이이긴 하지만 인터넷기반의 온라인의 발달로 R&D쪽과 관련이 있다면 모두 해당됩니다.

흐름상 꼭 해야 하는 거야?

남들이 한다고 다 따라할 필요는 없다고 봅니다만 흐름이 있는 것은 분명합니다. 꼭 해야 하는 것은 아니지만 어느덧 많은 사람들이 자기의 연구결과나 분석결과를 온라인에 배포하는 것이 일상화되었습니다.

내 피땀어린 연구물을 왜 배포 하나?

  • 첫번째는 Personal Branding 이유가 많아 보입니다. 어필하는 것이지요. 개인을 상품화
  • 두번째는 연구물을 공유해서 다른 사람들의 피드백을 받음으로써 자기 발전에도 도움이 된다고 생각하는 것입니다
  • 세번째는 논문 점수… 패쓰!

개인의 취향이고 하기 싫으면 안해도 되지만 추세는 배포해서 검증도 받고 성과도 알리는 것입니다. 일종의 자신감 표현일 수도 있고 우물안 개구리로 살지 않겠다는 생각일 수도 있겠구요.

배포를 걱정하는 이유가 내가 고생해서 연구한 것을 왜 남에게 거저 주느냐? 라는 이유일텐데요. 자신의 연구 결과물이 매우 좋다면 배포를 당연히 하지 않겠지요. 하지만 그런 뛰어난 결과물을 만드는 경우가 얼마나 될까요?

내 연구물은 약간의 불가피한 어쩔수 없이 안타깝고 애절한 이유로 조작을 했기 때문에 다른 사람들이 절대 재현해서는 안돼! 아~ 님! 그러시면 안돼요!

Reproducible Research에 필요한 것

온라인 IT활용능력이 필요합니다. 압축파일을 USB에 담아서 주는 세상이 어느덧 지나버린 것 같습니다.

형상관리 또는 코드 보관용 스토리지

보통 리서치를 전문으로 하시는 연구원들을 보면 연구성과물의 백업에 대해 예민한데요. 당연한것 이 성과물이 날아가면 인생이 과거로 회귀하기 때문입니다.

지능은 그대로 나이는 젊어지는 그런 회귀가 아니라 나이는 그대로 성과는 예전으로 돌아가는 회귀. @.@

보통 Reproducible Research에서는 온라인 소스코드 레파지토리를 많이 사용합니다.

물리백업은 외장하드를 여러개 사용하시던지 스토리지를 쓰시던지 각자의 방법이 있잖아요?

많이 발견되는 순서대로 보면

  • Github: 공짜인데 private은 돈 받아요
  • Bitbucket: 공짜인데 private 1개 공짜. 추가는 돈 받아요
  • Dropbox: 형상관리는 아니지만 물리백업의 위험을 최소화하기 위해서
  • 기타: 찾아보면 더러 있습니다.

private repository는 남들에게 안 보이게 숨기는 레파지토리입니다.

온라인을 사용하는 이유는 링크만 던져줘도 자료를 쉽게 공유할 수 있기 때문입니다. 게다가 삭제해도 복원이 가능하고 매우 안정적입니다. 대신 형상관리 소프트웨어를 사용하는 방법을 익혀야 하겠지요. SVN, CVS, GIT 등을 잘 쓰신다면 문제가 별로 없습니다.

살펴보면 대체로 Github을 많이 쓰는 것 같습니다.

형상관리를 회사나 연구소내에서 따로 구축해서 사용하는 경우도 많은데요 백업이나 관리가 잘 되야 하겠지요. 자료를 찾아 보시면 구축하는 방법등이 잘 나와 있습니다.

내부 형상관리가 통째로 날아가면 연구소 폐쇄 또는 폐업… 하지는 않더라구요.

데이터 배포용 레파지토리

연구물을 배포할 때 코드와 함께 사용한 데이터를 같이 주어야 하는데요. 알고리즘을 만들거나 분석기법을 만들거나 응용 분석을 하거나 해도 사용한 데이터가 있을 것입니다.
포함해야 하는 이유는 다른 사람이 재현을 해야하기 때문입니다. 코드만 가지고는 정확히 재현이 안되니까요.

데이터를 배포하는 방법은 크기나 데이터의 출처에 따라 배포하는 방식이 달라집니다.

  • 데이터의 사이즈가 매우 작은 경우

    코드에 넣어 줍니다. 코드에 변환해서 넣는 것이 대부분 가능합니다. 최근에는 데이터들의 크기가 커지기 시작하면서 이 방법은 점점 어렵게 되고 있습니다.

  • 데이터가 오픈데이터인 경우

    오픈데이터는 공개된 곳의 링크를 걸어주면 됩니다. 보통 코드내에서 자동으로 오픈데이터를 긁어오게 만들어 코드를 작성합니다.

  • 데이터가 매우 크고 오픈데이터가 아닌 경우

    웹사이트에 올리거나 Dropbox같은 클라우드 스토리지로 공유합니다. Dropbox외에도 Google Drive라든가 One Drive라든가 여러가지가 많습니다. 대부분 기본 용량은 공짜이고 용량 추가는 비용 지불입니다.

Reproducible Research 작성도구

분석 도구라면 뭐든지 가능하지만 우선 특화된 UI가 있는 분석툴들은 어렵습니다. R, Python, SAS, Matlab은 가능할 것입니다.

Excel로도 하긴합니다만 불편하더군요. 나 퀀트여서 C++, Excel만 하는데? 네.. 알아서 잘!

보통 R을 많이 사용하는 것을 볼 수 있는데요.
이유는 보통 이렇습니다.

  • 공짜입니다.

    받아보는 사람이 결과물을 보기 위해서 소프트웨어를 구매해야 한다면 힘드니까요. 나 오라클에 SQL로 코드짜고 연구했어. 그래서 내가 너에게 오라클 라이센스를 주마! 네! 님짱!

  • 코드가 간결하고 분석이나 리서치하기에 편합니다.

    원래 그런 용도로에 많이 특화되어 있습니다. 나 perl로 무지 간결하게 짤 수 있는데 대신 난독화가 심해져서 읽는 것은 너의 능력문제야! 네! 님짱!

  • 코드와 설명을 함께 넣어 리포트를 쉽게 만들 수 있습니다.

    Sweave나 Knitr같은 패키지로 쉽게 가능합니다. 코드에 주석으로 설명을 적기에는 너무 부담도 크고 할일도 많지요. 보고서나 논문 형태로 포맷팅을 쉽게 할 수 있습니다.

분석결과물이 코드와 데이터만 있는 것이 아니라 설명이 들어 있어야 하는데요. 보통 논문같은 형식이나 보고서 형식을 생각하시면 됩니다. 코드와 데이터만 덜렁 주지는 않습니다.

이정도 코드는 알아보겠지? 하실 수도 있겠지만 간단한 것을 제외하고 내가 만든 알고리즘이나 데이터 분석 절차와 대응 방법을 받는 사람이 쉽게 이해하기 어려우니까요.

참고로 위의 요소를 만족하는 도구로 대안은 Python, Ruby가 있습니다. 그 이유가 전부인 것은 아니지만 저런 이유도 있어서 데이터 사이언티스트가 많이 쓰는 도구로 Python, R이 상위권이기도 합니다.

Reproducible Research 배포처

준비를 다 했다면 배포할 곳이 필요합니다.

헐 @.@ 나는 누군가? 지금까지 뭘 했는가?

학회에 논문 제출?도 하겠지만 그 외는 온라인 커뮤니티에 배포를 많이 하게 되는데요. 커뮤니티에 배포를 하더라도 링크를 주고 링크를 누르면 어떤 사이트로 이동해서 결과물을 보게 하는데요. 그래서 결국 웹사이트가 필요합니다.

네. 도메인따고. 호스팅받고. 설치하고. 세팅하고. 하고. 하고. 하고…

웹블로그는 공짜가 많습니다. 괜찮은 것 하나를 선택해서 쓰면 됩니다. 도메인을 구매해서 연결하는 것도 좋습니다.
많이 쓰는 것으로는 다음과 같은 것들이 있습니다.

  • WordPress 또는 다른 블로그

    Tumblr나 Scriptogr.am 등 많습니다만 WordPress가 가장 만만해요. 공짜로 도메인 연결도 해주는 곳이 많습니다.

  • Github

    웹페이지를 볼 수 있게 지원합니다. 공짜로 도메인 연결도 가능해요. 다른 것들도 있습니다만 Github이 가장 만만해요.

  • 개인 웹사이트

    생각보다 많습니다. 클라우드를 이용해서 쉽게 구축하는 서비스를 제공하는 곳도 많습니다.

이런 추세는 R로 Reproducible Research를 하는 사람들의 트렌드때문인데요. R의 Knitr가 WordPress로 리포트를 배포하는 기능을 지원하기 때문입니다. Rmarkdown을 작성해서 배포하면 WordPress로 플롯과 코드와 설명이 모두 배포됩니다.

Github을 이용하려면 HTML 코드를 작성해서 업로드 해야 하는데 Knitr, Jekyll 조합으로 가능합니다. 요건 설정하기가 조금 까다롭습니다.

많이 알려진 플로우

Reproducible Research는 R 사용자들이 많이 주도하고 있는 상황이라서 R과 관련된 것이 아직까지는 대부분입니다.

많이 쓰는 플로우입니다.

  1. R과 Rstudio를 설치합니다.
  2. Rmarkdown이나 Sweave 형식으로 작성합니다.
  3. 작업하면서 소스코드를 계속 형상관리에 저장합니다.
    1. Github, Bitbucket, …
  4. 사용한 데이터는 오픈 스토리지에 올려 놓습니다.
    1. Dropbox, One Drive, Google Drive, Drive.., Drive.., …
  5. 리포트를 빌드합니다.
    1. 잘되는지 확인해야 합니다.
  6. 배포합니다.
    • WordPress로 배포
    • 또는 Jekyll로 빌드해서 Github에 Push

Reproducible Research 준비가 사실 번거롭고 할 일이 많습니다. 그런데도 하는 사람이 많은 것을 보면 신기하기도 합니다. 이 유행이 언제까지 일지는 모르겠지만 제 생각에는 그래도 앞으로도 당분간은 계속 될 것 같습니다.

세상이 너무 빨리 바뀌고 있네요.

빅데이터와 텍스트마이닝

빅데이터와 테스트 마이닝에 대해서 조금 적으려고 합니다.

빅데이터(Big data)

빅데이터(Big data)는 이제는 설명을 안해도 될 만큼 자료가 많습니다.
구글링을 해서 찾아보시면 되겠지만 너무 많아서 오히려 정리가 안되서 맥락을 이해하기가 어려울 수도 있습니다.

빅데이터는 간단하게 말하면 많은 데이터, 다양한 데이터를 저장, 가공, 처리, 분석하는 것을 통칭해서 말하는 것입니다. 어차피 명확하게 정의하기 어렵고 원래 정의를 만들고 시작한 것도 아닙니다.

사실 이미 빅데이터 리딩그룹쪽에서는 데이터와 관련된 IT기술이나 분석기법은 그 경계나 정의를 명확하게 정하지 않은지가 오래 되었습니다.

텍스트 마이닝 (Text Mining)

텍스트 마이닝은 사람이 써놓은 글을 분석해서 뭔가 쓸만한 것을 뽑는 것입니다.

텍스트 데이터는 특성상 많이 모아야 뭔가 쓸만한 것이 나옵니다. 텍스트 마이닝이 빅데이터에서 언급되고 마치 전부인것 처럼 얘기되기도 하는 이유는 원래 빅데이터의 출발이 IR(Information Retrieval)이 전문인 구글, 야후, 페이스북, 아마존, 넷플릭스등의 온라인 회사에서 시작되었기 때문입니다.  즉 빅데이터 관련 기술을 텍스트 처리에 많이 사용했기 때문입니다.

검색 포털이나 온라인 리테일 회사를 상상하시면 됩니다. 구글, 아마존이 대표적입니다.

이미 아시겠지만 현존하는 텍스트 마이닝의 최강자는 구글입니다. 그리고 그 외의 여러 회사들이 있습니다.

이 회사들의 공통점은 다음과 같습니다.

  1. 온라인 회사이고 많은 접속자가 만들어 낸 로그를 쌓아서 보유하고 있는 데이터가 매우 많다
  2. 대용량 정보처리기술이 회사의 핵심기술이다
  3. 사용자들이 웹사이트에서 행동하는 것을 로그에 쌓아놓고 그것을 다시 가공해서 회사의 서비스를 개선하거나 다른 부가가치를 만들어 낸다

빅데이터와 텍스트마이닝이 혼동되는 이유 중 또 하나는 텍스트데이터는 처리하는데 컴퓨팅 자원이 많이 소모된다는 점도 있습니다.

어찌되었든 텍스트 마이닝을 잘 하려면 필수는 아니지만 빅데이터 기반 기술이 있는 것이 매우 유리하며 그런 경험이 있다면 그렇게 될 수 밖에 없다고 보는 것이 업계 기술자들의 정론입니다.

그렇다고해서 빅데이터를 텍스트 마이닝에만 쓴다는 얘기는 아닙니다. 다시 텍스트 마이닝으로 돌아오면 텍스트 마이닝은 텍스트 데이터를 분석해서 의미, 의도, 경향등을 보는 것을 기본으로 하고 그런 결과물을 다른 데이터와 연동해서 분석하거나 결합해서 부가정보로 쓰게 됩니다. 그 이상을 하려면 텍스트 마이닝 결과물 자체가 비즈니스 모델이 되거나 회사의 이윤을 창출하는 뭔가를 만들어 주어야 하는데 그런것이 많지 않습니다.

텍스트 마이닝이 그 자체로 비즈니스 모델이 되는 것은 기계 번역이나 문서 자동 요약 등과 같은 것이 있습니다.

텍스트 마이닝의 문제점

텍스트 마이닝의 문제점은 상당히 자연어(사람이 쓰는 말, 한국어, 일본어, 독일어, 영어, …)에 영향을 많이 받으며 분석결과물 자체를 그대로 비즈니스 모델에 적용해서 뭔가를 만들어내서 성과를 보기 어렵다는데 있습니다. 자연어처리쪽 분야에 있어서 문제가 있는 분야가 한글 및 한국어의 경우 광학문자판독(OCR, Optical Character Recognition), 음성인식(Speech Recognition), 그리고 감성분석 (Sentimental Analysis)등이 있습니다. 기술적으로 문제라기 보다는 언어를 다루는 문제가 결과물을 보고 품질을 사람들이 쉽게 판단하기 때문입니다.

텍스트 마이닝이 어려운 이유

텍스트 마이닝의 전부가 워크 클라우드가 아니며 데이터를 수집해서 텍스트 마이닝 툴을 사용해서 마우스 클릭을 하면 분석결과가 나오는 것이 아닙니다. 영어권 경우에는 기술적인 진척이 많고 영어의 특성이 분석이 더 쉽다는 것이 없지 않아 잘 되는 것도 있지만 한글 및 한국어에서는 아직은 어렵습니다. 특히 텍스트 마이닝은 자연어처리 도구에 의존성을 매우 큰데, 자연어처리 도구가 그냥 사서 쓰는 소프트웨어가 아니라 사람의 정성스런 손길이 지속적으로 필요한 애물단지입니다. 자체로도 관리가 필요하며 관리가 안되면 쓸모가 없어지는 경우가 많으데다가 관리가 안된 자연어처리 도구를 이용해서 만든 2차 파생물도 함께 엉망이 됩니다.

때문에 사내(in-house)에서 지속적으로 투자하거나 하지 않으면 결과를 보기 어렵고, 당연히 단기 프로젝트에 의한 좋은 결과물은 나오기 어렵습니다. 참고로 자연어 처리 도구는 형태소 분석기, 구문 분석기등과 같은 자연어를 처리하는데 필요한 소프트웨어 라이브러리들입니다. 이것들도 자연어의 특성을 많이 타는 것으로 각 언어별로 다 품질이 다르고 기분석 사전이나 후처리 사전등을 따로 관리해야하는 복잡한 문제가 있습니다.

텍스트 마이닝과 워드 클라우드(Word Cloud)

TV에서 자주 볼 수 있는 화면이 단어들이 둥둥 떠 있고 단어끼리 선을 연결한 시각화 화면이 많은 것입니다. 워드 클라우드라는 시각화 방법입니다.

사실상 텍스트 마이닝의 결과물의 시각화는 워드 클라우드나 워드 클라우드를 변형한 시각화 기법외에는 아직 없습니다

경험이 없는 분들은 어렵게 생각하실지도 모르겠지만 사실 워드 클라우드는 구현하기가 매우 쉽흡니다. 심지어 그냥 오픈 소스 몇개를 붙여서 돌리면 그럴 듯한 것을 만들어서 보여줄 수 있습니다.
문제는 이런것들 돌려서 흥미 위주의 어필 포인트는 되겠지만 결과물이 실제로 도움이 되는 것이 많지 않다는 것이고 그것 때문에 대부분의 일반 기업에서는 빅데이터를 텍스트 마이닝이라고 생각하고 프로젝트를 진행한 뒤에 결과물이 도움이 안되니 빅데이터가 별거 아니고 해봤는데 아니더라고 말하게 된다는 것입니다.

가장 흔히 볼 수 있는 반응입니다

이것은 잘못 접한 정보와 유도된 상황 때문에 발생하는 착각입니다. 빅데이터와 텍스트 마이닝을 구분하지 못하며 제대로 이해하지 못하기 때문입니다.  경험을 해보지 않으면 제대로 구분하기 어려운 것도 사실입니다만 공부가 부족하기 그것을 모른다고 해서 틀린 것을 말하고 그것이 마치 정설인듯 말하는 것은 정당하지 않습니다. 텍스트 마이닝은 쉽지 않습니다. 그리고 텍스트마이닝이 빅데이터와 동치관계는 아닙니다.

데이터 사이언티스트가 사용하는 도구

저는 기업체를 상대로 솔루션 사업을 하고 있는 회사에서 데이터 사이언티스트로 일하고 있습니다. 대외 미팅 중에 아이스브레이킹(ice breaking)을 하면서 가장 많이 받는 질문이 아래 두가지입니다.

  • 데이터 사이언티스(Data Scientist)가 뭐하는 사람인가요?
  • 데이터 사이언티스(Data Scientist)는 무슨 툴(Tool)을 사용하나요?

첫번째에 대답은 검색을 해보면 여기저기 다 있습니다.

대부분 명확하게 정의는 하지만 그 정보들을 취합해 보시면 서로 다르게 정의하고 있는 영역이 보일 것입니다. 그 정의로는 혼동스럽죠. 쉽게 정의하면

  • 광의적으로 보면 데이터 관련된 일은 뭐든 다 해주는 사람. 비즈니스에서 부터 구현 및 서비스까지

    이쯤되면 수퍼맨입니다

  • 협의적으로 보면 공학기술을 이용해서 데이터 분석을 하고 구현체까지 만들어 주는 사람

    데이터마이닝과 프로그래밍을 같이 하는 사람입니다. 좀더 구체적으로는 개발자와 데이터 분석가의 중간쯤 어디입니다. 예전에는 데이터 엔지니어(Data Engineer) 또는 그냥 엔지니어(Engineer)라고 불렀습니다.

두번째 대답의 답은 뭘까요?

데이터 사이언티스트가 빅데이터를 하는 사람으로 가장 잘 알려져 있어서 보통은 빅데이터와 관련된 것을 뭉뚱그려서 같이 물어봅니다.
엔터프라이즈를 대상으로 제품이든 용역이든 팔아먹는 기업에서 몸담고 있는 사람이라면 이쪽의 대답은 당연히 자신의 소속한 회사의 솔루션과 관련된 답을 하기 마련입니다.

영업하는 사람이 아닐지라도 그럴 수 밖에 없습니다.

여러가지 솔루션을 많이 보유하고 있는 회사라면 이것저것 적절한 조합을 합쳐서 말하게 되고 솔루션이 적은 회사라면 특정 솔루션에 대해 말하고 응용할 수 있는 가능성을 얘기하게 됩니다. 제 경우에도 여기에서 자유롭지 않으며 회사의 솔루션이 R인 까닭으로 R이라고 말합니다. 하지만 제가 근무하는 회사와 상관없이 제 경우를 떠나서 언급되었거나 경쟁하면서 다른 사람들이 말하는 것들을 닥치는 대로 나열해 보겠습니다.

플랫폼으로 가장 많이 언급되는 것이 Hadoop ecosystem쪽 입니다.

  • 배치 프로세싱: Hadoop, Hive, Pig, Impala, …
  • 리얼타임: Storm, Spark, …

더 있는데 생각이 안나네요.

시각화쪽으로는 Spotfire, Tableau, CliqView 등이 있습니다.

구현을 해서 웹기반 툴을 만들어 주기도 합니다.

BI 쪽

  • Micro-strategy, Business Object(SAP 솔루션)같은 BI툴
  • Birt나 Jasper같은 리포팅툴

DW 쪽

  • Teradata, Oracle 솔루션들, SAP 솔루션들, EMC 솔루션을

이제 마지막으로 분석툴인데 질문자들이 데이터 사이언티스트는 뭘 쓰나요 할 때 예상대답으로 원하는 것이 주로 이쪽입니다.

R, SAS, SPSS 등이 있습니다.

SAS직원이거나 파트너사소속이면 아마 SAS 솔루션들을 말할 것이고 IBM쪽이라면 SPSS와 기타 IBM솔루션을 말할 것이고, 그것도 아니라면 R을 얘기합니다.

이것들의 범주는 사실 데이터마이닝 툴이라고 볼 수 있습니다.

이쯤되면 그냥 통합 ISP 인프라 솔루션들을 다 나온다고 보면됩니다. 이 상황은 빅데이터와 데이터 사이언티스와 데이터분석과 기존 데이터관련 솔루션들이 빅데이터 트렌드에 합류하면서 잡탕찌게가 되었기 때문입니다.

데이터 사이언티스트는 사용하는 툴이 정해져 있지 않습니다. 자세히 생각해 보면 아시겠지만 그럴것이면 데이터 사이언티스트가 별로 필요 없습니다. 데이터 사이언티스트가 닥치는대로 다 사용한다고는 하지만 사실 각자 주력으로 사용하는 것은 있습니다. 경향을 볼 때 주로 선정대상은 일반적이며 가격이 높지 않은 것을 선택합니다.

오픈 되어 있는 것이 필요하니 오픈 소스를 쓰고 오픈 소스는 자체로는 가격이 없으니 결국 오픈 소스를 선호하게 됩니다.

특정 회사에서 내근만 한다면 특정 툴로만 하는 것도 무리는 없습니다

물론 가격이 비싸고 훈련이 되어 있거나 훈련을 받아야 합니다.

국외의 상황이구요. 국내는 아직 혼란 상태입니다.

외국의 상황을 보죠.
검색을 해서 외국 사이트의 게재물을 읽어보시면 주로 언급되는 데이터 사이언티스트가 가장 많이 쓰는 도구는
R, Python, Java가 나옵니다.

SQL은 거의 기본입니다. 무조건 합니다. 제 경험으로는 실제로도 그렇습니다.

주로 현재는 Python이 가장 많고 그 다음이 R 그리고 Java입니다.

Python과 Java가 많은 이유는 데이터사이언티스트 중에서 공학에서 시작해서 커리어를 확장했기 때문입니다.  공학에서 넘어온 사람은 Python, Java가 많고
통계에서 넘어온 사람은 R이 많습니다.
비즈니스나 경제학에서 넘어온 사람은 여전히 SAS와 Excel을 씁니다.

SAS, Excel빼고 이것들의 공통점은 컴퓨터 랭귀지라는 것입니다.

SAS도 자체 랭귀지가 있습니다만 그냥 분류상으로 빼겠습니다. 많이 애매해졌습니다.

해석해 보면

  1. 첫번째 항상 구현만 하는 것은 아니겠지만 뭔가 구현을 하는 경우가 빈번하기 때문이라는 것을 알 수 있습니다. (주력으로 사용하는 도구이므로…)
  2. 두번째 가능한 특정 솔루션에 의존성을 가지지 않아야 하며 솔루션이나 툴이 중요한 것이 아니다라는 것을 알 수 있습니다. 현재는 가장 각광받는 것이 R과 Python 그리고 빅데이터 솔루션입니다.

하지만 데이터 사이언티스트가 사용하는 도구가 뭐냐를 보기 보다는
데이터 사이언티스트라는 사람 그 자체가 도구라는 사실이 숨겨져 있는 것이 함정입니다.

[컨퍼런스] 데이터사이언티스트가 말하는 빅데이터 분석 사례

(데이터솔루션)[http://www.spss.co.kr/main/main.asp]이 주최하는 빅데이터 세미나입니다.

  • 사이트 주소: http://www.datasolution.kr/imgs_job/marketing/2014/bigdata_01.html
  • 장소: 엘타워 그레이스 1홀
  • 날짜: 2014년 3월 25일 화요일
  • 시간: 13:30 – 17:30

0.5일 오후만 진행하네요.
주로 SPSS를 이용한 사례 중심 발표로 보여집니다.

관심있는 분들은 참여해 보세요.

R – 콜택시/대리운전 데이터 분석 예제 #1

콜택시/대리운전 데이터 분석 예제 #1

SKT의 빅데이터허브에서 받은 콜택시/대리운전 데이터를 이용한 간단한 Data Munging과 EDA를 위한 전처리의 예제입니다.

들어가기 앞서서…

Data Munging(데이터 먼징)은 데이터를 분석하기 위해 데이터를 여러 형태로 변환하는 것을 말합니다. (Data Wrangling 이라고도 합니다) ETL이 뭔지 아신다면 간단한 형태의 on-demand ETL이라고 생각하면 됩니다. Data Munging을 시스템을 이용해서 자동화하면 ETL이 됩니다.

EDA는 다들 알다시피 탐색적데이터분석(Exploratory Data Analysis)입니다. 최근의 추세는 EDA를 위해서 전처리와 Data Munging에서 EDA까지 한꺼번에 수행하는 것이 많습니다. (유행…)

해보기…

우선 bigdatahub.co.kr에서 콜택시/대리운전 데이터를 다운로드 모두 받습니다. 취향이겠지만 TSV 형식으로 받으면 좋습니다. 탭으로 구분된 것이 콤머로 구분된 것보다 다루기 편합니다.

CSV형식은 따옴표의 escaping등의 문제가 늘 있으므로 가끔 이런것이 문제를 일으킵니다. 이런 문제를 미연에 방지하기 위해 TSV형식을 사용하는 것이 좋습니다.
단, 당연한 것이지만 데이터 내부에는 Tab이 들어 있지 않다는 전제가 필요합니다.

TSV형식은 Tab Seprated View의 약어로 구분자(delimiter)가 tab 문자로 구분된 형식입니다. 이 예제에서 파일들이 저장된 경로는 다음과 같습니다. (제 PC는 Mac입니다)

각자의 경로에 맞게 잘 수정하시기 바랍니다.

저장된 파일 목록을 살펴봅니다.

이제 파일이름들로 된 character 타입 벡터를 하나 만들어 줍니다. copy & paste를 하시던가 타이핑을 열심히 하던가 해야 합니다.

다른 tsv파일들이 들어있지 않다면 타이핑하지 않고 그냥 불러올 수 있습니다.

오타방지와 노동력 낭비 방지를 위해서도 이 방법이 더 낫습니다. system 펑션에 intern 옵션을 True로 해주면 됩니다.

위의 내용을 보실 때 한글 자모가 분리된 형태로 보일 수 있는데 제 작업PC가 Mac OS X라서 그렇습니다. 실제로는 문제는 없습니다.

이제 읽어들일 파일이 헤더가 포함되었는지와 모든 헤더들이 동일한지 간단히 확인합니다. 만약 헤더가 일치하지 않으면 data.frame을 머지(merge)할 때 곤란해집니다. 편의를 위해서 unix 명령을 사용할 것이고 Mac OS X나 Linux를 사용하고 있다면 바로 쓸 수 있습니다.

R을 windows를 사용하고 있다면 msys나 cygwin등을 설치하거나 수작업으로 하는 방법이 있습니다.

결과를 보면 한 개의 파일이 다른 헤더를 가지고 있음을 알 수 있습니다.

아마도 “서울지역+콜택시+대리운전+이용분석_2013년+8월.tsv”라는 파일이름을 가진 파일이 원흉일 것입니다. 여튼 header들이 일치하지 않는데 결국 header를 고쳐주거나 header를 무시하고 읽어온 뒤에 header를 다시 붙여주는 방법을 사용해야 합니다. 그리고 어차피 컬럼명이 한글이므로 header는포기하는 것이 유리합니다.

우리는 header를 포기하고 column name들은 임의로 붙일 것입니다. 자 이제 여러 tsv 파일을 모두 읽어서 하나의 data.frame으로 만들어야 합니다.

그래야 다루기 쉽습니다.

파일들을 일곱번 읽어서 rbind하는 방법등 여러가지 방법이 있습니다. 그리고 그 외에도 방법은 여러가지가 있습니다만 여기서는 작업의 편의를 위해서 plyr를 이용해서 한 번에 읽어 버리도록 하겠습니다. plyr 패키지를 불러옵니다. 설치가 되어 있지 않다면 당연히 설치를 해 주어야 합니다.

plyr 설치하기

이제 paste0를 이용해 파일 이름들의 fullpath 벡터를 만들어줍니다.

아래는 결과입니다.

파일 이름이 절대경로로 잘 붙어 있는 것을 확인할 수 있습니다. 자 이제 ldply를 이용해서 몽땅 불러옵니다. header를 읽지 않기 위해서 skip=1 옵션을 준 것을 주의하세요.

자 파일을 읽어 왔습니다. 내용을 확인해 봅니다.

확인해보니 ldply를 사용하면서column이 하나 더 붙었습니다만 그것은 나중에 확인하기로 하고 우선 레코드를 빼먹지 않고 모두 data.frame으로 읽어 왔는지 확인해 봅니다.

총 3115 개의 레코드가 읽혔는데 맞는지 확인해 봅니다. unix명령어의 wc를 이용해서 확인합니다.

3122개가 나왔는데 header의 개수 7을 빼면 3115가 맞습니다. (산수! 산수!)

자 이제 컬럼명을 바꿔줍니다. 원래 컬럼명은 아래와 같습니다.

아래는 결과입니다.

컬럼명을 안 바꾸고 그냥 써도 되겠지만 컬럼의 의미를 인식하기 어려우므로 바꿔줍니다. (깔맞춤의 미학)

그전에 보면 맨 앞의 컬럼명이 filename인데 이것은 하등 쓸모가 없으므로 먼저 제거합니다.

#!!{"brush":"r"}
df <- df[,2:6]

컬럼이름을 바꿔줍니다.

컬럼이름이 로마자 병음 방식으로 상당히 무식해 보이지만 체신청(우체국)과 안행부에서도 채택(?)하고 있는 전통적으로 많이 쓰는 예술적인 네이밍룰입니다.

컬럼이 잘 바뀌었는지 확인해 봅니다.

아래는 결과입니다.

다 되었습니다. 여기까지 데이터를 읽어오는 과정이었습니다. 기회가 되면 이 데이터를 가지고 EDA인 Descriptive Statistics를 해보겠습니다.