케빈 머피의 새 기계학습 책

링크를 방문하시면 됩니다.

https://probml.github.io/pml-book/book1.html

기계학습 서적의 저자로 유명한 Kevin Patrick Murphy의 새 책 이라고 합니다.

현재는 Draft 판과 Python 코드를 다운로드 받을 수 있습니다.

저는 아직 읽어 보지는 못했습니다만 목차만 살펴봤을 때는 다른 기계학습 서적과 대동소이한 구성으로 보입니다.

CART – 결정 트리와 회귀 트리 Decision Tree and Regression Tree #1

결정트리(Decision Tree)인 CART 알고리즘에 대해 포스팅합니다.

제 계획대로라면 벌써 몇년전에 포스팅을 했어야 했지만 계획대로 되는 것은 언제나 그렇듯이 없습니다.

CART는 GBDT, Random Forest, XGboost, LightGBM 등의 트리계열 알고리즘의 근간이 되는 매우 중요한 알고리즘입니다. 요즘 트리 계열 알고리즘에서 가장 좋은 성능을 보이는 XGboost에게는 할아버지쯤 되는 알고리즘입니다.

CART에는 결정 트리(Decision Tree)와 회귀 트리(Regression Tree)라는 알고리즘이 2개 들어 있습니다. 한 개가 아닙니다. 그런데 둘은 거의 비슷하기 때문에 1개라고 봐도 무리가 없긴 합니다. 일란성 쌍둥이라고 생각하면 됩니다. CART는 Classification And Regression Trees의 약어인데 여기에도 분류와 회귀를 하는 트리라는 것을 알려주고 있습니다.

어쨌든 이 둘의 차이는 뒤에 설명하겠습니다.

알고리즘의 컨셉

알고리즘의 컨셉은 간단합니다. 학습 데이터를 해석해서 알아서 트리 구조를 자동으로 만든 다음 만들어진 트리를 이용해서 분류, 예측 문제를 해결하는 모델을 만드는 것입니다.

여기서 중요한 것은 트리를 자동으로 만든다는 것입니다. 트리를 사람이 만들어줘야 한다고 상상하시는 분들이 있는데 아닙니다.

분류 트리와 회귀 트리의 차이

분류 트리와 회귀 트리의 차이를 살펴보겠습니다.

결정 트리(Classification Tree)는 클래스(등급) 또는 레이블(표 딱지)을 예측하는 것으로 “남”또는 “여”, “예” 또는 “아니오”, “A”, “B”, “C” 와 같이 어떤 것인 맞추는 것(판별)이고

회귀 트리(Regression Tree)는 연속형 숫자인 1,2,3 123, 28.5와 같은 숫자를 맞추는 것입니다. 사람의 키를 맞춘다거나, 대출 상환 예상액을 맞춘다거나 하는 것(예측)입니다.

CART의 탄생

뭐든 그렇지만 자세한 설명 전에 역사를 조금 살펴보면 이해하는데 도움이 됩니다.

CART는 1980년대에 발표된 것으로 이제 나이가 들대로 든 알고리즘이지만 아직도 현역에서 많이 쓰입니다. 기계학습 알고리즘이 다들 독특한 면이 있긴하지만 CART도 상당히 독특한 기계학습 알고리즘입니다. 이 알고리즘은 학술상의 갈래로 보면 데이터마이닝 계열로 많이 분류됩니다. 비즈니스적인 결정을 과학적으로 해서 가치 창출얼 하기 위한 것. 그러니까 좋은 결정을 내리는 것을 자동화하기 위한 용도로 만들어진 것입니다.

만든 분들의 말에 의하면 통계 분석이나 문제 해결을 할 때 마다 회귀모델같은 통계 모델이나 여러 수리 모델을 매번 디자인하고 적용하는 것이 비효율적이라서 싫었다고 합니다.

데이터마이닝 계열이라고 했지만 이것도 기계학습 알고리즘이고 만들어진 원리를 보면 꽤 깊은 고급 통계 이론과 정보 이론이 함축되어 있습니다. 만만한 알고리즘은 아닙니다. 이 알고리즘의 저자들이 총 4명인데 통계학, 과학, 의학, 경제학, 컴퓨터 공학에 매우 뛰어난 석학들입니다. 이 알고리즘이 이런 분야에 고루 쓸 수 있는 다목적 도구라고 해석해 볼 수 있습니다.

CART의 저자와 논문

보통 알고리즘은 논문으로 많이 발표되는데 CART 알고리즘은 논문이 없습니다. 논문으로 발표된 알고리즘이 아니고 책으로 발표된 알고리즘입니다. 논문을 찾다가 논문이 없고 대신 책이라는 사실에 충격받았던 기억이 있습니다.

오래된 책인 만큼 표지가 매우 촌스럽습니만 아마존에서 아직도 판매하고 있습니다. 출판일을 보면 1984년 1월 출판이 첫판입니다.

CART의 저자들

앞서 말씀드렸듯이 책 표지에 있는 저자 4명은 모두 각 분야에서 상당히 유명한 분들입니다. 아래의 4명입니다.

  • Leo Breiman – University of California, Berkeley
  • Jerome H. Friedman – Stanford University
  • Richard A. Olshen – Stanford University
  • Charles J. Stone – University of California, Berkeley

책의 저자들까지 나열한 것은 위의 저자들 중에
Leo Breiman (레오 브라이먼)
Jerome H. Friedman (제롬 프리드먼)
이름을 굳이 외우실 필요는 없습니다만 이 두 사람은 알아두는 것이 기계학습을 깊이 공부하신다면 도움이 되기 때문입니다. 이 두 사람은 CART 발표 이후에 Random Forest(랜덤 포레스트)와 GBDT (Gradient Boosted Decision Tree), GBRT(Gradient Boosted Regression)를 만든 사람들입니다. 아마 기계학습을 조금이라도 공부하신 분들은 이 알고리즘들의 이름을 알고 있을 것입니다. 특히 랜덤포레스트는 너무도 유명하지요. 그리고 부럽게도 위키피디아에도 이 분들 이름이 등록되어 있습니다.

CART와 유사한 알고리즘

ID3, C4.5, C5.0 이라는 결정 트리(Decision Tree)알고리즘이 있습니다. 나열한 순서대로 개량된 버전인데 C4.5가 가장 많이 알려져 있습니다. CART와 유사하다고 하는데 동일한 시대에 발표된 것이지만 관련은 없다고합니다. 구조도 서로 비슷하다고 알려져 있습니다만 제가 이 알고리즘은 잘 알지 못합니다.

CART가 현재는 라이센스가 없이 무료인 반면 C4.5 구현체가 판매되었던 알고리즘이라서 사용자가 많지는 않습니다. 성능은 꽤 좋다고 하며 CART와 C4.5의 성능은 비슷하다고 알려져 있습니다.

CART의 개량형, 강화형

CART의 개량형, 강화형 또는 영향을 받은 것은 다음과 같은 것들이 있습니다.

  • Random Forest
  • Gradient Boosted Decision Tree / Gradient Boosted Regression Tree
  • XGboost
  • lightGBM
  • CatBoost
  • Isolation Cut Forest
  • Robust Random Cut Forest

앞서 말했듯이 요즘 각광받는 XGboost, lightGBM도 모두 CART 계열입니다. 현재 결정 트리 계열 중에 가장 주목받는 것은 lightGBM 입니다. 그래서 요즘은 CART를 사용하지 않고 바로 lightGBM이나 XGboost를 사용하는 경우도 많습니다. 다만 CART만 앙상블 모델이 아니고 다른 알고리즘은 모두 앙상블 모델입니다. 앙상블 모델은 여러 모델을 합쳐서 하나의 모델로 만든 것을 말합니다.

위의 알고리즘 중에서 저는 개인적으로 lightGBM을 매우 좋아합니다만 그 이유는 XGboost이 비해서 가볍고 범주형 변수를 지원하기 때문입니다. 자세한 얘기는 다음 기회에 하기로 하겠습니다.

Decision Tree와 Regression Tree의 차이

Decision Tree(결정 트리, 분류 트리)와 Regression Tree(회귀 트리)는 매우 유사합니다. Decision Tree가 남,녀와 같이 클래스 또는 레이블로 된 것을 분류해주는 Classification(분류) 문제 해결이라면 Regression Tree는 몸무게, 키, 확률 등의 연속형 수치값을 추정해주는 Regression 입니다.

참고로 Regression Tree에는 흔히 말하는 Linear Regression과 같은 회귀 모델이 들어 있지 않습니다. 연속형 값을 추정하는 것을 넓은 의미로 Regression(회귀)라고 하는데 Regression Tree는 종단 노드에서 평균을 사용해서 결과값을 추정합니다. 평균을 사용해서 추정하는 것은 넓은 의미에서 회귀라고 말 할 수 있습니다.

설명이 어려워졌는데 쉽게 말하자면 Regression Tree에서 말하는 Regression은 Linear Regression(선형회귀)나 Logistic Regression(로지스틱 리그레션)에서 말하는 그 회귀(Regression)이 아닙니다.

CART의 원리

복잡한 수식 같은 것을 적으려면 시간과 지면이 많이 필요합니다. 우선 원리만 적고 자세한 것은 나중에 업데이트하도록 하겠습니다.

cart algorithm에 대한 이미지 검색결과

CART 위와 같은 트리를 자동으로 만드는 것입니다. 위의 그림은 CART에서도 Decision Tree를 설명한 것인데 남 (Male), 여 (Female)를 구분하는 판별 모형을 만들때 입력 변수(Input variable, feature, 자질)인 키 (Height)와 몸무게 (Weight)를 이용하는 Decision Tree입니다.

입력 변수는 범주형 변수를 넣을 수도 있습니다. 만약 머리색을 입력 변수 중 하나로 추가해서 넣는다고 하면 Black, Brown, Pink 등과 같은 것이 됩니다.
출력 클래스도 남, 여가 아닌 남,여,모름 이렇게 3개 이상을 지정할 수 있습니다. 단 Decision Tree에 해당하고 Regression Tree는 안됩니다.

CART의 신비는 저 “트리를 어떻게 자동으로 만들어 주느냐”입니다.

이 다음 설명은 다음 편으로 짤라서 쓰겠습니다.

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을 더 좋아합니다.

BigQuery JSON 문자열에서 원하는 값 추출하기

BigQuery 테이블에 어떤 필드에 JSON 문자열이 들어 있고 이 JSON 문자열에서 어떤 키에 해당하는 값을 가져오는 간단한 쿼리 스니펫입니다.

들어있는 JSON 문자열의 포맷이 큰 문제가 없으면 괜찮은데 아닌 경우가 있습니다. 그래서 간단한게 쿼리를 돌려서 테스트 해봤습니다.

BigQuery에 JSON 문자열에서 원하는 키에 해당하는 값을 가져오는 샘플 쿼리입니다.

간단한 테스트를 하는데 테이블을 만드는 것이 귀찮으니 JSON 문자열 여러 개를 array로 만들고 UNNEST로 꺼내서 합니다. 다른 데이터베이스에서는 UNION ALL을 하고 INLINE VIEW로 묶어서 꺼내거나 LATERAL VIEW를 쓰면 됩니다.

결과를 TSV형태로 뽑아보면 다음과 같습니다.

저렇게 보면 눈에 잘 안들어오는데 이렇게 보면 실제 NULL값과 “NULL”이라는 문자열 그리고 key가 따옴표 또는 큰타옴표로 묶여 있지 않는 것들이 어떻게 처리되는지 볼 수 있습니다.

위의 결과는 DataGrip에서 결과를 확인한 것입니다.
결과를 자세히 보시면 알겠지만 사용할 때 주의할 점은 이렇습니다.

  • 우선 JSON의 안쪽에 키(key)는 큰따옴표 또는 작은따옴표로 묶여 있어야 합니다.
  • JSON_EXTRACT는 키에 해당하는 값을 통째로 다 문자열로 가져옵니다
  • JSON_EXTRACT_SCALA는 키에 해당하는 값에서 큰따옴표, 작은따옴표를 없애고 알맹이만 꺼내옵니다.

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 형태로 변환하는 함수들도 제공합니다.  사용해 보지는 않았습니다. ^^;

앙상블 모델 – 배깅 Bagging

기계학습 부류. 분류(classification) 또는 예측(prediction)에서 여러 모델을 합쳐서 더 좋은 결과를 얻는 방법을 앙상블(Ensemble) 모델이라고 합니다.  앙상블 기법은 배깅(Bagging), 부스팅(Boosting), 스태킹(Stacking) 3종류로 나눌 수 있습니다. 
이 포스트에서는 우선 배깅(Bagging)에 대해서 설명합니다.

앙상블 모델을 배울때 보통 Bagging과 Boosting을 알게 되고 그 다음 Stacking을 생각하게 됩니다. 순서는 중요하지 않지만 기법들이 생각보다 많이  다르고 복잡함의 종류도 다릅니다. 그래서 한꺼번에 설명하기 어렵습니다.

앙상블 모델은 보통은 지도학습(supervised learning)에 사용됩니다. 군집화나 학습데이터가 없는 아웃라이어 감지(outlier detection), 어노멀리 감지(anomaly detection), 클러스터링(clustering) 같은 것에는 쓰기 어렵습니다.

비지도학습(unsupervised learning)에도 앙상블을 할 수 있다고 하는데 실제로 사례를 본적은 없습니다.

배깅 Bagging

배깅은 모델을 병렬로 연결해서 취합하는 방법입니다.
예를들어 결정트리(Decision Tree; 분류 나무)와 같은 알고리즘을 병렬로 연결한다고 하면 여러 개의 트리를 만들어서 결과를 취합합니다.  결합할 때는 다수결(Majority vote)를 쓸 수도있고 가중치(Weighted Majority Vote)를 쓸 수 있는데 기본으로는 다수결을 쓴다고 알려져 있습니다.

배깅의 대표적으로 알려진 알고리즘은 Leo Brieman이 만든 그 유명한 랜덤포레스트(Random Forest)가 있습니다. 이름이 랜덤포레스트인 이유도 배깅과 관련이 있기 때문입니다. 랜덤요소를 이용해 트리를 여러 개 만들고 합쳐서 숲을 만듭니다.

앙상블에서 모델을 몇 개를 결합할지는 보통 초매개변수(Hyper parameter)로 만드는 사람에 의해서 정해지게 됩니다. 결정트리를 앙상블로 결합하는 경우는 보통 100개 이상입니다.

배깅을 조금 구체적으로 설명하면 데이터로 입력값을 주면 Y 또는 N를 알려주는 트리모델을 결합해서 배깅으로 앙상블시키려고 하면 가지고 있는 학습데이터로 100개의 트리 모델을 만들고 실제로 판별에 사용할 때 입력을 100개의 트리모델에 주고 각 트리들이 Y과 N을 각각 던져 주면 그 중 많은 것을 답으로 취하는 방식입니다.  물론 이것은 아주 간단한 예이고 더 복잡하게도 변형이 가능합니다.

그런데 한뭉치의 학습데이터로 모델을 여러 개를 만든다고 했는데 어떻게 여러 개를 만드느냐가 의문입니다.
100개의 결정트리를 만들려면 학습데이터를 100등분해서 각각 만들면 되지 않을까라고 생각하겠지만 그렇게 나눌 양이 되지 않는 경우가 많고 학습 데이터가 부족해서 10묶음 교차검증(10 Fold Cross Validation)같은 것 까지 하는 판국에 학습데이터를 잘게 쪼개서 모델을 만들 여유가 없게 됩니다.
지도학습에서는 학습데이터의 양이 항상 문제입니다. 언제나 부족하다고 느껴집니다. 사회과학이나 의료같은 문제에서는 대량의 학습데이터를 얻기 어려운 경우가 많으니까요.  이미지 인식같은 종류의 자연과학 데이터로 부터 문제를 해결하는 딥러닝하고는 입장이 많이 다릅니다. 100등분을 해서 나눌 여유도 없고 그렇게 나누면 각각의 모형들이 편향이 생기거나 분산이 커질 여지가 많습니다.
그래서 학습데이터를 분할해서 모델을 각각 만든다는 것이 다소 비현실적인 경우가 많습니다. (다 그런것은 아닙니다)

적은 데이터로 모델을 여러개 만드는 방법은 배깅이라는 명칭을 풀어보면 알 수 있습니다.

배깅이라는 단어는 영어사전에서 찾을 수 있는 단어는 아니고 부트스트랩 어그리게이팅 Bootstrap AGGregING의 약어 입니다.

풀어서 보면 부트스트랩(Bootstrap)은 샘플을 다시 샘플링하는 것을 부트스트래핑(Bootstraping)이라고 하고 어그리게이팅은 그냥 취합한다는 뜻입니다.  즉 부트스트래핑 기법으로 학습데이터를 뻥튀기하는 효과로 여러개의 트리를 만드는데 사용하고 그 결과들을 취합합니다. 그것을 배깅이라고 부릅니다.

부트스트래핑은 통계학의 샘플링에서 매우 중요하게 다루는 개념 중 하나입니다. 어렵고 내용이 길어지므로 설명은 다음기회에 해보겠습니다.

부트스트래핑(뻥튀기)을 조금 더 쉽게 설명하면
10000개의 레코드로 된 데이터세트가 있다고 가정합니다.
10000개의 레코드를 10000번 복원추출(resampling)을 합니다. 그러면 갯수는 똑같이 10000개가 됩니다. 다시 이 과정을 반복해서 100번을 해서 10000개 짜리 데이터세트를 100개를 만들고 이 것으로 각 모델들을 만듭니다. 그러면 100개의 조금씩 다른 모델을 만들 수 있습니다.

“10000개에서 10000개를 표본추출(샘플링)하면 똑같은 것 아닌가?”
라고 생각할 수 있습니다.  또
“똑같은 것 100개를 만들어서 각각 모델을 만들면 다 똑같은 것 아닌가?”
라고 생각할 수 있습니다.
복원추출을 했기 때문에 안 똑같습니다.
복원추출은 영어로 리샘플(Resample)이라고 합니다. 가지고 있는 학습데이터가 모집단으로 부터 표본추출한 데이터라고 볼 수 있습니다. 즉 모집단에 대한 샘플데이터입니다.  
표본추출한 것을 데이터 갯수 만큼 복원추출을 다시 하게 되면 어떤 것은 같은 것이 중복해서 뽑히고 어떤것은 아예 뽑히지 않게 됩니다.  이것이 배깅의 효과인데 이게 무슨짓인가 싶겠지만 이렇게 표본을 다시 복원추출하면 원래 모집단의 특성을 더 잘 반영되도록 재구성되는 경향이 있다고 알려져 있습니다. (중심극한정리와 비슷해 보이지만 다른 것입니다)

이 특성을 이용해서 조금씩 다른 모델들을 만들고 그것들의 결과를 취합하는 것입니다. 
“데이터가 전부 비슷하니 결과도 별차이가 없겠네”
라고 생각할 수 있겠지만 데이터가 빼곡해지는 효과가 있고 조금씩 다른 모델들이 투표를 하는 방식이므로 배깅으로 만들어진 앙상블 모델은 결과들에 대한 편차가 크지 않고 안정적인 결과를 보여지도록 향상됩니다.
학습데이터가 원래 편향이 있다면 그로 인한 편향문제까지는 해결하지는 못하지만 미지의 데이터(Unseen data)에 상당히 괜찮은 성능을 보이고 노이즈나 아웃라이어에 대해서도 강해지는 것으로 알려져 있습니다.
실제로 단순한 트리모형과 랜덤포레스트 모델을 만들고 비교를 해보면 차이를 알 수 있겠습니다.

R 3.5.0 릴리즈 – Joy in playing

지난 2018-04-23에 R 3.5.0이 릴리즈 되었습니다.
이전 버전은 R 3.4.4입니다.
R 3.5.0의 닉네임은 “Joy in playing”이고 늘 그래왔듯이 이 닉네임도 만화 피너츠에 나오는 대사입니다.

https://www.gocomics.com/peanuts/1973/01/27

R 3.4.x에서 앞자리 숫자가 바뀌면서 R 3.5.0으로 올라가면서 이전의 버전업에  비해서 업데이트 내역이 조금 많습니다.

꽤 많아서 나열하기는 힘들고 그 중에서 체감할 수 있는 가장 중요한 업데이트는 R에 설치되는 패키지가 설치할 때 모두 bytecode로 컴파일 된다는 것입니다.

그래서 바로 버전업을 하면 예상치 못한 문제가 발생할 여지가 많아서 사용하던 패키지가 이상하게 작동하거나 RStudio가 오작동 한다거하는 문제가 있을 수 있습니다.

버전업을 조금 미루시거나 RStudio를 최신으로 빠르게 반복해서 업데이트 해 주는 것이 필요할 것 같습니다.

R팁 – 두 벡터의 모든 멤버가 동일한지 비교하기 all.equal

두 벡터가 동일한지 비교하는 간단한 팁입니다.

R은 벡터(vector)와 스칼라(scala)의 구분이 없이 사실은 모든 변수를 벡터로 취급하기 때문에 다른 언어에는 없는 몇 가지 문제가 생깁니다. 이것도 그것과 관련이 있습니다.

두 벡터, 즉 2개의 변수가 있고 변수가 모두 length가 2 이상일 때 두 벡터가 완전히 동일한지 비교할 때 아래의 코드에서 첫번째 if구문과 같은 실수를 합니다.

위의 예제 코드에서 첫번째 if 구문은 상식적으로 의도한 대로 작동하지 않습니다.   == 연산자가 두 변수의 첫번째 요소(first element)만을 비교하기 때문에 두 벡터가 같다고 나옵니다.

물론 다음과 같은 경고 메세지를 콘솔창에 뿌려주기 때문에 문제가 있다는 것을 알 수는 있습니다. 무심결에 경고메세지를 무시해 버리면 큰 문제가 생길 수 있습니다.

만약 두 벡터의 멤버가 모두 동일한지 비교하려면 처음 코드에서 두 번째 사용한 if 구문처럼 all.equal을 사용해야 합니다.

코드를 조금 고쳐서 다음과 같은 것을 실행해 보세요.

사실 R을 사용해서 작업을 할 때 두 벡터가 완전히 동일한지 비교할 일이 별로 없습니다. 그래서 새까맣게 까먹고 있다고 가끔 실수를 저지를 때가 있습니다.