기획자 본인만큼 잡다한 블로그

greentec.egloos.com

포토로그




트위터 언팔로워 트래커 프로그래밍




트위터에는 사용자에게 꼭 필요하지만 빠져 있는 기능이 있다. 바로 나를 언팔로우한 사람이 누군지 알려주는 기능이다. 언팔로우란 팔로우를 하다가 팔로우를 끊는 것을 말한다. 페이스북으로 치면 unfriend, 싸이월드로 치면 일촌끊기가 되겠다. 일단 관계가 있어야 관계를 끊을 수 있다. 먼 옛날 싸이월드와 달리 인스타그램이나 트위터는 팔로워 수가 이 계정의 유명세에 대한 하나의 지표가 된다. 유명세는 권력, 힘이 된다.

트위터를 처음 시작한 초반에는 팔로우를 해주는 사람들이 그냥 고마웠다. 그래서 내 관심주제랑 어느 정도 겹치면 자연스럽게 맞팔로우를 하기도 했다. 그런데 그러고나서 매우 짧은 시간 후에 나에 대한 팔로우를 끊는 것을 몇 번 목격했다. 이런 것을 반복하면 이 사람의 팔로잉 수는 줄고 팔로워 수만 늘어서 자연스럽게 힘을 획득하게 된다. 양심이라는 아주 싼 가격에 말이다.
(관련글 링크 : 인스타그램 맞팔 후 언팔)

뭐, 물론 언팔을 하는 쪽에서도 변명할 수는 있겠지만 그런 것보다 중요한 것은 트위터의 팔로워 수가 100 명을 넘어가기 시작하면 눈으로 보고 누가 언팔로우를 했는지 알아내기는 쉽지 않다는 사실이다. 인터넷에 검색해보니 언팔매니저 같은 것들이 있는데, 여기까지 들어온 분들이라면 직접 코드를 사용하는 방법에 관심이 있을 것 같다. tweepy 를 사용하면 매일 내 팔로워를 긁어온 다음에 어제의 날짜와 비교해서 누가 팔로우를 끊었는지 알아낼 수 있다. 언팔매니저는 맞팔을 안해준 사람들을 찾는 것이 목적이라면 내가 만드는 코드는 언팔로워만 찾는 것이 목적이다.

그럼 간단한 코드를 보자. 짧은 코드이니만큼 전체를 리뷰하며 한 줄 한 줄 설명하도록 하겠다.
이 글은 python 3.6.2, tweepy 3.6.0 을 기준으로 한다.

  1. 트위터 API 접속

  2. 트위터는 API 를 제공하기 때문에 접속해서 나의 팔로워 수, 팔로워 정보, 트윗 등을 얻어올 수 있고 직접 트윗을 올릴 수도 있다. 나도 이것으로 2개의 트위터 봇을 라즈베리파이에서 돌리고 있다. 라즈베리파이는 설정 과정이 너무 고통스러웠기 때문에 빨리 백업을 해놔서 보드가 죽어도 다른 곳에서 쓸 수 있게 해야 하는데.. 아직 귀찮아서 못하고 있다. 어쨌든 이 서두 부분은 Twitter API 에 접속하기 위해서 꼭 필요하다.


    import tweepy
    from credentials import *

    # tweeter initialize!!
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True, compression=True)



    일단 tweepy 는 트위터 API 를 간단한 명령어로 편하게 쓸 수 있게 해주는 python 라이브러리다. 윈도우 환경에서는 보통 Anaconda 를 쓴다면 pip install tweepy 같은 간단한 명령어를 cmd 창에서 입력해서 설치할 수 있다.

    credentials 는 이 코드에서 다루는 파일과 같은 위치에 저장된 credentials.py 파일을 말한다. developer.twitter.com 에 접속해서 App 을 사용하도록 설정하면 다음과 같은 Keys and tokens 를 받을 수 있다. 이 값들을 credentials.py 에 저장해놓고, 불러와서 twitter API 접속에 사용하는 것이다.




    credentials.py 에는 다음처럼 값을 저장해준다.

    consumer_key = 'Zzzzzzzzzzzzzzzzzzzzzzzz'
    consumer_secret = 'Mmmmmmmmmmmmmmmmmmmmmmmmmm'
    access_token = '11111111111111111-222222222222222'
    access_token_secret = 'eeeeeeeeeeeeeeeeeeeeee'




  3. 어제, 오늘의 팔로워 정보 얻어오기

  4. 다음 부분은 어제의 팔로워 정보를 로드하는 부분이다. 그런데 이 글을 따라오는 분들이라면 어제의 팔로워 저장 파일은 당연히 없을 것이기 때문에,지금은 써놓기만 하고 주석처리 후 뒤에서 팔로워 정보를 한번 저장한 후에 로드하면 된다.

    # load file
    original_ids = []
    with open(pi_path + 'follower.txt', 'r') as f:
    for line in f.readlines():
    if line != '':
    original_ids.append(line.strip())




    오늘의 팔로워 정보는 직접 tweepy 에서 얻어온다. 여기서 나오는 Cursor 가 궁금한 분들은 이곳에서 간단한 글을 읽어보셔도 좋겠다. 요약하면 Cursor 는 기존의 page 방법과 다르게 boilerplate code (어떤 업무를 위해 반복적으로 작성해야 하는 코드) 를 없애고 간단하게 같은 작업을 할 수 있는 표현법이다.

    이 코드는 이 gist 에서 가져왔다.

    print("Loading followers..")
    followers = []
    for follower in tweepy.Cursor(api.followers).items():
    followers.append(follower)

    print("Found %s followers, finding friends.." % len(followers))
    friends = []
    for friend in tweepy.Cursor(api.friends).items():
    friends.append(friend)

    print('Found %s friends..' % len(friends))


    # creating dictionaries based on id's is handy too
    friend_dict = {}
    for friend in friends:
    friend_dict[str(friend.id)] = friend

    follower_dict = {}
    for follower in followers:
    follower_dict[str(follower.id)] = follower




  5. 어제, 오늘의 정보 비교해서 언팔로워 알아내기

  6. 이 부분도 2에서 어제의 팔로워 정보가 없어서 original_ids 가 [] 상태인 분들은 모든 사람이 unfollowers 로 뜰 것이다. 그렇지 않다면 정확한 unfollowers 와 unfollowers_and_still_friends 가 뜰 것이다. unfollowers 는 어제와 비교해서 오늘 follower 가 아닌 사람(언팔로우한 사람), unfollowers_and_still_friends 는 그 중에 아직 내가 팔로우하고 있는 사람이다. 내가 관심있는 건 뒷부분이다. 내가 팔로우 중이지만 나를 언팔로우한 경우.

    unfollowers = []
    unfollowers_and_still_friend = []
    for id_ in original_ids:
    if id_ not in follower_dict:
    unfollowers.append(id_)
    if id_ in friend_dict:
    unfollowers_and_still_friend.append(id_)

    print('unfollwers:', len(unfollowers))
    print('unfollowers_and_still_friend:', len(unfollowers_and_still_friend))




  7. 변경된 팔로워 저장

  8. 오늘의 팔로워 정보만 저장한다. 좀 더 자세히 한다면 이 사람이 언제 팔로워가 됐는지 하는 것들도 저장 가능하겠지만, 나는 라즈베리파이에서 이 스크립트를 돌릴 것이기 때문에 가능한 최소한의 저장 용량만 쓰고 싶었다. 오늘의 팔로워 목록만 있으면 내 목적은 달성된다.

    이제 2에서 어제의 팔로워 정보가 없어서 로드를 못하셨던 분들은 로드를 할 수 있다. 다만 팔로워가 많을 경우 tweepy 의 기능을 여러 번 사용하면 limit 가 걸릴 수 있다는 점에 주의하자. 이럴 때는 일정 시간 동안 기다렸다가 다시 시도하면 된다.

    # save file
    with open(pi_path + 'follower.txt', 'w') as f:
    for id_ in follower_dict:
    f.write(str(id_) + '\n')




  9. 메일로 보내서 자동화

  10. 이제 스크립트는 완성되었다. 이 스크립트를 매일 돌려도 된다. 하지만 좀 더 자동화하면 내 삶이 편해질 것 같다. 라즈베리파이에 넣어서 일정 시간마다 스크립트가 실행되도록 하고, 해당 내용을 메일로 받아보고 싶었다.

    나는 gmail 을 사용하는데 yagmail 이라는 라이브러리를 설치하면 좀 편하게 메일을 보낼 수 있다. 사용 방법은 아까처럼 cmd 창에서 pip install yagmail 을 입력하면 설치된다. 원래는 smtplib 라이브러리를 쓰려고 했는데 gmail 접속이 안돼서 이걸로 바꿨다. 그런데 스크립트로 메일이 안갈 때의 해결책이 지메일에서 '보안성이 낮은 앱의 접근을 허용' 옵션을 켜는 것이었기 때문에, 사실 smtplib 을 써도 되는 게 아니었나 생각한다.

    import smtplib
    from email.mime.text import MIMEText
    import datetime
    import yagmail

    if len(unfollowers) > 0:
    now = datetime.datetime.now()
    nowDate = now.strftime('%Y-%m-%d')

    mail_str = ''
    for id_ in unfollowers:
    if id_ in unfollowers_and_still_friend:
    mail_str += 'unfollower and still friend: ' + id_ + '\n'
    else:
    mail_str += 'just unfollower: ' + id_ + '\n'

    mail_str += '\n'
    mail_str += 'unfollower: ' + str(len(unfollowers)) + '\n'
    mail_str += 'unfollowers_and_still_friend: ' + str(len(unfollowers_and_still_friend)) + '\n'


    sub = '[트위터 Unfollower Tracker] ' + nowDate + ' unfollower 현황입니다.'

    yag = yagmail.SMTP("send_email_address", "password")
    yag.send("receive_email_address", subject=sub, contents=mail_str)







이것으로 자동화가 완성되었다. 이제 나를 팔로우하는 사람들에게 자신있게 맞팔로우를 할 수 있다...



게임 장르의 욕망이 사라질 때 글쓰기

모든 게임은 밤낮을 잊고 재밌게 플레이하다가도 어느 순간 그만두게 되는 시점이 온다. 게임 장르별로 플레이를 지속하게 만드는 욕망은 다르다. 오늘은 문득 길을 걷다 이것에 대해 글을 쓰고 싶어졌다. 욕망의 개인차가 있을 수 있기 때문에 주로 나의 경우를 예를 들어 설명해본다.





수집형 게임
- 카드, 캐릭터, 아이템 등 뭔가를 모아야 하는 게임들은 패키지가 아니라면 주기적으로 업데이트를 해서 수집 목록을 갱신하게 한다.
욕망 : 목표로 하는 단품 혹은 콜렉션을 얻고 싶다. 얻은 후 강화해서 쓸만하게 만들고 싶다.
사라질 때 : 원하는 것을 얻었다. 또는 원하는 것을 얻기까지의 과정이 너무 힘들어 보인다(과금 & 시간 많이 소요). 내 자산의 가치가 폭락했다(주로 업데이트로 인해).





전략형 게임
- LOL, 스타크래프트, 클래시 로얄 등 보통 PvP 를 상정한 게임이다. 게임은 비교적 공평하며 플레이어의 과금보다는 주로 실력으로 승부하게 된다.
욕망 : 게임을 좀 더 잘하고 싶다. 상대를 이기고 싶다. 높은 랭크에 올라가고 싶다.
사라질 때 : 시간 투입에 비해 게임 실력이 늘지 않는다. 여러 가지 정상적이지 않은 방법으로 높은 랭크를 획득했다(대리 게임 등).





샌드박스형 게임
- Don't starve, 마인크래프트, 롤러 코스터 타이쿤 등 주어진 세계의 룰 안에서 하고 싶은 것을 하며 노는 게임이다.
욕망 : 시간이나 게임 시스템의 압박 없이 자유롭게 플레이하고 싶다. 이 세계의 구성 요소를 조합해서 새로운 것을 만들고 싶다. 남들이 만든 창작물을 보고 더 좋은 것을 만들고 싶다. 나의 개입 없이도 잘 돌아가는 세계(system)를 만들고 싶다.
사라질 때 : 게임이 너무 어렵다. 내가 만들어 놓은 세계가 너무 잘 돌아가서 내가 할 게 없다(매우 드문 경우지만). 다른 사람들의 엄청난 창작물을 보고 좌절감을 느낀다.





스토리 게임
- 텔테일 게임즈의 게임들, 디트로이트 비컴 휴먼 등 인터랙티브 무비라 불리는 장르의 게임들이 주로 이에 해당된다. 위처, 레드 데드 리뎀션 같은 RPG 게임들도 메인 스토리를 보면 이쪽에 발을 걸치고 있다고도 할 수 있다.
욕망 : 스토리의 끝을 알고 싶다. 스토리의 과정을 하나하나 참여하며 진행하고 싶다.
사라질 때 : 스토리의 엔딩을 봤다. 스토리의 주요 반전을 스포일러 당했다. 스토리에 내가 미치는 영향이 미미하다(주로 텔테일. 주요 선택지에 따라 ㅇㅇㅇ는 기억할 것입니다 라는 메시지만 나오고 결과에는 영향이 거의 없음).





퍼즐 게임
- 지뢰찾기, 카드게임부터 캔디 크러시 사가나 Hitman GO 등 주어진 퍼즐을 해결하는 것이 메인 콘텐츠인 게임이다.
욕망 : 게임에 존재하는 퍼즐 혹은 임의의 퍼즐을 모두 풀고 싶다.
사라질 때 : 퍼즐이 너무 어렵다. walkthrough 등의 영상을 보고 퍼즐을 따라서 풀었지만 이해가 되지 않는다. 퍼즐 양이 많지만 베리에이션이 부족하고 다 비슷하게 보여서 퍼즐을 푸는 것이 노가다를 하는 느낌이라 풀고 싶지 않다.





오픈 월드 게임
- 게임 내 배경이 존으로 구분되지 않고 하나로 통합되어 있는 게임으로, 월드에 배치된 다양한 콘텐츠를 자유롭게 이동하며 즐길 수 있다.
욕망 : 게임에서 제공하는 콘텐츠를 모두 클리어하고 싶다. 게임에서 강제하는 순서가 아니라 내가 원하는 것부터 마음대로 즐기고 싶다.
사라질 때 : 게임에서 제공하는 콘텐츠를 모두 클리어했다. 모두 클리어하지 못할만큼 콘텐츠 양이 많은데, 콘텐츠들이 다 비슷해서 계속하고 싶은 마음이 들지 않는다. 스토리가 너무 유치하거나 말이 안돼서 몰입이 안된다(스토리가 있는 게임의 경우. 대부분 오픈월드 게임들은 스토리가 있는 것 같다).





<처음 시작하는 R 데이터 분석>, 강진희 & 엄동란 지음 독서




내가 R 이라는 언어를 처음 접한 때는 2015년 1월 경 courseraR Programming 이라는 수업에서였다. 통계에서 쓰는 언어는 SPSS, SAS 를 많이 들어봤고 공부도 해본 적이 있었지만 R 은 그때 처음으로 제대로 공부해 보았다. python 을 연상하게 하는 간결한 문법과 직관적인 사용법, 다양한 라이브러리와 오픈 소스 개발이 인상적이었지만 아쉽게도 그 당시에는 우리말로 된 교재를 찾아보기 힘들었다. 정확히 말하자면 대학교재들은 있었지만 일반인이 알기 쉽게 쓰인 책은 거의 없었다고 생각한다.

거의 4년이 지난 지금 우리말로 된 R 교재는 번역서와 국내 저자가 쓴 것을 합쳐 100여 권에 이를 정도로 많다. 짧은 시간에 이렇게 많은 책이 나온 데는 기계학습과 빅 데이터의 발전으로 R이 업계에서 차지하는 위치가 이전과는 비교할 수 없을 정도로 높아진 것이 한몫할 것이다. Stackoverflow 의 2018년도 개발자 설문조사에서 R 은 세계에서 19번째로 가장 많이 쓰이는 언어였다. 또 r4stats.com 의 2017년 Job Report 에서 R 은 SAS 를 제치고 Data science 분야에서 5번째로 사랑받는 언어가 되었다(SAS 는 7위, SPSS 는 14위).

R에 대해서 많은 책이 나와 있기 때문에 R 에 관심이 생겨서 당장 뭐라도 해보고 싶은 사람들은 교재의 선택에 어려움을 겪을 수 있다. 나같은 경우 한 분야에 입문하기 위해서는 두꺼운 책보다는 얇은 책을 선호하고, 튜토리얼이 세세하게 느껴질 정도로 꼼꼼하게 되어 있는 책을 좋아한다. 이 책은 그런 조건에 부합하고 있다. 풀컬러이며, 책의 시작 부분인 R과 RStudio 의 설치 안내 부분도 빨간색 박스로 눌러야 할 버튼을 강조해가면서 길을 헤매지 않도록 친절하게 안내해주고 있다. github 과 출판사 홈페이지에서 소스코드도 제공하고 있다. 사실 입문서이니만큼 소스코드의 양은 많지 않지만 여기서 쓰는 데이터를 받기 위해 소스코드를 받아야 했다.

정리하면 이 책은 초급자와 R을 처음 접하는 사람에게 좋은 입문서이다. 반대로 더 자세하고 많은 내용을 기대하는 중급 이상의 사용자들에게는 권하고 싶지 않은 책이다. 그런 분들에게는 시중에 이미 우리말로 되어 있는 두껍고 다양한 책들을 권하고 싶다.


비행기에서 플레이한 게임들 추천게임

며칠 전 런던-에딘버러(스코틀랜드)-로마 여행을 다녀왔다. 올해는 의도치 않게 많이 쉬게 된다. 그만큼 업무 시간에는 열심히 일해야겠다.
게임업계 종사자로서 최신 게임을 접하는 데에 부족한 점이 많았던 것 같기도 했고, 편도 10시간이 넘는 비행 시간을 버티기 위해서 핸드폰 게임을 하면서 가기 위해 여러 개의 게임을 다운로드 받았다. 내가 탔던 비행기는 이코노미 석에서 인터넷 연결을 제공하지 않기 때문에 인터넷 연결 없이 플레이가 가능한 게임이어야 했다. 그 중 재미있었던 것들을 뽑아본다.


The Battle of Polytopia




문명의 영향을 많이 받은 것 같은 전략게임이다. 문명6도 모바일로 나오긴 했지만 4GB 정도의 용량이라 외국 USIM 칩의 느린 다운로드 속도로는 다 받지 못하고, 대신에 이걸 받게 되었다. 단순하고 가벼운 시스템이었지만 이게 생각보다 재미있었다. 플레이할 때는 몰랐는데 나중에 나무위키를 찾아보니 Actionscript 로 개발했다고 한다. 어쩐지 더 반갑다.

기본 4종족은 무료로 플레이할 수 있고 다른 추가 종족들은 1,200 원에서 2,500 원을 내고 구매해야 하는 문명 같은 DLC 시스템을 따르고 있다. 이 종족들을 구매하지 않으면 게임에 나오는 종족이 최대 4개로만 고정되고 최대 종족 수에 따라 맵 크기도 더 커지기 때문에 역동적인 게임을 즐기려면 많은 종족을 구매해야 할 것 같다.

난이도는 Easy, Normal, Hard, Crazy 로 구성되는데 Crazy 는 정말 어떻게 깨라는 건지 모를 정도로 많은 적 병력이 등장한다. 이 점은 전략 게임이 늘 가지고 있는 문제 - 불공정한 AI - 를 제기하게 한다. 인간에 비해 판단력이 떨어지기 때문에 AI 는 더 많은 자원 혹은 더 저렴한 비용 등의 버프로 인간과의 격차를 줄일 수밖에 없다. 알파고 시대이니 만큼 이런 문제도 언젠가는 해결이 가능해지지 않을까.

플레이시간 : 대략 6시간 정도



Hexa Turn




삼각형의 진로를 막는 턴제 퍼즐 게임이다. Armorgames, Kongregate 등에서 원래 유명했는데, 웹페이지에서는 Package 1(24 레벨)만 플레이 가능하고 앱에서 즐겨야 풀 버전(Package 1~4, 96 레벨)을 플레이할 수 있다. 유료 버전이 2,500 원인데 좀 고민하다가 구매했다. 게임은 생각보다 어려워서, 현재 Package 2 의 16까지만 진행한 상태다. 새로운 기믹이 나오는 게 재밌어서 계속 플레이하고 싶은데 너무 어렵다.

플레이시간 : 대략 2시간 정도



Icy Ropes



QWOP의 플랫포머 버전 같은 게임이다. 터치할 때마다 연결된 두 캐릭터 중 하나의 움직임을 조절하는데, 이 움직임은 물리 법칙을 따르면서도 몹시 제어하기 어렵다. 하지만 계속 플레이하다보면 실력이 점점 늘게 되기 때문에, 실패했을 때 게임 탓 대신 내가 잘못해서 실패했다는 생각을 하게 된다. 오래 가는 피지컬 위주의 게임들은 이런 환상을 플레이어에게 심어주는 것이 중요한 것 같다.

이런 류의 게임들이 그렇듯이 길건너 친구들이 만든 전형에 충실하게 이 게임도 자주 실패하도록 유도하고, 광고 클릭을 하도록 하고, 여러 캐릭터의 뽑기를 제공한다. 별도의 고정된 맵을 만들어서 Challenge Mode 를 제공하고 맵을 깰 때마다 추가 캐릭터를 주는 경험은 신선하고 재미있었다.

플레이시간 : 대략 3시간 정도




<데이터 시각화 원리> - 조르즈 카몽이스 지음, 이혜연 옮김 독서



이 책의 원제는 "Data at Work" 다. 말 그대로 일에서 쓰기 위해서 데이터를 어떻게 시각화해야 하는가에 대한 시각을 담고 있다. <사용자를 생각하게 하지마><월스트리트 저널 인포그래픽 가이드> 에서도 느꼈지만 이런 류의 책들은 한결같이 복잡하고 화려한 데이터 시각화를 경계하며 심플하고 목적성이 뚜렷한 시각화를 만드는 것을 강조한다.

위에 언급한 책들과 이 책의 차이점은 큰 방향은 같지만 좀 더 철학적인 접근이 보인다는 것이다. 물론 두께도 500여 쪽으로 더 두껍지만 말이다. 저자는 '이것은 모두 실용주의에 관한 것이며, 미적인 것이 아니다(p. 454).', '만약 어느 경우에나 들어맞는 답은 없다는 사실과 보편적인 규칙이 없다는 사실을 받아들인다면, 각 실무자와 소비자 집단에 대해 일관된 이론을 늘 찾아야만 한다(p.24).', '우리가 찾기를 원했던 패턴을 노력 없이 찾을 수 있다면, 패턴이 흥미로울수록 더 많은 패턴을 찾을 가능성이 높음을 의미한다. ... 그 반대 역시 사실이다(p. 177).' 등 처음 봐서는 쉽게 받아들이기 힘든 고수의 심득(心得) 같은 이야기들을 풀어놓는다. 이 책을 보고 나도 이 분야의 시각화라는 것에 대해서 좀 더 고민이 많아지게 되었다.

그리고 이 책의 강점은 수많은 엑셀 차트(모두 인터넷에서 다운로드 가능하다. 이곳에서 상단의 Book 을 누르면 각 챕터별로 차트를 받을 수 있다) 들로 저자의 심득을 쉽게 풀어 설명한다는 것이다. 다 세어보지는 않았지만 차트가 200 여 개가 넘는 듯 하다. 차트의 구성요소인 색, 차트 종류, 라벨 등을 조금씩 바꾸면서 어느 지점이 문제인지, 무엇을 개선하면 더 나아지는지를 꼼꼼하게 알려주고 있다. 하지만 역시 실무에 적용하려면 많은 경험과 노력이 필요할 것 같다. 그래도 실무에 바로 참고할 수 있는 심플하고 깔끔한 다량의 차트를 확보할 수 있다는 것은 이 책을 읽은 이들에게 의도하지 않았던 수확일 것이다.

저자는 따로 블로그도 쓰고 있고 여기에도 짧지만 재미있는 글들이 보이는데, 이 중 저자가 특히 사용을 신중하게 해야 한다고 하는 파이 차트에 대해서 쓰인 이 글이 인상적이다.






사진과 트윗을 올린 Yougov 는 위키피디아에 따르면 영국에 있는 Internet-based market research and data analytics 회사이다. 그런데 이런 전문가 집단에서 올린 트위터 사진에는 피자 조각과 퍼센티지, 꺾인 안내선이 결합되어 있어서 우리가 흔히 보는 파이 차트를 떠올리게 한다. 하지만 사실 파이 차트의 기본 원칙인 모두 합치면 100% 가 성립하지 않고, 퍼센티지와 조각의 비율도 맞지 않고, 애초에 여기서 다루는 토핑의 비율은 중복 조사이기 때문에 합쳐서 100% 가 되지 않고 되더라도 의미가 없다. 책을 읽기 전이었다면 이 사진에서 틀린 부분을 찾아내는데 오래 걸렸겠지만, 저자가 워낙 책 전반에서 파이 차트의 잘못된 사용을 경계한 덕분에 틀린 부분들을 금방 알아볼 수 있었다.

요약하자면 이 책은 데이터 시각화 분야에서 내가 읽은 몇 안되는 책들 중 제일 두꺼웠고 제일 유익했던 책이다. 특히 바로 쓸 수 있는 cookbook 이 아니라 이 분야에서 시각화를 어떻게 해야 하는가에 대해 고민을 하게 만드는 책이라는 점이 좋았다.

1 2 3 4 5 6 7 8 9 10 다음

애드센스