All Articles

データサイエンス100本ノック(構造化データ加工編)をDuckDBで実行

目次

はじめに

データサイエンティスト協会がデータサイエンスにおける構造化データの加工の学習用にデータサイエンス100本ノック(構造化データ加工編)を公開しています。

言語はSQL、Python、Rで以前は環境構築用のDockerfileがRepositoryに同梱されていて、Dockerで環境を構築して演習問題を試してみてくださいというスタンスだったのですが、最近はPythonについてはGoogle ColaboratoryとAmazon SagemMaker Studio Labで演習用Notebookを起動するリンクがReadmeに載っています。特にColaboratoryはGoogleのアカウントさえ持っていれば簡単にNotebookの実行環境を立ち上げることができるので非常に便利です。 Pythonでデータサイエンス100本ノックを試したい方はこれを使うのが一番だと思います。

リンクは本家のReadmeを参照してください。

SQLで演習問題をやりたい場合はPostgreSQLを立ち上げてそこに演習データをロードし、JupyterからDBに接続してSQLを実行します。これだとローカルPCにDockerが入っているなり、PythonとPostgreSQLの環境が用意されているなりしないと演習を始めることができません。

Pythonの演習Notebookと同じようにColaboratoryだけで簡単にSQLの演習環境を立ち上げたいと思い、最近(自分の中で)話題のDuckDBを利用してColaboratoryだけで実行できるNotebookを作ってみました。

使い方

以下のリンクからNotebookをColaboratoryとSageMaker Labで開くことができます。

Colaboratoryを使う場合はGoogleアカウント、SageMaker Labを使う場合はSageMaker Labのアカウントが必要です。

Open In Colab

Open In Sagemaker Lab

仕組み

DuckDBについて

DuckDBはOnline Analytical Processing (OLAP)界のSQLiteを目指して開発が始まった製品です。

SQLiteはOnline Transaction Processing (OLTP)向けのRDMBSであり、データ保存に単一ファイルを使用し、SQLite Libraryを介してDBとやり取りを行います。 少ないリソースでRDBMSの機能を扱うことができるため組み込みソフトウェアなどでよく使われます。

近年のPCは昔に比べて演算性能が上がってきているため、数十GB程度のOLAP処理であればわざわざ分析用の分散システムを用意しなくてもスペックの高いマシンを一台用意すれば十分分析を行えるようになってきています。

DuckDBはシングルバイナリで動作する製品でOLAP処理用に開発されました。コストをかけずにSQLによるデータ分析を簡単に実行できるのでSQLによるデータ分析を始める上では有望な選択肢です。データ処理の並列化も行ってくれるのでMulti CoreのCPUの性能を引き出してくれます。(Pandasは意図的に処理を並列化しないとMulti Coreで処理は行えません) まずはDuckDBでカジュアルにデータ分析を初めて見て、必要に応じてPostgreSQLを立てるとか、BigQueryを使うなどステップアップしていけばいいと思います。

DuckDBはPythonとの連携も行われており、SQLクエリの結果をPandasのDataFrameオブジェクトとして出力したりもできるため、DuckDBでSQLで高速にデータを処理しつつ、Pandasで複雑なデータを加工を行うということをスムーズに行うことも可能です。

JupySQL

JupyterからDuckDBを使ってSQLを実行する際はJupySQLを利用することができます。

細かい使用方法は公式ドキュメントに任せます。

データのロード

DuckDBでインターネット上のファイルをTableに読み込みたいときはHTTPFS extensionを使用します。

DuckDBでExtensionをインストールするには Pythonのduckdbパッケージを使う場合は 以下のコマンドを実行します。

duckdb.install_extension("httpfs")

これにより以下のSQLでGithub上で管理されている演習データをDuckDBのTableにロードすることができます。

%%sql
INSERT INTO customer SELECT * FROM 'https://raw.githubusercontent.com/The-Japan-DataScientist-Society/100knocks-preprocess/master/docker/work/data/customer.csv';
INSERT INTO category SELECT * FROM 'https://raw.githubusercontent.com/The-Japan-DataScientist-Society/100knocks-preprocess/master/docker/work/data/category.csv';
INSERT INTO product SELECT * FROM 'https://raw.githubusercontent.com/The-Japan-DataScientist-Society/100knocks-preprocess/master/docker/work/data/product.csv';
INSERT INTO receipt SELECT * FROM 'https://raw.githubusercontent.com/The-Japan-DataScientist-Society/100knocks-preprocess/master/docker/work/data/receipt.csv';
INSERT INTO store SELECT * FROM 'https://raw.githubusercontent.com/The-Japan-DataScientist-Society/100knocks-preprocess/master/docker/work/data/store.csv';
INSERT INTO geocode SELECT * FROM 'https://raw.githubusercontent.com/The-Japan-DataScientist-Society/100knocks-preprocess/master/docker/work/data/geocode.csv';

PostgreSQLとDuckDBのSQL違い

DuckDBのSQLにはOLAP処理でよく使用する機能は代替実装されているのでデータサイエンス100本ノックの解答のSQLは概ね動作します。

ただし、一部PostgreSQLは文法が違ったりするのでそこの修正は必要です。

例えばS-013ではデータの抽出に正規表現を使っておりPostgreSQLの場合は

%%sql
SELECT * FROM customer WHERE status_cd ~ '^[A-F]' LIMIT 10;

でデータ抽出を実行できますが、DuckDBで正規表現を使いたい場合は REGEXP_MATCHES関数を使用すし、以下のように書く必要があります。

%%sql
SELECT * FROM customer WHERE REGEXP_MATCHES(status_cd, '^[A-F]') LIMIT 10;

まとめ

DuckDBでデータサイエンス100本ノック(構造化データ加工編)の演習問題を実行するためのNotebookを用意しました。 SQLによるデータ分析を勉強するうえではもっとも手軽な方法の一つだと思います。

データ処理の並列化などを考えるとSQLによるデータ分析は便利なのでぜひ試してみてください。

Published Jul 23, 2023

スタートアップで働くデータエンジニア兼データサイエンティスト。興味の範囲はデータパイプラインの構築、データ分析、機械学習、クラウドなどなど。