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

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

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

目標

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

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

料金

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

始める前に

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

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

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

  2. Google Cloud Platform プロジェクトを選択または作成します。

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

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

    APIを有効にする

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

ローカルの Jupyter 環境の設定

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

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

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

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

概要: Jupyter ノートブック

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  7. 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. [Run] をクリックします。

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

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

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

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

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

  1. 以下の Python コードを次のセルに入力して、BigQuery Python クライアント ライブラリをインポートし、クライアントを初期化します。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)をご覧ください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...