ggsql - SQL을 위한 그래픽 문법

4 hours ago 2
  • SQL 문법 기반 시각화 도구로, VISUALIZE, DRAW, PLACE, SCALE, LABEL 같은 절을 통해 데이터 조회와 그래프 구성을 한 흐름으로 결합
  • 열을 시각적 속성에 매핑하고 레이어 조합 방식으로 산점도, 막대그래프, 히스토그램, 박스플롯, 주석 요소까지 같은 구조 안에서 구성 가능
  • SQL 쿼리 결과를 곧바로 시각화 입력으로 넘기며, 일부 레이어는 단일 SQL 쿼리 실행으로 집계만 가져오는 구조여서 대규모 데이터 처리에 유리함
  • R이나 Python 런타임 없이도 사용할 수 있는 작고 집중된 실행 파일 지향 설계로, 코드 기반 보고 도구와 AI 분석 도우미 통합에도 적합성 부각
  • 현재 버전은 alpha-release이며, 고성능 writer, 테마, 인터랙티비티, language server, formatter, 공간 데이터 지원 같은 확장 계획 제시

ggsql 소개

  • ggsql은 SQL 문법 기반의 grammar of graphics 구현체로, SQL에 구조화된 시각화 기능 추가
    • Quarto, Jupyter notebooks, Positron, VS Code 등에서 사용 가능
  • SQL 사용자에게 익숙한 방식으로 시각화 코드를 작성할 수 있도록 설계됨
    • SQL의 선언적이고 조합 가능한 절 구성을 시각화 문법에도 적용
  • 동기와 사용 예시를 함께 제시하며 ggsql의 핵심 구문 전개

기본 예시

  • 첫 번째 플롯

    • 내장 penguins 데이터셋으로 산점도 작성 가능
      • VISUALIZE bill_len AS x, bill_dep AS y FROM ggsql:penguins
      • DRAW point
    • VISUALIZE에서 데이터 열을 시각적 속성에 매핑하고, DRAW point가 해당 기본 매핑을 사용해 점 레이어 생성
    • species AS color 추가만으로 색상 범주 구분 적용 가능
      • VISUALIZE bill_len AS x, bill_dep AS y, species AS color FROM ggsql:penguins
      • DRAW point
    • DRAW smooth 추가로 점 레이어 위에 회귀선 레이어 누적 가능
      • 종별 색상 매핑이 유지되어 species마다 별도 선 생성
    • 미리 정해진 플롯 종류 대신 모듈식 구성요소 조합 방식 채택
    • 같은 구조를 유지한 채 전혀 다른 시각화로 전환 가능
      • VISUALIZE island AS x, species AS color FROM ggsql:penguins
      • DRAW bar
  • 완전한 예시

    • 상단은 일반 SQL 쿼리, VISUALIZE 이후는 시각화 쿼리로 구분됨
      • 예시에서는 DuckDB 백엔드 사용
    • SQL 부분은 astronauts.parquet에서 이름별 최신 mission만 남기기 위해 ROW_NUMBER()와 QUALIFY 사용
    • 이어서 두 집합 결합
      • year_of_selection - year_of_birth를 age로 계산하고 Age at selection 범주 부여
      • year_of_mission - year_of_birth를 age로 계산하고 Age at mission 범주 부여
      • 두 결과를 UNION ALL로 결합
    • 시각화 쿼리에서는 age AS x, category AS fill 매핑 후 DRAW histogram 사용
      • SETTING binwidth => 1, position => 'identity' 지정
    • PLACE rule로 사전 계산된 평균 위치 주석 추가
      • x => (34, 44), linetype => 'dotted'
    • PLACE text로 텍스트 주석 추가
      • x => (34, 44, 60)
      • y => (66, 49, 20)
      • 라벨에 Mean age at selection = 34, Mean age at mission = 44, John Glenn was 77 on his last mission - the oldest person to travel in space! 포함
      • hjust => 'left', vjust => 'top', offset => (10, 0) 지정
    • SCALE fill TO accent로 fill 매핑값을 accent 색상 팔레트로 변환
    • LABEL 절로 제목, 부제, x축 라벨, 범례 라벨 제어
      • 제목 How old are astronauts on their most recent mission?
      • 부제 Age of astronauts when they were selected and when they were sent on their mission
      • x축 Age of astronaut (years)
      • fill => null

시각화 쿼리 구조

  • VISUALIZE 이전은 순수 SQL이며, 결과 테이블이 표로 반환되지 않고 시각화 입력으로 직접 전달됨
  • SQL 부분에서 생성된 테이블이나 CTE는 시각화 쿼리에서 참조 가능
  • 데이터가 이미 시각화에 적합한 형태라면 SQL 부분 생략 가능
    • VISUALIZE year_of_selection AS x, year_of_mission AS y FROM 'astronauts.parquet'
  • VISUALIZE 또는 VISUALISE는 SQL 쿼리 종료와 시각화 쿼리 시작 표시
  • 매핑은 열을 시각적 속성, 즉 aesthetics에 연결하는 역할 수행
    • 예시에서는 age가 x축 위치, category가 채우기 색상에 대응
  • DRAW는 시각화에 레이어 추가
    • point처럼 단순한 타입도 있고, histogram처럼 구간화 집계 계산이 필요한 타입도 존재
    • 레이어는 정의된 순서대로 렌더링
  • PLACE는 DRAW의 형제 절로, 테이블 데이터 대신 리터럴 값을 사용하는 annotation 전용 절
    • 예시 시각화는 히스토그램 레이어, 규칙선 annotation 레이어, 텍스트 annotation 레이어의 세 레이어로 구성
    • 하나의 레이어가 하나의 그래픽 객체에만 대응하지는 않으며, 같은 타입의 여러 개별 객체 렌더링 가능
  • SCALE은 데이터값을 aesthetic에 맞는 값으로 변환하는 절
    • 문자열 범주를 실제 색상으로 바꾸는 역할 외에도 연속형 변환, break point 정의, ordinal 또는 binned 같은 스케일 타입 설정 가능
  • LABEL은 제목, 부제, 축 제목, 범례 제목 등 텍스트 라벨 추가 및 수정 기능 지원

한 걸음 물러서서

  • 위 예시는 많은 구문을 포함하지만, 핵심 문법의 중요한 부분을 한 번에 포괄
  • 많은 시각화 쿼리는 이보다 훨씬 단순한 형태 가능
  • astronauts.parquet를 사용한 성별별 출생연도 박스플롯 예시 제시
    • VISUALIZE sex AS x, year_of_birth AS y FROM 'astronauts.parquet'
    • DRAW boxplot
  • 코드 길이는 다른 플로팅 시스템보다 길 수 있지만, 더 구조적, 조합 가능, 자기서술적 특성 보유
  • 이러한 특성은 사용자가 모든 종류의 플롯 동작을 내면화하기 쉽게 만들며, 미래의 LLM 코딩 도우미에도 유리함
  • 같은 관계를 지터 산점도로 쉽게 전환 가능
    • DRAW point
    • SETTING position => 'jitter'
  • 지터가 데이터 분포를 따르도록 지정해 violin plot 성격 부여 가능
    • SETTING position => 'jitter', distribution => 'density'
  • 이런 구문 구조와 조합성은 탐색적 분석과 시각화 설계에서 반복 작업을 쉽게 만듦

왜 ggsql인가

  • ggsql 개발 이유로 다섯 가지 제시
    • 주로 SQL로 작업하는 데이터 분석가와 데이터 과학자 지원 목적
    • SQL과 grammar of graphics의 높은 궁합
    • R이나 Python 같은 전체 프로그래밍 언어 없이도 강력한 코드 기반 시각화 도구 구축 목적
    • LLM의 뛰어난 SQL 처리 능력과 새로운 시각화 인터페이스 가능성
    • ggplot2 18년 개발 경험을 새로운 바탕에 적용하려는 의도
  • Hello, SQL user

    • 데이터 과학 혁명 과정에서 R과 Python이 주목받는 동안에도 SQL은 데이터 작업의 신뢰 가능한 기반 역할 지속
    • 오직 SQL 또는 주로 SQL만 사용하는 데이터 작업자 다수 존재
    • 이들에게 주어진 기존 시각화 선택지는 본문 기준으로 대체로 비최적
      • 데이터를 내보내 R 또는 Python 사용
      • 재현성 지원이 부족한 GUI 기반 BI 도구 사용
      • 쿼리 내부 직접 시각화 도구 사용, 그러나 충분히 강력하거나 인체공학적이지 않다고 판단
    • ggsql 문법은 SQL 사용자가 즉시 이해할 수 있도록 설계됨
      • 조합 가능하고 선언적인 절에 대한 기대 활용
    • ggsql은 시각화 방식 개선뿐 아니라 SQL 사용자를 Quarto 기반의 코드 기반 보고서 생성 및 공유 생태계로 끌어들이는 역할 수행
  • 선언적 데이터 가공, 선언적 시각화

    • SQL은 하나 이상의 테이블에 저장된 관계형 데이터를 다루는 도메인 특화 언어
    • SQL 구문은 관계대수 개념에 기반하며, 데이터 조작을 구조적으로 생각하는 방식 제공
    • SQL 의미론은 함수형이 아니라 선언적인 모듈식 연산 집합 정의
    • grammar of graphics는 데이터 시각화 개념을 모듈식 구성요소로 분해하는 이론적 틀
    • ggplot2 같은 도구가 이 개념을 실제 구현으로 옮김
    • grammar of graphics 역시 함수형보다 선언적인 모듈식 연산 집합 정의
    • 두 체계는 각자 영역에 접근하는 방식에서 공통점이 크며, 원시 데이터부터 최종 시각화까지 자연스럽고 강력한 전체 파이프라인 구성 가능
  • No runtime, no problem

    • ggplot2는 R 설치, plotnine은 Python 설치 필요
    • 반면 단일하고 집중된 실행 파일 기반 시각화 도구에는 분명한 이점 존재
      • 다른 도구에 작은 실행 파일을 내장하기가 R/Python 번들링 또는 설치 요구보다 쉬움
      • 범위가 작아 악의적이거나 실수에 의한 코드 실행을 sandbox로 제한하기 쉬움
    • 이런 특성은 ggsql을 AI 분석 도우미나 여러 환경에서 코드를 실행하는 코드 기반 보고 도구 통합에 더 매력적인 선택지로 만듦
    • 해석형 언어에서 벗어나며 제약도 있지만 얻는 부분도 큼
    • 가장 중요한 장점은 엄격한 구조 덕분에 백엔드에서 레이어당 전체 데이터 파이프라인을 단일 SQL 쿼리로 실행할 수 있다는 점
      • 예시로 100억 건 거래 데이터의 bar plot 작성 시 데이터 웨어하우스에서 각 막대의 count 값만 가져오고 100억 행 전체는 가져오지 않음
      • boxplot, density plot 같은 더 복잡한 레이어 타입에도 같은 원리 적용
    • 이는 전체 데이터를 먼저 물질화한 뒤 계산하고 플로팅하는 대부분의 시각화 도구와 대비되는 특성
  • SELECT pod_door FROM bay WHERE closed

    • LLM은 자연어를 SQL로 변환하는 데 매우 효과적임이 입증됨
    • ggsql에도 같은 수준의 효과 적용 가능하다는 기대 제시
    • querychat에서 ggsql을 통해 자연어 기반 시각적 데이터 탐색이 이미 가능
    • ggsql은 R이나 Python보다 더 안전하고 가벼운 런타임이므로, 프로덕션 환경에 코딩 에이전트를 배포할 때 더 높은 확신 제공
  • We are now wise beyond our years

    • ggplot2 18년 개발과 유지보수는 데이터 시각화 문법, 사용성, 설계에 대한 18년의 축적된 사고 의미
    • 이 지식이 모두 ggplot2로 다시 들어갈 수는 없음
      • 오래전에 정해진 결정과 사용자 기대를 존중해야 하며, 도전하더라도 매우 점진적으로만 가능
    • ggsql은 blank slate
      • 처음부터 새로 구축하는 프로젝트
      • 시각화 도구에 대한 기존 기대가 없는 환경을 위해 설계된 시스템
    • 이러한 출발점이 개발 과정에서 해방감과 활력을 줬으며, 그것이 사용자 경험에도 드러난다고 밝힘

미래

  • 현재 버전은 alpha-release이며 아직 완료되지 않음
  • 앞으로 추가하고자 하는 비포괄적 목록 제시
    • Rust로 처음부터 작성한 새로운 고성능 writer
    • 테마 인프라
    • 인터랙티비티
    • Posit Workbench 또는 Positron에서 Connect까지의 종단간 배포 흐름
    • 완전한 ggsql language server와 코드 formatter
    • 공간 데이터 지원
  • ggplot2 개발에는 어떤 의미인가

    • ggplot2 사용자는 ggsql 발표를 두려움과 기대가 섞인 시선으로 볼 수 있다는 언급
    • Posit가 ggplot2를 뒤로하고 ggsql에 집중하는 것인지에 대한 답은 아님
    • ggplot2는 이미 매우 성숙하고 안정적이지만 계속 지원하고 확장할 계획
    • ggsql 개발 과정이 ggplot2에 새로운 기능을 제공하는 데도 기여하길 기대

더 알아보기

  • ggsql을 바로 사용하고 싶다면 ggsql 웹사이트의 Getting started 섹션에서 설치 안내와 튜토리얼 확인 가능
  • 문서 페이지에서는 ggsql이 지원하는 전체 기능 확인 가능
  • 사용자 경험에 대한 피드백을 기대한다는 언급 포함
Read Entire Article