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

BigQuery は、ペタバイト級のアナリティクス データ ウェアハウスであり、巨大容量のデータに対して SQL クエリをリアルタイムに近い速度で実行できます。

データ可視化ツールは、BigQuery データを把握して、インタラクティブに分析するのに役立ちます。可視化ツールを使って、傾向を特定して対応し、データを利用して予測を行うことができます。このチュートリアルでは、Jupyter ノートブックで Python と pandas 用の BigQuery クライアント ライブラリを使用して、BigQuery の natality サンプル テーブルのデータを可視化します。

目標

このチュートリアルの内容は、次のとおりです。

  • Jupyter ノートブックを実行する環境を設定する
  • BigQuery Python クライアント ライブラリと pandas を使用して BigQuery データのクエリを実行し、可視化する

料金

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

始める前に

このチュートリアルを始める前に、Google Cloud Console を使用して、プロジェクトを作成または選択します。

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

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

    [プロジェクトの選択] ページに移動

  3. 新しいプロジェクトでは、BigQuery が自動的に有効になります。既存のプロジェクトで BigQuery を有効にするには、 BigQuery API を有効にします。

    API を有効にする

    にアクセスします。
  4. クレジット カード情報の提供やプロジェクトに対する課金の有効化を行わない場合は、BigQuery によってサンドボックスが提供されます。このトピックの手順は、プロジェクトへの課金が有効かどうかに関係なく機能します。必要に応じて課金を有効にする場合は、課金を有効にする方法についてをご覧ください。

ローカルの Jupyter 環境の設定

このチュートリアルでは、ローカルにホストされる Jupyter ノートブックを使用します。次の操作を行って、Jupyter のインストール、認証の設定、必要な Python ライブラリのインストールを行います。

  1. ターミナルで次のコマンドを実行して、pandas を使用する関数に必要な pandas ライブラリを含む、最新バージョンの Python 用 BigQuery クライアント ライブラリをインストールします。

    pip install --upgrade 'google-cloud-bigquery[pandas]'
    
  2. Jupyter のドキュメントで説明しているインストール手順に沿って、Jupyter をインストールします。

  3. 認証の開始ページの手順に沿って、アプリケーションのデフォルト認証情報を設定します。認証を設定するには、サービス アカウントを作成し、環境変数を設定します。

概要: Jupyter ノートブック

ノートブックにより、コードを作成および実行する環境が提供されます。ノートブックは、本質的にソース アーティファクトであり、.ipynb ファイルとして保存されます。このファイルには、説明テキスト コンテンツ、実行可能コードブロック、関連する結果(インタラクティブ HTML として表示される)を含めることができます。構造的に、ノートブックは一連のセルです。

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

  • コードセル - 評価するコードが含まれます。コードを実行して生成された出力や結果は、入力コードのすぐ後に表示されます。

  • マークダウン セル - HTML に変換されるマークダウン テキストが含まれ、ヘッダー、リスト、書式付きテキストの生成に使用されます。

以下のスクリーンショットは、マークダウン セルとそれに続く Python コードセルを示しています。Python セルの出力はコードのすぐ下に表示されます。

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

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

BigQuery データのクエリと可視化

チュートリアルのこのセクションでは、BigQuery 内のデータのクエリと可視化に使用する Datalab ノートブックを作成します。natality サンプル テーブルのデータを使って、可視化を行います。このチュートリアルのクエリはすべて、標準 SQL の構文を使用します。

Jupyter ノートブックを使用して BigQuery データのクエリを実行し、可視化するには:

  1. Jupyter をまだ起動していない場合は、ターミナルで次のコマンドを実行します。

    jupyter notebook
    
  2. これで Jupyter が実行され、ブラウザ ウィンドウで開かれます。Jupyter ウィンドウで [New] ボタンをクリックし、[Python 3] を選択して Python ノートブックを作成します。

    Jupyter の新しい Python 3 ノートブック

  3. ページ上部の [Untitled] をクリックします。

  4. [Rename notebook] ダイアログで、「BigQuery tutorial」などの新しい名前を入力して、[Rename] をクリックします。

  5. Python 用の BigQuery クライアント ライブラリには、最小限のコードでクエリを実行するためのマジック コマンドが用意されています。クライアント ライブラリからこのマジック コマンドを読み込むには、以下のコードをノートブックの最初のセルに貼り付けます。

    %load_ext google.cloud.bigquery
  6. [Run] ボタンをクリックするか SHIFT + ENTER キーを押してコマンドを実行します。

  7. Python 用 BigQuery クライアント ライブラリにはセルマジックである %%bigquery が用意されています。このセルマジックは SQL クエリを実行して、結果を pandas DataFrame として返します。次のセルに以下のコードを入力して、年別の出生数の合計を返します。

    %%bigquery
    SELECT
        source_year AS year,
        COUNT(is_male) AS birth_count
    FROM `bigquery-public-data.samples.natality`
    GROUP BY year
    ORDER BY year DESC
    LIMIT 15
  8. [Run] をクリックします。

  9. コードセルの下にクエリの結果が表示されます。

    年別の出生数

  10. 次のセルブロックで、以下のコマンドを入力して同じクエリを実行しますが、今回は新しい変数 total_births に結果を保存します(この変数は、%%bigquery の引数として指定されています)。結果は、より詳細な分析と可視化のために利用できます。

    %%bigquery total_births
    SELECT
        source_year AS year,
        COUNT(is_male) AS birth_count
    FROM `bigquery-public-data.samples.natality`
    GROUP BY year
    ORDER BY year DESC
    LIMIT 15
  11. [実行] をクリックします。

  12. これで、pandas DataFrame が変数 total_births に保存され、プロットに使用できます。クエリ結果のプロットを準備するには、次のセルに以下の組み込みマジック コマンドを貼り付けて matplotlib を有効にします。matplotlib は、pandas で使用されるプロット用のライブラリです。

    %matplotlib inline
  13. [実行] をクリックします。

  14. 次のセルに以下のコードを入力し、pandas の DataFrame.plot() メソッドを使用してクエリ結果を棒グラフとして可視化します。pandas によるデータ可視化の詳細については、pandas のドキュメントをご覧ください。

    total_births.plot(kind="bar", x="year", y="birth_count")
  15. [Run] をクリックします。

  16. コードブロックの下にグラフが表示されます。

    年別の出生数を表す棒グラフ

  17. 続いて、次のセルに以下のクエリを貼り付けて、曜日別の出生数を取得します。

    %%bigquery births_by_weekday
    SELECT
        wday,
        SUM(CASE WHEN is_male THEN 1 ELSE 0 END) AS male_births,
        SUM(CASE WHEN is_male THEN 0 ELSE 1 END) AS female_births
    FROM `bigquery-public-data.samples.natality`
    WHERE wday IS NOT NULL
    GROUP BY wday
    ORDER BY wday ASC

    wday(weekday)フィールドでは null 値が許可されるため、このクエリでは wday が null であるレコードを除外しています。

  18. [Run] をクリックします。

  19. 次のセルに以下のコードを入力し、クエリ結果を折れ線グラフで表示します。

    births_by_weekday.plot(x="wday")
  20. [Run] をクリックします。

  21. コードブロックの下にグラフが表示されます。出生数が日曜日(1)と土曜日(7)に大幅に低下していることがわかります。

    曜日別の出生数を表す折れ線グラフ

  22. [File] > [Save and Checkpoint] をクリックするか、ツールバーの保存アイコンをクリックします。チェックポイントを作成すると、ノートブックを以前の状態にロールバックできます。

pandas DataFrame

マジック コマンドを使用すると、最小限の構文で BigQuery を操作できます。%%bigquery のバックグラウンドでは、Python 用 BigQuery クライアント ライブラリを使用して指定のクエリを実行し、結果を pandas DataFrame に変換します。続いて、オプションで結果を変数に保存し、最後に結果を表示します。マジック コマンドの代わりに Python 用 BigQuery クライアント ライブラリを直接使用すると、クエリをより詳細に制御でき、より複雑な構成が可能になります。ライブラリと pandas の統合により、宣言型の SQL の機能と命令コード(Python)を組み合わせて、データの分析、可視化、変換操作を行うことができます。

pandas DataFrame による BigQuery データのクエリと可視化

チュートリアルのこのセクションでは、pandas DataFrame を使用して BigQuery データのクエリ実行と可視化を行います。Python 用 BigQuery クライアント ライブラリを使用して、BigQuery データをクエリします。pandas ライブラリの DataFrame を使用してデータを分析します。

  1. 以下の Python コードを次のセルに入力して、Python 用 BigQuery クライアント ライブラリをインポートし、クライアントを初期化します。BigQuery クライアントは、BigQuery API からのメッセージの送受信に使用されます。

    from google.cloud import bigquery
    
    client = bigquery.Client()
  2. [Run] をクリックします。

  3. Client.query() メソッドを使用してクエリを実行します。次のセルに、以下のコードを入力して、年別の多生児の出生数を取得するクエリを実行します。出生数は多生児の人数(双子の場合は 2、三つ子の場合は 3 など)ごとに取得します。

    sql = """
    SELECT
        plurality,
        COUNT(1) AS count,
        year
    FROM
        `bigquery-public-data.samples.natality`
    WHERE
        NOT IS_NAN(plurality) AND plurality > 1
    GROUP BY
        plurality, year
    ORDER BY
        count DESC
    """
    df = client.query(sql).to_dataframe()
    df.head()
  4. [Run] をクリックします。

  5. DataFrame 内のクエリ結果をグラフ表示するには、次のセルに以下のコードを挿入して、データのピボットを行い、時系列の多生児数の積み上げ棒グラフを作成します。

    pivot_table = df.pivot(index="year", columns="plurality", values="count")
    pivot_table.plot(kind="bar", stacked=True, figsize=(15, 7))
  6. [Run] をクリックします。

  7. コードブロックの下にグラフが表示されます。

    年別の多生児数を表す積み上げ棒グラフ

  8. 次のセルに以下のクエリを入力し、妊娠週別の出生数を取得します。

    sql = """
    SELECT
        gestation_weeks,
        COUNT(1) AS count
    FROM
        `bigquery-public-data.samples.natality`
    WHERE
        NOT IS_NAN(gestation_weeks) AND gestation_weeks <> 99
    GROUP BY
        gestation_weeks
    ORDER BY
        gestation_weeks
    """
    df = client.query(sql).to_dataframe()
  9. [Run] をクリックします。

  10. DataFrame 内のクエリ結果をグラフ表示するには、次のセルに以下のコードを貼り付けます。

    ax = df.plot(kind="bar", x="gestation_weeks", y="count", figsize=(15, 7))
    ax.set_title("Count of Births by Gestation Weeks")
    ax.set_xlabel("Gestation Weeks")
    ax.set_ylabel("Count")
  11. [Run] をクリックします。

  12. コードブロックの下に棒グラフが表示されます。

    妊娠週別の平均体重。

次のステップ

  • BigQuery 用のクエリの作成方法を学習する - BigQuery ドキュメントのデータのクエリでは、クエリの実行方法やユーザー定義関数(UDF)の作成方法などを説明しています。

  • BigQuery の構文を見る - BigQuery の SQL クエリに推奨される言語は標準 SQL です。この言語については、SQL リファレンスをご覧ください。BigQuery のレガシー SQL の構文については、クエリ リファレンス(レガシー SQL)をご覧ください。