JupyterLab から BigQuery のデータを探索して可視化する
このページでは、Vertex AI Workbench インスタンスの JupyterLab インターフェース内から BigQuery に保存されているデータを探索して可視化する方法の例を紹介します。
始める前に
まだ作成していない場合は、Vertex AI Workbench インスタンスを作成します。
必要なロール
インスタンスのサービス アカウントに BigQuery でデータのクエリを実行するために必要な権限を付与するには、プロジェクトで Service Usage ユーザー(roles/serviceusage.serviceUsageConsumer
)IAM ロールをインスタンスのサービス アカウントに付与するように管理者へ依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
管理者は、カスタムロールや他の事前定義ロールを使用して、必要な権限をインスタンスのサービス アカウントに付与することもできます。
JupyterLab を開く
Google Cloud コンソールで、[インスタンス] ページに移動します。
Vertex AI Workbench インスタンス名の横にある [JupyterLab を開く] をクリックします。
Vertex AI Workbench インスタンスで JupyterLab が表示されます。
BigQuery からデータを読み取る
次の 2 つのセクションでは、後の可視化で使用するデータを BigQuery から読み取ります。これらの手順は、JupyterLab から BigQuery のデータをクエリするで説明した手順と同じです。すでに完了している場合はスキップして、BigQuery テーブルのデータの概要を取得するをご覧ください。
%%bigquery マジック コマンドを使用してデータをクエリする
このセクションでは、ノートブック セルに SQL を直接記述し、BigQuery から Python ノートブックにデータを読み取ります。
1 個または 2 個のパーセント記号(%
または %%
)が付いたマジック コマンドを使用すると、ノートブック内で最小限の構文を使用して BigQuery を操作できます。Python 用の BigQuery クライアント ライブラリは、Vertex AI Workbench インスタンスに自動的にインストールされます。%%bigquery
マジック コマンドは、バックグラウンドで Python 用 BigQuery クライアント ライブラリを使用して指定のクエリを実行し、結果を Pandas DataFrame に変換(オプションで結果を変数に保存)して、それを表示します。
注: google-cloud-bigquery
Python パッケージのバージョン 1.26.0 では、%%bigquery
マジックから結果をダウンロードする際にデフォルトで BigQuery Storage API が使用されます。
ノートブック ファイルを開くには、[File] > [New] > [Notebook] の順に選択します。
[Select Kernel] ダイアログで [Python 3] を選択し、[Select] をクリックします。
新しい IPYNB ファイルが開きます。
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;
[
Run cell] をクリックします。出力は次のようになります。
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 ...
次のセル(前のセルの出力の下)で、以下のコマンドを入力して同じクエリを実行します。ただし、今回は
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
コマンドで使用できる引数の詳細については、クライアント ライブラリのマジックのドキュメントをご覧ください。[
Run cell] をクリックします。次のセルで以下のコマンドを入力すると、先ほど読み取ったクエリ結果の最初の数行が表示されます。
regions_by_country.head()
[
Run cell] をクリックします。これで、pandas DataFrame
regions_by_country
をプロットに使用する準備ができました。
BigQuery クライアント ライブラリを直接使用してデータをクエリする
このセクションでは、Python 用 BigQuery クライアント ライブラリを直接使用して Python ノートブックにデータを読み込みます。
クライアント ライブラリを使用すると、クエリをより詳細に制御できます。また、クエリとジョブでより複雑な構成を使用することもできます。ライブラリと pandas のインテグレーションにより、宣言型の SQL の機能と命令コード(Python)を組み合わせて、データの分析、可視化、変換を行うことができます。
注: Python 用にさまざまなデータ分析、データ ラングリング、可視化のライブラリが用意されています(numpy
、pandas
、matplotlib
など)。これらのライブラリのいくつかは DataFrame オブジェクトを基盤とします。
次のセルに以下の Python コードを入力して、Python 用 BigQuery クライアント ライブラリをインポートし、クライアントを初期化します。
from google.cloud import bigquery client = bigquery.Client()
BigQuery クライアントは、BigQuery API との間のメッセージの送受信に使用されます。
[
Run cell] をクリックします。次のセルに以下のコードを入力して、米国の
top_terms
で 1 日の上位語句の重なりの割合を日数差で取得します。これは、各日の上位語句が前日、2 日前、3 日前と何 % 重なっているのかを調べるものです(約 1 か月間のすべての日付ペアについて調べます)。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 にダウンロードします。[
Run cell] をクリックします。クエリ結果の最初の数行がコードセルの下に表示されます。
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 テーブルのデータの概要を取得する
このセクションでは、ノートブックのショートカットを使用して、BigQuery テーブルのすべてのフィールドの要約統計を取得し、可視化します。これにより、詳しい調査を実施する前に、データをプロファイリングできます。
BigQuery クライアント ライブラリには %bigquery_stats
マジック コマンドがあります。特定のテーブル名を指定してこのコマンドを呼び出すと、テーブルの概要と各テーブル列の詳細な統計情報を取得できます。
次のセルに以下のコードを入力して、米国の
top_terms
テーブルで分析を行います。%bigquery_stats bigquery-public-data.google_trends.top_terms
[
Run cell] をクリックします。しばらく実行すると、
top_terms
テーブルの 7 つの変数のそれぞれについて、さまざまな統計情報を含む画像が表示されます。次の図は、出力例の一部を示しています。
BigQuery のデータを視覚化する
このセクションでは、プロット機能を使用して、Jupyter ノートブックで以前に実行したクエリの結果を可視化します。
次のセルに以下のコードを入力し、pandas
DataFrame.plot()
メソッドを使用して、国別のリージョン数を返すクエリの結果を棒グラフで可視化します。regions_by_country.plot(kind="bar", x="country_name", y="num_regions", figsize=(15, 10))
[
Run cell] をクリックします。次のようなグラフになります。
次のセルに以下のコードを入力し、pandas
DataFrame.plot()
メソッドを使用して、クエリ結果から上位の検索語句の重複率を日単位で視覚化する散布図を作成します。pct_overlap_terms_by_days_apart.plot( kind="scatter", x="days_apart", y="pct_overlap_terms", s=len(pct_overlap_terms_by_days_apart["num_date_pairs"]) * 20, figsize=(15, 10) )
[
Run cell] をクリックします。次のようなグラフになります。各ポイントのサイズは、データ内の日数が異なる日付ペアの数を反映します。たとえば、上位の検索語句はほぼ 1 か月間毎日出現しているため、期間が 1 日のペアのほうが 30 日のペアよりも数が多くなります。
データの可視化の詳細については、pandas のドキュメントをご覧ください。