参考記事:
[R & SQL] データサイエンス100本ノック+α - 概要・導入
- 設問文は データサイエンス100本ノック(構造化データ加工編) より引用しています。
- すべてのコードはコピー&ペーストでそのまま実行できます。
演習問題
出力イメージ:
n
1 531590
実行環境の構築について
R コード実行環境の構築に必要な手順は こちら から確認できます。
セットアップが完了すると、必要なパッケージとデータを使用できるようになります。
解答例を以下に示します。
R (データフレーム操作)
利用するデータ
データフレーム df_store
、df_product
を利用します。
解答例 (1)
cross_join()
を用いた解答例です。
解答コードと実行結果
df_store %>%
cross_join(df_product) %>%
count()
# A tibble: 1 × 1
n
<int>
1 531590
解説
df_store %>% cross_join(df_product)
df_store
とdf_product
のデータフレームをcross_join()
によって結合します。cross_join()
は、2 つのデータフレームの各行の全組み合わせ (デカルト積) を作成し、その結果を新しいデータフレームとして返します。
例えば、df_store
に 100 行、df_product
に 500 行があるとすると、結合された結果には 100 * 500 = 50,000 行が含まれることになります。count()
count()
は、データフレームの行数をカウントする関数です。
ここでは、cross_join()
で結合された結果の行数、つまり生成された全組み合わせの数をカウントしています。
実行結果で得られるn
は組み合わせの総数を表し、ここでは 531,590 件の組み合わせが得られたことが分かります。
解答例 (2)
tidyr::crossing()
を用いた解答例です。
解答コードと実行結果
df_store %>%
tidyr::crossing(df_product) %>%
count()
# A tibble: 1 × 1
n
<int>
1 531590
解説
crossing()
は、tidyr
パッケージに含まれる関数で、cross_join()
と同様に 2 つのデータフレーム (df_store
と df_product
) の各行の全組み合わせ (デカルト積) を生成し、結果を新しいデータフレームとして返します。tidyr
パッケージを使用しているプロジェクトでは、コードの一貫性を保つことができます。
R (データベース操作)
データベースでの操作も 解答例 (1)
と同様の流れです。
データフレーム df_store
、df_product
をテーブル参照 db_store
、db_product
に置き換えることで、同様の操作を実行できます。
db_result = db_store %>%
cross_join(db_product) %>%
count()
db_result %>% collect()
# A tibble: 1 × 1
n
<dbl>
1 531590
db_result %>% collect()
データベース操作の結果を R のデータフレーム (tibble) として取得します。
SQL
利用するデータ
store
テーブルと product
テーブルを利用します。
自動生成された SQL クエリ
データベース操作による結果 (db_result
) に基づき、自動生成された SQLクエリを show_query()
で確認できます。
db_result %>% show_query()
SELECT COUNT(*) AS n
FROM (
SELECT store.*, product.*
FROM store
CROSS JOIN product
) q01
解答クエリ
このクエリをより簡潔な形に書き直すと、次のようになります。
SELECT
COUNT(*) AS n
FROM
store
CROSS JOIN
product
解説
COUNT(*)
を用いて、生成された組み合わせの総数をカウントします。結果として、店舗と商品の全組み合わせ数が返されます。
SELECT COUNT(*) AS n
COUNT(*)
は、結果セット内の行数をカウントします。ここでは、全組み合わせの数を取得します。AS n
でカウントされた値に名前を付けています。FROM store
store
テーブルからデータを取得します。CROSS JOIN product
store
テーブルとproduct
テーブルをCROSS JOIN
によって結合します。この演算子は、両テーブルの全ての行の組み合わせを生成します。
実行結果の確認
この SQLクエリの実行結果は、次のようにして確認できます。
q = sql("
SELECT
COUNT(*) AS n
FROM
store
CROSS JOIN
product
"
)
q %>% db_get_query(con)
# A tibble: 1 × 1
n
<dbl>
1 531590