Jupyter ノートブックで BigQuery データを可視化する

このチュートリアルでは、Vertex AI Workbenchマネージド Jupyter ノートブックインスタンスで、Python と pandas 用の BigQuery クライアント ライブラリを使用してデータを探索し、可視化する方法について説明します。データ可視化ツールは、BigQuery データをインタラクティブに分析して、データから傾向を特定し、分析情報を伝達するのに役立ちます。このチュートリアルでは、Google トレンド BigQuery 一般公開データセットに含まれるデータを使用します。

目標

  • Vertex AI Workbench を使用して、マネージド Jupyter ノートブック インスタンスを作成します。
  • ノートブックでマジック コマンドを使用して BigQuery データをクエリする。
  • BigQuery Python クライアント ライブラリと pandas を使用して BigQuery データのクエリを実行し、可視化する

費用

BigQuery は有料プロダクトであり、BigQuery にアクセスすると BigQuery の利用料金が発生します。処理されるクエリデータは毎月 1 TB まで無料です。詳細については、BigQuery の料金ページをご覧ください。

Vertex AI Workbench は有料のプロダクトです。Vertex AI Workbench インスタンスを使用すると、コンピューティング、ストレージ、管理の費用が発生します。詳細については、Vertex AI Workbench の料金のページをご覧ください。

始める前に

  1. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  2. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

  3. BigQuery API を有効にします。

    API を有効にする

    新しいプロジェクトでは、BigQuery が自動的に有効になります。

  4. Notebooks API を有効にします。

    Notebook API を有効にします

概要: Jupyter ノートブック

ノートブックにより、コードを作成および実行する環境が提供されます。ノートブックは、本質的にソース アーティファクトであり、IPYNB ファイルとして保存されます。このファイルには、説明テキスト コンテンツ、実行可能コードブロック、インタラクティブ HTML としてレンダリングされる出力を含めることができます。

構造的に、ノートブックは一連のセルです。 セルは、結果を生成するために評価される入力テキストのブロックです。セルには次の 3 種類があります。

  • コードセルには評価するコードが含まれます。実行されたコードの出力または結果は、実行されたコードと一緒に表示されます。
  • マークダウン セルには、ヘッダー、リスト、書式付きテキストを作成するために HTML に変換されるマークダウン テキストが含まれます。
  • 未加工のセルを使用して、さまざまなコード形式を HTML または LaTeX にレンダリングできます。

次の画像は、マークダウン セルで、その後に Python コードセル、その後に出力が示されています。

Jupyter マークダウンとコードセル。

開いたノートブックは、実行中のセッションに関連付けられます(Python ではカーネルとも呼ばれます)。このセッションは、ノートブック内のすべてのコードを実行し、状態を管理します。状態には、変数の値、関数、クラス、読み込まれる既存の Python モジュールが含まれます。

Google Cloud では、Vertex AI Workbench ノートブックベースの環境を使用して、データのクエリと探索、モデルの開発とトレーニング、コードの一部としての実行ができます。このチュートリアルでは、Vertex AI Workbench でマネージド ノートブック インスタンスを作成し、JupyterLab インターフェース内で BigQuery データを調べます。

マネージド ノートブック インスタンスを作成する

このセクションでは、Google Cloud で JupyterLab インスタンスを設定して、マネージド ノートブックを作成できるようにします。

  1. コンソールで [ワークベンチ] ページに移動します。

    ワークベンチに移動

  2. [新しいノートブック] をクリックします。

  3. [ノートブック名] フィールドにインスタンスの名前を入力します。

  4. [リージョン] リストで、インスタンスのリージョンを選択します。

  5. [権限] セクションで、マネージド ノートブック インスタンスにアクセスできるユーザーを定義するオプションを選択します。

    • サービス アカウント: このオプションを選択すると、ランタイムにリンクする Compute Engine サービス アカウントにアクセスできるすべてのユーザーにアクセス権が付与されます。独自のサービス アカウントを指定するには、[Compute Engine のデフォルトのサービス アカウントを使用する] チェックボックスをオフにして、使用するサービス アカウントのメールアドレスを入力します。サービス アカウントの詳細については、サービス アカウントの種類をご覧ください。
    • 単一ユーザーのみ: このオプションは、特定のユーザーだけにアクセスを許可します。[ユーザーのメール] フィールドに、マネージド ノートブック インスタンスを使用するユーザー アカウントのメールアドレスを入力します。
  6. 省略可: インスタンスの詳細設定を変更するには、[詳細設定] をクリックします。詳細については、詳細設定を使用してインスタンスを作成するをご覧ください。

  7. [作成] をクリックします。

    インスタンスが作成されるまで数分かかります。Vertex AI Workbench がインスタンスを自動的に起動します。インスタンスを使用する準備が整うと、Vertex AI Workbench で [JupyterLab を開く] リンクが有効になります。

JupyterLab で BigQuery リソースを参照する

このセクションでは、JupyterLab を開き、マネージド ノートブック インスタンスで使用可能な BigQuery リソースを調べます。

  1. 作成したマネージド ノートブック インスタンスの行で、[JupyterLab を開く] をクリックします。

    プロンプトが表示されたら、利用規約に同意する場合は [認証] をクリックします。マネージド ノートブック インスタンスは、新しいブラウザタブで JupyterLab を開きます。

  2. JupyterLab のナビゲーション メニューで BigQuery [ノートブック内の BigQuery] をクリックします。

    [BigQuery] ペインには、使用可能なプロジェクトとデータセットが一覧表示されます。ここで、タスクを実行できます。

    • データセットの説明を表示するには、データセット名をダブルクリックします。
    • データセットのテーブル、ビュー、モデルを表示するには、データセットを展開します。
    • 概要を JupyterLab のタブとして開くには、テーブル、ビュー、モデルをダブルクリックします。

    注: テーブルの概要説明で、[Preview] タブをクリックして、テーブルデータをプレビューします。次の画像は、bigquery-public-data プロジェクトの google_trends データセットにある international_top_terms テーブルのプレビューを示しています。

    国際的な上位用語リスト。

%%bigquery マジック コマンドを使用してノートブック データをクエリする

このセクションでは、ノートブック セルに直接 SQL を書き込み、BigQuery から Python ノートブックにデータを読み取ります。

単一または二重のパーセント文字(% または %%)を使用するマジック コマンドを使用すると、最小限の構文でノートブック内で BigQuery を操作できます。Python 用 BigQuery クライアント ライブラリは、マネージド ノートブックに自動的にインストールされます。%%bigquery マジック コマンドは、バックグラウンドで Python 用 BigQuery クライアント ライブラリを使用して指定のクエリを実行し、結果を pandas DataFrame に変換します。オプションで結果を変数に保存し、結果を表示します。

: google-cloud-bigquery Python パッケージのバージョン 1.26.0 では、%%bigquery マジックから結果をダウンロードする際にデフォルトで BigQuery Storage API が使用されます。

  1. ノートブック ファイルを開くには、[File] > [New] > [Notebook] の順に選択します。

  2. [Select Kernel] ダイアログで [Python (Local)] を選択し、[Select] をクリックします。

    新しい IPYNB ファイルが開きます。

  3. international_top_terms データセットの国ごとのリージョン数を取得するには、次のステートメントを入力します。

    %%bigquery
    SELECT
      country_code,
      country_name,
      COUNT(DISTINCT region_code) AS num_regions
    FROM
      `bigquery-public-data.google_trends.international_top_terms`
    WHERE
      refresh_date = DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY)
    GROUP BY
      country_code,
      country_name
    ORDER BY
      num_regions DESC;
    
  4. [セルを実行] をクリックします。

    出力は次のようになります。

    Query complete after 0.07s: 100%|██████████| 4/4 [00:00<00:00, 1440.60query/s]
    Downloading: 100%|██████████| 41/41 [00:02><00:00, 20.21rows/s]
    ... country_code country_name num_regions 0 TR Turkey 81 1 TH Thailand 77 2 VN Vietnam 63 3 JP Japan 47 4 RO Romania 42 5 NG Nigeria 37 6 IN India 36 7 ID Indonesia 34 8 CO Colombia 33 9 MX Mexico 32 10 BR Brazil 27 11 EG Egypt 27 12 UA Ukraine 27 13 CH Switzerland 26 14 AR Argentina 24 15 FR France 22 16 SE Sweden 21 17 HU Hungary 20 18 IT Italy 20 19 PT Portugal 20 20 NO Norway 19 21 FI Finland 18 22 NZ New Zealand 17 23 PH Philippines 17>
  5. 次のセル(前のセルの出力より下)で次のコマンドを入力して同じクエリを実行しますが、今回は結果を regions_by_country という名前の新しい pandas DataFrame に保存します。その名前を指定するには、%%bigquery マジック コマンドで引数を使用します。

    %%bigquery regions_by_country
    SELECT
      country_code,
      country_name,
      COUNT(DISTINCT region_code) AS num_regions
    FROM
      `bigquery-public-data.google_trends.international_top_terms`
    WHERE
      refresh_date = DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY)
    GROUP BY
      country_code, country_name
    ORDER BY
      num_regions DESC;
    

    注: %%bigquery コマンドで使用できる引数の詳細については、クライアント ライブラリのマジックのドキュメントをご覧ください。

  6. [セルを実行] をクリックします。

  7. 次のセルに以下のコマンドを入力し、読み取ったばかりの結果の最初の数行を確認します。

    regions_by_country.head()
    
  8. [セルを実行] をクリックします。

    pandas DataFrame regions_by_country をプロットできます。

BigQuery クライアント ライブラリを直接使用してノートブックのデータをクエリする

このセクションでは、Python 用 BigQuery クライアント ライブラリを使用して、Python ノートブックにデータを直接読み取ります。

クライアント ライブラリを使用すると、クエリをより詳細に制御でき、クエリとジョブの構成をより複雑にすることができます。ライブラリと pandas の統合により、宣言型の SQL の機能と命令コード(Python)を組み合わせて、データの分析、可視化、変換に役立てることができます。

注: Python 用のさまざまなデータ分析、データ ラングリング、可視化のライブラリ(numpypandasmatplotlib など)を使用できます。これらのライブラリのいくつかは、DataFrame オブジェクト上に構築されます。

  1. 次のセルに以下の Python コードを入力して、Python 用 BigQuery クライアント ライブラリをインポートし、クライアントを初期化します。

    from google.cloud import bigquery
    
    client = bigquery.Client()
    

    BigQuery クライアントは、BigQuery API からのメッセージの送受信に使用されます。

  2. [セルを実行] をクリックします。

  3. 次のセルに以下のコードを入力して、米国における top_terms の 1 日あたりの上位用語の、日数の重なる時間の割合を取得します。ここでの考え方は、(約1か月にわたる日付のすべてのペアについて)毎日の上位の用語を調べて、前日、2日前、3日前などの上位の用語と重複する割合を確認することです。

    sql = """
    WITH
      TopTermsByDate AS (
        SELECT DISTINCT refresh_date AS date, term
        FROM `bigquery-public-data.google_trends.top_terms`
      ),
      DistinctDates AS (
        SELECT DISTINCT date
        FROM TopTermsByDate
      )
    SELECT
      DATE_DIFF(Dates2.date, Date1Terms.date, DAY)
        AS days_apart,
      COUNT(DISTINCT (Dates2.date || Date1Terms.date))
        AS num_date_pairs,
      COUNT(Date1Terms.term) AS num_date1_terms,
      SUM(IF(Date2Terms.term IS NOT NULL, 1, 0))
        AS overlap_terms,
      SAFE_DIVIDE(
        SUM(IF(Date2Terms.term IS NOT NULL, 1, 0)),
        COUNT(Date1Terms.term)
        ) AS pct_overlap_terms
    FROM
      TopTermsByDate AS Date1Terms
    CROSS JOIN
      DistinctDates AS Dates2
    LEFT JOIN
      TopTermsByDate AS Date2Terms
      ON
        Dates2.date = Date2Terms.date
        AND Date1Terms.term = Date2Terms.term
    WHERE
      Date1Terms.date <= Dates2.date
    GROUP BY
      days_apart
    
    ORDER BY
      days_apart;
    """
    pct_overlap_terms_by_days_apart = client.query(sql).to_dataframe()
    
    pct_overlap_terms_by_days_apart.head()
    

    使用されている SQL は、Python 文字列にカプセル化され、query() メソッドに渡されてクエリが実行されます。to_dataframe メソッドはクエリが完了するのを待ち、BigQuery Storage API を使用して結果を pandas DataFrame にダウンロードします。

  4. [セルを実行] をクリックします。

    コードセルの下にクエリ結果の最初の数行が表示されます。

       days_apart   num_date_pairs  num_date1_terms overlap_terms   pct_overlap_terms
     0          0             32               800            800            1.000000
     1          1             31               775            203            0.261935
     2          2             30               750             73            0.097333
     3          3             29               725             31            0.042759
     4          4             28               700             23            0.032857
    

BigQuery クライアント ライブラリの使用の詳細については、クイックスタートのクライアント ライブラリの使用をご覧ください。

BigQuery のデータを視覚化する

このセクションでは、プロット機能を使用して、Jupyter ノートブックで以前に実行したクエリの結果を可視化します。

  1. 次のセルに以下のコードを入力し、pandas の DataFrame.plot() メソッドを使用して、国のリージョン数を返すクエリの結果を可視化する棒グラフを作成します。

    regions_by_country.plot(kind="bar", x="country_name", y="num_regions", figsize=(15, 10))
    
  2. [セルを実行] をクリックします。

    チャートは次の例のようになります。

    各国で上位の検索結果の上位

  3. 次のセルに以下のコードを入力して、pandas DataFrame.plot() メソッドを使用して、クエリの結果の上位の検索用語の重複の割合を日単位で視覚化する散布図を作成します。

    pct_overlap_terms_by_days_apart.plot(
      kind="scatter",
      x="days_apart",
      y="pct_overlap_terms",
      s=pct_overlap_terms_by_days_apart["num_date_pairs"] * 20,
      figsize=(15, 10)
      )
    
  4. [セルを実行] をクリックします。

    チャートは次の例のようになります。各ポイントのサイズは、データ内の日数が異なる日付ペアの数を反映します。たとえば、上位の検索キーワードが約 1 か月にわたって毎日表示されるため、1 日の間隔が 30 日よりも多いペアがあります。

    上位の各国での日数に関するグラフ

データの可視化の詳細については、pandas のドキュメントをご覧ください。

%bigquery_stats マジックを使用して、すべてのテーブル列の統計情報と可視化を取得する

このセクションでは、ノートブックのショートカットを使用して、BigQuery テーブルのすべてのフィールドの要約統計と可視化を取得します。

BigQuery クライアント ライブラリには %bigquery_stats コマンドがあります。このコマンドを特定のテーブル名で呼び出すと、テーブルの概要と各テーブル列の詳細な統計情報を確認できます。

  1. 次のセルに以下のコードを入力し、米国の top_terms テーブルで分析を実行します。

    %bigquery_stats bigquery-public-data.google_trends.top_terms
    
  2. [セルを実行] をクリックします。

    しばらくすると、top_terms テーブルの 7 つの変数のそれぞれにさまざまな統計情報を含むイメージが表示されます。次の図は、出力例の一部を示しています。

    国際的な統計の概要。

クエリ履歴の表示とクエリの再使用

JupyterLab でクエリ履歴をタブとして表示するには、次の手順を行います。

  1. JupyterLab のナビゲーション メニューで BigQuery [ノートブック内の BigQuery] をクリックし、[BigQuery] ペインを開きます。

  2. [BigQuery] ペインで下にスクロールし、[クエリ履歴] をクリックします。

    左側のナビゲーションの下部にハイライト表示されたクエリ履歴

    クエリのリストが新しいタブに表示され、次のようなタスクを実行できます。

    • ジョブ ID、クエリ実行日時、実行時間など、クエリの詳細を表示するには、クエリをクリックします。
    • クエリを修正するには、再度実行するか、ノートブックで使用できるようにコピーして、[クエリをエディタで開く] をクリックします。

ノートブックの保存とダウンロード

このセクションでは、ノートブックを保存します。このチュートリアルで使用したリソースをクリーンアップした後、後で使用するために、ノートブックをダウンロードします。

  1. [File] > [Save Notebook] の順に選択します。
  2. [File] > [Download] を選択して、ノートブックのローカルコピーを IPYNB ファイルとしてパソコンにダウンロードします。

クリーンアップ

課金を停止する最も簡単な方法は、このチュートリアル用に作成した Cloud プロジェクトを削除することです。

  1. コンソールで [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ