Snowflake入門：データ取り込みから可視化まで

みなさん、こんにちは！
Snowflake を使い始めたばかりで使い方がよくわからない、データの取り込みや分析はどうやってすればよいの？という方を対象に、基本操作をハンズオン形式でシンプルに解説します。

本記事を読むことで、Snowflake へのデータ取り込み、テーブル作成からダッシュボードによる可視化までの一連の操作方法を知ることができます。

## データ準備
はじめに、取り込み元のデータとして政府が公開している[人口統計データ](https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00200521&tstat=000001011777&cycle=0&tclass1=000001094741&stat_infid=000031524010&tclass2val=0)をダウンロードしておきます。
中身は以下のようなCSVデータで、全国と都道府県の人口統計データが記録されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/62d5fa35-3b2e-46d0-a2f0-057b6ad2ccbe.png)

## データベース作成
メニューの「データ」→「データベース」を開き、「＋データベース」ボタンをクリックします。
新しいデータベースの名前を入力し作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/ad9b3cd8-54be-4b2f-81f0-9fe36e352c86.png)

「プロジェクト」→「ワークシート」を開き、右上のボタンで「SQLワークシート」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/1507adf9-89cf-4181-9b1f-0b5285dd0531.png)

新規作成されたワークシートが開きます。
ワークシート名はタブ部分をダブルクリックするか、一覧の表示から変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/ac620351-bcd7-43fe-aeaa-93cfc2d7eb95.png)

データベースを`TEST`、スキーマを`PUBLIC`として設定します。
※データベース、スキーマを設定しておくことで、SQL文中で明示的にデータベースとスキーマを指定する必要がなくなるので便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/2aa982c8-35ad-417b-bcd9-7569b430b192.png)

以下のSQLを実行し、`population`テーブルを作成します。
```ruby:qiita.rb
CREATE OR REPLACE TABLE population (
    "都道府県コード" STRING,
    "都道府県名" STRING,
    "元号" STRING,
    "和暦（年）" STRING,
    "西暦（年）" STRING,
    "注" STRING,
    "人口（総数）" INTEGER,
    "人口（男）" INTEGER,
    "人口（女）" INTEGER
);
```

データベースから作成されたテーブルを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/a74356b6-378a-4c1c-8d98-dace964427bf.png)

## データロード
先ほどダウンロードした人口統計データのファイルを Snowflake にアップロードします。
「データ」→「データを追加」から「テーブルにデータをロード」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/6157d556-3e8a-4653-9482-d6e1224902a6.png)

ファイルをアップロードし、ロード対象のデータベースとスキーマ、テーブルを選択して「次へ」をクリックします。
※ファイルの文字コードは UTF-8 にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/7c5b4226-b8c5-4698-87e8-24a356713dac.png)

ロードの画面が開いたら、左側でロードの設定を行います。今回はファイル形式を Delimited Files (CSV or TSV) とし、ヘッダー行を含むため「最初の行をスキップ」としました。残りはデフォルト設定のままです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/411b45e3-d96e-4a65-9943-599e133a8917.png)

設定が正しくできていないかファイルを正常に読み込めない場合は右側がエラー表示になります。その場合、ファイルに異常がないか、設定が適切にできているかを再度確認しましょう。設定が完了したら「ロード」をクリックします。

ロードに失敗しました。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/fb6fa914-bdf3-41e8-ac5d-ac41c8462653.png)

エラー箇所を確認したところ、沖縄県で人口が「-」になっている所がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/0d366eec-6ba0-434b-bb7a-46cdbdbb52be.png)

そのままでは読み込めないデータが含まれているので、設定に戻りロード時にエラーが発生した場合の設定を「ファイルから有効なデータのみをロード」に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/aa2a83bf-9e9b-4e17-a275-3ed387c5a87a.png)

再度ロードを実行すると、今度は正常にデータが挿入されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/9a988324-b284-4e31-bff1-13c26e17c7a0.png)

テーブルデータにもデータが入っていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/78ad23d2-8530-430f-befe-5de6b1c5aa00.png)

## クエリ実行、分析
無事にデータを取り込むことができたので、クエリの実行と分析を行っていきます。

以下のSQLを実行し、カラム名を日本語から英語に変換した`population_renamed`テーブルを作成します。
```ruby:qiita.rb
CREATE TABLE population_renamed (
    prefectures_code STRING,
    prefectures STRING,
    era STRING,
    year_jp STRING,
    year STRING,
    note STRING,
    population INTEGER,
    man_population INTEGER,
    woman_population INTEGER
) AS SELECT * FROM population;
```

テーブルが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/ec4b72b5-8397-44e7-b607-2d07c0fc89bd.png)

以下のSQLを実行し、注釈などの余分なデータを除いた`population_prepared`テーブルを作成します。
```ruby:qiita.rb
CREATE TABLE population_prepared
AS SELECT * FROM population_renamed
WHERE prefectures_code RLIKE '\\d{2}';
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/cdf78fb3-4584-4040-addc-b2999a7ec8ba.png)

年ごとの全国人口推移を可視化するため、以下のSQLを実行します。
```ruby:qiita.rb
SELECT year, population, man_population, woman_population
FROM population_prepared
WHERE prefectures = '全国'
ORDER BY 1;
```

ワークシート下部の「チャート」をクリックし、以下のように設定します。

* チャート型：ライン
* データ
・MANPOPULATION（用途：ライン、集計：なし）
・WOMANPOPULATION（用途：ライン、集計：なし）
・POPULATION（用途：ライン、集計：なし）
・YEAR（用途：X軸、バケット化：なし）

上記の設定を行うと、左側に人口推移を表した折れ線グラフが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/c5e38a13-0522-4a2f-bd8d-fed6f710b027.png)

作成したチャートは、ワークシートを開きなおしてもそのまま表示されます。ただし、新しいSQLを実行した場合は結果とチャートが上書きされてしまい表示できなくなるのでご注意ください。

## ダッシュボード作成
可視化まで完了したので、作成したワークシートをもとにダッシュボードを作成してみます。

ワークシート名にカーソルを合わせてメニューを開き、「移動」→「新しいダッシュボード」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/de9cbdc1-28dc-43f8-bfb8-2ac9c0a67c5b.png)

ポップアップが開くため、ダッシュボード名を入力し「ダッシュボードを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/dc647e00-92e5-4a05-8652-a49d167578c4.png)

以上でダッシュボードの作成は完了です！ 右上の「実行」を押すと最新のデータに基づいてグラフが更新されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/50d314dd-fb13-4b2f-aa98-39500dcb263c.png)

※ワークシートを使用してダッシュボードを作成した場合、もとのワークシートは一覧から削除されて利用できなくなるため注意が必要です。グラフのメニューから「クエリを編集」でクエリにアクセスすること自体は可能です。

## さいごに
Snowflake の基本操作についてご紹介しました。

今回はローカルファイルを直接アップロードして取り込む方法をご紹介しましたが、AWS/GCP/Azure上のファイルを取り込んだり、ストリーミングデータを取り込んだりすることも可能です。また、ワークシートもSQLだけではなく、Pythonを利用してプログラムと組み合わせた高度な処理を行うこともできます。本記事でご紹介した以外にも様々な機能があるので、ぜひご自身でもいろいろと触って試してみてください。

## 参考
* [Snowflake入門 - ゼロからはじめるSnowflake](https://quickstarts.snowflake.com/guide/getting_started_with_snowflake_ja)
* [ダッシュボードを使用したデータの視覚化 | Snowflake Documentation](https://docs.snowflake.com/ja/user-guide/ui-snowsight-dashboards)