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 이후는 시각화 쿼리로 구분됨
- 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이 지원하는 전체 기능 확인 가능
- 사용자 경험에 대한 피드백을 기대한다는 언급 포함
-
Homepage
-
Tech blog
- ggsql - SQL을 위한 그래픽 문법