SlideShare a Scribd company logo
1 of 93
Download to read offline
표지 동물은 송골매다. 이 매는 세상에서 가장 흔한 맹금류 중 하나로 남극을 제외한 모든 대륙에 서식한다.
또한, 도시, 열대 지역, 사막, 툰드라 등 다양한 환경에서 생존할 수 있다. 일부는 겨울과 여름 서식지 간
의 머나먼 여행을 한다.
송골매는 세상에서 가장 빨리 나는 새로, 시속 약 320km로 급강하할 수 있다. 참새나 오리와
같은 다른 새와 박쥐를 먹이로 하는데, 공중에서도 먹이를 낚아챌 수 있다.
다 자란 송골매의 날개는 푸른 잿빛을, 등은 어두운 갈색을 띠며, 담황색 배에는 갈색
점이, 하얀 얼굴에는 검은색 눈물점이 있다. 그리고 갈고리 모양의 부리와 강
한 발톱도 있다. 송골매의 영어 이름인 peregrine falcon은 라틴어의
peregrinus에서 온 말인데, 그 뜻은 방랑자다. 송골매는 매조련사들
의 사랑을 받아왔으며, 여러 세기에 걸쳐 사냥에 동원되었다.
오라일리 책의 표지에 등장하는 동물 중 상당수는 멸종 위기에 처해 있다. 이들 모두가 우리 세상에 소중한 존재다. 이 동
물들을 돕고 싶다면 animals.oreilly.com으로 가보자.
표지 그림은 라이데커의 『Royal Natural History』에서 가져왔다.
9가지 사례로 익히는 고급 스파크 분석(2판)
현실 세계 빅데이터로 배우는 데이터 과학과 머신러닝
초판 1쇄 발행 2016년 7월 1일
2판   1쇄 발행 2018년 3월 5일
지은이 샌디 라이자, 유리 레이저슨, 션 오언, 조시 윌스 / 옮긴이 박상은, 권한철, 서양주 / 펴낸이 김태헌
펴낸곳 한빛미디어 (주) / 주소 서울시 서대문구 연희로2길 62 한빛미디어(주) IT출판부
전화 02 – 325 – 5544 / 팩스 02 – 336 – 7124
등록 1999년 6월 24일 제10 – 1779호 / ISBN 979 – 11 – 6224 – 052 – 6 93000
총괄 전태호 / 책임편집 김창수 / 기획·편집 이복연
디자인 표지 박정화, 내지 김연정, 조판 백지선
영업 김형진, 김진불, 조유미 / 마케팅 박상용, 송경석, 변지영 / 제작 박성우, 김정우
이 책에 대한 의견이나 오탈자 및 잘못된 내용에 대한 수정 정보는 한빛미디어(주)의 홈페이지나 아래 이메일로
알려주십시오. 잘못된 책은 구입하신 서점에서 교환해 드립니다. 책값은 뒤표지에 표시되어 있습니다.
한빛미디어 홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr
© 2018 Hanbit Media Inc.
Authorized Korean translation of the English edition of Advanced Analytics with Spark 2E ISBN
9781491972953 © 2017 Sanford Ryza, Uri Laserson, Sean Owen, and Joshua Wills
This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls
all rights to publish and sell the same.
이 책의 저작권은 오라일리와 한빛미디어 (주)에 있습니다.
저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 무단 복제를 금합니다.
지금 하지 않으면 할 수 없는 일이 있습니다.
책으로 펴내고 싶은 아이디어나 원고를 메일 ( writer@hanbit.co.kr ) 로 보내주세요.
한빛미디어(주)는 여러분의 소중한 경험과 지식을 기다리고 있습니다.
| 표지 설명 |
9가지 사례로 익히는 고급 스파크 분석 2판
4
샌디 라이자 Sandy Ryza
리믹스에서 대중교통에 적용할 수 있는 알고리즘을 개발하고 있다. 이전에는 클라우데라와 클로버
헬스에서 선임 데이터 과학자로 근무했다. 아파치 스파크 커미터이자 아파치 하둡의 PMC 멤버이
며 스파크 시계열 데이터 처리 프로젝트의 창설자이다. 2012년 브라운 대학교 전산학과의 트와이
닝 어워즈에서 ‘Most Chill’ 부문을 수상했다.
유리 레이저슨 Uri Laserson
마운트 시나이 의과대학교 아이칸 스쿨의 유전학 조교수다. 하둡 생태계를 활용해 유전체학과 면역
학에 적용할 수 있는 확장 가능한 기술을 개발하고 있다.
션 오언 Sean Owen
클라우데라 데이터 과학팀의 디렉터다. 아파치 스파크 커미터와 PMC 멤버이며, 아파치 머하웃
Apache Mahout의 커미터였다.
조시 윌스 Josh Wills
슬랙Slack 데이터 엔지니어링팀의 리더이며 아파치 크런치Apache Crunch 프로젝트의 창설자이다. 데이
터 과학자들에 관한 트윗을 한 번 남긴 적이 있다.
지은이 소개
5
박상은 edberg.s@gmail.com
컴퓨터에 붙은 그림을 보고 애플이라는 단어의 뜻을 알게 된 이 땅의 흔한 개발자 중 한 사람이다.
포항공과대학교에서 전산학을, 한국과학기술원에서 인공지능을 공부했으며, 그 덕분에 알파고와
스카이넷을 구분할 줄 아는 지혜를 갖추게 되었다. 메일, 브라우저, CMS, 도서 관리 시스템 등 일
관성을 찾기 어려운 다양한 프로젝트에 참여했다. 이렇게 하여 물에 물 탄듯한 경력이 완성되는 듯
했으나, 최근 몇 년은 빅데이터 처리와 관련한 연구개발에 집중했다. 현재 에스코어에서 Elastic 스
택을 활용한 빅데이터 저장/검색 서비스 제공과 머신러닝 및 딥러닝 관련 업무를 수행하고 있다. 대
량의 데이터를 실시간으로 수집, 처리, 분석하여, 실시간으로 생산되는 데이터의 수집과 시각화 사
이의 시간 간격을 줄이는 데 각별한 관심이 있다.
권한철 ultradioc@gmail.com
에스코어의 데이터 분석가 및 플랫폼 개발자다. 보안 관제용 실시간 CEP 엔진 개발을 비롯해서 스
파크를 활용한 다수의 프로젝트에 참여했으며, 현재는 파이썬 라이브러리를 활용하여 콜센터 데이
터 분석 업무를 수행하고 있다. 특히 실시간 데이터 분석과 통계 및 머신러닝 알고리즘을 활용한 데
이터 분석에 관심이 많다.
서양주 yangsuh84@gmail.com
한국과학기술원 학부에서 수학을, 서울대학교에서 석사과정으로 통계학을 전공하였으며, 티맥스소
프트를 시작으로 개발자로서 일하게 되었다. 그 후 에스코어에서 2013년 하둡과 스파크를 접한 이
후로 빅데이터 분석을 주 업무로 수행하게 되었다. 현재는 카카오 추천팀에서 실시간 콘텐츠 추천
업무를 하고 있다.
옮긴이 소개
6
버클리에서 스파크 프로젝트를 시작한 이래로, 나는 단순히 빠른 병렬 시스템을 구축한다는 사
실보다는 점점 더 많은 사람이 대규모 컴퓨팅을 사용할 수 있게 돕는다는 점에 흥분해왔다. 데
이터 과학 전문가 네 명이 스파크 기반의 고급 분석에 대해서 쓴 이 책을 읽는 것이 즐거운 이
유가 바로 여기에 있다. 샌디, 유리, 션 그리고 조시는 오랫동안 스파크로 작업해왔으며, 그만
큼 충실한 설명과 예제를 이 책에 담아냈다.
이 책에서 가장 마음에 드는 부분은 실제 응용 사례와 현실 세계의 데이터셋을 가져와 예제 중
심으로 설명하는 점이다. 독자의 PC에서 직접 실행해볼 수 있는 아홉 개의 개별 빅데이터 예제
를 제공한 책은 흔치 않은데, 저자들은 이런 예제들을 모아서 스파크로 실습할 수 있도록 모든
것을 세팅해두었다. 게다가, 핵심 알고리즘만 다룬 것이 아니라, 정말로 좋은 결과를 얻는 데
필요한 데이터 준비와 모듈 튜닝의 복잡한 사항까지 다루고 있다. 독자는 이들 예제에서 터득
한 개념을 자신의 문제를 푸는 데 곧바로 적용할 수 있을 것이다.
오늘날 빅데이터 처리는 의심할 여지 없이 컴퓨터로 할 수 있는 가장 흥미로운 분야이며, 빠르
게 진화하고 새로운 아이디어들이 도입되는 분야이기도 하다. 나는 독자들이 이 흥미로운 새로
운 분야로 들어서는 데 이 책이 도움이 될 거라 기대한다.
마테이 자하리아
스파크 창시자, 『러닝 스파크』 저자
아파치 스파크는 빅데이터 영역에서 가장 핫한 기술로, 범용적이면서 빠른 대용량 분산 처리를
지원한다. 또한 기초 데이터 분석부터 머신러닝 등의 기능까지 지원하게 되면서 개발자만의 오
픈 소스에서 분석가를 위한 오픈 소스로 주목받고 있다. 이 책은 스파크로 빅데이터를 분석하
기 위한 가장 실용적인 데이터와 분석 방법을 설명하고 있다. 빅데이터에 관심 있거나 종사하
는 개발자와 분석가 모두에게 추천한다.
이상훈
한국 스파크 사용자 모임 운영자, 『실시간 분석의 모든 것』 역자
추천의 글
7
교통, 금융 분야 등의 실제 데이터로 데이터 획득, 전처리, 가중치 결정, 실행, 평가 그리고 시
각화까지 해볼 수 있는 스파크 활용서다. 스파크 입문을 넘어 실무에 적용하려 할 때 좋은 참고
서다. 자신의 관심 도메인에 맞는 부분만 찾아서 읽어도 좋을 것 같다.
최홍용
현대오토에버
8
학교를 졸업하고 몇 군데의 회사를 거쳐 2008년에 지금의 회사에 입사했다. 처음에는 콘텐츠
관리 시스템 개발로 시작했지만, 몇 번의 굴곡을 거쳐 회사는 이름이 바뀌었고 내가 하는 개발
업무도 바뀌게 되었다. 2011년, 데이터를 집계, 분석하여 실시간으로 시각화하는 과제를 수행
하게 되었다. 지금은 다른 회사에서 잘나가고 계신 배병우 씨와 함께 이를 위한 시스템을 설계
하면서 아파치 스톰Apache Storm을 알게 되었다. 그 후 몇 년간, 우리 회사의 개발팀은 스톰의 끝
을 보고 왔다. 그리고 스톰의 몇 가지 한계를 실감하게 되었다. 스톰은 스트림을 처리하는 훌륭
한 도구지만, 딱 거기까지였다(물론 이번에 릴리스된 스톰 1.0에서는 많은 부분이 개선되긴 했
다). 상태를 저장할 방법이 없는 탓에 완전한 분산 컴퓨팅 환경이라 말할 수 없다든지, 오류가
났을 시에 원래 상태를 복원할 수 없는 등 스톰이 할 수 없는 일이 꽤 있었다.
그러던 어느 날, 공역자인 권한철 씨와 서양주 씨가 아파치 스파크를 만났다. 당시 약간 모자라
보이던 스파크는, 맵리듀스MapReduce 로직을 인메모리로 처리하여 성능을 확장할 수 있다는 점
외에도, 일반적인 프로그래밍 환경에 데이터 분산 처리의 거의 모든 것을 가져올 수 있다는 특
징을 가지고 있었다. 여기에 분산 환경마저도 추상화하여 설치 이외에는 별다른 고민 없이 분
산 데이터 처리가 가능하다는 매력도 지녔다. 그리고 스톰의 강점인 스트림 처리마저도 스파크
스트리밍Spark Streaming이 마이크로 배치 형태로 처리할 수 있었다. 데이터 처리의 팔방미인이라
고 해도 과언이 아니었고, 우리는 그때부터 스파크에 집중하게 되었다. 그리고 약 2년이 흘렀
다. 스파크를 활용한 몇 개의 과제를 성공적으로 수행했으며, 새로운 도구를 받아들이는데 다
소 보수적인 분야의 현장에서도 스파크를 활용하여 얻을 수 있는 이점을 받아들이고 있다. 우
리는 스파크의 시대가 열리는 것을 목격한 운 좋은 증인이 되었고, 이 책을 읽을 독자분들도 아
직 늦지 않았다는 이야기를 해주고 싶다.
이 책은 단순한 스파크 참고서가 아니다. 스파크 참고서로는 더 좋은 책들이 여럿 있다. 부끄럽
지만 우리는 이 책도 그러한 참고서 중 하나인 줄 알고 번역을 시작했고, 그 착각 탓에 더 어려
운 길을 가야 했지만, 동시에 더 재미있는 길을 가볼 수 있었다. 이 책의 매력은 다양한 현장의
분석을 책에 담아낸 점에 있다. 스파크로 무엇을 해야 할지가 막막하다면 이 책을 펴면 도움이
옮긴이의 말
9
될 것이다. 굳이 스파크가 아닌 다른 도구를 사용하더라도 유용한 정보도 들어 있다. 이 책이
역자들에게 도움이 된 것처럼 독자들께도 도움이 될 것으로 생각한다.
이 책을 번역하느라 업무 부담을 조금씩 나눠주신 에스코어 엔터프라이즈 공통 플랫폼 그룹 김
세준 그룹장 이하 동료들에게 감사를 전한다. 동시에 몇 달 동안 아빠를 번역에 빼앗긴 건우에
게도 미안함을 전한다. 다른 역자들도 마찬가지의 미안함과 고마움을 가지고 있으리라 생각한
다. 번역이라는 것이 이렇게 어려운 작업인 줄은 상상도 못 했다. 책을 읽다가 책의 문장이 발
바닥에 꽂힌 가시 같다는 기분이 들면, 그 책임이 역자들에게도 있을 수 있음을 이해해주시기
바란다.
박상은
10
과거를 후회하는 걸 좋아하진 않지만, 잠시 태만했던 2011년 시절 믿기 어려운 일이 벌어졌다.
당시 나는 어려운 이산 최적화 문제를 클러스터에 효율적으로 분배하는 방법을 고민하고 있었
다. 내 지도교수는 스파크라는 것이 최신 유행이라며 설명해주었지만, 그 개념은 실현되기엔
너무 이상적이라 실패할 것으로 판단하고 바로 학부 졸업논문을 맵리듀스로 작성하였다. 그 후
스파크와 나 모두 성장하였지만, 스파크는 도저히 무시할 수 없는 거물이 되었다. 대략 2년 후,
스파크에 주목해야 함이 명백해졌다.
MPI부터 맵리듀스에 이르기까지, 스파크 이전의 프레임워크들은 분산 시스템의 어렵고 세세
한 핵심들을 추상화하여 대규모 자원을 활용한 프로그램을 작성할 수 있도록 해주었다. 이들
프레임워크는 늘어가는 데이터를 처리하기 위해 발전해온 만큼, 빅데이터가 진출할 수 있는 범
위는 이들 프레임워크의 능력 한계와 밀접하게 연관될 수밖에 없었다. 스파크는 분산 프로그램
도 일반 프로그램을 작성하듯 쉽게 짤 수 있게 하여 이 범위를 좀 더 넓혀주고 있다.
스파크를 사용하면 ETL 파이프라인의 성능이 엄청나게 향상될 것이며 매일 하둡의 신에게 절
망을 하소연하는 맵리듀스 프로그래머들의 고통을 덜어줄 것이다. 그러나 나에게 가장 흥미
로운 점은 항상 스파크가 개척해준 복잡한 분석 작업이었다. 스파크는 반복적 알고리즘 Iterative
Algorithm과 대화형 탐색Interactive Exploration을 지원하는 패러다임을 갖춰, 마침내 데이터 과학자가 대
규모 데이터셋을 생산적으로 다룰 수 있는 오픈 소스 프레임워크가 되었다.
나는 데이터 과학을 가르치는 가장 좋은 방법은 예제를 활용한 것이라고 생각한다. 이를 위해
나와 동료 저자들은 책에 여러 가지 응용 예를 담았으며, 가장 일반적인 알고리즘들과 데이터
셋들, 그리고 대규모 분석에서의 디자인 패턴들 간의 상호작용을 다루려고 노력하였다. 이 책
은 독자가 처음부터 끝까지 정독하라는 의도로 쓰이지 않았다. 여러분이 성취해봤으면 하는 주
제나 흥미를 자아내는 장을 펼쳐보자.
샌디 라이자
지은이의 말
11
이 책의 1장에서는 데이터 과학과 빅데이터 분석이라는 넓은 맥락에서 스파크의 가치를 소개
한다. 그다음부터 각 장은 스파크를 사용한 독립적인 분석으로 구성된다. 2장은 데이터를 정제
하는 간단한 예로 스파크와 스칼라를 사용한 데이터 분석의 기초를 소개한다. 그리고 그다음
몇 장은 가장 일반적으로 사용되는 알고리즘 몇 개를 전형적인 분야에 적용하면서, 핵심적인
머신러닝 문제를 스파크를 활용하여 푸는 방법을 살펴볼 것이다. 나머지 장들은 좀 더 특수한
분야를 다룬다. 위키백과의 텍스트 안에 숨겨진 의미 관계를 알아보거나 유전체학 데이터도 분
석해볼 것이다.
2판에 대하여
1판이 출간된 이후 스파크의 메이저 버전이 올라가면서 완전히 새로운 핵심 API가 도입되고
MLlib이나 Spark SQL과 같은 하위 컴포넌트들도 크게 바뀌었다. 2판에서는 이에 따른 사용
예를 전달하기 위해서 스파크의 예제 코드를 대폭 수정했고 관련 설명도 지금 시점에 맞게 새
로 썼다.
예제 내려받기
코드 예제와 데이터셋은 다음 주소에서 내려받을 수 있다.
https://github.com/sryza/aas
이 책의 구성
12
아파치 스파크와 MLlib이 없었다면 여러분이 이 책을 읽을 수 있었을 리 만무하다. 우리 모두
는 스파크와 MLlib을 개발하고 오픈 소스로 제공한 개발팀과 여기에 참여한 수백 명의 기여자
에게 감사를 전한다.
이 책을 검토하느라 시간을 내어준 모든 전문가에게도 감사를 전하고 싶다. 미카엘 베르니코,
아담 브레인델, 이안 부스, 파르비즈 데이힘, 제레미 프리먼, 크리스 프레글리, 드바시시 고시,
줄리엣 호글랜드, 조나단 키블러, 니샤 무크타버, 프랭크 나샤프트, 닉 펜트리스, 코스타스 사
켈리스, 톰 화이트, 마르셀로 반진, 그리고 줄리엣 호글랜드(한 번 더), 모두 고마워! 신세를
졌어. 덕분에 책의 구성과 품질 모두 크게 개선되었다.
또한, 나(샌디)는 어려운 주제의 배경 이론과 관련하여 조언해준 조단 핀쿠스와 리처드 왕에
게 감사를 표한다.
이 책이 출판되고 독자의 손에 들어가기까지 물심양면으로 지원해주고 이런 경험을 하게 해준
마리 보구로와 오라일리에도 감사를 표한다.
샌디 라이자
감사의 말
13
CONTENTS
	 지은이 소개 �����������������������������������������������������������������������������������������������������������������������������
4
	 옮긴이 소개 �����������������������������������������������������������������������������������������������������������������������������
5
	 추천의 글 ��������������������������������������������������������������������������������������������������������������������������������
6
	 옮긴이의 말 �����������������������������������������������������������������������������������������������������������������������������
8
	 지은이의 말 ��������������������������������������������������������������������������������������������������������������������������
10
	 이 책의 구성 �������������������������������������������������������������������������������������������������������������������������
11
	 감사의 말 �����������������������������������������������������������������������������������������������������������������������������
12
CHAPTER 1 빅데이터 분석하기
1.1 데이터 과학의 어려움......................................................................................................
21
1.2 아파치 스파크란.............................................................................................................
23
1.3 이 책에 관하여...............................................................................................................
26
1.4 2판에 관하여..................................................................................................................
26
CHAPTER 2 스칼라와 스파크를 활용한 데이터 분석
2.1 데이터 과학자를 위한 스칼라...........................................................................................
30
2.2 스파크 프로그래밍 모델..................................................................................................
32
2.3 레코드 링크....................................................................................................................
32
2.4 스파크 셸과 SparkContext 시작하기...............................................................................
34
2.5 클러스터에서 클라이언트로 데이터 가져오기....................................................................
41
2.6 클라이언트에서 클러스터로 코드 보내기...........................................................................
46
2.7 RDD에서 Data Frame으로.............................................................................................
47
2.8 DataFrame API로 데이터 분석하기.................................................................................
51
2.9 데이터프레임에 대한 빠른 요약 통계................................................................................
57
2.10 데이터프레임의 축 회전과 형태변환...............................................................................
59
14
CONTENTS
2.11 데이터프레임을 결합하고 특징 선택하기........................................................................
63
2.12 실제 환경을 위한 모델 준비하기....................................................................................
65
2.13 모델 평가.....................................................................................................................
67
2.14 한 걸음 더 나아가기.....................................................................................................
69
CHAPTER 3 음악 추천과 Audioscrobbler 데이터셋
3.1 데이터셋........................................................................................................................
72
3.2 교차 최소 제곱 추천 알고리즘..........................................................................................
73
3.3 데이터 준비하기.............................................................................................................
77
3.4 첫 번째 모델 만들기........................................................................................................
82
3.5 추천 결과 추출 검사하기.................................................................................................
86
3.6 추천 품질 평가하기.........................................................................................................
89
3.7 AUC 계산하기................................................................................................................
91
3.8 하이퍼파라미터 선택하기................................................................................................
93
3.9 추천 결과 만들기............................................................................................................
96
3.10 한 걸음 더 나아가기.....................................................................................................
98
CHAPTER 4 의사 결정 나무로 산림 식생 분포 예측하기
4.1 회귀로 돌아와서..........................................................................................................
102
4.2 벡터와 특징.................................................................................................................
102
4.3 학습 예제....................................................................................................................
104
4.4 의사 결정 나무와 랜덤 포레스트...................................................................................
104
4.5 Covtype 데이터셋.......................................................................................................
108
4.6 데이터 준비하기..........................................................................................................
109
4.7 첫 번째 의사 결정 나무................................................................................................
111
4.8 의사 결정 나무 하이퍼파라미터.....................................................................................
119
15
4.9 의사 결정 나무 튜닝하기..............................................................................................
121
4.10 범주형 특징 다시 살펴보기.........................................................................................
126
4.11 랜덤 포레스트...........................................................................................................
129
4.12 예측하기...................................................................................................................
132
4.13 한 걸음 더 나아가기..................................................................................................
133
CHAPTER 5 K-평균 군집화로 네트워크 이상 탐지하기
5.1 이상 탐지....................................................................................................................
136
5.2 K-평균 군집화............................................................................................................
137
5.3 네트워크 침입..............................................................................................................
138
5.4 KDD 컵 1999 데이터셋...............................................................................................
139
5.5 첫 번째 군집화하기......................................................................................................
140
5.6 k 선정하기..................................................................................................................
143
5.7 R에서 시각화하기........................................................................................................
146
5.8 특징 정규화.................................................................................................................
152
5.9 범주형 변수.................................................................................................................
154
5.10 엔트로피와 함께 레이블 활용하기...............................................................................
156
5.11 군집화하기................................................................................................................
157
5.12 한 걸음 더 나아가기..................................................................................................
160
CHAPTER 6 숨은 의미 분석으로 위키백과 이해하기
6.1 문서-단어 행렬...........................................................................................................
163
6.2 데이터 구하기..............................................................................................................
165
6.3 파싱하여 데이터 준비하기............................................................................................
166
6.4 표제어 추출.................................................................................................................
168
6.5 단어빈도-역문서빈도(TF-IDF) 계산하기.......................................................................
170
16
CONTENTS
6.6 특잇값 분해.................................................................................................................
172
6.7 중요한 의미 찾기.........................................................................................................
174
6.8 낮은 차원 표현에 대한 의문과 고찰...............................................................................
179
6.9 단어와 단어 사이의 연관도...........................................................................................
180
6.10 문서와 문서 사이의 연관도.........................................................................................
183
6.11 문서와 단어 사이의 연관도.........................................................................................
185
6.12 여러 개의 단어로 질의하기.........................................................................................
186
6.13 한 걸음 더 나아가기..................................................................................................
188
CHAPTER 7 그래프엑스로 동시발생 네트워크 분석하기
7.1 네트워크 분석 사례: MEDLINE의 인용 색인..................................................................
191
7.2 데이터 구하기..............................................................................................................
192
7.3 스칼라 XML 라이브러리로 XML 문서 파싱하기..............................................................
195
7.4 MeSH 주요 주제와 주제들의 동시발생 분석하기............................................................
198
7.5 그래프엑스로 동시발생 네트워크 구성하기....................................................................
201
7.6 네트워크의 구조 이해하기............................................................................................
206
7.6.1 연결 성분.............................................................................................................
206
7.6.2 차수의 분포..........................................................................................................
209
7.7 관련성 낮은 관계 필터링하기........................................................................................
212
7.7.1 EdgeTriplets 처리................................................................................................
213
7.7.2 필터링된 그래프 분석하기.......................................................................................
216
7.8 작은 세상 네트워크......................................................................................................
217
7.8.1 클릭과 군집계수....................................................................................................
218
7.8.2 프레겔을 사용하여 평균 경로 길이 계산하기...............................................................
220
7.9 한 걸음 더 나아가기 ...................................................................................................
226
17
CHAPTER 8 뉴욕 택시 운행 데이터로 위치 및 시간 데이터 분석하기
8.1 데이터 얻기.................................................................................................................
228
8.2 스파크에서 서드파티 라이브러리로 작업하기.................................................................
229
8.3 지리 데이터와 Esri Geometry API, 그리고 Spray..........................................................
230
8.3.1 Esri Geometry API 살펴보기.................................................................................
231
8.3.2 GeoJSON 소개...................................................................................................
233
8.4 뉴욕 택시 운행 데이터 준비하기...................................................................................
236
8.4.1 잘못된 레코드 대규모로 다루기................................................................................
239
8.4.2 지리 정보 분석하기................................................................................................
244
8.5 스파크에서 세션화 작업 수행하기.................................................................................
247
8.5.1 세션 구성하기: 스파크에서 보조 정렬하기..................................................................
249
8.6 한 걸음 더 나아가기.....................................................................................................
252
CHAPTER 9 몬테카를로 시뮬레이션으로 금융 리스크 추정하기
9.1 전문 용어....................................................................................................................
254
9.2 VaR 계산 방법.............................................................................................................
255
9.2.1 분산-공분산 ........................................................................................................
255
9.2.2 과거 기반 시뮬레이션.............................................................................................
256
9.2.3 몬테카를로 시뮬레이션...........................................................................................
256
9.3 우리의 모델.................................................................................................................
257
9.4 데이터 구하기..............................................................................................................
258
9.5 전처리하기..................................................................................................................
259
9.6 요인 가중치 결정하기...................................................................................................
263
9.7 표본추출.....................................................................................................................
265
9.7.1 다변량 정규분포....................................................................................................
268
9.8 실험 실행하기..............................................................................................................
270
18
CONTENTS
9.9 수익 분포 시각화하기...................................................................................................
274
9.10 결과 평가하기...........................................................................................................
275
9.11 한 걸음 더 나아가기..................................................................................................
278
CHAPTER 10 BDG 프로젝트와 유전체학 데이터 분석하기
10.1 모델링과 저장소를 분리하기.......................................................................................
283
10.2 ADAM CLI를 이용한 유전체학 데이터 처리................................................................
287
10.2.1 파케이 형식과 열 기반 저장소...............................................................................
294
10.3 ENCODE 데이터로부터 전사인자 결합 부위 예측하기.................................................
296
10.4 1000 지놈 프로젝트에서 유전자형 질의하기...............................................................
305
10.5 한 걸음 더 나아가기..................................................................................................
308
CHAPTER 11 파이스파크와 썬더로 신경 영상 데이터 분석하기
11.1 파이스파크 소개........................................................................................................
312
11.1.1 파이스파크 내부 구조...........................................................................................
314
11.2 썬더 라이브러리 개요와 설치.....................................................................................
316
11.3 썬더로 데이터 읽어 들이기.........................................................................................
317
11.3.1 썬더 핵심 자료형.................................................................................................
323
11.4 썬더로 신경 세포 유형 분류하기.................................................................................
324
11.5 한 걸음 더 나아가기..................................................................................................
329
찾아보기 ���������������������������������������������������������������������������������������������������������������������������������������������������
330
191장 빅데이터 분석하기
“데이터 애플리케이션은 소시지와 비슷하다. 어떻게 만드는지 모르는 편이 나으니까.”
-오토 폰 비스마르크1
●	‌‌셀 수 없이 많은 트랜잭션과 수천 가지 특징을 활용해 신용카드 부정 사용을 감지하는 모델 구축
●	‌‌수백만 사용자에게 수백만 가지의 제품 중 적절한 것을 지능적으로 추천
●	‌‌수백만의 요소를 고려한 포트폴리오 시뮬레이션을 통한 투자 위험도 추정
●	‌‌질환의 유전적 연관성을 파악하기 위한 대규모 인간 유전자 분석
몇 년 전만 하더라도 이와 같은 작업은 꽤 어려운 일이었다. 요즘을 빅데이터의 시대라고 말할 수
있는 이유는 기존에는 경험하지 못한 규모로 정보를 수집, 저장, 처리할 수 있는 도구가 준비되
었기 때문이다. 이 배경에는 오픈 소스 소프트웨어 생태계가 있는데, 그 덕분에 엄청난 양의 데
이터를 다룰 수 있는 컴퓨터 클러스터 환경을 저렴하게 사용할 수 있게 되었다. 하둡Apache Hadoop
과 같은 분산 시스템이 대세가 되었으며, 거의 모든 분야의 수많은 현장에서 활용하고 있다.
하지만 돌덩어리와 끌이 있다고 해서 조각상이 저절로 만들어지는 것이 아니듯, 빅데이터와 이
를 다룰 도구를 갖추었다는 것과 이를 활용하여 무언가 쓸모 있는 일을 한다는 것 사이에는 차
이가 있다. 데이터 과학이 필요한 이유가 바로 여기에 있다. 조각이 도구를 사용하여 원석을 다
른 사람들에게 의미 있는 무언가로 바꾸는 작업이듯, 데이터 과학도 도구를 사용하여 원본 데
1	 옮긴이_ 비스마르크는 원래 ‘데이터 애플리케이션’이 아니라 ‘법률’이 그러하다고 말했다.
빅데이터 분석하기
CHAPTER 1
샌디 라이자
20 9가지 사례로 익히는 고급 스파크 분석 (2판)
이터를 데이터 과학자가 아닌 사람들의 관심을 끌 만한 의미 있는 것으로 바꾸는 작업이다.
흔히 ‘쓸모 있는 일 하기’는 스키마Schema를 설계하고 SQL을 사용하여 “등록 과정의 세 번째 페
이지에 도달한 엄청난 수의 사용자 중 25세 이상은 몇 명인가?”와 같은 질문에 답하는 것을 의
미한다. 이런 질문에 쉽게 답할 수 있도록 데이터 웨어하우스Data Warehouse를 구성하고 정보를 체
계화하는 방법을 다루는 분야도 중요하지만, 이 책에서는 이런 복잡한 일은 되도록 다루지 않
으려 한다.
때로는 ‘쓸모 있는 일 하기’에는 노력이 더 필요할 수 있다. SQL은 여전히 주요한 수단이다. 하
지만 다루는 데이터가 매우 독특하거나 분석 작업이 복잡하다면 SQL보다 유연하고 근본적이
며 머신러닝과 통계 기능이 풍부한 새로운 프로그래밍 패러다임이 필요해진다. 이런 유형의 분
석이 이 책에서 이야기하려는 대상이다.
오랜 기간에 걸쳐 R, PyData 스택(파이썬 데이터 분석 도구 모음), 옥타브Octave와 같은 오픈
소스 프레임워크 덕에 작은 데이터셋Dataset을 빠르게 분석하고 모델을 수립할 수 있었다. 데이
터셋의 일부를 사용해서 머신러닝 모델을 학습시키고 나머지 데이터의 레이블을 예측하는 일
이 10줄 이내의 코드로도 가능하다. 여기서 조금만 더 나아가면 결측치Missing Data를 보정하고,
몇몇 모델을 실험해 최적의 모델을 찾고, 한 모델의 결과를 다른 모델을 적합Fit시키기 위한 입
력으로 사용할 수 있다. 대규모 데이터셋에서 같은 결과를 얻기 위해 컴퓨터 클러스터 환경을
활용한다면 이러한 과정이 어떻게 달라질까?
단순히 프레임워크를 여러 노드에서 동작하도록 확장하고 프로그래밍 모델은 그대로 유지한
채 분산 환경에서 잘 동작하게끔 내부를 수정하는 것이 옳을 수도 있다. 하지만 단일 노드에서
는 문제가 되지 않았지만 분산 컴퓨팅에서는 새롭게 고민해야 하는 것들이 있다. 예를 들어 네
트워크는 메모리보다 월등히 느리므로 데이터가 클러스터의 여러 노드에 나뉘어 있다면 많은
데이터를 참조하는 알고리즘은 성능이 매우 나빠진다. 분산 환경에서 동작하는 노드의 수가 늘
어날수록 오류가 발생할 가능성도 커진다. 이러한 사실들을 종합해볼 때 고도의 병렬 실행 코
드를 쉽게 작성할 수 있는, 분산 환경의 특징을 충실하게 활용하는 프로그래밍 패러다임이 필
요하다.
하나의 노드에서 동작하는 PyData나 R 같은 도구가 소프트웨어 커뮤니티에서 최근 주목받
고 있지만, 이들만이 데이터 분석을 위한 도구는 아니다. 대량의 데이터를 다루는 유전체학 같
은 과학 분야에서도 수십 년간 병렬 컴퓨팅 프레임워크를 발전시켜왔다. 이 분야에서 데이터를
211장 빅데이터 분석하기
다루는 사람 대부분은 HPCHigh-Performance Computing (고성능 컴퓨팅)라는 클러스터 컴퓨팅 환경
에 익숙하다. PyData나 R은 확장성이 부족해 문제라면, HPC에서는 추상화 수준이 지나치게
낮아서 발생하는 나쁜 사용성이 문제다. 예컨대 DNA 염기서열로 가득 찬 커다란 파일을 병렬
처리하려면 수작업으로 일일이 작은 파일로 나눈 후, 각각에 대한 처리 작업을 클러스터의 스
케줄러에 하나씩 등록해야 한다. 일부에서 오류가 발생하면 작업자는 그 오류를 직접 찾아내서
수동으로 재입력해야 한다. 분석하다 보면 전체 데이터셋의 정렬과 같은 데이터 전체를 사용하
는 작업을 수행해야 할 때가 있다. 이 경우에는 커다란 데이터 모두를 하나의 노드에 밀어 넣거
나 MPI와 같은 저수준 분산 프레임워크에 의존해야 하는데, 그러려면 C 언어와 분산 네트워크
환경을 잘 이해하고 있어야 한다.
또, HPC 환경에 맞게 제작된 도구들은 저수준 저장소 모델로부터 인메모리In-memory 데이터 모
델을 분리하기가 어려운 경우가 많다. 예를 들어 많은 도구가 POSIX 파일시스템의 단일 데이
터 스트림으로만 데이터를 읽을 수 있도록 만들어졌다. 이러한 도구는 병렬화하거나 데이터베
이스 같은 다른 종류의 백엔드 저장소를 사용하도록 변경하기가 쉽지 않다. 하둡 생태계의 요
즘 시스템들은 사용자가 클러스터 환경을 단일 컴퓨터 환경처럼 다룰 수 있도록 추상화해준다.
파일을 쪼개 여러 노드에 걸쳐 있는 저장소에 분산하고, 일을 작은 단위로 나눠 처리하고, 오류
를 복구하는 모든 작업을 자동으로 수행한다. 하둡 생태계는 큰 데이터 파일을 다루는 과정도
자동화할 수 있으며, HPC보다 훨씬 저렴하다.
1.1 데이터 과학의 어려움
데이터 과학을 실제로 적용하다 보면 종종 어려운 문제에 부딪히게 된다. 클라우데라Cloudera의
데이터 과학팀은 이러한 어려움을 널리 알리는 데 큰 역할을 해왔다. 대량의 데이터로부터 복
잡한 분석을 성공적으로 처리하는 시스템을 구축하려면 (설사 실제로 벌어지지 않더라도) 이
런 어려움에 관해서 알고 있어야 한다.
첫째, 성공적인 분석을 위한 작업 대부분은 데이터의 전처리 과정에서 이뤄진다. 데이터는 너
저분하다. 그래서 데이터를 활용하기 전에 정제, 개조, 합치기, 섞기 같은 여러 가지 전처리 과
정이 필요하다. 특히, 맨눈으로 검사하기 어려울 정도로 데이터가 많다면 어떠한 전처리 과정
이 필요한지를 파악하는 일조차 별도의 처리 과정을 거쳐야 한다. 심지어 모델의 성능을 최적
22 9가지 사례로 익히는 고급 스파크 분석 (2판)
화해야 할 때는 알고리즘을 선택해서 구현하는 일보다 특징을 추출하고 선택하는 데 일반적으
로 더 큰 노력이 들어간다.
예컨대 온라인 구매 데이터에서 사기 행위를 찾는 모델을 만들고자 한다면 데이터 과학자들은
사용자가 작성하는 주문서 상의 여러 정보, 즉 사용자 IP의 위치 정보, 로그인 시각, 웹 사이트
내비게이션 로그와 같은 활용 가능한 수많은 특징 중에서 무엇을 사용할지 선택해야 한다. 선
택한 각 특징을 머신러닝 알고리즘에 적합한 벡터로 변환해야 하며, 이를 위해서 더블형Double
숫자로 이뤄진 2차원 배열을 수학적 모델로 변환하는 일 정도는 해줄 수 있는 시스템이 있어야
한다.
둘째, 데이터 과학은 기본적으로 반복 Iteration 작업들로 구성된다. 보통은 모델을 만들고 분석하
는 과정에서 같은 데이터를 여러 번 반복해서 읽게 된다. 이는 머신러닝이나 통계적 절차의 특
징에 기인하는데, 값이 수렴할 때까지 입력 데이터를 반복해서 사용하는 확률적 구배법Stochastic
Gradient Descent (SGD)이나 기댓값 최대화법Expectation Maximization 같은 널리 사용되는 최적화 기법들
을 보면 알 수 있다. 반복 과정은 데이터 과학자 자신의 작업 흐름 안에서도 중요하다. 데이터
과학자가 처음 접하는 데이터셋을 파악하고자 할 때, 특정 질의의 결과를 바탕으로 다음에 수
행해야 할 질의를 결정하는 것이 일반적이다. 모델을 만들 때도 데이터 과학자는 단 한 번의 시
도로 모델이 완성되리라 기대하지 않는다. 실험을 통해서 알맞은 특징을 선택하고, 적절한 알
고리즘을 선택하고, 유의성 검정을 하고, 맞춤 하이퍼파라미터들을 찾아낸다. 어떤 프레임워크
가 같은 데이터를 매번 디스크에서 가져온다면 전체 과정의 속도가 디스크 입출력만큼 느려지
고, 그 결과 반복해서 시도해볼 수 있는 횟수가 줄어들게 된다.
셋째, 잘 돌아가는 모델이 완성되었다고 해서 일이 끝나는 것은 아니다. 데이터 과학의 핵심이
데이터를 직접 분석하지 않는 사람들에게 유용한 정보를 뽑아내는 것이라면, 데이터 과학자 컴
퓨터의 텍스트 파일에 회귀 가중치의 목록 형태로 (즉, 다른 사람이 이해하기 힘든 형태로) 저
장된 모델을 만드는 일은 진정한 목적이 될 수 없다. 데이터 애플리케이션이라면 추천 시스템
이나 실시간 사기 탐지 시스템처럼 의미 있게 활용할 수 있어야 한다. 이런 시스템에서는 모델
이 제품 서비스의 일부이므로 주기적으로 혹은 실시간으로 다시 생성해야 할 수도 있다.
이런 상황에서는 연구를 위한 분석과 현장을 위한 분석을 구분해야 한다. 연구를 위한 분석은 데
이터에 대한 탐사 분석Exploratory Analytics을 의미한다. 이 분석에서는 데이터의 특성을 이해하려 시
도한다. 그 결과를 시각화하고, 아직 적용하지 않은 이론들을 시험한다. 여러 종류의 특징과 현
231장 빅데이터 분석하기
재의 데이터를 보강할 수 있는 후보 데이터도 시험하게 된다. 한두 가지는 성공하기를 바라면
서 다양한 알고리즘을 시험하는 것이다. 반면 데이터 애플리케이션을 구축하는 현장에서는 운
영을 위한 분석Operational Analytics을 수행한다. 분석 모델을 실제 의사 결정에 영향을 주는 서비스에
적용하며, 일정 기간 모델의 성과를 추적하고, 정확도를 조금이라도 올리기 위한 미세 조정 방
안을 궁리한다. 그리고 서비스 수준 협약서Service Level Agreement (SLA)와 가동시간Uptime도 고민하
게 된다. 현재의 사례를 보면, R과 같은 언어로 탐사 분석을 수행한 이후에, 양산 단계에서는
데이터 처리 과정을 자바나 C++로 완전히 새롭게 구현하는 것이 일반적이다.
물론 처음에 만든 모델의 코드를 실무 애플리케이션에서도 사용할 수 있다면 좋겠지만, R과 같
은 언어는 성능도 좋지 않은 데다가 제품의 다른 구성요소들과 통합하기에는 적합하지 않다.
반대로 자바나 C++ 쪽은 탐사 분석에 쓸만한 도구를 찾아보기 어렵다. 자바나 C++에서는 데
이터와 상호작용할 수 있는 REPLRead-Evaluate-Print-Loop 환경이 부족하며, 간단한 변환식을 구현
하는 데도 많은 양의 코드가 필요하다. 그리하여 모델링 과정에서도 쉽게 쓸 수 있고 제품에도
적용할 수 있는 프레임워크가 필요한 상황이 되었다.
1.2 아파치 스파크란
아파치 스파크로 들어가 보자. 스파크는 세련된 방법으로 클러스터의 여러 노드로 프로그램
을 분배하고, 그 위에서 동작하는 프로그램을 개발할 수 있도록 개발된 오픈 소스 프레임워
크다. UC 버클리의 AMPLab에서 탄생해, 지금은 아파치 소프트웨어 재단에서 관리하는 스
파크는 데이터 과학자가 분산 프로그래밍을 할 수 있게 해주는 아마도 최초의 오픈 소스 소
프트웨어일 것이다.
스파크를 쉽게 이해하기 위하여 스파크의 선배라 할 수 있는 맵리듀스MapReduce와 비교해보자.
맵리듀스는 수십만 개의 노드를 활용하는 병렬 처리를 간단히 구현할 수 있는 모델로, 대량의
데이터 연산 분야에 일대 혁신을 가져왔다. 맵리듀스는 거의 선형에 가까운 확장성을 보여준
다. 데이터가 많아지면 컴퓨팅 노드도 그만큼 추가하여 같은 시간에 일을 마무리 지을 수 있음
을 의미한다. 그리고 “하나의 노드에서는 잘 발생하지 않는 오류라도 규모가 큰 클러스터 환경
에서는 일상적으로 발생한다”는 상식으로부터도 자유롭다. 맵리듀스는 일을 작은 단위 작업으로
쪼개고, 단위 작업에서 오류가 나더라도 전체에 영향을 주지 않도록 우아한 방식으로 오류를
24 9가지 사례로 익히는 고급 스파크 분석 (2판)
처리한다.
스파크는 맵리듀스의 선형 확장성과 결함 포용Fault Tolerance성을 유지하면서, 세 가지 중요한 개
선을 이뤄냈다. 먼저, ‘맵 단계 후 리듀스 단계’를 지키지 않아도 되며, 훨씬 일반적인 방향성 비
순환 그래프Directed Acyclic Graph (DAG) 형태로 정의한 연산들을 실행할 수 있다. 맵리듀스라면 중
간 결과를 분산 파일시스템에 반드시 저장해야 하는 상황에서, 스파크는 파이프라인의 다음 단
계로 중간 결과를 바로 넘길 수 있다는 뜻이다. 이는 맵리듀스의 후손이자 마이크로소프트 연
구소에서 시작된 Dryad(https://goo.gl/Or3T8P)와 유사한 방식이다. 두 번째, 사용자가 연
산을 더욱 자연스럽게 표현할 수 있도록 풍부한 변환 방식을 제공하여 처리 능력을 확장하고
있다. 개발자 중심의 기능을 제공하여 몇 줄의 코드만으로 복잡한 파이프라인을 구현할 수 있
는 간소화된 API를 제공한다.
마지막 개선은 인메모리 처리 방식이다. 스파크의 데이터셋Dataset과 데이터프레임DataFrame을 통
한 추상화는 개발자가 데이터 처리 파이프라인의 어느 지점에서라도 데이터를 클러스터의 메
모리로 저장할 수 있도록 해준다. 이후 단계에서 같은 데이터를 사용해야 한다면 데이터를 다
시 연산하거나 디스크로부터 다시 읽을 필요가 없다는 뜻이다. 이 능력 덕분에 과거의 분산 처
리 엔진들이 하지 못하던 용도로도 사용할 수 있게 되었다. 예를 들어 데이터셋을 여러 번 훑어
야 하는 알고리즘이나 사용자 요청에 빠르게 응답하기 위해 커다란 인메모리 데이터셋을 스캔
해야 하는 반응형 애플리케이션Reactive Application에 아주 적합하다.
데이터 분석에서 가장 큰 병목이 CPU, 디스크, 네트워크 같은 컴퓨팅 환경이 아니라 분석가의
생산성에 달려 있음을 이해한다면, 앞 절에서 이야기한 ‘데이터 과학의 어려움’을 해결하는 데
스파크가 좋은 해답이라는 사실이 아마도 가장 중요할 것이다. 전처리부터 모델 평가까지의 전
체 과정을 단일 프로그래밍 환경에서 수행하는 것이 개발 속도 면에서 얼마나 큰 이점인지는
아무리 과장해도 지나치지 않을 것이다. REPL 환경의 분석 라이브러리들을 가지고 많은 것을
표현할 수 있는 프로그래밍 모델로 묶어낼 수 있는 스파크에서는 맵리듀스와 같은 특정 프레임
워크를 사용하느라 여러 IDE를 오갈 필요도 없고, R과 같은 프레임워크를 사용하느라 하둡 분
산 파일시스템Hadoop Distributed File System (HDFS)으로부터 데이터를 샘플링하거나 이리저리 이동
시킬 필요도 없다. 분석가가 데이터를 조사하는 시간이 절약될수록 뭔가 쓸만한 일을 할 가능
성은 더 커진다.
데이터 조작 또는 ETL에 적용할 수 있다는 관점에서는 스파크는 빅데이터를 다루는 매트랩
251장 빅데이터 분석하기
Matlab이라기보다는 빅데이터를 다루는 파이썬에 가까워 보인다. 범용 연산 엔진으로서 스파크
의 핵심 API는 통계, 머신러닝, 행렬 연산의 어떤 기능과도 독립적인, 데이터 변환을 위한 강
력한 토대를 제공한다. 스파크의 스칼라 API와 파이썬 API 덕분에 범용 언어에서 쉽게 불러
쓸 수 있고, 기존의 다른 라이브러리와 함께 사용할 수도 있다.
스파크의 인메모리 캐시 기능은 반복적으로 이뤄지는 크고 작은 모든 데이터 처리에 이상적이
다. 이 기능을 활용하면 학습 데이터를 반복해서 읽어야 하는 머신러닝 알고리즘에서는 학습
데이터를 메모리에 캐싱할 수 있다. 데이터 과학자가 데이터를 파악하려 할 때도 데이터를 디
스크에서 매번 읽어 들이는 대신, 메모리에 올려둔 채 다양한 질의를 테스트해보고, 또 그 결과
를 메모리에 쉽게 저장할 수도 있다.
마지막으로, 스파크는 탐사 분석 시스템과 운영 분석 시스템 사이의 간격을 좁힐 수 있다. 세간
에서 데이터 과학자는 통계학자보다는 엔지니어링을 잘하고 엔지니어보다는 통계 활용에 능하
다고 이야기하는데, 적어도 스파크는 대부분의 다른 탐사 분석 시스템보다는 운영 시스템에 적
용하기 좋고, 운영 시스템에서 일반적으로 사용하는 기술들에 비해 데이터 탐사 분석에도 적합
하다. 스파크는 근본적으로 성능과 신뢰성 모두를 위해서 만들어졌다. 자바 가상 머신Java Virtual
Machine (JVM)에서 돌아가기 때문에 자바 스택에서 돌아가는 수많은 운영 및 디버깅 도구도 활
용할 수 있다.
스파크는 하둡 생태계의 다양한 도구와 통합하기에도 좋다. 스파크는 맵리듀스가 지원하는 모
든 데이터 포맷을 읽고 쓸 수 있어서, 에이브로Apache Avro, 파케이Apache Parquet와 같은 하둡의 일
반적인 데이터 저장 파일 포맷도 사용할 수 있다. 물론 하둡 이전부터 사용된 쉼표로 분리된 텍
스트 형식(CSV)도 지원한다. 그리고 HBase와 카산드라Apache Cassandra 같은 NoSQL 데이터베
이스로부터 데이터를 읽고 쓸 수도 있다. 스파크의 스트림 처리 라이브러리인 스파크 스트리밍
Spark Streaming을 사용하면 플룸Apache Flume이나 카프카Apache Kafka로부터 연속적으로 데이터를 입력
받을 수도 있다. SQL 라이브러리인 Spark SQL로는 하이브 메타스토어Apache Hive Metastore와 상
호작용이 가능하며, 하이브 온 스파크Hive on Spark를 사용하여 맵리듀스 대신 스파크를 하이브의
기본 실행 엔진으로 사용할 수 있다. 하둡의 스케줄링과 자원 관리를 담당하는 YARNYet Another
Resource Negotiator 내부에서도 동작한다. 이를 통해서 클러스터 사이에서 자원을 동적으로 공유할
수 있으며, 맵리듀스나 임팔라Apache Impala 같은 다른 처리 엔진과 동일한 정책으로 관리할 수 있
게 되었다.
26 9가지 사례로 익히는 고급 스파크 분석 (2판)
1.3 이 책에 관하여
이 책의 나머지 부분에서는 스파크의 장점이나 단점은 다루지 않는다. 기본적인 스파크 프
로그래밍 모델과 스칼라 언어의 기초는 소개하지만, 스파크의 레퍼런스에 해당하는 내용이
나 모든 것에 대한 포괄적인 지침 같은 것은 제공하지 않으려 한다. 머신러닝, 통계학, 선형
대수의 튜토리얼로 만들 생각도 없다. 물론, 필요하다면 기본적인 배경은 설명할 것이다.
그 대신, 대량의 데이터셋을 다루는 복잡한 분석을 스파크로 실행해보며, 그 생생한 느낌을
여러분께 전달하고자 한다. 단순히 모델을 구축하고 평가하는 데 그치지 않고, 전체 파이프
라인을 돌아보며 데이터 정제, 전처리, 탐사 분석, 실제 제품으로 만들기까지를 보여주고자
한다. 아마도 실제 예제를 통해 보여주는 방법이 최선일 것이다. 그래서 우선 스파크와 그
생태계를 간단히 설명한 후, 그다음 장부터는 각 분야의 데이터를 스파크로 분석하는 독립
적인 설명들로 채울 것이다.
가능하다면 단순히 ‘정답’을 제공하기보다는 데이터 과학의 절차 전체, 즉 모든 반복, 막다른
길, 재시도 등을 설명할 것이다. 이 책은 스칼라, 스파크, 머신러닝, 데이터 분석에 더 친숙
해지는 계기가 될 것이다. 그리고 이 모두는 더 큰 목적을 향한 과정이다. 우리는 이번 장의
처음에 언급한 여러 업무에 어떻게 접근하는지를 보여주려는 것이다. 약 30쪽 내외로 구성
된 각 장을 통해 데이터 애플리케이션의 일부를 만들어내는 방법을 가능한 한 실제처럼 설
명할 것이다.
1.4 2판에 관하여
2015년과 2016년에 스파크는 많은 변화를 겪었으며, 그 결과로 2016년 7월에 스파크 2.0
이 출시되었다. 가장 큰 변화는 스파크의 핵심 API에서 이뤄졌다. 1.x 버전의 스파크 API는
여러 컴퓨터 클러스터에 걸쳐 느슨하게 인스턴스화된 객체의 모음인 탄력적 분산 데이터셋Resilient
Distributed Dataset (RDD)을 중심으로 구성되어 있었다.
RDD를 기반으로 강력하고 표현력 높은 API를 구성할 수 있었지만, 중요한 문제가 두 가지 생
겼다. 첫째, 성능과 안정성의 측면에서 적합하지 않았다. 자바나 파이썬 객체를 기반으로 했기
때문에 메모리 사용 면에서 비효율적이었고, 가비지 컬렉션 때문에 스파크 프로그램이 대기해
271장 빅데이터 분석하기
야 하는 시간이 길어졌다. 또한, 실행 계획이 API에 묶여 있어, 사용자가 프로그램의 실행을
최적화하는 부담이 커지게 되었다. 예를 들어, 전통적인 RDBMS를 사용하면 조인할 테이블의
크기에 따라 최선의 조인 전략이 알아서 선택되는 반면, 스파크를 사용할 때는 사용자가 이를
직접 선택해야 했다. 둘째, 스파크 API는 일반적으로 데이터가 구조화된 관계형 모델에 잘 들
어맞는다는 사실을 무시했다. 튜플 내에서의 순서 대신 열의 이름을 사용한다든지의 방법으로
데이터를 훨씬 더 쉽게 조작할 수 있는 기본 자료형을 제공할 수 없었다.
스파크 2.0은 RDD를 Dataset과 DataFrame으로 대체하여 이러한 문제점을 해결했다.
Dataset은 RDD와 비슷하지만 객체를 인코더에 매핑하여 인메모리 표현에 훨씬 효율적이다.
이를 통해서 스파크 프로그램을 더 빠르고, 더 작은 메모리로, 더 예측 가능하게 실행할 수 있
다. 또, 데이터셋과 실행 계획 사이에 최적화 기능을 배치하여 실행 방법에 대해서 더 지능적인
결정을 내릴 수 있다. DataFrame은 관계형 데이터, 즉 고정된 열의 데이터가 행 단위로 이뤄
진 데이터를 모델링하는 데 특화된 Dataset의 하위클래스다. 열 개념을 도입하여 더 깨끗하고
표현력이 풍부한 API를 사용할 수 있으며, 거기에 다양한 성능 최적화가 가능해졌다. 예를 들
어, 결과를 만들어내는 데 열의 일부만 필요하다는 사실을 알고 있다면, 열 전체를 메모리에 올
리지 않아도 된다. 그리고 이전에는 사용자 정의 함수로 정의해야 했던 많은 변환을 이제 API
에서 직접 표현할 수 있다. 이 기능은 파이썬을 사용할 때 특히 유용한데, 스파크 내부 동작이
파이썬에서 정의된 함수보다 변환을 훨씬 빠르게 수행할 수 있기 때문이다. 또한 DataFrame
은 Spark SQL과 상호운용성을 제공하므로, 사용자가 SQL 질의를 작성해서 DataFrame을
반환받고, 그 DataFrame을 스파크가 지원하는 프로그래밍 언어에서 사용할 수 있다. 새 API
는 기존 API와 매우 유사해 보이지만, 세부적인 변화 때문에 거의 모든 스파크 프로그램이 수
정되어야 한다.
스파크 2.0은 이러한 변화 외에도, 머신러닝과 통계 분석에 사용하는 API도 크게 변경되었다.
이전 버전에서는 머신러닝 알고리즘별로 고유한 API가 있어서, 알고리즘에 적용할 데이터를
준비하거나 특정 알고리즘의 결과를 다른 알고리즘에 적용하고자 할 때는 각각을 조합하는 코
드를 만들어야 했다. 스파크 2.0에 포함된 Spark ML API는 머신러닝 알고리즘과 특징Feature
의 변환 단계의 파이프라인을 구성할 수 있는 프레임워크를 제공한다. 인기 있는 파이썬 도구
인 사이킷런Scikit-Learn의 API에서 영감을 받아서, 데이터의 파라미터를 학습하고, 이 파라미터
를 데이터를 변환시키는 데 사용하는 객체인 추정자Estimator와 변환자Transformer를 중심으로 돌아간
다. Spark ML API는 DataFrame API와 많은 부분이 결합되어 있어, 관계형 데이터로도 머
28 9가지 사례로 익히는 고급 스파크 분석 (2판)
신러닝을 쉽게 수행할 수 있다. 예를 들어서 사용자는 특징 벡터의 순서 값 대신 이름으로 특징
을 참조할 수 있다.
이러한 변화들이 반영되다 보니, 이 책 초판의 많은 부분이 의미가 없게 되었다. 이번 2판은 새
로운 스파크 API를 사용하기 위해서 모든 장을 수정하였다. 추가로, 더 이상 관련이 없는 부분
은 제외했다. 예를 들어 몇몇 복잡한 API를 다루던 전체 부록을 삭제했는데, 이 부분을 지금은
사용자 개입 없이 스파크가 알아서 처리해주기 때문이다. 안정적으로 성숙한 스파크의 시대가
된 터라, 스파크를 사용한 분석에 있어서 수년간은 이 책이 유용한 자료로 남아있기를 희망한다.
292장 스칼라와 스파크를 활용한 데이터 분석
“흥미를 잃지 않는다면 못할 일은 아무 것도 없다.”
-데이비드 포스터 월리스
데이터 정제는 모든 데이터 과학 프로젝트의 시작이자, 매우 중요한 일이다. 분석에 사용하는
데이터의 품질이나 다른 내재적 원인에 의하여 분석 결과가 왜곡되거나 실제와 다른 결론
이 도출된다면 아무리 뛰어난 분석 방법이라 할지라도 도움이 되지 않을 것이다.
이러한 중요성에도 불구하고 데이터 과학 서적이나 강의에서는 데이터 정제 과정에 관해서
다루지 않거나 그냥 언급만 하고 지나치곤 한다. 사실 데이터 정제는 꽤 지루한 과정이다.
우리가 새 문제에 써보고 싶은 멋진 머신러닝 알고리즘을 적용하기 전에 거쳐야 하는 아주
따분한 일이다. 많은 풋내기 데이터 과학자는 조악한 품질의 데이터로 분석을 시작하고, 복
잡한 알고리즘을 적용한 후 말도 안 되는 답을 얻고 나서야 비로소 데이터 품질에 심각한 문
제가 있음을 깨닫기도 한다.
“쓰레기를 넣으면 쓰레기가 나온다Garbage in, garbage out”라는 말도 있지만, 현실은 이보다 훨씬 심
각하다. 어떤 데이터에 쉽게 파악되지 않는 심각한 품질 문제가 있어서 그럴싸한 데이터로 오
인된다면 도출된 결과도 그럴싸해 보일 수 있다. 이런 식의 심각한 오답을 제시하는 것은 데이
터 과학자에게 치명적인 실수다.
데이터 과학자로서 갖춰야 할 중요한 소질 하나는 데이터 분석의 모든 단계에서 흥미롭고 가치
있는 문제를 찾아내는 능력이다. 분석의 초기 단계에 기술과 통찰을 더하면 최종 결과물의 신
스칼라와 스파크를 활용한 데이터 분석
CHAPTER 2
조시 윌스
30 9가지 사례로 익히는 고급 스파크 분석 (2판)
뢰도는 더 커지게 된다.
데이터 과학자에게 데이터 품질 관리에 신경 쓰라고 하다니, 물론 말은 쉽다. 아이들에게 채소
를 먹으라고 이야기하는 것처럼 말이다. 하지만 스파크와 같은 새로운 도구를 써보는 일이 훨
씬 재미있다. 스파크로는 멋진 머신러닝 알고리즘을 만들어보거나, 스트리밍 데이터를 처리하
는 엔진을 개발한다거나 복잡하게 연결된 그래프를 분석하는 등의 일을 해볼 수 있으니 말이
다. 그래서 스파크와 스칼라를 활용하여 데이터를 정제하는 예를 직접 보여주는 것으로부터 시
작하려고 한다.
2.1 데이터 과학자를 위한 스칼라
데이터 과학자 대부분은 데이터를 조작하고 분석할 때 R이나 파이썬과 같은, 자신에게 가장
능숙한 특정 도구를 선호한다. 어쩔 수 없이 다른 환경에서 일하게 되더라도 선호하는 도구
에 집착하며 그 도구를 사용할 수 있는 방법을 찾아 헤매곤 한다. 새로운 문법과 새로운 패
턴을 습득해야 하는 새로운 도구를 도입하는 것은 최선의 상황에서도 꽤 힘든 도전적인 일
이다.
스파크에는 R이나 파이썬으로 코드를 작성할 수 있는 라이브러리와 래퍼Wrapper가 있다. 그중
파이스파크PySpark라는 훌륭한 파이썬 래퍼는 이 책의 11장에서도 일부 다루고 있다. 하지만 대
부분의 예제는 스칼라로 제공할 것이다. 스파크 자체가 스칼라 언어로 구현되어 있어서, 스칼
라를 직접 사용하면 다음과 같은 효과를 기대할 수 있다.
성능 면에서 유리하다.
스칼라처럼 JVM에서 동작하는 언어 위에서 R이나 파이썬으로 만들어진 알고리즘을 실행하
려면 코드와 데이터를 변환하거나 다른 환경으로 옮기는 작업이 추가로 필요하며, 때에 따
라서는 이 추가 과정에서 오류가 생길 수도 있다. 반면, 스파크가 제공하는 스칼라 API를 사
용한다면 의도한 대로 동작할 가능성이 매우 커진다.
312장 스칼라와 스파크를 활용한 데이터 분석
최신 기능을 활용할 수 있다.
스파크의 머신러닝, 스트림 처리, 그래프 분석 등의 라이브러리는 모두 스칼라로 작성했기
때문에 새로운 기능이 파이썬이나 R 환경까지 지원하는 데 시일이 걸리는 편이다. 그러므로
스파크가 제공하는 모든 최신 기능을 곧바로 사용하려 한다면 최소한 스칼라에 대해서 조금
은 알아야 하며, 그 기능들을 확장하여 새로운 문제에 적용하려면 스칼라를 어느 정도 능숙
하게 다룰 수 있어야 한다.
스파크의 철학을 이해하기 쉽다.
파이썬이나 R로 스파크를 사용한다 할지라도, 스파크의 API에는 이를 구현한 언어인 스칼
라로부터 시작된 철학이 녹아 있다. 여러분이 다른 언어를 사용하더라도 스칼라로 스파크를
다루는 방법을 알고 있다면 스파크 체계를 이해하고 문제를 ‘스파크답게’ 해결하는 데 도움
이 된다.
다른 데이터 분석 도구들과는 많이 다르기 때문에 설명하기 힘든, 스칼라의 또 다른 장점이
있다. 만약 R이나 파이썬으로 데이터베이스에 있는 데이터를 분석해왔다면 필요한 데이터를
SQL로 가져온 후, 작업 환경을 R이나 파이썬으로 바꿔서 그 데이터를 다루고 시각화하는 절차
에 익숙할 것이다. 누군가는 클러스터에 저장된 데이터에 접근하여 작업하는 일(SQL)과 PC
에 저장된 데이터를 다루고 시각화하는 일(파이썬/R)에 각각 다른 언어를 사용해왔을 수도 있
다. 그리고 SQL 사용자 정의 함수를 이용해 데이터를 처리하는 위치를 데이터베이스 엔진으로
옮기고 싶다면 C++나 자바 같은 또 다른 프로그래밍 환경으로 바꿔 작업해야 할 수도 있다.
오랫동안 사용해 익숙해졌다면 이런 방식의 불편함을 자각하지 못할지도 모른다.
스칼라와 스파크를 사용한다면 이야기가 달라진다. 어떤 경우에도 같은 언어를 사용할 수 있기
때문이다. 스파크를 통해 클러스터에서 데이터를 가져오고, 그 데이터를 로컬 환경에서 다루는
일 모두를 스칼라 코드를 작성하여 처리할 수 있다. 무엇보다 좋은 점은 로컬에서 작성한 스칼
라 코드를 클러스터로 보내서, 클러스터에 저장된 데이터를 로컬에서 다룬 결과와 완전히 똑같
이 처리할 수 있다는 것이다. 심지어 Spark SQL과 같은 고수준 언어로 작업할 때도 자신만의
사용자 정의 함수를 만들어 Spark SQL 엔진에 등록하여 그대로 사용하면 되며, 이 과정에서
작업 환경을 바꿀 필요가 없다.
32 9가지 사례로 익히는 고급 스파크 분석 (2판)
데이터의 저장 위치나 처리 위치와 상관없이, 데이터를 조작하고 분석하는 모든 일을 하나의
환경에서 할 수 있다는 것이 얼마나 혁신적인지 설명하기는 쉽지 않지만, 일단 경험해보면 알
것이다. 필자들은 스파크를 처음 접했을 때 느꼈던 신비한 힘을 예제에 담아내려고 노력했다.
2.2 스파크 프로그래밍 모델
스파크 프로그래밍을 위해서 데이터와 이를 담은 저장소가 필요하다. 데이터는 보통 HDFS와
같은 분산 저장소에 저장한다. 일반적으로 스파크 프로그램은 다음과 같은 몇 개의 연이은 단
계로 구성된다.
1.	‌‌입력 데이터에 적용할 변환을 정의한다.
2.	‌‌변환된 데이터를 저장소로 보내거나 구동자Driver의 로컬 메모리로 반환하는 액션을 수행한다.
3.	‌‌분산 처리 방식으로 계산된 결과를 바탕으로 로컬 계산을 수행한다. 이 작업은 다음에 수행할 변환과 액션을
결정하는 기준이 될 수도 있다.
스파크 버전이 1.2에서 2.1로 진화함에 따라 각 단계를 수행할 때 사용할 수 있는 도구들이 양
적, 질적으로 발전했다. 분석을 수행하는 과정의 복잡한 SQL 질의, 머신러닝 라이브러리 및 사
용자 작성 코드들을 섞어 쓰거나 골라 쓸 수 있고, 더 짧은 시간에 더 많은 응답을 제공하기 위
해서 수년간 스파크 커뮤니티가 개발해온 모든 상위 수준의 추상화를 활용할 수 있다. 동시에,
이 모든 상위 수준 추상화가 ‘저장소와 실행 사이의 상호작용’이라는 스파크의 가장 근원적인
철학을 지켜나가고 있다는 점을 기억해둬야 한다. 스파크는 데이터 처리 파이프라인상의 어떤
중간 단계에서도 이후에 사용하기 위해서 메모리에 데이터를 캐시할 수 있도록 하여 이러한 추
상화를 훌륭하게 결합한다. 이 원칙을 이해한다면 데이터 분석에 스파크를 더 효율적으로 활용
할 수 있다.
2.3 레코드 링크
이 장에서 논의할 문제는 문헌과 실무 현장에서 엔티티 해소Entity Resolution, 레코드 중복 제거Record
Deduplication, 병합 및 제거Merge-and-purge, 목록 정리List Washing 등 다양한 이름으로 불리고 있다. 모
332장 스칼라와 스파크를 활용한 데이터 분석
순되게도 이 문제가 다양한 이름으로 불리기 때문에 문제 해결을 위한 기술들을 훑어보고자 해
도 관련 논문조차 다 찾아내기 어렵다. 오히려 이 데이터 정제 문제에 대한 참고 문헌들에서 중
복 제거를 수행할 데이터 과학자가 필요한 처지다! 이 장의 목적을 원만히 이루기 위해 이제부
터 ‘같은 실체를 가리키는 레코드들을 연결 짓는’ 이 문제를 레코드 링크Record Linkage라 하겠다.
이 문제의 일반적인 형태는 다음과 같다. 하나 또는 그 이상의 데이터 출처로부터 데이터를 수
집하여 취합하면 그 속의 레코드 일부가 실제로는 같은 고객, 같은 환자, 같은 위치, 같은 행사
등 동일한 실체를 가리킬 수 있다. 각 실체는 이름, 주소, 생일과 같은 여러 속성을 가지고 있어
서 동일한 실체를 가리키는 레코드들을 찾아내려면 이 속성값을 이용해야 한다. 안타깝게도 이
속성값들은 불완전하다. 형식이 다르거나 오타가 있거나 값이 누락되었을 수 있다. 그러므로
단순하게 속성의 값이 같은지만을 검사한다면 상당수의 중복 레코드를 놓치게 될 것이다. [표
2-1]을 살펴보자.
표 2-1 레코드 링크의 어려움
이름 주소 도시 주 전화번호
조시의 커피숍 선셋 대로 1234 서 할리우드 CA (213)-555-1212
조시 커피 선셋 대로 1234, 서 할리우드 CA 555-1212
커피숍 체인 #1234 선셋 가 1400, 2 할리우드 CA 206-555-1212
커피숍 체인 지역 사무소 선셋 가 1400, 2호실 할리우드 캘리포니아 206-555-1212
이 표에서 위의 두 줄은 각각 ‘서 할리우드’와 ‘할리우드’라는 도시에 있는 서로 다른 작은 커피
숍처럼 보인다. 하지만 이는 입력상의 실수로, 사실은 같은 커피숍을 가리킨다. 그다음의 두 줄
은 주소가 같지만 2개의 서로 다른 사업장을 가리키고 있는데, 하나는 실제 커피숍이며 다른
하나는 지역의 체인점 사무소다. 둘 다 시애틀에 있는 본사의 대표 전화번호가 기록되어 있다.
이 예제는 레코드 링크가 얼마나 어려운지를 보여준다. 각각의 묶음이 서로 유사하게 보이더라
도 중복이 있는지를 결정하기 위해 사용하는 기준은 묶음마다 다르다. 사람은 직관으로 쉽게
구분할 수 있겠지만 컴퓨터가 그 구분법을 학습하기에는 어려운 형태다.
34 9가지 사례로 익히는 고급 스파크 분석 (2판)
2.4 스파크 셸과 SparkContext 시작하기
여기에서는 UC 어바인의 머신러닝 데이터 저장소UC Irvine Machine Learning Repository에서 구할 수 있는
표본 데이터를 사용한다. 이 저장소에서 연구와 교육을 위한 흥미로운 (더구나 무료인) 데이
터셋들을 구할 수 있다. 우리가 분석할 데이터셋은 2010년에 독일의 한 병원에서 실시한 레코
드 링크 연구에서 나온 것으로, 환자의 성과 이름, 주소, 생일 등 몇 가지 기준에 따라 묶은 수
백만 건의 환자 기록 묶음이 들어 있다. 각 묶음에는 문자열 유사도에 따라 0.0부터 1.0까지 점
수를 매겼고, 그 후 같은 사람을 표현한 묶음과 그렇지 않은 묶음을 분류해 일일이 표시하였다.
데이터셋을 만드는 데 사용한 필드 자체의 원래 값은 환자의 개인 정보를 보호하기 위해 제거
되었으며 식별번호, 필드별 유사도 점수, 묶음별 실제 분류값(같은 사람인지 여부)이 레코드
링크 연구 용도로 발행되었다.
다음과 같이 셸shell 명령어로 저장소로부터 데이터를 가져오자.
$ mkdir linkage
$ cd linkage/
$ curl -L -o donation.zip http://bit.ly/1Aoywaq
$ unzip donation.zip
$ unzip 'block_*.zip'
사용할 수 있는 하둡 클러스터가 있으면, HDFS에 블록 데이터용 디렉터리를 생성하고 데이터
파일을 그 디렉터리에 복사한다.
$ hadoop fs -mkdir linkage
$ hadoop fs -put block_*.csv linkage
이 책의 예제 코드는 2.1.0 버전의 스파크를 사용한다. 필요한 릴리스는 스파크 프로젝트 사이
트에서 내려받을 수 있다(http://spark.apache.org/downloads.html). 클러스터 환경을 사용
하든 로컬 PC 환경을 사용하든, 스파크 참조 문서를 보고 환경을 설정하면 된다(http://spark.
apache.org/docs/latest/).
이제 spark-shell을 실행할 준비가 되었다. spark-shell은 스파크 확장 API를 제공하는 스
칼라 REPL이다. REPL이라는 용어가 생소하다면 R 환경과 유사한 것으로 생각하면 된다.
spark-shell은 스칼라 프로그래밍 언어를 사용하여 함수를 정의하고 데이터를 다룰 수 있는
713장 음악 추천과 Audioscrobbler 데이터셋
“De gustibus non est disputandum.”
(취향에 이유를 따지지 마라.)
-작자 미상
누군가 나에게 무슨 일을 하냐고 물을 때 ‘데이터 과학’ 또는 ‘머신러닝’이라고 직접적으로 대답
하면, 들리기야 멋있게 들리지만 반응은 싸한 편이다. 실제 데이터 과학자들조차도 이 용어의
뜻을 명확하게 정의하지 못하고 있으니(많은 데이터를 저장하고, 계산하고, 무언가 예측하는
일?) 당연히 그럴 만하다. 대신 예를 들어 대답해보자.
“아마존에서 고객이 과거에 구매한 책들과 유사한 책을 추천해주는 걸 알고 계신가요? 정말요?
네. 바로 그게 제가 하는 일입니다.”
추천 엔진은 적어도 내 주변 사람은 모두 알고 있으며, 또 많은 사람이 아마존을 통해 경험한
대규모 머신러닝의 사례일 것이다. 소셜 네트워크에서 동영상 사이트, 그리고 온라인 쇼핑몰까
지 추천 엔진은 모든 영역에 적용되는 공통분모에 해당하며, 실제로 동작하는 모습을 직접 관
찰할 수도 있다. Gmail이 우리가 신경 쓰지 않아도 스팸을 골라내는 것과 흡사한 방법으로, 스
포티파이Spotify 역시 재생할 음악을 컴퓨터가 골라주고 있다는 사실을 알고 있다.
추천 알고리즘의 결과는 다른 머신러닝 알고리즘보다 훨씬 직관적이다. 게다가 흥미롭기까지
하다. 우리가 개인의 음악 취향이 너무 사적이어서 설명할 수 없다고 생각한다는 점을 고려해
음악 추천과 Audioscrobbler 데이터셋
CHAPTER 3
션 오언
72 9가지 사례로 익히는 고급 스파크 분석 (2판)
보면, 추천 엔진은 우리가 좋아하리라 생각하지도 못한 음악을 찾아내는 놀라운 일을 해낸다.
추천 엔진이 널리 사용되는 음악과 영화 분야에서는 추천된 목록이 누군가 과거에 접해본 콘텐
츠와 왜 잘 들어맞는지를 추리해내기가 상대적으로 쉽다. 하지만 모든 군집화Clustering1
나 분류
Classification 알고리즘이 설명하기 쉬운 건 아니다. 예컨대 서포트 벡터 머신Support Vector Machine 분류
기는 계수들의 집합으로 구성되는데, 예측은 하더라도 그 계수들의 의미를 설명하기란 전문가
조차도 쉽지 않다.
그래서 앞으로 3개 장에 걸쳐서 스파크의 핵심 머신러닝 알고리즘을 다뤄보려 한다. 그중 처음
인 이번 장은 음악에 특화된 추천 엔진을 들여다보겠다. 이는 스파크와 MLlib을 실제 세상의
문제에 적용하는 방식을 소개하고, 이어지는 장에서 더 깊게 파헤칠 머신러닝 알고리즘의 기본
을 소개하는 적절한 방법일 것이다.
3.1 데이터셋
이 장의 예제에서는 오디오스크로블러Audioscrobbler에서 공개한 데이터셋을 사용한다. 오디오스
크로블러는 2002년에 초기 인터넷 스트리밍 라디오 서비스를 제공한 last.fm(http://www.
last.fm)을 위해서 만들어진 첫 번째 음악 추천 시스템이다. 오디오스크로블러는 ‘스크로블링’2
용 오픈 API를 제공했고, 청취자의 음악 재생 내역을 기록했다. 서드파티 앱과 사이트들이 추
천 엔진에 음악 감상 관련 데이터를 돌려준 덕에, 이 시스템의 사용자는 수백만 명에 이르렀다.
당시의 추천 엔진 관련 연구는 대부분 평점 데이터를 학습하는 데 그쳤다. 즉, “개똥이가 소녀
시대에게 별점 3개 반을 주었군”과 같은 입력에 기초해 동작하는 도구처럼 보이곤 했다.
오디오스크로블버의 데이터셋이 재미있는 점은 “개똥이가 소녀시대 음악을 들었어”와 같은 단
순 재생 정보만 기록한다는 것이다. 단순 재생 여부는 평점보다 정보가 적다. 개똥이가 듣는다는
사실만으로 개똥이가 실제로 좋아하는지 혹은 싫어하는지를 판단할 수 없기 때문이다. 종종 별
관심 없는 아티스트의 음악을 틀어놓을 때도 있고, 또 음악을 틀어놓고 외출해버릴 수도 있다.
1	 옮긴이_ 흔히 영어를 그대로 읽어 클러스터링이라 부르지만, 이 책에서는 분산 처리 분야의 용어인 클러스터와 명확히 구분하기 위해 우
리말 용어인 군집화로 옮긴다.
2	 옮긴이_음악을 들을 때 아티스트, 제목, 앨범 등의 정보를 last.fm 서버에 보내는 작업이다.
733장 음악 추천과 Audioscrobbler 데이터셋
하지만 감상한 음악에 평점을 매기는 횟수는 음악을 듣는 일에 비해서 훨씬 드물다. 그래서 음
악 감상 데이터 하나의 정보량은 음악 평점 데이터 하나의 정보량보다 적지만, 음악 감상 데이
터셋은 크기도 훨씬 크고, 더 많은 사용자와 아티스트를 포함하며, 정보의 총량도 훨씬 많다.
사용자와 아티스트 사이의 관계가 명시적 평점이나 ‘좋아요’ 버튼으로 직접 주어지지 않고 다
른 행위들로부터 의도치 않게 은연중에 드러나기 때문에 이런 종류의 데이터를 암묵적 피드백
Implicit Feedback이라고 부르기도 한다.
2005년에 last.fm에서 배포한 데이터셋의 스냅샷을 인터넷에서 압축된 파일 형태로 구할 수
있다. https://goo.gl/yoWRAl 에서 압축 파일을 내려받은 후, 그 안의 몇몇 파일을 찾아보자.
중심이 되는 데이터셋은 user_artist_data.txt 파일에 들어 있다. 이 안에는 141,000명의 사
용자와 160만 명의 아티스트 정보가 담겨 있으며 약 2,420만 건의 음악 재생 정보가 재생 횟
수와 함께 기록되어 있다.
또한, 이 데이터셋의 artist_data.txt 파일에는 각각의 아티스트에 ID를 부여하고 있다. 음악
이 재생되면 클라이언트 프로그램이 재생되는 아티스트의 이름을 전송하는데, 그 이름은 잘못
기록되었거나 공식 명칭이 아닐 수 있으며, 이러한 오류가 뒤늦게 발견될 수도 있다. 예를 들어
“The Smiths”, “Smiths, The”, “the smiths”는 데이터셋 안에서는 별도의 아티스트 ID를 가
질지도 모르지만, 이 모두가 단 한 사람에게 붙여진 것일 수 있다. 그래서 데이터셋의 artist_
alias.txt 파일은 아티스트 명칭의 흔한 오기 패턴과 다양한 변형 표기법으로 기록된 아티스트
ID를 해당 아티스트의 대표 ID와 연결짓고 있다.
3.2 교차 최소 제곱 추천 알고리즘
우리는 암묵적 피드백 데이터에 적합한 추천 알고리즘을 선택해야 한다. 우리의 데이터셋은 전
적으로 사용자와 아티스트의 음악 사이의 상호작용으로만 구성되며, 아티스트 이름 외에 사용
자와 아티스트에 대한 어떤 정보도 포함하고 있지 않다. 우리는 사용자와 아티스트의 속성에
대해 아는 바가 없어도 학습이 가능한 알고리즘이 필요하다. 이런 알고리즘을 일반적으로 협업
필터링Collaborative Filtering (https://goo.gl/eK7KYG)이라고 한다. 예를 들어 두 사용자가 단지 동
년배라서 취향이 비슷하다고 이야기하는 것은 협업 필터링이 아니다. 두 사람이 들은 노래 중
같은 것이 많기 때문에 같은 노래를 좋아할 수도 있다고 예측하는 것이 협업 필터링의 예라고
74 9가지 사례로 익히는 고급 스파크 분석 (2판)
할 수 있다.
수천만 건의 재생 기록을 담은 이 데이터는 얼핏 방대해 보이지만, 다른 관점에서 보면 밀도가
낮기 때문에 꼭 그렇지도 않다. 한 사용자가 160만 명의 아티스트 중 평균 171명의 노래만 재
생했다. 어떤 사용자는 딱 한 아티스트의 노래만 듣기도 했다. 이런 사용자들에게도 괜찮은 추
천이 가능한 알고리즘이 필요하다. 어찌 되었든 음악을 듣는 누구라도 처음에는 딱 한 곡의 청
취 기록만 있었을 것이다!
결국 대규모 모델을 만들 수 있고 동시에 빠르게 추천해주는, 확장 가능한 알고리즘이 필요하
다. 일반적으로 추천 결과가 내일 나온다면 너무 늦다. 1초 이내의 준 실시간으로 나와야 한다.
이 예제에서는 잠재요인Latent-factor (https://goo.gl/w0isfF) 모델로 분류할 수 있는 많은 알고리
즘 중 하나를 사용하고자 한다. 잠재요인 모델은 다수의 사용자와 아이템 사이에서 관측된 상
호작용Observed Interaction을 상대적으로 적은 수의 관측되지 않은 숨은 원인Unobserved Underlying Reason
으로 설명하려 할 때 사용한다. 이는 수백만의 사람이 수천 개의 음반 중 특정 음반을 구입한
이유를 (직접 관측할 수 없고 데이터도 주어지지 않은) 수십 개 음악 장르에 대한 개인 취향으
로 설명하는 것과 유사하다.
예를 들어 메탈 밴드인 메가데스와 판테라의 음반뿐 아니라 클래식 작곡가 모차르트의 음반을
구매한 사람을 생각해보자. 왜 이런 음반만 구매하고 다른 음반은 구매하지 않았는지에 대한
정확한 이유를 설명하는 것은 어렵다. 그렇지만 이 음반들은 더 큰 음악 취향에서의 매우 작은
부분일 수 있다. 이 사람은 아마도 메탈 음악부터 프로그레시브 록, 클래식에 이르는 음악을 좋
아할 것이다. 이렇게 설명하는 것은 더 간단할 뿐 아니라 이 설명을 바탕으로 흥미를 유발할 수
있는 다른 많은 앨범을 제안할 수도 있다. 여기서 메탈, 프로그레시브 록, 클래식을 좋아한다는
것이 수만 개의 앨범 각각에 대한 선호도를 설명할 수 있는 세 개의 숨은 원인이다.
더 구체적으로는 행렬 분해Matrix Factorization (https://goo.gl/w0isfF) 모델을 사용할 것이다. 수학
적으로 이들 알고리즘에서는 사용자와 제품 데이터를 큰 행렬 A로 간주해 다루는데, A는 사용
자 i가 아티스트 j의 음악을 들었다면 A의 i행 j열에 값이 존재하는 행렬이다. A는 희소 행렬
Sparse Matrix이다. 사용자-아티스트의 가능한 모든 조합 중 오직 극소수만이 실제 데이터로 등장
하기 때문에, 이 행렬의 원소 대부분은 0이 된다. 이들 행렬 분해 알고리즘은 A를 더 작은 행렬
X와 Y의 행렬 곱으로 분해하는데, 이 X와 Y는 매우 길쭉하다. A가 다수의 행과 열을 가지기
때문에 X와 Y는 매우 많은 행을 가지게 되는 데 반해, 열은 몇 개(k) 되지 않는다. k개의 열은
753장 음악 추천과 Audioscrobbler 데이터셋
상호작용하는 데이터를 설명하는 데 사용하는 잠재요인에 해당한다.
[그림 3-1]에서 볼 수 있듯, k가 작기 때문에 이 분해는 근사치일 수밖에 없다.
그림 3-1 행렬 분해
원래의 행렬 A는 매우 희소한 데 비해 행렬 곱 XYT
는 밀도가 매우 높아서 이 알고리즘을 행렬
채우기Matrix Completion 알고리즘이라고 부를 때도 있다. 설사 값이 0인 원소가 있다 할지라도 매
우 드물게 나타나므로, 이 모델은 A의 근삿값일 뿐이다. 원래의 행렬 A에서 결측된(즉, 값이 0
인) 많은 원소에 대한 값조차도 생성한다는(채워준다는) 점에서 행렬 분해는 하나의 모델이라
할 수 있다.
다행히도 선형대수학이 직관과 아주 잘 들어맞는다. 이 두 행렬은 각 사용자와 각 아티스트를
하나씩의 행으로 담고 있다. 이 행들은 매우 작은 수(k개)의 값만을 가진다. 그리고 각 값은 모
델에서 잠재특징Latent Feature에 대응한다. 그래서 행들은 사용자와 아티스트가, 아마도 취향이나
장르에 대응하리라 추측되는 이들 잠재 특징과 얼마나 밀접하게 관련되는지를 표시하게 된다.
그리고 간단히 사용자-특징 행렬과 특징-아티스트 행렬을 곱하는 것으로 사용자-아티스트
상호작용 밀집 행렬 전체의 근사치를 얻을 수 있다. 이 행렬 곱은 아이템을 아이템 속성들에 대
응시킨 뒤 사용자 속성들을 가중치로 준 것으로 생각할 수 있다.
안타까운 점은 A를 완벽하게 표현하기에는 X와 Y가 충분히 크지 않아(선형대수학에서는 계수
Rank가 너무 작다고 기술한다. https://goo.gl/49ymAa) 일반적으로 정확하게 A = XYT
를 만족
하는 해를 구할 수 없다는 것이다. 하지만 알고 보면 나쁘지 않다. A는 발생할 수 있는 모든 상
76 9가지 사례로 익히는 고급 스파크 분석 (2판)
호작용 중 아주 작은 표본일 뿐이다. 우리는 A 행렬의 정보가 매우 드문드문 존재해서 (단지
몇 가지 작은 k개의 요인으로 잘 설명되는) 훨씬 간단한 감춰진 진실의 모습을 설명하기 힘든
것으로 생각한다. 고양이 그림의 직소 퍼즐을 생각해보자. 완성된 퍼즐을 보고 고양이라고 설
명하기는 아주 쉬워도, 조각 몇 개만 쥐고 있다면 이것이 어떤 그림이라고 설명하기란 매우 어
렵다.
XYT
은 여전히 A에 가능한 한 가까워야 한다. 어쨌든 이것이 우리가 해야 할 일이다. 정확하게
구하지는 못할 것이고 또 구할 수도 없다. 설상가상으로, X와 Y의 가장 좋은 답을 동시에 직접
적으로 구할 수조차 없다. 그나마 나은 소식은 Y를 알고 있을 때는 X의 정답을 구할 수 있음이
자명하고, 그 반대도 마찬가지라는 것이다. 뭐, 아직은 둘 다 모르는 상태지만!
다행히 이런 딜레마를 극복하고 제대로 된 해를 찾아주는 알고리즘이 있다. 더 구체적으로 설
명하면, 이 장의 예제에서는 X와 Y를 계산하기 위해 교차 최소 제곱Alternating Least Squares (ALS,
https://goo.gl/hPoZq5) 알고리즘을 사용할 것이다. 이런 종류의 접근법은 넷플릭스 프라이즈
Netflix Prize (https://goo.gl/EtIzYO)가 열리던 시절에 발표된 「암묵적 피드백 데이터셋에 대한 협
업 필터링Collaborative Filtering for Implicit Feedback Datasets」 (https://goo.gl/8WZqmk)과 「넷플릭스 프라이
즈를 위한 대규모의 병렬 협업 필터링Large-scale Parallel Collaborative Filtering for the Netflix Prize」(https://goo.
gl/tG99s9) 같은 논문 덕에 유명해졌다. 사실 스파크의 MLlib이 제공하는 ALS 알고리즘도 이
논문들에서 아이디어를 가져와 구현한 것이다.
Y의 값을 모르지만, 무작위로 값이 선택된 행 벡터로 초기화할 수는 있다. 그런 다음 간단한 선
형대수를 통해 주어진 A와 Y에 대한 최적 X를 구할 수 있다. 사실, X의 각 행 i는 Y와 A의 한
행의 함수로 독립적으로 쉽게 계산할 수 있다. 독립적으로 수행할 수 있으니 병렬 처리가 가능
하며, 이는 대규모로 계산할 때 매우 훌륭한 장점이다.
AiY(YT
Y )-1 = Xi
이 수식의 양 변을 똑같이 만들기란 불가능하므로, 우리의 목표는 양 변의 차이인
|AiY (YT
Y )-1
- Xi|, 즉 두 행렬에서 대응되는 원소 간 차의 제곱의 합을 최소화하는 것이다.
여기서 최소 제곱Least Squares이라는 이름이 유래되었다. 실전에서는 역행렬을 구하는 방법으로
계산하지 않고 QR 분해QR Decomposition (https://goo.gl/OvtPVU)와 같은 방법으로 더 빠르게 바
로 계산할 수 있다. 앞의 식은 단순히 행 벡터가 어떻게 계산되는지의 이론을 설명하기 위한 것
1014장 의사 결정 나무로 산림 식생 분포 예측하기
“예측은 매우 어려우며, 미래에 대해서는 특히 그렇다.”
-닐스 보어
19세기 후반 영국의 우생학자 프랜시스 골턴 경Sir Francis Galton은 완두콩과 사람 등을 대상으로 그
키를 측정하는 데 집중했다. 그는 키가 큰 완두콩과 사람의 다음 세대 역시 평균보다 크다는 사
실을 발견했다. 놀라운 발견이라고 할 수는 없다. 하지만 자식 세대는 평균적으로 부모보다 조
금 작았다. 키가 2미터에 달하는 야구 선수의 자식은 물론 평균보다는 크겠지만, 그렇다고 2미
터까지 크지는 않는다는 뜻이다.
이 연구의 뜻하지 않은 결과 덕분에 골턴 경은 부모 세대의 키와 비교하여 자식 세대의 키를 정
리해보았고 둘 사이에 대략적인 선형 관계가 있음을 알아냈다. 큰 부모 완두콩은 큰 자식 완두
콩으로 이어졌지만, 부모보다는 조금 작았다. 작은 부모 완두콩도 작은 자식 완두콩으로 이어
지지만, 역시 부모보다는 조금 컸다. 이 선형 관계에서 직선의 기울기는 1보다 작은 양수였고,
골턴 경은 이 현상을 평균으로의 회귀Regression to the Mean라고 표현했다. 오늘날 우리도 이 표현을 사
용한다.
당시에는 인지하지 못했을지언정, 이 선형 관계는 예측 모델의 오래된 예로 보인다. 두 값을 연
결한 선이 있다는 것은 하나의 값이 다른 값에 대해 많은 것을 시사할 수 있음을 의미한다. 어
떤 완두콩의 자식의 크기는 그 완두콩과 비슷하리라고 가정하는 것보다 이 관계를 이용하여 그
크기를 계산하는 쪽이 훨씬 정확할 것이다.
의사 결정 나무로
산림 식생 분포 예측하기
CHAPTER 4
션 오언
102 9가지 사례로 익히는 고급 스파크 분석 (2판)
4.1 회귀로 돌아와서
통계학이 체계를 갖춘 지 한 세기 이상이 지나고 머신러닝과 데이터 과학이 등장한 오늘날에
도, 주어진 값들로부터 새로운 값을 예측하는 방법으로 ‘회귀(https://goo.gl/yFA7xy)’를 꼽는
다. 심지어 값이 평균에 가까워지거나 실제로 가까워지려는 움직임조차 없을지라도 말이다. 또
한, 회귀 기법은 분류 기법과 연관이 있다(https://goo.gl/Tq7xfG). 일반적으로 회귀는 크기,
수입, 온도와 같은 숫자를 예측하며, 분류는 ‘스팸 메일’, ‘고양이 사진’과 같은 레이블이나 범주
를 예측하는 데 사용한다.
회귀와 분류는 모두 하나 이상의 값이 주어졌을 때 하나 이상의 값을 예측해낸다. 이를 위해서
학습을 위한 입출력 체계가 구성되어 있어야 하며, 질문과 이에 대한 답변도 제공되어야 한다.
이러한 탓에 회귀와 분류는 지도 학습Supervised Learning (https://goo.gl/ktFn24) 유형에 들어간다.
분류와 회귀는 가장 오래되고 가장 잘 연구된 유형의 예측 분석이다. 서포트 벡터 머신Support
Vector Machine, 로지스틱 회귀Logistic Regression, 나이브 베이즈 분류Naïve Bayes, 신경망Neural Network, 딥러
닝Deep Learning과 같은 분석 패키지나 라이브러리에서 자주 접하는 대부분의 알고리즘은 분류와
회귀 기법이다. 3장의 주제인 추천 엔진도 더 직관적이라는 이유로 앞 장의 주제로 사용했지
만, 역시 비교적 최근에 따로 떨어져나온 머신러닝의 하위 주제일 뿐이다.
이번 장에서는 분류와 회귀 모두에 적용할 수 있는 대중적이고 유연한 알고리즘인 의사 결정
나무(https://goo.gl/CT9gWE), 그리고 이 알고리즘의 확장판인 랜덤 포레스트(https://goo.
gl/fC83b1)를 다루고자 한다. 이 알고리즘과 관련한 흥미로운 사실은 닐스 보어가 미래 예측
에 대해서 말한 것과 달리 미래 예측에 사용할 수 있으며, 적어도 아직은 우리가 명확히 알지
못하는 것을 예측할 수 있다는 것이다. 예를 들어 온라인에서의 행동 양식으로부터 자동차를
살 가능성을 예측한다든지, 이메일 본문의 어떤 단어로부터 그 이메일이 스팸인지 여부를 찾아
낸다든지, 위치와 토양의 화학성분비가 주어졌을 때 어느 부분의 땅이 작물을 가장 잘 키워낼
지와 같은 것이다.
4.2 벡터와 특징
특정 데이터셋과 알고리즘을 선택하는 방법, 그리고 회귀와 분류가 동작하는 방법을 설명하려
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기

More Related Content

What's hot

『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법복연 이
 
『이펙티브 디버깅』 맛보기
『이펙티브 디버깅』 맛보기『이펙티브 디버깅』 맛보기
『이펙티브 디버깅』 맛보기복연 이
 
『데이터 분석을 통한 네트워크 보안』 - 맛보기
『데이터 분석을 통한 네트워크 보안』 - 맛보기『데이터 분석을 통한 네트워크 보안』 - 맛보기
『데이터 분석을 통한 네트워크 보안』 - 맛보기복연 이
 
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기복연 이
 
『아마존 웹 서비스 인 액션』 맛보기
『아마존 웹 서비스 인 액션』 맛보기『아마존 웹 서비스 인 액션』 맛보기
『아마존 웹 서비스 인 액션』 맛보기복연 이
 
Python을 활용한 챗봇 서비스 개발 1일차
Python을 활용한 챗봇 서비스 개발 1일차Python을 활용한 챗봇 서비스 개발 1일차
Python을 활용한 챗봇 서비스 개발 1일차Taekyung Han
 
인페디 기말(Ui맵)
인페디 기말(Ui맵)인페디 기말(Ui맵)
인페디 기말(Ui맵)화진 유
 

What's hot (8)

『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
 
『이펙티브 디버깅』 맛보기
『이펙티브 디버깅』 맛보기『이펙티브 디버깅』 맛보기
『이펙티브 디버깅』 맛보기
 
『데이터 분석을 통한 네트워크 보안』 - 맛보기
『데이터 분석을 통한 네트워크 보안』 - 맛보기『데이터 분석을 통한 네트워크 보안』 - 맛보기
『데이터 분석을 통한 네트워크 보안』 - 맛보기
 
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
 
1.introduction
1.introduction1.introduction
1.introduction
 
『아마존 웹 서비스 인 액션』 맛보기
『아마존 웹 서비스 인 액션』 맛보기『아마존 웹 서비스 인 액션』 맛보기
『아마존 웹 서비스 인 액션』 맛보기
 
Python을 활용한 챗봇 서비스 개발 1일차
Python을 활용한 챗봇 서비스 개발 1일차Python을 활용한 챗봇 서비스 개발 1일차
Python을 활용한 챗봇 서비스 개발 1일차
 
인페디 기말(Ui맵)
인페디 기말(Ui맵)인페디 기말(Ui맵)
인페디 기말(Ui맵)
 

Similar to ​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기

『오픈스택 인 액션』 - 맛보기
『오픈스택 인 액션』 - 맛보기『오픈스택 인 액션』 - 맛보기
『오픈스택 인 액션』 - 맛보기복연 이
 
스태커회사소개서
스태커회사소개서스태커회사소개서
스태커회사소개서stackrinc
 
『클라우드 시스템을 관리하는 기술』 - 맛보기
『클라우드 시스템을 관리하는 기술』 - 맛보기『클라우드 시스템을 관리하는 기술』 - 맛보기
『클라우드 시스템을 관리하는 기술』 - 맛보기복연 이
 
오픈소스 생태계 일원으로서의 개발자(자막 버전)
오픈소스 생태계 일원으로서의 개발자(자막 버전)오픈소스 생태계 일원으로서의 개발자(자막 버전)
오픈소스 생태계 일원으로서의 개발자(자막 버전)JeongHun Byeon
 
[113]apache zeppelin 이문수
[113]apache zeppelin 이문수[113]apache zeppelin 이문수
[113]apache zeppelin 이문수NAVER D2
 
Spark Day 2017 Machine Learning & Deep Learning With Spark
Spark Day 2017 Machine Learning & Deep Learning With SparkSpark Day 2017 Machine Learning & Deep Learning With Spark
Spark Day 2017 Machine Learning & Deep Learning With SparkSangHoon Lee
 
파이콘 2017 그만퇴근합시다_이지호
파이콘 2017 그만퇴근합시다_이지호파이콘 2017 그만퇴근합시다_이지호
파이콘 2017 그만퇴근합시다_이지호Jiho Lee
 
20180714 하둡 스터디 종료 보고 및 연구과제 발표자료
20180714 하둡 스터디 종료 보고 및 연구과제 발표자료20180714 하둡 스터디 종료 보고 및 연구과제 발표자료
20180714 하둡 스터디 종료 보고 및 연구과제 발표자료BOMI KIM
 
[H3 2012] 오픈소스로 개발 실력 쌓기
[H3 2012] 오픈소스로 개발 실력 쌓기[H3 2012] 오픈소스로 개발 실력 쌓기
[H3 2012] 오픈소스로 개발 실력 쌓기KTH, 케이티하이텔
 
Spark machine learning & deep learning
Spark machine learning & deep learningSpark machine learning & deep learning
Spark machine learning & deep learninghoondong kim
 
Apache spark 소개 및 실습
Apache spark 소개 및 실습Apache spark 소개 및 실습
Apache spark 소개 및 실습동현 강
 
Spark overview 이상훈(SK C&C)_스파크 사용자 모임_20141106
Spark overview 이상훈(SK C&C)_스파크 사용자 모임_20141106Spark overview 이상훈(SK C&C)_스파크 사용자 모임_20141106
Spark overview 이상훈(SK C&C)_스파크 사용자 모임_20141106SangHoon Lee
 
Python & Spark
Python & SparkPython & Spark
Python & Sparkitproman35
 
오픈소스Sw이해와가치 송상효-20160811
오픈소스Sw이해와가치 송상효-20160811오픈소스Sw이해와가치 송상효-20160811
오픈소스Sw이해와가치 송상효-20160811승우 백
 
[D2 COMMUNITY] Spark User Group - 스파크를 통한 딥러닝 이론과 실제
[D2 COMMUNITY] Spark User Group - 스파크를 통한 딥러닝 이론과 실제[D2 COMMUNITY] Spark User Group - 스파크를 통한 딥러닝 이론과 실제
[D2 COMMUNITY] Spark User Group - 스파크를 통한 딥러닝 이론과 실제NAVER D2
 
효율적 데이터 과학을 위한 7가지 팁
효율적 데이터 과학을 위한 7가지 팁효율적 데이터 과학을 위한 7가지 팁
효율적 데이터 과학을 위한 7가지 팁Jaimie Kwon (권재명)
 
RUCK 2017 권재명 효율적 데이터 과학과 데이터 조직을 위한 7가지 요인
RUCK 2017 권재명 효율적 데이터 과학과 데이터 조직을 위한 7가지 요인RUCK 2017 권재명 효율적 데이터 과학과 데이터 조직을 위한 7가지 요인
RUCK 2017 권재명 효율적 데이터 과학과 데이터 조직을 위한 7가지 요인r-kor
 
제2회 i talks-세미나-openstack+openshift-2014-5-28
제2회 i talks-세미나-openstack+openshift-2014-5-28제2회 i talks-세미나-openstack+openshift-2014-5-28
제2회 i talks-세미나-openstack+openshift-2014-5-28Donghan Kim
 
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기AWSKRUG - AWS한국사용자모임
 
Launchpad 활용 사례 in OpenStack: 다루어본 Bug & Blueprint를 중심으로
Launchpad 활용 사례 in OpenStack: 다루어본 Bug & Blueprint를 중심으로Launchpad 활용 사례 in OpenStack: 다루어본 Bug & Blueprint를 중심으로
Launchpad 활용 사례 in OpenStack: 다루어본 Bug & Blueprint를 중심으로Ubuntu Korea Community
 

Similar to ​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기 (20)

『오픈스택 인 액션』 - 맛보기
『오픈스택 인 액션』 - 맛보기『오픈스택 인 액션』 - 맛보기
『오픈스택 인 액션』 - 맛보기
 
스태커회사소개서
스태커회사소개서스태커회사소개서
스태커회사소개서
 
『클라우드 시스템을 관리하는 기술』 - 맛보기
『클라우드 시스템을 관리하는 기술』 - 맛보기『클라우드 시스템을 관리하는 기술』 - 맛보기
『클라우드 시스템을 관리하는 기술』 - 맛보기
 
오픈소스 생태계 일원으로서의 개발자(자막 버전)
오픈소스 생태계 일원으로서의 개발자(자막 버전)오픈소스 생태계 일원으로서의 개발자(자막 버전)
오픈소스 생태계 일원으로서의 개발자(자막 버전)
 
[113]apache zeppelin 이문수
[113]apache zeppelin 이문수[113]apache zeppelin 이문수
[113]apache zeppelin 이문수
 
Spark Day 2017 Machine Learning & Deep Learning With Spark
Spark Day 2017 Machine Learning & Deep Learning With SparkSpark Day 2017 Machine Learning & Deep Learning With Spark
Spark Day 2017 Machine Learning & Deep Learning With Spark
 
파이콘 2017 그만퇴근합시다_이지호
파이콘 2017 그만퇴근합시다_이지호파이콘 2017 그만퇴근합시다_이지호
파이콘 2017 그만퇴근합시다_이지호
 
20180714 하둡 스터디 종료 보고 및 연구과제 발표자료
20180714 하둡 스터디 종료 보고 및 연구과제 발표자료20180714 하둡 스터디 종료 보고 및 연구과제 발표자료
20180714 하둡 스터디 종료 보고 및 연구과제 발표자료
 
[H3 2012] 오픈소스로 개발 실력 쌓기
[H3 2012] 오픈소스로 개발 실력 쌓기[H3 2012] 오픈소스로 개발 실력 쌓기
[H3 2012] 오픈소스로 개발 실력 쌓기
 
Spark machine learning & deep learning
Spark machine learning & deep learningSpark machine learning & deep learning
Spark machine learning & deep learning
 
Apache spark 소개 및 실습
Apache spark 소개 및 실습Apache spark 소개 및 실습
Apache spark 소개 및 실습
 
Spark overview 이상훈(SK C&C)_스파크 사용자 모임_20141106
Spark overview 이상훈(SK C&C)_스파크 사용자 모임_20141106Spark overview 이상훈(SK C&C)_스파크 사용자 모임_20141106
Spark overview 이상훈(SK C&C)_스파크 사용자 모임_20141106
 
Python & Spark
Python & SparkPython & Spark
Python & Spark
 
오픈소스Sw이해와가치 송상효-20160811
오픈소스Sw이해와가치 송상효-20160811오픈소스Sw이해와가치 송상효-20160811
오픈소스Sw이해와가치 송상효-20160811
 
[D2 COMMUNITY] Spark User Group - 스파크를 통한 딥러닝 이론과 실제
[D2 COMMUNITY] Spark User Group - 스파크를 통한 딥러닝 이론과 실제[D2 COMMUNITY] Spark User Group - 스파크를 통한 딥러닝 이론과 실제
[D2 COMMUNITY] Spark User Group - 스파크를 통한 딥러닝 이론과 실제
 
효율적 데이터 과학을 위한 7가지 팁
효율적 데이터 과학을 위한 7가지 팁효율적 데이터 과학을 위한 7가지 팁
효율적 데이터 과학을 위한 7가지 팁
 
RUCK 2017 권재명 효율적 데이터 과학과 데이터 조직을 위한 7가지 요인
RUCK 2017 권재명 효율적 데이터 과학과 데이터 조직을 위한 7가지 요인RUCK 2017 권재명 효율적 데이터 과학과 데이터 조직을 위한 7가지 요인
RUCK 2017 권재명 효율적 데이터 과학과 데이터 조직을 위한 7가지 요인
 
제2회 i talks-세미나-openstack+openshift-2014-5-28
제2회 i talks-세미나-openstack+openshift-2014-5-28제2회 i talks-세미나-openstack+openshift-2014-5-28
제2회 i talks-세미나-openstack+openshift-2014-5-28
 
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
 
Launchpad 활용 사례 in OpenStack: 다루어본 Bug & Blueprint를 중심으로
Launchpad 활용 사례 in OpenStack: 다루어본 Bug & Blueprint를 중심으로Launchpad 활용 사례 in OpenStack: 다루어본 Bug & Blueprint를 중심으로
Launchpad 활용 사례 in OpenStack: 다루어본 Bug & Blueprint를 중심으로
 

More from 복연 이

『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기
『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기
『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기복연 이
 
『Effective Unit Testing』 - 맛보기
『Effective Unit Testing』 - 맛보기『Effective Unit Testing』 - 맛보기
『Effective Unit Testing』 - 맛보기복연 이
 
『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기
『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기
『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기복연 이
 
『Modern PHP』 - 미리보기
『Modern PHP』 - 미리보기『Modern PHP』 - 미리보기
『Modern PHP』 - 미리보기복연 이
 
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도복연 이
 
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기복연 이
 
어서 와! 번역은 처음이지?
어서 와! 번역은 처음이지?어서 와! 번역은 처음이지?
어서 와! 번역은 처음이지?복연 이
 
『풀스택 개발자를 위한 MEAN 스택 입문』 - 미리보기
『풀스택 개발자를 위한 MEAN 스택 입문』 - 미리보기『풀스택 개발자를 위한 MEAN 스택 입문』 - 미리보기
『풀스택 개발자를 위한 MEAN 스택 입문』 - 미리보기복연 이
 
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기복연 이
 
『안드로이드 시큐리티 인터널』 - 미리보기
『안드로이드 시큐리티 인터널』 - 미리보기『안드로이드 시큐리티 인터널』 - 미리보기
『안드로이드 시큐리티 인터널』 - 미리보기복연 이
 
『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기복연 이
 
『게임을 움직이는 기술과 발상』 - 미리보기
『게임을 움직이는 기술과 발상』 - 미리보기『게임을 움직이는 기술과 발상』 - 미리보기
『게임을 움직이는 기술과 발상』 - 미리보기복연 이
 
개앞맵시 '건방진' 사용 설명서
개앞맵시 '건방진' 사용 설명서개앞맵시 '건방진' 사용 설명서
개앞맵시 '건방진' 사용 설명서복연 이
 

More from 복연 이 (13)

『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기
『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기
『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기
 
『Effective Unit Testing』 - 맛보기
『Effective Unit Testing』 - 맛보기『Effective Unit Testing』 - 맛보기
『Effective Unit Testing』 - 맛보기
 
『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기
『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기
『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기
 
『Modern PHP』 - 미리보기
『Modern PHP』 - 미리보기『Modern PHP』 - 미리보기
『Modern PHP』 - 미리보기
 
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도
 
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기
 
어서 와! 번역은 처음이지?
어서 와! 번역은 처음이지?어서 와! 번역은 처음이지?
어서 와! 번역은 처음이지?
 
『풀스택 개발자를 위한 MEAN 스택 입문』 - 미리보기
『풀스택 개발자를 위한 MEAN 스택 입문』 - 미리보기『풀스택 개발자를 위한 MEAN 스택 입문』 - 미리보기
『풀스택 개발자를 위한 MEAN 스택 입문』 - 미리보기
 
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
 
『안드로이드 시큐리티 인터널』 - 미리보기
『안드로이드 시큐리티 인터널』 - 미리보기『안드로이드 시큐리티 인터널』 - 미리보기
『안드로이드 시큐리티 인터널』 - 미리보기
 
『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기
 
『게임을 움직이는 기술과 발상』 - 미리보기
『게임을 움직이는 기술과 발상』 - 미리보기『게임을 움직이는 기술과 발상』 - 미리보기
『게임을 움직이는 기술과 발상』 - 미리보기
 
개앞맵시 '건방진' 사용 설명서
개앞맵시 '건방진' 사용 설명서개앞맵시 '건방진' 사용 설명서
개앞맵시 '건방진' 사용 설명서
 

Recently uploaded

A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 

Recently uploaded (6)

A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 

​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기

  • 1.
  • 2. 표지 동물은 송골매다. 이 매는 세상에서 가장 흔한 맹금류 중 하나로 남극을 제외한 모든 대륙에 서식한다. 또한, 도시, 열대 지역, 사막, 툰드라 등 다양한 환경에서 생존할 수 있다. 일부는 겨울과 여름 서식지 간 의 머나먼 여행을 한다. 송골매는 세상에서 가장 빨리 나는 새로, 시속 약 320km로 급강하할 수 있다. 참새나 오리와 같은 다른 새와 박쥐를 먹이로 하는데, 공중에서도 먹이를 낚아챌 수 있다. 다 자란 송골매의 날개는 푸른 잿빛을, 등은 어두운 갈색을 띠며, 담황색 배에는 갈색 점이, 하얀 얼굴에는 검은색 눈물점이 있다. 그리고 갈고리 모양의 부리와 강 한 발톱도 있다. 송골매의 영어 이름인 peregrine falcon은 라틴어의 peregrinus에서 온 말인데, 그 뜻은 방랑자다. 송골매는 매조련사들 의 사랑을 받아왔으며, 여러 세기에 걸쳐 사냥에 동원되었다. 오라일리 책의 표지에 등장하는 동물 중 상당수는 멸종 위기에 처해 있다. 이들 모두가 우리 세상에 소중한 존재다. 이 동 물들을 돕고 싶다면 animals.oreilly.com으로 가보자. 표지 그림은 라이데커의 『Royal Natural History』에서 가져왔다. 9가지 사례로 익히는 고급 스파크 분석(2판) 현실 세계 빅데이터로 배우는 데이터 과학과 머신러닝 초판 1쇄 발행 2016년 7월 1일 2판   1쇄 발행 2018년 3월 5일 지은이 샌디 라이자, 유리 레이저슨, 션 오언, 조시 윌스 / 옮긴이 박상은, 권한철, 서양주 / 펴낸이 김태헌 펴낸곳 한빛미디어 (주) / 주소 서울시 서대문구 연희로2길 62 한빛미디어(주) IT출판부 전화 02 – 325 – 5544 / 팩스 02 – 336 – 7124 등록 1999년 6월 24일 제10 – 1779호 / ISBN 979 – 11 – 6224 – 052 – 6 93000 총괄 전태호 / 책임편집 김창수 / 기획·편집 이복연 디자인 표지 박정화, 내지 김연정, 조판 백지선 영업 김형진, 김진불, 조유미 / 마케팅 박상용, 송경석, 변지영 / 제작 박성우, 김정우 이 책에 대한 의견이나 오탈자 및 잘못된 내용에 대한 수정 정보는 한빛미디어(주)의 홈페이지나 아래 이메일로 알려주십시오. 잘못된 책은 구입하신 서점에서 교환해 드립니다. 책값은 뒤표지에 표시되어 있습니다. 한빛미디어 홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr © 2018 Hanbit Media Inc. Authorized Korean translation of the English edition of Advanced Analytics with Spark 2E ISBN 9781491972953 © 2017 Sanford Ryza, Uri Laserson, Sean Owen, and Joshua Wills This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same. 이 책의 저작권은 오라일리와 한빛미디어 (주)에 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 무단 복제를 금합니다. 지금 하지 않으면 할 수 없는 일이 있습니다. 책으로 펴내고 싶은 아이디어나 원고를 메일 ( writer@hanbit.co.kr ) 로 보내주세요. 한빛미디어(주)는 여러분의 소중한 경험과 지식을 기다리고 있습니다. | 표지 설명 |
  • 3. 9가지 사례로 익히는 고급 스파크 분석 2판
  • 4. 4 샌디 라이자 Sandy Ryza 리믹스에서 대중교통에 적용할 수 있는 알고리즘을 개발하고 있다. 이전에는 클라우데라와 클로버 헬스에서 선임 데이터 과학자로 근무했다. 아파치 스파크 커미터이자 아파치 하둡의 PMC 멤버이 며 스파크 시계열 데이터 처리 프로젝트의 창설자이다. 2012년 브라운 대학교 전산학과의 트와이 닝 어워즈에서 ‘Most Chill’ 부문을 수상했다. 유리 레이저슨 Uri Laserson 마운트 시나이 의과대학교 아이칸 스쿨의 유전학 조교수다. 하둡 생태계를 활용해 유전체학과 면역 학에 적용할 수 있는 확장 가능한 기술을 개발하고 있다. 션 오언 Sean Owen 클라우데라 데이터 과학팀의 디렉터다. 아파치 스파크 커미터와 PMC 멤버이며, 아파치 머하웃 Apache Mahout의 커미터였다. 조시 윌스 Josh Wills 슬랙Slack 데이터 엔지니어링팀의 리더이며 아파치 크런치Apache Crunch 프로젝트의 창설자이다. 데이 터 과학자들에 관한 트윗을 한 번 남긴 적이 있다. 지은이 소개
  • 5. 5 박상은 edberg.s@gmail.com 컴퓨터에 붙은 그림을 보고 애플이라는 단어의 뜻을 알게 된 이 땅의 흔한 개발자 중 한 사람이다. 포항공과대학교에서 전산학을, 한국과학기술원에서 인공지능을 공부했으며, 그 덕분에 알파고와 스카이넷을 구분할 줄 아는 지혜를 갖추게 되었다. 메일, 브라우저, CMS, 도서 관리 시스템 등 일 관성을 찾기 어려운 다양한 프로젝트에 참여했다. 이렇게 하여 물에 물 탄듯한 경력이 완성되는 듯 했으나, 최근 몇 년은 빅데이터 처리와 관련한 연구개발에 집중했다. 현재 에스코어에서 Elastic 스 택을 활용한 빅데이터 저장/검색 서비스 제공과 머신러닝 및 딥러닝 관련 업무를 수행하고 있다. 대 량의 데이터를 실시간으로 수집, 처리, 분석하여, 실시간으로 생산되는 데이터의 수집과 시각화 사 이의 시간 간격을 줄이는 데 각별한 관심이 있다. 권한철 ultradioc@gmail.com 에스코어의 데이터 분석가 및 플랫폼 개발자다. 보안 관제용 실시간 CEP 엔진 개발을 비롯해서 스 파크를 활용한 다수의 프로젝트에 참여했으며, 현재는 파이썬 라이브러리를 활용하여 콜센터 데이 터 분석 업무를 수행하고 있다. 특히 실시간 데이터 분석과 통계 및 머신러닝 알고리즘을 활용한 데 이터 분석에 관심이 많다. 서양주 yangsuh84@gmail.com 한국과학기술원 학부에서 수학을, 서울대학교에서 석사과정으로 통계학을 전공하였으며, 티맥스소 프트를 시작으로 개발자로서 일하게 되었다. 그 후 에스코어에서 2013년 하둡과 스파크를 접한 이 후로 빅데이터 분석을 주 업무로 수행하게 되었다. 현재는 카카오 추천팀에서 실시간 콘텐츠 추천 업무를 하고 있다. 옮긴이 소개
  • 6. 6 버클리에서 스파크 프로젝트를 시작한 이래로, 나는 단순히 빠른 병렬 시스템을 구축한다는 사 실보다는 점점 더 많은 사람이 대규모 컴퓨팅을 사용할 수 있게 돕는다는 점에 흥분해왔다. 데 이터 과학 전문가 네 명이 스파크 기반의 고급 분석에 대해서 쓴 이 책을 읽는 것이 즐거운 이 유가 바로 여기에 있다. 샌디, 유리, 션 그리고 조시는 오랫동안 스파크로 작업해왔으며, 그만 큼 충실한 설명과 예제를 이 책에 담아냈다. 이 책에서 가장 마음에 드는 부분은 실제 응용 사례와 현실 세계의 데이터셋을 가져와 예제 중 심으로 설명하는 점이다. 독자의 PC에서 직접 실행해볼 수 있는 아홉 개의 개별 빅데이터 예제 를 제공한 책은 흔치 않은데, 저자들은 이런 예제들을 모아서 스파크로 실습할 수 있도록 모든 것을 세팅해두었다. 게다가, 핵심 알고리즘만 다룬 것이 아니라, 정말로 좋은 결과를 얻는 데 필요한 데이터 준비와 모듈 튜닝의 복잡한 사항까지 다루고 있다. 독자는 이들 예제에서 터득 한 개념을 자신의 문제를 푸는 데 곧바로 적용할 수 있을 것이다. 오늘날 빅데이터 처리는 의심할 여지 없이 컴퓨터로 할 수 있는 가장 흥미로운 분야이며, 빠르 게 진화하고 새로운 아이디어들이 도입되는 분야이기도 하다. 나는 독자들이 이 흥미로운 새로 운 분야로 들어서는 데 이 책이 도움이 될 거라 기대한다. 마테이 자하리아 스파크 창시자, 『러닝 스파크』 저자 아파치 스파크는 빅데이터 영역에서 가장 핫한 기술로, 범용적이면서 빠른 대용량 분산 처리를 지원한다. 또한 기초 데이터 분석부터 머신러닝 등의 기능까지 지원하게 되면서 개발자만의 오 픈 소스에서 분석가를 위한 오픈 소스로 주목받고 있다. 이 책은 스파크로 빅데이터를 분석하 기 위한 가장 실용적인 데이터와 분석 방법을 설명하고 있다. 빅데이터에 관심 있거나 종사하 는 개발자와 분석가 모두에게 추천한다. 이상훈 한국 스파크 사용자 모임 운영자, 『실시간 분석의 모든 것』 역자 추천의 글
  • 7. 7 교통, 금융 분야 등의 실제 데이터로 데이터 획득, 전처리, 가중치 결정, 실행, 평가 그리고 시 각화까지 해볼 수 있는 스파크 활용서다. 스파크 입문을 넘어 실무에 적용하려 할 때 좋은 참고 서다. 자신의 관심 도메인에 맞는 부분만 찾아서 읽어도 좋을 것 같다. 최홍용 현대오토에버
  • 8. 8 학교를 졸업하고 몇 군데의 회사를 거쳐 2008년에 지금의 회사에 입사했다. 처음에는 콘텐츠 관리 시스템 개발로 시작했지만, 몇 번의 굴곡을 거쳐 회사는 이름이 바뀌었고 내가 하는 개발 업무도 바뀌게 되었다. 2011년, 데이터를 집계, 분석하여 실시간으로 시각화하는 과제를 수행 하게 되었다. 지금은 다른 회사에서 잘나가고 계신 배병우 씨와 함께 이를 위한 시스템을 설계 하면서 아파치 스톰Apache Storm을 알게 되었다. 그 후 몇 년간, 우리 회사의 개발팀은 스톰의 끝 을 보고 왔다. 그리고 스톰의 몇 가지 한계를 실감하게 되었다. 스톰은 스트림을 처리하는 훌륭 한 도구지만, 딱 거기까지였다(물론 이번에 릴리스된 스톰 1.0에서는 많은 부분이 개선되긴 했 다). 상태를 저장할 방법이 없는 탓에 완전한 분산 컴퓨팅 환경이라 말할 수 없다든지, 오류가 났을 시에 원래 상태를 복원할 수 없는 등 스톰이 할 수 없는 일이 꽤 있었다. 그러던 어느 날, 공역자인 권한철 씨와 서양주 씨가 아파치 스파크를 만났다. 당시 약간 모자라 보이던 스파크는, 맵리듀스MapReduce 로직을 인메모리로 처리하여 성능을 확장할 수 있다는 점 외에도, 일반적인 프로그래밍 환경에 데이터 분산 처리의 거의 모든 것을 가져올 수 있다는 특 징을 가지고 있었다. 여기에 분산 환경마저도 추상화하여 설치 이외에는 별다른 고민 없이 분 산 데이터 처리가 가능하다는 매력도 지녔다. 그리고 스톰의 강점인 스트림 처리마저도 스파크 스트리밍Spark Streaming이 마이크로 배치 형태로 처리할 수 있었다. 데이터 처리의 팔방미인이라 고 해도 과언이 아니었고, 우리는 그때부터 스파크에 집중하게 되었다. 그리고 약 2년이 흘렀 다. 스파크를 활용한 몇 개의 과제를 성공적으로 수행했으며, 새로운 도구를 받아들이는데 다 소 보수적인 분야의 현장에서도 스파크를 활용하여 얻을 수 있는 이점을 받아들이고 있다. 우 리는 스파크의 시대가 열리는 것을 목격한 운 좋은 증인이 되었고, 이 책을 읽을 독자분들도 아 직 늦지 않았다는 이야기를 해주고 싶다. 이 책은 단순한 스파크 참고서가 아니다. 스파크 참고서로는 더 좋은 책들이 여럿 있다. 부끄럽 지만 우리는 이 책도 그러한 참고서 중 하나인 줄 알고 번역을 시작했고, 그 착각 탓에 더 어려 운 길을 가야 했지만, 동시에 더 재미있는 길을 가볼 수 있었다. 이 책의 매력은 다양한 현장의 분석을 책에 담아낸 점에 있다. 스파크로 무엇을 해야 할지가 막막하다면 이 책을 펴면 도움이 옮긴이의 말
  • 9. 9 될 것이다. 굳이 스파크가 아닌 다른 도구를 사용하더라도 유용한 정보도 들어 있다. 이 책이 역자들에게 도움이 된 것처럼 독자들께도 도움이 될 것으로 생각한다. 이 책을 번역하느라 업무 부담을 조금씩 나눠주신 에스코어 엔터프라이즈 공통 플랫폼 그룹 김 세준 그룹장 이하 동료들에게 감사를 전한다. 동시에 몇 달 동안 아빠를 번역에 빼앗긴 건우에 게도 미안함을 전한다. 다른 역자들도 마찬가지의 미안함과 고마움을 가지고 있으리라 생각한 다. 번역이라는 것이 이렇게 어려운 작업인 줄은 상상도 못 했다. 책을 읽다가 책의 문장이 발 바닥에 꽂힌 가시 같다는 기분이 들면, 그 책임이 역자들에게도 있을 수 있음을 이해해주시기 바란다. 박상은
  • 10. 10 과거를 후회하는 걸 좋아하진 않지만, 잠시 태만했던 2011년 시절 믿기 어려운 일이 벌어졌다. 당시 나는 어려운 이산 최적화 문제를 클러스터에 효율적으로 분배하는 방법을 고민하고 있었 다. 내 지도교수는 스파크라는 것이 최신 유행이라며 설명해주었지만, 그 개념은 실현되기엔 너무 이상적이라 실패할 것으로 판단하고 바로 학부 졸업논문을 맵리듀스로 작성하였다. 그 후 스파크와 나 모두 성장하였지만, 스파크는 도저히 무시할 수 없는 거물이 되었다. 대략 2년 후, 스파크에 주목해야 함이 명백해졌다. MPI부터 맵리듀스에 이르기까지, 스파크 이전의 프레임워크들은 분산 시스템의 어렵고 세세 한 핵심들을 추상화하여 대규모 자원을 활용한 프로그램을 작성할 수 있도록 해주었다. 이들 프레임워크는 늘어가는 데이터를 처리하기 위해 발전해온 만큼, 빅데이터가 진출할 수 있는 범 위는 이들 프레임워크의 능력 한계와 밀접하게 연관될 수밖에 없었다. 스파크는 분산 프로그램 도 일반 프로그램을 작성하듯 쉽게 짤 수 있게 하여 이 범위를 좀 더 넓혀주고 있다. 스파크를 사용하면 ETL 파이프라인의 성능이 엄청나게 향상될 것이며 매일 하둡의 신에게 절 망을 하소연하는 맵리듀스 프로그래머들의 고통을 덜어줄 것이다. 그러나 나에게 가장 흥미 로운 점은 항상 스파크가 개척해준 복잡한 분석 작업이었다. 스파크는 반복적 알고리즘 Iterative Algorithm과 대화형 탐색Interactive Exploration을 지원하는 패러다임을 갖춰, 마침내 데이터 과학자가 대 규모 데이터셋을 생산적으로 다룰 수 있는 오픈 소스 프레임워크가 되었다. 나는 데이터 과학을 가르치는 가장 좋은 방법은 예제를 활용한 것이라고 생각한다. 이를 위해 나와 동료 저자들은 책에 여러 가지 응용 예를 담았으며, 가장 일반적인 알고리즘들과 데이터 셋들, 그리고 대규모 분석에서의 디자인 패턴들 간의 상호작용을 다루려고 노력하였다. 이 책 은 독자가 처음부터 끝까지 정독하라는 의도로 쓰이지 않았다. 여러분이 성취해봤으면 하는 주 제나 흥미를 자아내는 장을 펼쳐보자. 샌디 라이자 지은이의 말
  • 11. 11 이 책의 1장에서는 데이터 과학과 빅데이터 분석이라는 넓은 맥락에서 스파크의 가치를 소개 한다. 그다음부터 각 장은 스파크를 사용한 독립적인 분석으로 구성된다. 2장은 데이터를 정제 하는 간단한 예로 스파크와 스칼라를 사용한 데이터 분석의 기초를 소개한다. 그리고 그다음 몇 장은 가장 일반적으로 사용되는 알고리즘 몇 개를 전형적인 분야에 적용하면서, 핵심적인 머신러닝 문제를 스파크를 활용하여 푸는 방법을 살펴볼 것이다. 나머지 장들은 좀 더 특수한 분야를 다룬다. 위키백과의 텍스트 안에 숨겨진 의미 관계를 알아보거나 유전체학 데이터도 분 석해볼 것이다. 2판에 대하여 1판이 출간된 이후 스파크의 메이저 버전이 올라가면서 완전히 새로운 핵심 API가 도입되고 MLlib이나 Spark SQL과 같은 하위 컴포넌트들도 크게 바뀌었다. 2판에서는 이에 따른 사용 예를 전달하기 위해서 스파크의 예제 코드를 대폭 수정했고 관련 설명도 지금 시점에 맞게 새 로 썼다. 예제 내려받기 코드 예제와 데이터셋은 다음 주소에서 내려받을 수 있다. https://github.com/sryza/aas 이 책의 구성
  • 12. 12 아파치 스파크와 MLlib이 없었다면 여러분이 이 책을 읽을 수 있었을 리 만무하다. 우리 모두 는 스파크와 MLlib을 개발하고 오픈 소스로 제공한 개발팀과 여기에 참여한 수백 명의 기여자 에게 감사를 전한다. 이 책을 검토하느라 시간을 내어준 모든 전문가에게도 감사를 전하고 싶다. 미카엘 베르니코, 아담 브레인델, 이안 부스, 파르비즈 데이힘, 제레미 프리먼, 크리스 프레글리, 드바시시 고시, 줄리엣 호글랜드, 조나단 키블러, 니샤 무크타버, 프랭크 나샤프트, 닉 펜트리스, 코스타스 사 켈리스, 톰 화이트, 마르셀로 반진, 그리고 줄리엣 호글랜드(한 번 더), 모두 고마워! 신세를 졌어. 덕분에 책의 구성과 품질 모두 크게 개선되었다. 또한, 나(샌디)는 어려운 주제의 배경 이론과 관련하여 조언해준 조단 핀쿠스와 리처드 왕에 게 감사를 표한다. 이 책이 출판되고 독자의 손에 들어가기까지 물심양면으로 지원해주고 이런 경험을 하게 해준 마리 보구로와 오라일리에도 감사를 표한다. 샌디 라이자 감사의 말
  • 13. 13 CONTENTS 지은이 소개 ����������������������������������������������������������������������������������������������������������������������������� 4 옮긴이 소개 ����������������������������������������������������������������������������������������������������������������������������� 5 추천의 글 �������������������������������������������������������������������������������������������������������������������������������� 6 옮긴이의 말 ����������������������������������������������������������������������������������������������������������������������������� 8 지은이의 말 �������������������������������������������������������������������������������������������������������������������������� 10 이 책의 구성 ������������������������������������������������������������������������������������������������������������������������� 11 감사의 말 ����������������������������������������������������������������������������������������������������������������������������� 12 CHAPTER 1 빅데이터 분석하기 1.1 데이터 과학의 어려움...................................................................................................... 21 1.2 아파치 스파크란............................................................................................................. 23 1.3 이 책에 관하여............................................................................................................... 26 1.4 2판에 관하여.................................................................................................................. 26 CHAPTER 2 스칼라와 스파크를 활용한 데이터 분석 2.1 데이터 과학자를 위한 스칼라........................................................................................... 30 2.2 스파크 프로그래밍 모델.................................................................................................. 32 2.3 레코드 링크.................................................................................................................... 32 2.4 스파크 셸과 SparkContext 시작하기............................................................................... 34 2.5 클러스터에서 클라이언트로 데이터 가져오기.................................................................... 41 2.6 클라이언트에서 클러스터로 코드 보내기........................................................................... 46 2.7 RDD에서 Data Frame으로............................................................................................. 47 2.8 DataFrame API로 데이터 분석하기................................................................................. 51 2.9 데이터프레임에 대한 빠른 요약 통계................................................................................ 57 2.10 데이터프레임의 축 회전과 형태변환............................................................................... 59
  • 14. 14 CONTENTS 2.11 데이터프레임을 결합하고 특징 선택하기........................................................................ 63 2.12 실제 환경을 위한 모델 준비하기.................................................................................... 65 2.13 모델 평가..................................................................................................................... 67 2.14 한 걸음 더 나아가기..................................................................................................... 69 CHAPTER 3 음악 추천과 Audioscrobbler 데이터셋 3.1 데이터셋........................................................................................................................ 72 3.2 교차 최소 제곱 추천 알고리즘.......................................................................................... 73 3.3 데이터 준비하기............................................................................................................. 77 3.4 첫 번째 모델 만들기........................................................................................................ 82 3.5 추천 결과 추출 검사하기................................................................................................. 86 3.6 추천 품질 평가하기......................................................................................................... 89 3.7 AUC 계산하기................................................................................................................ 91 3.8 하이퍼파라미터 선택하기................................................................................................ 93 3.9 추천 결과 만들기............................................................................................................ 96 3.10 한 걸음 더 나아가기..................................................................................................... 98 CHAPTER 4 의사 결정 나무로 산림 식생 분포 예측하기 4.1 회귀로 돌아와서.......................................................................................................... 102 4.2 벡터와 특징................................................................................................................. 102 4.3 학습 예제.................................................................................................................... 104 4.4 의사 결정 나무와 랜덤 포레스트................................................................................... 104 4.5 Covtype 데이터셋....................................................................................................... 108 4.6 데이터 준비하기.......................................................................................................... 109 4.7 첫 번째 의사 결정 나무................................................................................................ 111 4.8 의사 결정 나무 하이퍼파라미터..................................................................................... 119
  • 15. 15 4.9 의사 결정 나무 튜닝하기.............................................................................................. 121 4.10 범주형 특징 다시 살펴보기......................................................................................... 126 4.11 랜덤 포레스트........................................................................................................... 129 4.12 예측하기................................................................................................................... 132 4.13 한 걸음 더 나아가기.................................................................................................. 133 CHAPTER 5 K-평균 군집화로 네트워크 이상 탐지하기 5.1 이상 탐지.................................................................................................................... 136 5.2 K-평균 군집화............................................................................................................ 137 5.3 네트워크 침입.............................................................................................................. 138 5.4 KDD 컵 1999 데이터셋............................................................................................... 139 5.5 첫 번째 군집화하기...................................................................................................... 140 5.6 k 선정하기.................................................................................................................. 143 5.7 R에서 시각화하기........................................................................................................ 146 5.8 특징 정규화................................................................................................................. 152 5.9 범주형 변수................................................................................................................. 154 5.10 엔트로피와 함께 레이블 활용하기............................................................................... 156 5.11 군집화하기................................................................................................................ 157 5.12 한 걸음 더 나아가기.................................................................................................. 160 CHAPTER 6 숨은 의미 분석으로 위키백과 이해하기 6.1 문서-단어 행렬........................................................................................................... 163 6.2 데이터 구하기.............................................................................................................. 165 6.3 파싱하여 데이터 준비하기............................................................................................ 166 6.4 표제어 추출................................................................................................................. 168 6.5 단어빈도-역문서빈도(TF-IDF) 계산하기....................................................................... 170
  • 16. 16 CONTENTS 6.6 특잇값 분해................................................................................................................. 172 6.7 중요한 의미 찾기......................................................................................................... 174 6.8 낮은 차원 표현에 대한 의문과 고찰............................................................................... 179 6.9 단어와 단어 사이의 연관도........................................................................................... 180 6.10 문서와 문서 사이의 연관도......................................................................................... 183 6.11 문서와 단어 사이의 연관도......................................................................................... 185 6.12 여러 개의 단어로 질의하기......................................................................................... 186 6.13 한 걸음 더 나아가기.................................................................................................. 188 CHAPTER 7 그래프엑스로 동시발생 네트워크 분석하기 7.1 네트워크 분석 사례: MEDLINE의 인용 색인.................................................................. 191 7.2 데이터 구하기.............................................................................................................. 192 7.3 스칼라 XML 라이브러리로 XML 문서 파싱하기.............................................................. 195 7.4 MeSH 주요 주제와 주제들의 동시발생 분석하기............................................................ 198 7.5 그래프엑스로 동시발생 네트워크 구성하기.................................................................... 201 7.6 네트워크의 구조 이해하기............................................................................................ 206 7.6.1 연결 성분............................................................................................................. 206 7.6.2 차수의 분포.......................................................................................................... 209 7.7 관련성 낮은 관계 필터링하기........................................................................................ 212 7.7.1 EdgeTriplets 처리................................................................................................ 213 7.7.2 필터링된 그래프 분석하기....................................................................................... 216 7.8 작은 세상 네트워크...................................................................................................... 217 7.8.1 클릭과 군집계수.................................................................................................... 218 7.8.2 프레겔을 사용하여 평균 경로 길이 계산하기............................................................... 220 7.9 한 걸음 더 나아가기 ................................................................................................... 226
  • 17. 17 CHAPTER 8 뉴욕 택시 운행 데이터로 위치 및 시간 데이터 분석하기 8.1 데이터 얻기................................................................................................................. 228 8.2 스파크에서 서드파티 라이브러리로 작업하기................................................................. 229 8.3 지리 데이터와 Esri Geometry API, 그리고 Spray.......................................................... 230 8.3.1 Esri Geometry API 살펴보기................................................................................. 231 8.3.2 GeoJSON 소개................................................................................................... 233 8.4 뉴욕 택시 운행 데이터 준비하기................................................................................... 236 8.4.1 잘못된 레코드 대규모로 다루기................................................................................ 239 8.4.2 지리 정보 분석하기................................................................................................ 244 8.5 스파크에서 세션화 작업 수행하기................................................................................. 247 8.5.1 세션 구성하기: 스파크에서 보조 정렬하기.................................................................. 249 8.6 한 걸음 더 나아가기..................................................................................................... 252 CHAPTER 9 몬테카를로 시뮬레이션으로 금융 리스크 추정하기 9.1 전문 용어.................................................................................................................... 254 9.2 VaR 계산 방법............................................................................................................. 255 9.2.1 분산-공분산 ........................................................................................................ 255 9.2.2 과거 기반 시뮬레이션............................................................................................. 256 9.2.3 몬테카를로 시뮬레이션........................................................................................... 256 9.3 우리의 모델................................................................................................................. 257 9.4 데이터 구하기.............................................................................................................. 258 9.5 전처리하기.................................................................................................................. 259 9.6 요인 가중치 결정하기................................................................................................... 263 9.7 표본추출..................................................................................................................... 265 9.7.1 다변량 정규분포.................................................................................................... 268 9.8 실험 실행하기.............................................................................................................. 270
  • 18. 18 CONTENTS 9.9 수익 분포 시각화하기................................................................................................... 274 9.10 결과 평가하기........................................................................................................... 275 9.11 한 걸음 더 나아가기.................................................................................................. 278 CHAPTER 10 BDG 프로젝트와 유전체학 데이터 분석하기 10.1 모델링과 저장소를 분리하기....................................................................................... 283 10.2 ADAM CLI를 이용한 유전체학 데이터 처리................................................................ 287 10.2.1 파케이 형식과 열 기반 저장소............................................................................... 294 10.3 ENCODE 데이터로부터 전사인자 결합 부위 예측하기................................................. 296 10.4 1000 지놈 프로젝트에서 유전자형 질의하기............................................................... 305 10.5 한 걸음 더 나아가기.................................................................................................. 308 CHAPTER 11 파이스파크와 썬더로 신경 영상 데이터 분석하기 11.1 파이스파크 소개........................................................................................................ 312 11.1.1 파이스파크 내부 구조........................................................................................... 314 11.2 썬더 라이브러리 개요와 설치..................................................................................... 316 11.3 썬더로 데이터 읽어 들이기......................................................................................... 317 11.3.1 썬더 핵심 자료형................................................................................................. 323 11.4 썬더로 신경 세포 유형 분류하기................................................................................. 324 11.5 한 걸음 더 나아가기.................................................................................................. 329 찾아보기 ��������������������������������������������������������������������������������������������������������������������������������������������������� 330
  • 19. 191장 빅데이터 분석하기 “데이터 애플리케이션은 소시지와 비슷하다. 어떻게 만드는지 모르는 편이 나으니까.” -오토 폰 비스마르크1 ● ‌‌셀 수 없이 많은 트랜잭션과 수천 가지 특징을 활용해 신용카드 부정 사용을 감지하는 모델 구축 ● ‌‌수백만 사용자에게 수백만 가지의 제품 중 적절한 것을 지능적으로 추천 ● ‌‌수백만의 요소를 고려한 포트폴리오 시뮬레이션을 통한 투자 위험도 추정 ● ‌‌질환의 유전적 연관성을 파악하기 위한 대규모 인간 유전자 분석 몇 년 전만 하더라도 이와 같은 작업은 꽤 어려운 일이었다. 요즘을 빅데이터의 시대라고 말할 수 있는 이유는 기존에는 경험하지 못한 규모로 정보를 수집, 저장, 처리할 수 있는 도구가 준비되 었기 때문이다. 이 배경에는 오픈 소스 소프트웨어 생태계가 있는데, 그 덕분에 엄청난 양의 데 이터를 다룰 수 있는 컴퓨터 클러스터 환경을 저렴하게 사용할 수 있게 되었다. 하둡Apache Hadoop 과 같은 분산 시스템이 대세가 되었으며, 거의 모든 분야의 수많은 현장에서 활용하고 있다. 하지만 돌덩어리와 끌이 있다고 해서 조각상이 저절로 만들어지는 것이 아니듯, 빅데이터와 이 를 다룰 도구를 갖추었다는 것과 이를 활용하여 무언가 쓸모 있는 일을 한다는 것 사이에는 차 이가 있다. 데이터 과학이 필요한 이유가 바로 여기에 있다. 조각이 도구를 사용하여 원석을 다 른 사람들에게 의미 있는 무언가로 바꾸는 작업이듯, 데이터 과학도 도구를 사용하여 원본 데 1 옮긴이_ 비스마르크는 원래 ‘데이터 애플리케이션’이 아니라 ‘법률’이 그러하다고 말했다. 빅데이터 분석하기 CHAPTER 1 샌디 라이자
  • 20. 20 9가지 사례로 익히는 고급 스파크 분석 (2판) 이터를 데이터 과학자가 아닌 사람들의 관심을 끌 만한 의미 있는 것으로 바꾸는 작업이다. 흔히 ‘쓸모 있는 일 하기’는 스키마Schema를 설계하고 SQL을 사용하여 “등록 과정의 세 번째 페 이지에 도달한 엄청난 수의 사용자 중 25세 이상은 몇 명인가?”와 같은 질문에 답하는 것을 의 미한다. 이런 질문에 쉽게 답할 수 있도록 데이터 웨어하우스Data Warehouse를 구성하고 정보를 체 계화하는 방법을 다루는 분야도 중요하지만, 이 책에서는 이런 복잡한 일은 되도록 다루지 않 으려 한다. 때로는 ‘쓸모 있는 일 하기’에는 노력이 더 필요할 수 있다. SQL은 여전히 주요한 수단이다. 하 지만 다루는 데이터가 매우 독특하거나 분석 작업이 복잡하다면 SQL보다 유연하고 근본적이 며 머신러닝과 통계 기능이 풍부한 새로운 프로그래밍 패러다임이 필요해진다. 이런 유형의 분 석이 이 책에서 이야기하려는 대상이다. 오랜 기간에 걸쳐 R, PyData 스택(파이썬 데이터 분석 도구 모음), 옥타브Octave와 같은 오픈 소스 프레임워크 덕에 작은 데이터셋Dataset을 빠르게 분석하고 모델을 수립할 수 있었다. 데이 터셋의 일부를 사용해서 머신러닝 모델을 학습시키고 나머지 데이터의 레이블을 예측하는 일 이 10줄 이내의 코드로도 가능하다. 여기서 조금만 더 나아가면 결측치Missing Data를 보정하고, 몇몇 모델을 실험해 최적의 모델을 찾고, 한 모델의 결과를 다른 모델을 적합Fit시키기 위한 입 력으로 사용할 수 있다. 대규모 데이터셋에서 같은 결과를 얻기 위해 컴퓨터 클러스터 환경을 활용한다면 이러한 과정이 어떻게 달라질까? 단순히 프레임워크를 여러 노드에서 동작하도록 확장하고 프로그래밍 모델은 그대로 유지한 채 분산 환경에서 잘 동작하게끔 내부를 수정하는 것이 옳을 수도 있다. 하지만 단일 노드에서 는 문제가 되지 않았지만 분산 컴퓨팅에서는 새롭게 고민해야 하는 것들이 있다. 예를 들어 네 트워크는 메모리보다 월등히 느리므로 데이터가 클러스터의 여러 노드에 나뉘어 있다면 많은 데이터를 참조하는 알고리즘은 성능이 매우 나빠진다. 분산 환경에서 동작하는 노드의 수가 늘 어날수록 오류가 발생할 가능성도 커진다. 이러한 사실들을 종합해볼 때 고도의 병렬 실행 코 드를 쉽게 작성할 수 있는, 분산 환경의 특징을 충실하게 활용하는 프로그래밍 패러다임이 필 요하다. 하나의 노드에서 동작하는 PyData나 R 같은 도구가 소프트웨어 커뮤니티에서 최근 주목받 고 있지만, 이들만이 데이터 분석을 위한 도구는 아니다. 대량의 데이터를 다루는 유전체학 같 은 과학 분야에서도 수십 년간 병렬 컴퓨팅 프레임워크를 발전시켜왔다. 이 분야에서 데이터를
  • 21. 211장 빅데이터 분석하기 다루는 사람 대부분은 HPCHigh-Performance Computing (고성능 컴퓨팅)라는 클러스터 컴퓨팅 환경 에 익숙하다. PyData나 R은 확장성이 부족해 문제라면, HPC에서는 추상화 수준이 지나치게 낮아서 발생하는 나쁜 사용성이 문제다. 예컨대 DNA 염기서열로 가득 찬 커다란 파일을 병렬 처리하려면 수작업으로 일일이 작은 파일로 나눈 후, 각각에 대한 처리 작업을 클러스터의 스 케줄러에 하나씩 등록해야 한다. 일부에서 오류가 발생하면 작업자는 그 오류를 직접 찾아내서 수동으로 재입력해야 한다. 분석하다 보면 전체 데이터셋의 정렬과 같은 데이터 전체를 사용하 는 작업을 수행해야 할 때가 있다. 이 경우에는 커다란 데이터 모두를 하나의 노드에 밀어 넣거 나 MPI와 같은 저수준 분산 프레임워크에 의존해야 하는데, 그러려면 C 언어와 분산 네트워크 환경을 잘 이해하고 있어야 한다. 또, HPC 환경에 맞게 제작된 도구들은 저수준 저장소 모델로부터 인메모리In-memory 데이터 모 델을 분리하기가 어려운 경우가 많다. 예를 들어 많은 도구가 POSIX 파일시스템의 단일 데이 터 스트림으로만 데이터를 읽을 수 있도록 만들어졌다. 이러한 도구는 병렬화하거나 데이터베 이스 같은 다른 종류의 백엔드 저장소를 사용하도록 변경하기가 쉽지 않다. 하둡 생태계의 요 즘 시스템들은 사용자가 클러스터 환경을 단일 컴퓨터 환경처럼 다룰 수 있도록 추상화해준다. 파일을 쪼개 여러 노드에 걸쳐 있는 저장소에 분산하고, 일을 작은 단위로 나눠 처리하고, 오류 를 복구하는 모든 작업을 자동으로 수행한다. 하둡 생태계는 큰 데이터 파일을 다루는 과정도 자동화할 수 있으며, HPC보다 훨씬 저렴하다. 1.1 데이터 과학의 어려움 데이터 과학을 실제로 적용하다 보면 종종 어려운 문제에 부딪히게 된다. 클라우데라Cloudera의 데이터 과학팀은 이러한 어려움을 널리 알리는 데 큰 역할을 해왔다. 대량의 데이터로부터 복 잡한 분석을 성공적으로 처리하는 시스템을 구축하려면 (설사 실제로 벌어지지 않더라도) 이 런 어려움에 관해서 알고 있어야 한다. 첫째, 성공적인 분석을 위한 작업 대부분은 데이터의 전처리 과정에서 이뤄진다. 데이터는 너 저분하다. 그래서 데이터를 활용하기 전에 정제, 개조, 합치기, 섞기 같은 여러 가지 전처리 과 정이 필요하다. 특히, 맨눈으로 검사하기 어려울 정도로 데이터가 많다면 어떠한 전처리 과정 이 필요한지를 파악하는 일조차 별도의 처리 과정을 거쳐야 한다. 심지어 모델의 성능을 최적
  • 22. 22 9가지 사례로 익히는 고급 스파크 분석 (2판) 화해야 할 때는 알고리즘을 선택해서 구현하는 일보다 특징을 추출하고 선택하는 데 일반적으 로 더 큰 노력이 들어간다. 예컨대 온라인 구매 데이터에서 사기 행위를 찾는 모델을 만들고자 한다면 데이터 과학자들은 사용자가 작성하는 주문서 상의 여러 정보, 즉 사용자 IP의 위치 정보, 로그인 시각, 웹 사이트 내비게이션 로그와 같은 활용 가능한 수많은 특징 중에서 무엇을 사용할지 선택해야 한다. 선 택한 각 특징을 머신러닝 알고리즘에 적합한 벡터로 변환해야 하며, 이를 위해서 더블형Double 숫자로 이뤄진 2차원 배열을 수학적 모델로 변환하는 일 정도는 해줄 수 있는 시스템이 있어야 한다. 둘째, 데이터 과학은 기본적으로 반복 Iteration 작업들로 구성된다. 보통은 모델을 만들고 분석하 는 과정에서 같은 데이터를 여러 번 반복해서 읽게 된다. 이는 머신러닝이나 통계적 절차의 특 징에 기인하는데, 값이 수렴할 때까지 입력 데이터를 반복해서 사용하는 확률적 구배법Stochastic Gradient Descent (SGD)이나 기댓값 최대화법Expectation Maximization 같은 널리 사용되는 최적화 기법들 을 보면 알 수 있다. 반복 과정은 데이터 과학자 자신의 작업 흐름 안에서도 중요하다. 데이터 과학자가 처음 접하는 데이터셋을 파악하고자 할 때, 특정 질의의 결과를 바탕으로 다음에 수 행해야 할 질의를 결정하는 것이 일반적이다. 모델을 만들 때도 데이터 과학자는 단 한 번의 시 도로 모델이 완성되리라 기대하지 않는다. 실험을 통해서 알맞은 특징을 선택하고, 적절한 알 고리즘을 선택하고, 유의성 검정을 하고, 맞춤 하이퍼파라미터들을 찾아낸다. 어떤 프레임워크 가 같은 데이터를 매번 디스크에서 가져온다면 전체 과정의 속도가 디스크 입출력만큼 느려지 고, 그 결과 반복해서 시도해볼 수 있는 횟수가 줄어들게 된다. 셋째, 잘 돌아가는 모델이 완성되었다고 해서 일이 끝나는 것은 아니다. 데이터 과학의 핵심이 데이터를 직접 분석하지 않는 사람들에게 유용한 정보를 뽑아내는 것이라면, 데이터 과학자 컴 퓨터의 텍스트 파일에 회귀 가중치의 목록 형태로 (즉, 다른 사람이 이해하기 힘든 형태로) 저 장된 모델을 만드는 일은 진정한 목적이 될 수 없다. 데이터 애플리케이션이라면 추천 시스템 이나 실시간 사기 탐지 시스템처럼 의미 있게 활용할 수 있어야 한다. 이런 시스템에서는 모델 이 제품 서비스의 일부이므로 주기적으로 혹은 실시간으로 다시 생성해야 할 수도 있다. 이런 상황에서는 연구를 위한 분석과 현장을 위한 분석을 구분해야 한다. 연구를 위한 분석은 데 이터에 대한 탐사 분석Exploratory Analytics을 의미한다. 이 분석에서는 데이터의 특성을 이해하려 시 도한다. 그 결과를 시각화하고, 아직 적용하지 않은 이론들을 시험한다. 여러 종류의 특징과 현
  • 23. 231장 빅데이터 분석하기 재의 데이터를 보강할 수 있는 후보 데이터도 시험하게 된다. 한두 가지는 성공하기를 바라면 서 다양한 알고리즘을 시험하는 것이다. 반면 데이터 애플리케이션을 구축하는 현장에서는 운 영을 위한 분석Operational Analytics을 수행한다. 분석 모델을 실제 의사 결정에 영향을 주는 서비스에 적용하며, 일정 기간 모델의 성과를 추적하고, 정확도를 조금이라도 올리기 위한 미세 조정 방 안을 궁리한다. 그리고 서비스 수준 협약서Service Level Agreement (SLA)와 가동시간Uptime도 고민하 게 된다. 현재의 사례를 보면, R과 같은 언어로 탐사 분석을 수행한 이후에, 양산 단계에서는 데이터 처리 과정을 자바나 C++로 완전히 새롭게 구현하는 것이 일반적이다. 물론 처음에 만든 모델의 코드를 실무 애플리케이션에서도 사용할 수 있다면 좋겠지만, R과 같 은 언어는 성능도 좋지 않은 데다가 제품의 다른 구성요소들과 통합하기에는 적합하지 않다. 반대로 자바나 C++ 쪽은 탐사 분석에 쓸만한 도구를 찾아보기 어렵다. 자바나 C++에서는 데 이터와 상호작용할 수 있는 REPLRead-Evaluate-Print-Loop 환경이 부족하며, 간단한 변환식을 구현 하는 데도 많은 양의 코드가 필요하다. 그리하여 모델링 과정에서도 쉽게 쓸 수 있고 제품에도 적용할 수 있는 프레임워크가 필요한 상황이 되었다. 1.2 아파치 스파크란 아파치 스파크로 들어가 보자. 스파크는 세련된 방법으로 클러스터의 여러 노드로 프로그램 을 분배하고, 그 위에서 동작하는 프로그램을 개발할 수 있도록 개발된 오픈 소스 프레임워 크다. UC 버클리의 AMPLab에서 탄생해, 지금은 아파치 소프트웨어 재단에서 관리하는 스 파크는 데이터 과학자가 분산 프로그래밍을 할 수 있게 해주는 아마도 최초의 오픈 소스 소 프트웨어일 것이다. 스파크를 쉽게 이해하기 위하여 스파크의 선배라 할 수 있는 맵리듀스MapReduce와 비교해보자. 맵리듀스는 수십만 개의 노드를 활용하는 병렬 처리를 간단히 구현할 수 있는 모델로, 대량의 데이터 연산 분야에 일대 혁신을 가져왔다. 맵리듀스는 거의 선형에 가까운 확장성을 보여준 다. 데이터가 많아지면 컴퓨팅 노드도 그만큼 추가하여 같은 시간에 일을 마무리 지을 수 있음 을 의미한다. 그리고 “하나의 노드에서는 잘 발생하지 않는 오류라도 규모가 큰 클러스터 환경 에서는 일상적으로 발생한다”는 상식으로부터도 자유롭다. 맵리듀스는 일을 작은 단위 작업으로 쪼개고, 단위 작업에서 오류가 나더라도 전체에 영향을 주지 않도록 우아한 방식으로 오류를
  • 24. 24 9가지 사례로 익히는 고급 스파크 분석 (2판) 처리한다. 스파크는 맵리듀스의 선형 확장성과 결함 포용Fault Tolerance성을 유지하면서, 세 가지 중요한 개 선을 이뤄냈다. 먼저, ‘맵 단계 후 리듀스 단계’를 지키지 않아도 되며, 훨씬 일반적인 방향성 비 순환 그래프Directed Acyclic Graph (DAG) 형태로 정의한 연산들을 실행할 수 있다. 맵리듀스라면 중 간 결과를 분산 파일시스템에 반드시 저장해야 하는 상황에서, 스파크는 파이프라인의 다음 단 계로 중간 결과를 바로 넘길 수 있다는 뜻이다. 이는 맵리듀스의 후손이자 마이크로소프트 연 구소에서 시작된 Dryad(https://goo.gl/Or3T8P)와 유사한 방식이다. 두 번째, 사용자가 연 산을 더욱 자연스럽게 표현할 수 있도록 풍부한 변환 방식을 제공하여 처리 능력을 확장하고 있다. 개발자 중심의 기능을 제공하여 몇 줄의 코드만으로 복잡한 파이프라인을 구현할 수 있 는 간소화된 API를 제공한다. 마지막 개선은 인메모리 처리 방식이다. 스파크의 데이터셋Dataset과 데이터프레임DataFrame을 통 한 추상화는 개발자가 데이터 처리 파이프라인의 어느 지점에서라도 데이터를 클러스터의 메 모리로 저장할 수 있도록 해준다. 이후 단계에서 같은 데이터를 사용해야 한다면 데이터를 다 시 연산하거나 디스크로부터 다시 읽을 필요가 없다는 뜻이다. 이 능력 덕분에 과거의 분산 처 리 엔진들이 하지 못하던 용도로도 사용할 수 있게 되었다. 예를 들어 데이터셋을 여러 번 훑어 야 하는 알고리즘이나 사용자 요청에 빠르게 응답하기 위해 커다란 인메모리 데이터셋을 스캔 해야 하는 반응형 애플리케이션Reactive Application에 아주 적합하다. 데이터 분석에서 가장 큰 병목이 CPU, 디스크, 네트워크 같은 컴퓨팅 환경이 아니라 분석가의 생산성에 달려 있음을 이해한다면, 앞 절에서 이야기한 ‘데이터 과학의 어려움’을 해결하는 데 스파크가 좋은 해답이라는 사실이 아마도 가장 중요할 것이다. 전처리부터 모델 평가까지의 전 체 과정을 단일 프로그래밍 환경에서 수행하는 것이 개발 속도 면에서 얼마나 큰 이점인지는 아무리 과장해도 지나치지 않을 것이다. REPL 환경의 분석 라이브러리들을 가지고 많은 것을 표현할 수 있는 프로그래밍 모델로 묶어낼 수 있는 스파크에서는 맵리듀스와 같은 특정 프레임 워크를 사용하느라 여러 IDE를 오갈 필요도 없고, R과 같은 프레임워크를 사용하느라 하둡 분 산 파일시스템Hadoop Distributed File System (HDFS)으로부터 데이터를 샘플링하거나 이리저리 이동 시킬 필요도 없다. 분석가가 데이터를 조사하는 시간이 절약될수록 뭔가 쓸만한 일을 할 가능 성은 더 커진다. 데이터 조작 또는 ETL에 적용할 수 있다는 관점에서는 스파크는 빅데이터를 다루는 매트랩
  • 25. 251장 빅데이터 분석하기 Matlab이라기보다는 빅데이터를 다루는 파이썬에 가까워 보인다. 범용 연산 엔진으로서 스파크 의 핵심 API는 통계, 머신러닝, 행렬 연산의 어떤 기능과도 독립적인, 데이터 변환을 위한 강 력한 토대를 제공한다. 스파크의 스칼라 API와 파이썬 API 덕분에 범용 언어에서 쉽게 불러 쓸 수 있고, 기존의 다른 라이브러리와 함께 사용할 수도 있다. 스파크의 인메모리 캐시 기능은 반복적으로 이뤄지는 크고 작은 모든 데이터 처리에 이상적이 다. 이 기능을 활용하면 학습 데이터를 반복해서 읽어야 하는 머신러닝 알고리즘에서는 학습 데이터를 메모리에 캐싱할 수 있다. 데이터 과학자가 데이터를 파악하려 할 때도 데이터를 디 스크에서 매번 읽어 들이는 대신, 메모리에 올려둔 채 다양한 질의를 테스트해보고, 또 그 결과 를 메모리에 쉽게 저장할 수도 있다. 마지막으로, 스파크는 탐사 분석 시스템과 운영 분석 시스템 사이의 간격을 좁힐 수 있다. 세간 에서 데이터 과학자는 통계학자보다는 엔지니어링을 잘하고 엔지니어보다는 통계 활용에 능하 다고 이야기하는데, 적어도 스파크는 대부분의 다른 탐사 분석 시스템보다는 운영 시스템에 적 용하기 좋고, 운영 시스템에서 일반적으로 사용하는 기술들에 비해 데이터 탐사 분석에도 적합 하다. 스파크는 근본적으로 성능과 신뢰성 모두를 위해서 만들어졌다. 자바 가상 머신Java Virtual Machine (JVM)에서 돌아가기 때문에 자바 스택에서 돌아가는 수많은 운영 및 디버깅 도구도 활 용할 수 있다. 스파크는 하둡 생태계의 다양한 도구와 통합하기에도 좋다. 스파크는 맵리듀스가 지원하는 모 든 데이터 포맷을 읽고 쓸 수 있어서, 에이브로Apache Avro, 파케이Apache Parquet와 같은 하둡의 일 반적인 데이터 저장 파일 포맷도 사용할 수 있다. 물론 하둡 이전부터 사용된 쉼표로 분리된 텍 스트 형식(CSV)도 지원한다. 그리고 HBase와 카산드라Apache Cassandra 같은 NoSQL 데이터베 이스로부터 데이터를 읽고 쓸 수도 있다. 스파크의 스트림 처리 라이브러리인 스파크 스트리밍 Spark Streaming을 사용하면 플룸Apache Flume이나 카프카Apache Kafka로부터 연속적으로 데이터를 입력 받을 수도 있다. SQL 라이브러리인 Spark SQL로는 하이브 메타스토어Apache Hive Metastore와 상 호작용이 가능하며, 하이브 온 스파크Hive on Spark를 사용하여 맵리듀스 대신 스파크를 하이브의 기본 실행 엔진으로 사용할 수 있다. 하둡의 스케줄링과 자원 관리를 담당하는 YARNYet Another Resource Negotiator 내부에서도 동작한다. 이를 통해서 클러스터 사이에서 자원을 동적으로 공유할 수 있으며, 맵리듀스나 임팔라Apache Impala 같은 다른 처리 엔진과 동일한 정책으로 관리할 수 있 게 되었다.
  • 26. 26 9가지 사례로 익히는 고급 스파크 분석 (2판) 1.3 이 책에 관하여 이 책의 나머지 부분에서는 스파크의 장점이나 단점은 다루지 않는다. 기본적인 스파크 프 로그래밍 모델과 스칼라 언어의 기초는 소개하지만, 스파크의 레퍼런스에 해당하는 내용이 나 모든 것에 대한 포괄적인 지침 같은 것은 제공하지 않으려 한다. 머신러닝, 통계학, 선형 대수의 튜토리얼로 만들 생각도 없다. 물론, 필요하다면 기본적인 배경은 설명할 것이다. 그 대신, 대량의 데이터셋을 다루는 복잡한 분석을 스파크로 실행해보며, 그 생생한 느낌을 여러분께 전달하고자 한다. 단순히 모델을 구축하고 평가하는 데 그치지 않고, 전체 파이프 라인을 돌아보며 데이터 정제, 전처리, 탐사 분석, 실제 제품으로 만들기까지를 보여주고자 한다. 아마도 실제 예제를 통해 보여주는 방법이 최선일 것이다. 그래서 우선 스파크와 그 생태계를 간단히 설명한 후, 그다음 장부터는 각 분야의 데이터를 스파크로 분석하는 독립 적인 설명들로 채울 것이다. 가능하다면 단순히 ‘정답’을 제공하기보다는 데이터 과학의 절차 전체, 즉 모든 반복, 막다른 길, 재시도 등을 설명할 것이다. 이 책은 스칼라, 스파크, 머신러닝, 데이터 분석에 더 친숙 해지는 계기가 될 것이다. 그리고 이 모두는 더 큰 목적을 향한 과정이다. 우리는 이번 장의 처음에 언급한 여러 업무에 어떻게 접근하는지를 보여주려는 것이다. 약 30쪽 내외로 구성 된 각 장을 통해 데이터 애플리케이션의 일부를 만들어내는 방법을 가능한 한 실제처럼 설 명할 것이다. 1.4 2판에 관하여 2015년과 2016년에 스파크는 많은 변화를 겪었으며, 그 결과로 2016년 7월에 스파크 2.0 이 출시되었다. 가장 큰 변화는 스파크의 핵심 API에서 이뤄졌다. 1.x 버전의 스파크 API는 여러 컴퓨터 클러스터에 걸쳐 느슨하게 인스턴스화된 객체의 모음인 탄력적 분산 데이터셋Resilient Distributed Dataset (RDD)을 중심으로 구성되어 있었다. RDD를 기반으로 강력하고 표현력 높은 API를 구성할 수 있었지만, 중요한 문제가 두 가지 생 겼다. 첫째, 성능과 안정성의 측면에서 적합하지 않았다. 자바나 파이썬 객체를 기반으로 했기 때문에 메모리 사용 면에서 비효율적이었고, 가비지 컬렉션 때문에 스파크 프로그램이 대기해
  • 27. 271장 빅데이터 분석하기 야 하는 시간이 길어졌다. 또한, 실행 계획이 API에 묶여 있어, 사용자가 프로그램의 실행을 최적화하는 부담이 커지게 되었다. 예를 들어, 전통적인 RDBMS를 사용하면 조인할 테이블의 크기에 따라 최선의 조인 전략이 알아서 선택되는 반면, 스파크를 사용할 때는 사용자가 이를 직접 선택해야 했다. 둘째, 스파크 API는 일반적으로 데이터가 구조화된 관계형 모델에 잘 들 어맞는다는 사실을 무시했다. 튜플 내에서의 순서 대신 열의 이름을 사용한다든지의 방법으로 데이터를 훨씬 더 쉽게 조작할 수 있는 기본 자료형을 제공할 수 없었다. 스파크 2.0은 RDD를 Dataset과 DataFrame으로 대체하여 이러한 문제점을 해결했다. Dataset은 RDD와 비슷하지만 객체를 인코더에 매핑하여 인메모리 표현에 훨씬 효율적이다. 이를 통해서 스파크 프로그램을 더 빠르고, 더 작은 메모리로, 더 예측 가능하게 실행할 수 있 다. 또, 데이터셋과 실행 계획 사이에 최적화 기능을 배치하여 실행 방법에 대해서 더 지능적인 결정을 내릴 수 있다. DataFrame은 관계형 데이터, 즉 고정된 열의 데이터가 행 단위로 이뤄 진 데이터를 모델링하는 데 특화된 Dataset의 하위클래스다. 열 개념을 도입하여 더 깨끗하고 표현력이 풍부한 API를 사용할 수 있으며, 거기에 다양한 성능 최적화가 가능해졌다. 예를 들 어, 결과를 만들어내는 데 열의 일부만 필요하다는 사실을 알고 있다면, 열 전체를 메모리에 올 리지 않아도 된다. 그리고 이전에는 사용자 정의 함수로 정의해야 했던 많은 변환을 이제 API 에서 직접 표현할 수 있다. 이 기능은 파이썬을 사용할 때 특히 유용한데, 스파크 내부 동작이 파이썬에서 정의된 함수보다 변환을 훨씬 빠르게 수행할 수 있기 때문이다. 또한 DataFrame 은 Spark SQL과 상호운용성을 제공하므로, 사용자가 SQL 질의를 작성해서 DataFrame을 반환받고, 그 DataFrame을 스파크가 지원하는 프로그래밍 언어에서 사용할 수 있다. 새 API 는 기존 API와 매우 유사해 보이지만, 세부적인 변화 때문에 거의 모든 스파크 프로그램이 수 정되어야 한다. 스파크 2.0은 이러한 변화 외에도, 머신러닝과 통계 분석에 사용하는 API도 크게 변경되었다. 이전 버전에서는 머신러닝 알고리즘별로 고유한 API가 있어서, 알고리즘에 적용할 데이터를 준비하거나 특정 알고리즘의 결과를 다른 알고리즘에 적용하고자 할 때는 각각을 조합하는 코 드를 만들어야 했다. 스파크 2.0에 포함된 Spark ML API는 머신러닝 알고리즘과 특징Feature 의 변환 단계의 파이프라인을 구성할 수 있는 프레임워크를 제공한다. 인기 있는 파이썬 도구 인 사이킷런Scikit-Learn의 API에서 영감을 받아서, 데이터의 파라미터를 학습하고, 이 파라미터 를 데이터를 변환시키는 데 사용하는 객체인 추정자Estimator와 변환자Transformer를 중심으로 돌아간 다. Spark ML API는 DataFrame API와 많은 부분이 결합되어 있어, 관계형 데이터로도 머
  • 28. 28 9가지 사례로 익히는 고급 스파크 분석 (2판) 신러닝을 쉽게 수행할 수 있다. 예를 들어서 사용자는 특징 벡터의 순서 값 대신 이름으로 특징 을 참조할 수 있다. 이러한 변화들이 반영되다 보니, 이 책 초판의 많은 부분이 의미가 없게 되었다. 이번 2판은 새 로운 스파크 API를 사용하기 위해서 모든 장을 수정하였다. 추가로, 더 이상 관련이 없는 부분 은 제외했다. 예를 들어 몇몇 복잡한 API를 다루던 전체 부록을 삭제했는데, 이 부분을 지금은 사용자 개입 없이 스파크가 알아서 처리해주기 때문이다. 안정적으로 성숙한 스파크의 시대가 된 터라, 스파크를 사용한 분석에 있어서 수년간은 이 책이 유용한 자료로 남아있기를 희망한다.
  • 29. 292장 스칼라와 스파크를 활용한 데이터 분석 “흥미를 잃지 않는다면 못할 일은 아무 것도 없다.” -데이비드 포스터 월리스 데이터 정제는 모든 데이터 과학 프로젝트의 시작이자, 매우 중요한 일이다. 분석에 사용하는 데이터의 품질이나 다른 내재적 원인에 의하여 분석 결과가 왜곡되거나 실제와 다른 결론 이 도출된다면 아무리 뛰어난 분석 방법이라 할지라도 도움이 되지 않을 것이다. 이러한 중요성에도 불구하고 데이터 과학 서적이나 강의에서는 데이터 정제 과정에 관해서 다루지 않거나 그냥 언급만 하고 지나치곤 한다. 사실 데이터 정제는 꽤 지루한 과정이다. 우리가 새 문제에 써보고 싶은 멋진 머신러닝 알고리즘을 적용하기 전에 거쳐야 하는 아주 따분한 일이다. 많은 풋내기 데이터 과학자는 조악한 품질의 데이터로 분석을 시작하고, 복 잡한 알고리즘을 적용한 후 말도 안 되는 답을 얻고 나서야 비로소 데이터 품질에 심각한 문 제가 있음을 깨닫기도 한다. “쓰레기를 넣으면 쓰레기가 나온다Garbage in, garbage out”라는 말도 있지만, 현실은 이보다 훨씬 심 각하다. 어떤 데이터에 쉽게 파악되지 않는 심각한 품질 문제가 있어서 그럴싸한 데이터로 오 인된다면 도출된 결과도 그럴싸해 보일 수 있다. 이런 식의 심각한 오답을 제시하는 것은 데이 터 과학자에게 치명적인 실수다. 데이터 과학자로서 갖춰야 할 중요한 소질 하나는 데이터 분석의 모든 단계에서 흥미롭고 가치 있는 문제를 찾아내는 능력이다. 분석의 초기 단계에 기술과 통찰을 더하면 최종 결과물의 신 스칼라와 스파크를 활용한 데이터 분석 CHAPTER 2 조시 윌스
  • 30. 30 9가지 사례로 익히는 고급 스파크 분석 (2판) 뢰도는 더 커지게 된다. 데이터 과학자에게 데이터 품질 관리에 신경 쓰라고 하다니, 물론 말은 쉽다. 아이들에게 채소 를 먹으라고 이야기하는 것처럼 말이다. 하지만 스파크와 같은 새로운 도구를 써보는 일이 훨 씬 재미있다. 스파크로는 멋진 머신러닝 알고리즘을 만들어보거나, 스트리밍 데이터를 처리하 는 엔진을 개발한다거나 복잡하게 연결된 그래프를 분석하는 등의 일을 해볼 수 있으니 말이 다. 그래서 스파크와 스칼라를 활용하여 데이터를 정제하는 예를 직접 보여주는 것으로부터 시 작하려고 한다. 2.1 데이터 과학자를 위한 스칼라 데이터 과학자 대부분은 데이터를 조작하고 분석할 때 R이나 파이썬과 같은, 자신에게 가장 능숙한 특정 도구를 선호한다. 어쩔 수 없이 다른 환경에서 일하게 되더라도 선호하는 도구 에 집착하며 그 도구를 사용할 수 있는 방법을 찾아 헤매곤 한다. 새로운 문법과 새로운 패 턴을 습득해야 하는 새로운 도구를 도입하는 것은 최선의 상황에서도 꽤 힘든 도전적인 일 이다. 스파크에는 R이나 파이썬으로 코드를 작성할 수 있는 라이브러리와 래퍼Wrapper가 있다. 그중 파이스파크PySpark라는 훌륭한 파이썬 래퍼는 이 책의 11장에서도 일부 다루고 있다. 하지만 대 부분의 예제는 스칼라로 제공할 것이다. 스파크 자체가 스칼라 언어로 구현되어 있어서, 스칼 라를 직접 사용하면 다음과 같은 효과를 기대할 수 있다. 성능 면에서 유리하다. 스칼라처럼 JVM에서 동작하는 언어 위에서 R이나 파이썬으로 만들어진 알고리즘을 실행하 려면 코드와 데이터를 변환하거나 다른 환경으로 옮기는 작업이 추가로 필요하며, 때에 따 라서는 이 추가 과정에서 오류가 생길 수도 있다. 반면, 스파크가 제공하는 스칼라 API를 사 용한다면 의도한 대로 동작할 가능성이 매우 커진다.
  • 31. 312장 스칼라와 스파크를 활용한 데이터 분석 최신 기능을 활용할 수 있다. 스파크의 머신러닝, 스트림 처리, 그래프 분석 등의 라이브러리는 모두 스칼라로 작성했기 때문에 새로운 기능이 파이썬이나 R 환경까지 지원하는 데 시일이 걸리는 편이다. 그러므로 스파크가 제공하는 모든 최신 기능을 곧바로 사용하려 한다면 최소한 스칼라에 대해서 조금 은 알아야 하며, 그 기능들을 확장하여 새로운 문제에 적용하려면 스칼라를 어느 정도 능숙 하게 다룰 수 있어야 한다. 스파크의 철학을 이해하기 쉽다. 파이썬이나 R로 스파크를 사용한다 할지라도, 스파크의 API에는 이를 구현한 언어인 스칼 라로부터 시작된 철학이 녹아 있다. 여러분이 다른 언어를 사용하더라도 스칼라로 스파크를 다루는 방법을 알고 있다면 스파크 체계를 이해하고 문제를 ‘스파크답게’ 해결하는 데 도움 이 된다. 다른 데이터 분석 도구들과는 많이 다르기 때문에 설명하기 힘든, 스칼라의 또 다른 장점이 있다. 만약 R이나 파이썬으로 데이터베이스에 있는 데이터를 분석해왔다면 필요한 데이터를 SQL로 가져온 후, 작업 환경을 R이나 파이썬으로 바꿔서 그 데이터를 다루고 시각화하는 절차 에 익숙할 것이다. 누군가는 클러스터에 저장된 데이터에 접근하여 작업하는 일(SQL)과 PC 에 저장된 데이터를 다루고 시각화하는 일(파이썬/R)에 각각 다른 언어를 사용해왔을 수도 있 다. 그리고 SQL 사용자 정의 함수를 이용해 데이터를 처리하는 위치를 데이터베이스 엔진으로 옮기고 싶다면 C++나 자바 같은 또 다른 프로그래밍 환경으로 바꿔 작업해야 할 수도 있다. 오랫동안 사용해 익숙해졌다면 이런 방식의 불편함을 자각하지 못할지도 모른다. 스칼라와 스파크를 사용한다면 이야기가 달라진다. 어떤 경우에도 같은 언어를 사용할 수 있기 때문이다. 스파크를 통해 클러스터에서 데이터를 가져오고, 그 데이터를 로컬 환경에서 다루는 일 모두를 스칼라 코드를 작성하여 처리할 수 있다. 무엇보다 좋은 점은 로컬에서 작성한 스칼 라 코드를 클러스터로 보내서, 클러스터에 저장된 데이터를 로컬에서 다룬 결과와 완전히 똑같 이 처리할 수 있다는 것이다. 심지어 Spark SQL과 같은 고수준 언어로 작업할 때도 자신만의 사용자 정의 함수를 만들어 Spark SQL 엔진에 등록하여 그대로 사용하면 되며, 이 과정에서 작업 환경을 바꿀 필요가 없다.
  • 32. 32 9가지 사례로 익히는 고급 스파크 분석 (2판) 데이터의 저장 위치나 처리 위치와 상관없이, 데이터를 조작하고 분석하는 모든 일을 하나의 환경에서 할 수 있다는 것이 얼마나 혁신적인지 설명하기는 쉽지 않지만, 일단 경험해보면 알 것이다. 필자들은 스파크를 처음 접했을 때 느꼈던 신비한 힘을 예제에 담아내려고 노력했다. 2.2 스파크 프로그래밍 모델 스파크 프로그래밍을 위해서 데이터와 이를 담은 저장소가 필요하다. 데이터는 보통 HDFS와 같은 분산 저장소에 저장한다. 일반적으로 스파크 프로그램은 다음과 같은 몇 개의 연이은 단 계로 구성된다. 1. ‌‌입력 데이터에 적용할 변환을 정의한다. 2. ‌‌변환된 데이터를 저장소로 보내거나 구동자Driver의 로컬 메모리로 반환하는 액션을 수행한다. 3. ‌‌분산 처리 방식으로 계산된 결과를 바탕으로 로컬 계산을 수행한다. 이 작업은 다음에 수행할 변환과 액션을 결정하는 기준이 될 수도 있다. 스파크 버전이 1.2에서 2.1로 진화함에 따라 각 단계를 수행할 때 사용할 수 있는 도구들이 양 적, 질적으로 발전했다. 분석을 수행하는 과정의 복잡한 SQL 질의, 머신러닝 라이브러리 및 사 용자 작성 코드들을 섞어 쓰거나 골라 쓸 수 있고, 더 짧은 시간에 더 많은 응답을 제공하기 위 해서 수년간 스파크 커뮤니티가 개발해온 모든 상위 수준의 추상화를 활용할 수 있다. 동시에, 이 모든 상위 수준 추상화가 ‘저장소와 실행 사이의 상호작용’이라는 스파크의 가장 근원적인 철학을 지켜나가고 있다는 점을 기억해둬야 한다. 스파크는 데이터 처리 파이프라인상의 어떤 중간 단계에서도 이후에 사용하기 위해서 메모리에 데이터를 캐시할 수 있도록 하여 이러한 추 상화를 훌륭하게 결합한다. 이 원칙을 이해한다면 데이터 분석에 스파크를 더 효율적으로 활용 할 수 있다. 2.3 레코드 링크 이 장에서 논의할 문제는 문헌과 실무 현장에서 엔티티 해소Entity Resolution, 레코드 중복 제거Record Deduplication, 병합 및 제거Merge-and-purge, 목록 정리List Washing 등 다양한 이름으로 불리고 있다. 모
  • 33. 332장 스칼라와 스파크를 활용한 데이터 분석 순되게도 이 문제가 다양한 이름으로 불리기 때문에 문제 해결을 위한 기술들을 훑어보고자 해 도 관련 논문조차 다 찾아내기 어렵다. 오히려 이 데이터 정제 문제에 대한 참고 문헌들에서 중 복 제거를 수행할 데이터 과학자가 필요한 처지다! 이 장의 목적을 원만히 이루기 위해 이제부 터 ‘같은 실체를 가리키는 레코드들을 연결 짓는’ 이 문제를 레코드 링크Record Linkage라 하겠다. 이 문제의 일반적인 형태는 다음과 같다. 하나 또는 그 이상의 데이터 출처로부터 데이터를 수 집하여 취합하면 그 속의 레코드 일부가 실제로는 같은 고객, 같은 환자, 같은 위치, 같은 행사 등 동일한 실체를 가리킬 수 있다. 각 실체는 이름, 주소, 생일과 같은 여러 속성을 가지고 있어 서 동일한 실체를 가리키는 레코드들을 찾아내려면 이 속성값을 이용해야 한다. 안타깝게도 이 속성값들은 불완전하다. 형식이 다르거나 오타가 있거나 값이 누락되었을 수 있다. 그러므로 단순하게 속성의 값이 같은지만을 검사한다면 상당수의 중복 레코드를 놓치게 될 것이다. [표 2-1]을 살펴보자. 표 2-1 레코드 링크의 어려움 이름 주소 도시 주 전화번호 조시의 커피숍 선셋 대로 1234 서 할리우드 CA (213)-555-1212 조시 커피 선셋 대로 1234, 서 할리우드 CA 555-1212 커피숍 체인 #1234 선셋 가 1400, 2 할리우드 CA 206-555-1212 커피숍 체인 지역 사무소 선셋 가 1400, 2호실 할리우드 캘리포니아 206-555-1212 이 표에서 위의 두 줄은 각각 ‘서 할리우드’와 ‘할리우드’라는 도시에 있는 서로 다른 작은 커피 숍처럼 보인다. 하지만 이는 입력상의 실수로, 사실은 같은 커피숍을 가리킨다. 그다음의 두 줄 은 주소가 같지만 2개의 서로 다른 사업장을 가리키고 있는데, 하나는 실제 커피숍이며 다른 하나는 지역의 체인점 사무소다. 둘 다 시애틀에 있는 본사의 대표 전화번호가 기록되어 있다. 이 예제는 레코드 링크가 얼마나 어려운지를 보여준다. 각각의 묶음이 서로 유사하게 보이더라 도 중복이 있는지를 결정하기 위해 사용하는 기준은 묶음마다 다르다. 사람은 직관으로 쉽게 구분할 수 있겠지만 컴퓨터가 그 구분법을 학습하기에는 어려운 형태다.
  • 34. 34 9가지 사례로 익히는 고급 스파크 분석 (2판) 2.4 스파크 셸과 SparkContext 시작하기 여기에서는 UC 어바인의 머신러닝 데이터 저장소UC Irvine Machine Learning Repository에서 구할 수 있는 표본 데이터를 사용한다. 이 저장소에서 연구와 교육을 위한 흥미로운 (더구나 무료인) 데이 터셋들을 구할 수 있다. 우리가 분석할 데이터셋은 2010년에 독일의 한 병원에서 실시한 레코 드 링크 연구에서 나온 것으로, 환자의 성과 이름, 주소, 생일 등 몇 가지 기준에 따라 묶은 수 백만 건의 환자 기록 묶음이 들어 있다. 각 묶음에는 문자열 유사도에 따라 0.0부터 1.0까지 점 수를 매겼고, 그 후 같은 사람을 표현한 묶음과 그렇지 않은 묶음을 분류해 일일이 표시하였다. 데이터셋을 만드는 데 사용한 필드 자체의 원래 값은 환자의 개인 정보를 보호하기 위해 제거 되었으며 식별번호, 필드별 유사도 점수, 묶음별 실제 분류값(같은 사람인지 여부)이 레코드 링크 연구 용도로 발행되었다. 다음과 같이 셸shell 명령어로 저장소로부터 데이터를 가져오자. $ mkdir linkage $ cd linkage/ $ curl -L -o donation.zip http://bit.ly/1Aoywaq $ unzip donation.zip $ unzip 'block_*.zip' 사용할 수 있는 하둡 클러스터가 있으면, HDFS에 블록 데이터용 디렉터리를 생성하고 데이터 파일을 그 디렉터리에 복사한다. $ hadoop fs -mkdir linkage $ hadoop fs -put block_*.csv linkage 이 책의 예제 코드는 2.1.0 버전의 스파크를 사용한다. 필요한 릴리스는 스파크 프로젝트 사이 트에서 내려받을 수 있다(http://spark.apache.org/downloads.html). 클러스터 환경을 사용 하든 로컬 PC 환경을 사용하든, 스파크 참조 문서를 보고 환경을 설정하면 된다(http://spark. apache.org/docs/latest/). 이제 spark-shell을 실행할 준비가 되었다. spark-shell은 스파크 확장 API를 제공하는 스 칼라 REPL이다. REPL이라는 용어가 생소하다면 R 환경과 유사한 것으로 생각하면 된다. spark-shell은 스칼라 프로그래밍 언어를 사용하여 함수를 정의하고 데이터를 다룰 수 있는
  • 35. 713장 음악 추천과 Audioscrobbler 데이터셋 “De gustibus non est disputandum.” (취향에 이유를 따지지 마라.) -작자 미상 누군가 나에게 무슨 일을 하냐고 물을 때 ‘데이터 과학’ 또는 ‘머신러닝’이라고 직접적으로 대답 하면, 들리기야 멋있게 들리지만 반응은 싸한 편이다. 실제 데이터 과학자들조차도 이 용어의 뜻을 명확하게 정의하지 못하고 있으니(많은 데이터를 저장하고, 계산하고, 무언가 예측하는 일?) 당연히 그럴 만하다. 대신 예를 들어 대답해보자. “아마존에서 고객이 과거에 구매한 책들과 유사한 책을 추천해주는 걸 알고 계신가요? 정말요? 네. 바로 그게 제가 하는 일입니다.” 추천 엔진은 적어도 내 주변 사람은 모두 알고 있으며, 또 많은 사람이 아마존을 통해 경험한 대규모 머신러닝의 사례일 것이다. 소셜 네트워크에서 동영상 사이트, 그리고 온라인 쇼핑몰까 지 추천 엔진은 모든 영역에 적용되는 공통분모에 해당하며, 실제로 동작하는 모습을 직접 관 찰할 수도 있다. Gmail이 우리가 신경 쓰지 않아도 스팸을 골라내는 것과 흡사한 방법으로, 스 포티파이Spotify 역시 재생할 음악을 컴퓨터가 골라주고 있다는 사실을 알고 있다. 추천 알고리즘의 결과는 다른 머신러닝 알고리즘보다 훨씬 직관적이다. 게다가 흥미롭기까지 하다. 우리가 개인의 음악 취향이 너무 사적이어서 설명할 수 없다고 생각한다는 점을 고려해 음악 추천과 Audioscrobbler 데이터셋 CHAPTER 3 션 오언
  • 36. 72 9가지 사례로 익히는 고급 스파크 분석 (2판) 보면, 추천 엔진은 우리가 좋아하리라 생각하지도 못한 음악을 찾아내는 놀라운 일을 해낸다. 추천 엔진이 널리 사용되는 음악과 영화 분야에서는 추천된 목록이 누군가 과거에 접해본 콘텐 츠와 왜 잘 들어맞는지를 추리해내기가 상대적으로 쉽다. 하지만 모든 군집화Clustering1 나 분류 Classification 알고리즘이 설명하기 쉬운 건 아니다. 예컨대 서포트 벡터 머신Support Vector Machine 분류 기는 계수들의 집합으로 구성되는데, 예측은 하더라도 그 계수들의 의미를 설명하기란 전문가 조차도 쉽지 않다. 그래서 앞으로 3개 장에 걸쳐서 스파크의 핵심 머신러닝 알고리즘을 다뤄보려 한다. 그중 처음 인 이번 장은 음악에 특화된 추천 엔진을 들여다보겠다. 이는 스파크와 MLlib을 실제 세상의 문제에 적용하는 방식을 소개하고, 이어지는 장에서 더 깊게 파헤칠 머신러닝 알고리즘의 기본 을 소개하는 적절한 방법일 것이다. 3.1 데이터셋 이 장의 예제에서는 오디오스크로블러Audioscrobbler에서 공개한 데이터셋을 사용한다. 오디오스 크로블러는 2002년에 초기 인터넷 스트리밍 라디오 서비스를 제공한 last.fm(http://www. last.fm)을 위해서 만들어진 첫 번째 음악 추천 시스템이다. 오디오스크로블러는 ‘스크로블링’2 용 오픈 API를 제공했고, 청취자의 음악 재생 내역을 기록했다. 서드파티 앱과 사이트들이 추 천 엔진에 음악 감상 관련 데이터를 돌려준 덕에, 이 시스템의 사용자는 수백만 명에 이르렀다. 당시의 추천 엔진 관련 연구는 대부분 평점 데이터를 학습하는 데 그쳤다. 즉, “개똥이가 소녀 시대에게 별점 3개 반을 주었군”과 같은 입력에 기초해 동작하는 도구처럼 보이곤 했다. 오디오스크로블버의 데이터셋이 재미있는 점은 “개똥이가 소녀시대 음악을 들었어”와 같은 단 순 재생 정보만 기록한다는 것이다. 단순 재생 여부는 평점보다 정보가 적다. 개똥이가 듣는다는 사실만으로 개똥이가 실제로 좋아하는지 혹은 싫어하는지를 판단할 수 없기 때문이다. 종종 별 관심 없는 아티스트의 음악을 틀어놓을 때도 있고, 또 음악을 틀어놓고 외출해버릴 수도 있다. 1 옮긴이_ 흔히 영어를 그대로 읽어 클러스터링이라 부르지만, 이 책에서는 분산 처리 분야의 용어인 클러스터와 명확히 구분하기 위해 우 리말 용어인 군집화로 옮긴다. 2 옮긴이_음악을 들을 때 아티스트, 제목, 앨범 등의 정보를 last.fm 서버에 보내는 작업이다.
  • 37. 733장 음악 추천과 Audioscrobbler 데이터셋 하지만 감상한 음악에 평점을 매기는 횟수는 음악을 듣는 일에 비해서 훨씬 드물다. 그래서 음 악 감상 데이터 하나의 정보량은 음악 평점 데이터 하나의 정보량보다 적지만, 음악 감상 데이 터셋은 크기도 훨씬 크고, 더 많은 사용자와 아티스트를 포함하며, 정보의 총량도 훨씬 많다. 사용자와 아티스트 사이의 관계가 명시적 평점이나 ‘좋아요’ 버튼으로 직접 주어지지 않고 다 른 행위들로부터 의도치 않게 은연중에 드러나기 때문에 이런 종류의 데이터를 암묵적 피드백 Implicit Feedback이라고 부르기도 한다. 2005년에 last.fm에서 배포한 데이터셋의 스냅샷을 인터넷에서 압축된 파일 형태로 구할 수 있다. https://goo.gl/yoWRAl 에서 압축 파일을 내려받은 후, 그 안의 몇몇 파일을 찾아보자. 중심이 되는 데이터셋은 user_artist_data.txt 파일에 들어 있다. 이 안에는 141,000명의 사 용자와 160만 명의 아티스트 정보가 담겨 있으며 약 2,420만 건의 음악 재생 정보가 재생 횟 수와 함께 기록되어 있다. 또한, 이 데이터셋의 artist_data.txt 파일에는 각각의 아티스트에 ID를 부여하고 있다. 음악 이 재생되면 클라이언트 프로그램이 재생되는 아티스트의 이름을 전송하는데, 그 이름은 잘못 기록되었거나 공식 명칭이 아닐 수 있으며, 이러한 오류가 뒤늦게 발견될 수도 있다. 예를 들어 “The Smiths”, “Smiths, The”, “the smiths”는 데이터셋 안에서는 별도의 아티스트 ID를 가 질지도 모르지만, 이 모두가 단 한 사람에게 붙여진 것일 수 있다. 그래서 데이터셋의 artist_ alias.txt 파일은 아티스트 명칭의 흔한 오기 패턴과 다양한 변형 표기법으로 기록된 아티스트 ID를 해당 아티스트의 대표 ID와 연결짓고 있다. 3.2 교차 최소 제곱 추천 알고리즘 우리는 암묵적 피드백 데이터에 적합한 추천 알고리즘을 선택해야 한다. 우리의 데이터셋은 전 적으로 사용자와 아티스트의 음악 사이의 상호작용으로만 구성되며, 아티스트 이름 외에 사용 자와 아티스트에 대한 어떤 정보도 포함하고 있지 않다. 우리는 사용자와 아티스트의 속성에 대해 아는 바가 없어도 학습이 가능한 알고리즘이 필요하다. 이런 알고리즘을 일반적으로 협업 필터링Collaborative Filtering (https://goo.gl/eK7KYG)이라고 한다. 예를 들어 두 사용자가 단지 동 년배라서 취향이 비슷하다고 이야기하는 것은 협업 필터링이 아니다. 두 사람이 들은 노래 중 같은 것이 많기 때문에 같은 노래를 좋아할 수도 있다고 예측하는 것이 협업 필터링의 예라고
  • 38. 74 9가지 사례로 익히는 고급 스파크 분석 (2판) 할 수 있다. 수천만 건의 재생 기록을 담은 이 데이터는 얼핏 방대해 보이지만, 다른 관점에서 보면 밀도가 낮기 때문에 꼭 그렇지도 않다. 한 사용자가 160만 명의 아티스트 중 평균 171명의 노래만 재 생했다. 어떤 사용자는 딱 한 아티스트의 노래만 듣기도 했다. 이런 사용자들에게도 괜찮은 추 천이 가능한 알고리즘이 필요하다. 어찌 되었든 음악을 듣는 누구라도 처음에는 딱 한 곡의 청 취 기록만 있었을 것이다! 결국 대규모 모델을 만들 수 있고 동시에 빠르게 추천해주는, 확장 가능한 알고리즘이 필요하 다. 일반적으로 추천 결과가 내일 나온다면 너무 늦다. 1초 이내의 준 실시간으로 나와야 한다. 이 예제에서는 잠재요인Latent-factor (https://goo.gl/w0isfF) 모델로 분류할 수 있는 많은 알고리 즘 중 하나를 사용하고자 한다. 잠재요인 모델은 다수의 사용자와 아이템 사이에서 관측된 상 호작용Observed Interaction을 상대적으로 적은 수의 관측되지 않은 숨은 원인Unobserved Underlying Reason 으로 설명하려 할 때 사용한다. 이는 수백만의 사람이 수천 개의 음반 중 특정 음반을 구입한 이유를 (직접 관측할 수 없고 데이터도 주어지지 않은) 수십 개 음악 장르에 대한 개인 취향으 로 설명하는 것과 유사하다. 예를 들어 메탈 밴드인 메가데스와 판테라의 음반뿐 아니라 클래식 작곡가 모차르트의 음반을 구매한 사람을 생각해보자. 왜 이런 음반만 구매하고 다른 음반은 구매하지 않았는지에 대한 정확한 이유를 설명하는 것은 어렵다. 그렇지만 이 음반들은 더 큰 음악 취향에서의 매우 작은 부분일 수 있다. 이 사람은 아마도 메탈 음악부터 프로그레시브 록, 클래식에 이르는 음악을 좋 아할 것이다. 이렇게 설명하는 것은 더 간단할 뿐 아니라 이 설명을 바탕으로 흥미를 유발할 수 있는 다른 많은 앨범을 제안할 수도 있다. 여기서 메탈, 프로그레시브 록, 클래식을 좋아한다는 것이 수만 개의 앨범 각각에 대한 선호도를 설명할 수 있는 세 개의 숨은 원인이다. 더 구체적으로는 행렬 분해Matrix Factorization (https://goo.gl/w0isfF) 모델을 사용할 것이다. 수학 적으로 이들 알고리즘에서는 사용자와 제품 데이터를 큰 행렬 A로 간주해 다루는데, A는 사용 자 i가 아티스트 j의 음악을 들었다면 A의 i행 j열에 값이 존재하는 행렬이다. A는 희소 행렬 Sparse Matrix이다. 사용자-아티스트의 가능한 모든 조합 중 오직 극소수만이 실제 데이터로 등장 하기 때문에, 이 행렬의 원소 대부분은 0이 된다. 이들 행렬 분해 알고리즘은 A를 더 작은 행렬 X와 Y의 행렬 곱으로 분해하는데, 이 X와 Y는 매우 길쭉하다. A가 다수의 행과 열을 가지기 때문에 X와 Y는 매우 많은 행을 가지게 되는 데 반해, 열은 몇 개(k) 되지 않는다. k개의 열은
  • 39. 753장 음악 추천과 Audioscrobbler 데이터셋 상호작용하는 데이터를 설명하는 데 사용하는 잠재요인에 해당한다. [그림 3-1]에서 볼 수 있듯, k가 작기 때문에 이 분해는 근사치일 수밖에 없다. 그림 3-1 행렬 분해 원래의 행렬 A는 매우 희소한 데 비해 행렬 곱 XYT 는 밀도가 매우 높아서 이 알고리즘을 행렬 채우기Matrix Completion 알고리즘이라고 부를 때도 있다. 설사 값이 0인 원소가 있다 할지라도 매 우 드물게 나타나므로, 이 모델은 A의 근삿값일 뿐이다. 원래의 행렬 A에서 결측된(즉, 값이 0 인) 많은 원소에 대한 값조차도 생성한다는(채워준다는) 점에서 행렬 분해는 하나의 모델이라 할 수 있다. 다행히도 선형대수학이 직관과 아주 잘 들어맞는다. 이 두 행렬은 각 사용자와 각 아티스트를 하나씩의 행으로 담고 있다. 이 행들은 매우 작은 수(k개)의 값만을 가진다. 그리고 각 값은 모 델에서 잠재특징Latent Feature에 대응한다. 그래서 행들은 사용자와 아티스트가, 아마도 취향이나 장르에 대응하리라 추측되는 이들 잠재 특징과 얼마나 밀접하게 관련되는지를 표시하게 된다. 그리고 간단히 사용자-특징 행렬과 특징-아티스트 행렬을 곱하는 것으로 사용자-아티스트 상호작용 밀집 행렬 전체의 근사치를 얻을 수 있다. 이 행렬 곱은 아이템을 아이템 속성들에 대 응시킨 뒤 사용자 속성들을 가중치로 준 것으로 생각할 수 있다. 안타까운 점은 A를 완벽하게 표현하기에는 X와 Y가 충분히 크지 않아(선형대수학에서는 계수 Rank가 너무 작다고 기술한다. https://goo.gl/49ymAa) 일반적으로 정확하게 A = XYT 를 만족 하는 해를 구할 수 없다는 것이다. 하지만 알고 보면 나쁘지 않다. A는 발생할 수 있는 모든 상
  • 40. 76 9가지 사례로 익히는 고급 스파크 분석 (2판) 호작용 중 아주 작은 표본일 뿐이다. 우리는 A 행렬의 정보가 매우 드문드문 존재해서 (단지 몇 가지 작은 k개의 요인으로 잘 설명되는) 훨씬 간단한 감춰진 진실의 모습을 설명하기 힘든 것으로 생각한다. 고양이 그림의 직소 퍼즐을 생각해보자. 완성된 퍼즐을 보고 고양이라고 설 명하기는 아주 쉬워도, 조각 몇 개만 쥐고 있다면 이것이 어떤 그림이라고 설명하기란 매우 어 렵다. XYT 은 여전히 A에 가능한 한 가까워야 한다. 어쨌든 이것이 우리가 해야 할 일이다. 정확하게 구하지는 못할 것이고 또 구할 수도 없다. 설상가상으로, X와 Y의 가장 좋은 답을 동시에 직접 적으로 구할 수조차 없다. 그나마 나은 소식은 Y를 알고 있을 때는 X의 정답을 구할 수 있음이 자명하고, 그 반대도 마찬가지라는 것이다. 뭐, 아직은 둘 다 모르는 상태지만! 다행히 이런 딜레마를 극복하고 제대로 된 해를 찾아주는 알고리즘이 있다. 더 구체적으로 설 명하면, 이 장의 예제에서는 X와 Y를 계산하기 위해 교차 최소 제곱Alternating Least Squares (ALS, https://goo.gl/hPoZq5) 알고리즘을 사용할 것이다. 이런 종류의 접근법은 넷플릭스 프라이즈 Netflix Prize (https://goo.gl/EtIzYO)가 열리던 시절에 발표된 「암묵적 피드백 데이터셋에 대한 협 업 필터링Collaborative Filtering for Implicit Feedback Datasets」 (https://goo.gl/8WZqmk)과 「넷플릭스 프라이 즈를 위한 대규모의 병렬 협업 필터링Large-scale Parallel Collaborative Filtering for the Netflix Prize」(https://goo. gl/tG99s9) 같은 논문 덕에 유명해졌다. 사실 스파크의 MLlib이 제공하는 ALS 알고리즘도 이 논문들에서 아이디어를 가져와 구현한 것이다. Y의 값을 모르지만, 무작위로 값이 선택된 행 벡터로 초기화할 수는 있다. 그런 다음 간단한 선 형대수를 통해 주어진 A와 Y에 대한 최적 X를 구할 수 있다. 사실, X의 각 행 i는 Y와 A의 한 행의 함수로 독립적으로 쉽게 계산할 수 있다. 독립적으로 수행할 수 있으니 병렬 처리가 가능 하며, 이는 대규모로 계산할 때 매우 훌륭한 장점이다. AiY(YT Y )-1 = Xi 이 수식의 양 변을 똑같이 만들기란 불가능하므로, 우리의 목표는 양 변의 차이인 |AiY (YT Y )-1 - Xi|, 즉 두 행렬에서 대응되는 원소 간 차의 제곱의 합을 최소화하는 것이다. 여기서 최소 제곱Least Squares이라는 이름이 유래되었다. 실전에서는 역행렬을 구하는 방법으로 계산하지 않고 QR 분해QR Decomposition (https://goo.gl/OvtPVU)와 같은 방법으로 더 빠르게 바 로 계산할 수 있다. 앞의 식은 단순히 행 벡터가 어떻게 계산되는지의 이론을 설명하기 위한 것
  • 41. 1014장 의사 결정 나무로 산림 식생 분포 예측하기 “예측은 매우 어려우며, 미래에 대해서는 특히 그렇다.” -닐스 보어 19세기 후반 영국의 우생학자 프랜시스 골턴 경Sir Francis Galton은 완두콩과 사람 등을 대상으로 그 키를 측정하는 데 집중했다. 그는 키가 큰 완두콩과 사람의 다음 세대 역시 평균보다 크다는 사 실을 발견했다. 놀라운 발견이라고 할 수는 없다. 하지만 자식 세대는 평균적으로 부모보다 조 금 작았다. 키가 2미터에 달하는 야구 선수의 자식은 물론 평균보다는 크겠지만, 그렇다고 2미 터까지 크지는 않는다는 뜻이다. 이 연구의 뜻하지 않은 결과 덕분에 골턴 경은 부모 세대의 키와 비교하여 자식 세대의 키를 정 리해보았고 둘 사이에 대략적인 선형 관계가 있음을 알아냈다. 큰 부모 완두콩은 큰 자식 완두 콩으로 이어졌지만, 부모보다는 조금 작았다. 작은 부모 완두콩도 작은 자식 완두콩으로 이어 지지만, 역시 부모보다는 조금 컸다. 이 선형 관계에서 직선의 기울기는 1보다 작은 양수였고, 골턴 경은 이 현상을 평균으로의 회귀Regression to the Mean라고 표현했다. 오늘날 우리도 이 표현을 사 용한다. 당시에는 인지하지 못했을지언정, 이 선형 관계는 예측 모델의 오래된 예로 보인다. 두 값을 연 결한 선이 있다는 것은 하나의 값이 다른 값에 대해 많은 것을 시사할 수 있음을 의미한다. 어 떤 완두콩의 자식의 크기는 그 완두콩과 비슷하리라고 가정하는 것보다 이 관계를 이용하여 그 크기를 계산하는 쪽이 훨씬 정확할 것이다. 의사 결정 나무로 산림 식생 분포 예측하기 CHAPTER 4 션 오언
  • 42. 102 9가지 사례로 익히는 고급 스파크 분석 (2판) 4.1 회귀로 돌아와서 통계학이 체계를 갖춘 지 한 세기 이상이 지나고 머신러닝과 데이터 과학이 등장한 오늘날에 도, 주어진 값들로부터 새로운 값을 예측하는 방법으로 ‘회귀(https://goo.gl/yFA7xy)’를 꼽는 다. 심지어 값이 평균에 가까워지거나 실제로 가까워지려는 움직임조차 없을지라도 말이다. 또 한, 회귀 기법은 분류 기법과 연관이 있다(https://goo.gl/Tq7xfG). 일반적으로 회귀는 크기, 수입, 온도와 같은 숫자를 예측하며, 분류는 ‘스팸 메일’, ‘고양이 사진’과 같은 레이블이나 범주 를 예측하는 데 사용한다. 회귀와 분류는 모두 하나 이상의 값이 주어졌을 때 하나 이상의 값을 예측해낸다. 이를 위해서 학습을 위한 입출력 체계가 구성되어 있어야 하며, 질문과 이에 대한 답변도 제공되어야 한다. 이러한 탓에 회귀와 분류는 지도 학습Supervised Learning (https://goo.gl/ktFn24) 유형에 들어간다. 분류와 회귀는 가장 오래되고 가장 잘 연구된 유형의 예측 분석이다. 서포트 벡터 머신Support Vector Machine, 로지스틱 회귀Logistic Regression, 나이브 베이즈 분류Naïve Bayes, 신경망Neural Network, 딥러 닝Deep Learning과 같은 분석 패키지나 라이브러리에서 자주 접하는 대부분의 알고리즘은 분류와 회귀 기법이다. 3장의 주제인 추천 엔진도 더 직관적이라는 이유로 앞 장의 주제로 사용했지 만, 역시 비교적 최근에 따로 떨어져나온 머신러닝의 하위 주제일 뿐이다. 이번 장에서는 분류와 회귀 모두에 적용할 수 있는 대중적이고 유연한 알고리즘인 의사 결정 나무(https://goo.gl/CT9gWE), 그리고 이 알고리즘의 확장판인 랜덤 포레스트(https://goo. gl/fC83b1)를 다루고자 한다. 이 알고리즘과 관련한 흥미로운 사실은 닐스 보어가 미래 예측 에 대해서 말한 것과 달리 미래 예측에 사용할 수 있으며, 적어도 아직은 우리가 명확히 알지 못하는 것을 예측할 수 있다는 것이다. 예를 들어 온라인에서의 행동 양식으로부터 자동차를 살 가능성을 예측한다든지, 이메일 본문의 어떤 단어로부터 그 이메일이 스팸인지 여부를 찾아 낸다든지, 위치와 토양의 화학성분비가 주어졌을 때 어느 부분의 땅이 작물을 가장 잘 키워낼 지와 같은 것이다. 4.2 벡터와 특징 특정 데이터셋과 알고리즘을 선택하는 방법, 그리고 회귀와 분류가 동작하는 방법을 설명하려