HomeAbout
SQL
데이터 분석, SQL이 문제가 아니야!
이윤희
December 27, 2021
3 min

Table Of Contents

01
데이터 목록 살펴보기
02
필요한 데이터가 무엇인지 정의하기
03
테이블 생김새 파악하기
04
결과 값 확인하고, 대조하기 (다다익선)
  • 원 글은 작성자 블로그에서 보실 수 있습니다.

하도 데이터, 데이터 외쳐 대는 통에 SQL을 배웠지만, 아직도 회사에서 데이터 보려면 어디에서 무엇을 해야할지 헤매고 있지 않나요? 문법을 익히는 게 중요한 게 아닙니다. 우리 서비스의 데이터 구조를 모른 채 Query만 쓸 줄 아는 건, 통삽겹 구이 먹으려고 삼겹살도 없이 에어프라이어 설명서만 읽는 거랑 똑같은 거라고요! 데이터를 활용하려면 회사에 어떤 데이터가 있고, 어떤 형태로 쌓이고 있는지 알아야 합니다. 그리고 안타깝게도 이 정보들은 인터넷에 공개된 무료 SQL Guide처럼 말끔하게 정리되어 있지 않을 확률이 높아요. 엔지니어와 데이터 분석가를 찾아가기 전에 데이터 구조를 파악하고 활용할 수 있는 몇 가지 효과적인 방법을 소개합니다.


✋ 잠깐! 아래 내용은 SELECT, WHERE, JOIN을 포함한 SQL 기본 문법에 대한 이해도가 있는 분들께 권합니다. 아직 SQL 문법을 잘 모른다면, 데이터 플랫폼 서비스 Mode에서 제공하는 Tutorial을 추천합니다.

데이터 목록 살펴보기

DBeaver, HeidiSQL, Redash, Superset 등 회사에서 사용하는 SQL 도구에 접속해보면 어떤 테이블이 있고, 그 안에서 어떤 정보가 관리되고 있는지 확인할 수 있어요. 목록을 보는 것만으로는 정확히 알 수 없지만, 테이블과 컬럼 이름을 보면 대략적인 의미를 유추할 수 있을 거에요. 참고로, 서비스와 관련된 데이터는 크게 두 가지 유형으로 구분됩니다.

로그는 서비스 로그와 행동 로그로 구분된다. 서비스 로그는 트랜잭션(transaction)의 결과를 기록하는 로그다. 가입하거나 예약하거나 결제를 하는 것처럼 하나의 트랜잭션이 완료되면 각각에 대한 서비스 로그가 남는다. 반면 행동 로그는 트랜잭션에 이르기까지 사용자가 서비스에서 하는 하나하나의 액션에 대한 로그를 의미한다. 특정 상품을 클릭하거나 검색하거나 배너를 스와이프 하는 등의 액션을 예로 들 수 있다. 양승화, <그로스 해킹>, 위키북스

왠지 필요할 것 같은 테이블을 발견 했다면, 그냥 지나치지 말고 Sample 값을 확인 해보아요. 🛠 SELECT * FROM table_a LIMIT 100; 테이블과 컬럼 이름만 확인하는 것보다, 실제 어떤 값이 입력되어 있는지 보면 훨씬 더 많은 정보를 얻을 수 있으니까요!

필요한 데이터가 무엇인지 정의하기

데이터는 목적에 따라 여러 개의 테이블로 쪼개어 관리됩니다. 그렇기 때문에 분석에 필요한 데이터를 추출할 때는 여러 테이블에 나누어져 있는 데이터를 합쳐서(Join) 확인 하는 경우가 많아요. 이 정보는 이 테이블에서 저 정보는 또 다른 테이블에서 가져오는 거죠. 먼저, 원하는 정보를 얻기 위해 필요한 값이 무엇인지 개념적으로 적어 보면 좋아요. 정확히 어떤 테이블에서 해당 정보를 가지고 와야 하는지는 몰라도 괜찮습니다. 하지만 내가 추출하고자 하는 데이터가 어떤 항목으로 구성되어야 할지는 구체적으로 정의 해보는 게 좋아요. 예를 들어, 지난 일주일 간 운영 중인 프로모션 페이지를 조회한 사용자 수를 지역별로 구분해보고 싶다고 가정 해볼게요. 이 경우, 프로모션 페이지를 방문한 사용자(User ID), 사용자가 거주 중인 지역, 프로모션 페이지를 방문한 시간이 필요할 거에요. 프로모션 페이지 방문은 사용자 Action의 일종이니, 행동 로그 테이블에서 프로모션 페이지 방문에 해당하는 Event와 원하는 기간에 맞추어 Filter 하면 됩니다. 한편, 행동 로그 테이블에는 사용자의 Demographic 정보가 기록되지 않는 경우가 많아요. 그러니 사용자의 거주 지역은 사용자 정보를 담고 있는 User 테이블을 참조하고, User ID를 Key로 행동 로그 테이블과 User 테이블을 Join하면 원하는 정보를 모두 얻을 수 있습니다. 아주 복잡하게 느껴지는 데이터를 추출하는 경우에도, Output 컬럼을 명확하게 정의하고, 각 컬럼 별로 필요한 조건이 무엇인지 쪼개어 생각하면, 생각보다 어렵지 않게 문제를 풀 수 있습니다.

테이블 생김새 파악하기

테이블의 목적과 종류에 따라 데이터가 만들어지고 수정되는 형태가 다릅니다. 새로운 Action이 있을 때마다 새로운 Row(행)이 만들어 지는 경우가 있고, 변경이 발생한 Row의 값이 수정되는 경우도 있어요. 한 테이블 안에서 정보가 어떻게 쌓이고 관리되는지 알아야 목적에 맞는 Query를 잘성할 수 있어요. 잘 모르는 테이블을 만났다면 위에서 설명한 것처럼 몇 개의 Sample 값을 확인해보는 것부터 시작합니다. 그런 뒤에 특정 값을 기준으로 정렬 해봅니다. 저는 보통 시간 컬럼(e.g. created_at)을 역순으로 정렬해서 데이터가 기록되는 패턴을 확인하고, Distinct한(중복이 없는) 값일 것으로 추정되는 컬럼을 정렬해서 실제로 그러한지 다시 한 번 확인합니다. 이 작업 없이 상상한 대로 테이블을 집계 해버리면, 아주 엉뚱한 결과가 나올 수도 있어요 😵

결과 값 확인하고, 대조하기 (다다익선)

Query를 작성하면서 꼭 중간 중간 결과 값을 확인하고, 내가 의도한 혹은 알고 있는 값과 Align 되는지 확인합니다. 특히 익숙하지 않은 테이블 혹은 문법을 사용할 때는 Line by Line으로 확인 해보면 실수할 확률이 줄어들어요! 좀 전의 프로모션 페이지 조회 예시로 돌아가 볼게요. 사용자 지역 정보를 Join하기 전에 앞서, 일주일 간 프로모션 페이지 조회수가 얼마인지 집계해 보았더니 9.5만이 나왔어요. 어라? 우리 회사 WAU는 10만 전후 수준인데, Active User의 95%가 프로모션 페이지를 방문했다니.. 어딘가 이상하죠? Event를 잘못 Filtering 했거나, 기간을 잘못 설정했을 수 있습니다. 이런 식으로 중간 결과를 도메인 지식 혹은 예상한 결과 값과 대조해보면 실수를 찾을 수 있을 때가 많아요. 예상 결과를 잘 모를 때는 데이터를 집계(Group By)하기 전에 값을 펼쳐서 Eye Checking 하는 것도 도움이 됩니다. 특히, 여러 테이블을 Join한 경우에는 의도에 맞게 Query가 작동하는지, 누락된 값은 없는지 확인 해보기를 바랍니다. 잠깐의 귀찮음을 잘 참으면, 먼 길 돌아가는 걸 막을 수 있어요!


이 글은 누구의 도움 없이 혼자서 데이터를 파악하라는 의도로 작성한 것이 아닙니다. 가장 좋은 방법은 다른 사람의 Query를 많이 보는 것, 그리고 데이터를 실제 관리하고 있는 분석가 혹은 엔지니어와 자주 소통하고 궁금한 점을 물어보는 것입니다. 하지만 데이터 분석은 선형적으로 진행되지 않을 때가 많아요. 그렇기 때문에 도움을 줄 수 있는 누군가에게 필요한 모든 것을 물어보기가 어렵습니다. 시도 해보고, 틀리고, 다시 시도 해보기를 여러 번 거치면서 혼자서 데이터와 지지고 볶아야 하는 시간이 분명 있을 거에요. 그 순간 덜 방황하기를 바라는 마음으로 정리했습니다. 조금이라도 도움이 되기를 바라요.


Tags

#데이터분석#SQL

Share


Related Posts

SQL을 작성할 때 놓치기 쉬운 5가지
2022-01-31
4 min
© 2023, All Rights Reserved.
Powered By

Quick Links

About UsOfficial Page

Social Media