今回はDuckDBを用いた
簡単SQLデータ分析についてです
解説動画はこちら
そんな時はDuckDB使えばいいじゃない!!
ということで
DuckDBのご紹介です。
簡単SQLデータ分析についてです
解説動画はこちら
DuckDB
データ分析したいけどSQLならわかるんだけど
Python良く分からないなー
そんな時はDuckDB使えばいいじゃない!!
ということで
DuckDBのご紹介です。
Python上でSQLでデータ取得できるライブラリで
DataFrameをそのままSQLテーブルとして扱えます。
pandasの複雑なメソッドを覚えなくても
SQL操作で任意のデータが抽出できるものです。
SQL操作で任意のデータが抽出できるものです。
pandasも加えると更に深掘りも出来てお得です。
早速使い方を見ていきましょう。
インストール
早速使い方を見ていきましょう。
インストール
Google Colabでは
インストール済みなので不要です。
インストール済みなので不要です。
ローカルなどでインストールしていない人は
下記コマンドを実行しておいてください。
下記コマンドを実行しておいてください。
pip install duckdb
ライブラリの呼び出し
これだけです。
操作の基本
データフレームを作ってSQL文を投げてみます
DuckDBではデータフレームや
ファイルに直接SQL文のクエリを実行し
データ抽出が行えます。
SQL分をファイルから読み込みする
サンプルデータで簡易分析
sklearnサンプルデータを用いて
DuckDBでSQL分析してみましょう。
今回用いるデータは
「California Housing Dataset」
カリフォルニアの
地域ごとの住宅価格などのデータです。
下記コードで読み込みできます。
データの準備が整ったら
DuckDBでSQLを実行してみましょう。
1.平均住宅価格
2.住宅価格ランキング
3.地域ごとの住宅価格
4.収入と住宅価格
5.家の広さと価格
海沿い住宅は高いのかどうか
結果はコードを試すか
動画の方をご覧ください
まとめ
複雑な集計もSQLを書ければ出来ちゃうので
import duckdb
操作の基本
# 実行結果を表示
duckdb.sql("SQL文").show()
# 実行結果を変数に格納
データフレーム変数 = duckdb.sql("SQL文").df()
データフレームを作ってSQL文を投げてみます
import pandas as pd
df = pd.DataFrame({
"a":[1,2,3],
"b":[10,20,30]
})
sql = "SELECT * FROM df WHERE a > 1"
result_df = duckdb.sql(sql).df()
result_df
| a | b | |
|---|---|---|
| 0 | 2 | 20 |
| 1 | 3 | 30 |
DuckDBではデータフレームや
ファイルに直接SQL文のクエリを実行し
データ抽出が行えます。
SQL分をファイルから読み込みする
sql = open("ファイルパス").read()
df = duckdb.sql(sql).df()
ファイルを直接クエリする
sql = open("ファイルパス").read()
df = duckdb.sql(sql).df()
Google Colabなどでもファイルを置いておけば参照できます。サンプルデータで簡易分析
sklearnサンプルデータを用いて
DuckDBでSQL分析してみましょう。
今回用いるデータは
「California Housing Dataset」
カリフォルニアの
地域ごとの住宅価格などのデータです。
下記コードで読み込みできます。
import duckdb
import pandas as pd
from sklearn.datasets import fetch_california_housing
# データロード
data = fetch_california_housing(as_frame=True)
df = data.frame
# DuckDBに接続
con = duckdb.connect()
# DataFrameを登録
con.register("housing", df)
データの準備が整ったら
DuckDBでSQLを実行してみましょう。
1.平均住宅価格
sql = """
SELECT
AVG(MedHouseVal) as avg_price
FROM housing
"""
print(con.sql(sql).df())
2.住宅価格ランキング
sql = """
SELECT
MedHouseVal
FROM housing
GROUP BY MedHouseVal
ORDER BY MedHouseVal DESC
LIMIT 10
"""
print(con.sql(sql).df())
3.地域ごとの住宅価格
sql = """
SELECT
ROUND(Latitude,1) as lat,
ROUND(Longitude,1) as lon,
AVG(MedHouseVal) as avg_price,
COUNT(*) as houses
FROM housing
GROUP BY lat, lon
ORDER BY avg_price DESC, houses DESC
LIMIT 15
"""
print(con.sql(sql).df())
4.収入と住宅価格
sql = """
SELECT
CASE
WHEN MedInc < 2 THEN 'low'
WHEN MedInc < 5 THEN 'middle'
ELSE 'high'
END as income_level,
AVG(MedHouseVal) as avg_price,
COUNT(*) as cnt
FROM housing
GROUP BY income_level
ORDER BY avg_price DESC
"""
print(con.sql(sql).df())
5.家の広さと価格
sql = """
SELECT
ROUND(AveRooms,0) as rooms,
AVG(MedHouseVal) as price,
COUNT(*) as n
FROM housing
GROUP BY rooms
HAVING n > 50
ORDER BY rooms
"""
print(con.sql(sql).df())
応用編
海沿い住宅は高いのかどうか
カリフォルニアは 西側が海なので
経度(Longitude) で判定
sql = """
SELECT
CASE
WHEN Longitude < -121 THEN 'coastal'
ELSE 'inland'
END AS location_type,
AVG(MedHouseVal) AS avg_house_price,
COUNT(*) AS houses
FROM housing
GROUP BY location_type
"""
result = con.sql(sql).df()
print("海沿い住宅(coastal) vs 内陸住宅(inland)")
print(result)
結果はコードを試すか
動画の方をご覧ください
まとめ
DuckDBを用いるとSQLを使ったデータ分析が
簡単に行えます。
簡単に行えます。
Pythonのコードに慣れていなくても
直接ファイルにSQLを実行して分析結果を得られます。
複雑な集計もSQLを書ければ出来ちゃうので
データアナリストでなくても簡単に分析できちゃいます。
手元にデータが有るけどデータベース作れない
SQLは分かるけどpython分からない人向け
超お手軽ライブラリなので、おすすめです
ぜひ試してみてください
それでは。
手元にデータが有るけどデータベース作れない
SQLは分かるけどpython分からない人向け
超お手軽ライブラリなので、おすすめです
ぜひ試してみてください
それでは。





