Hex上でSnowflakeのデータを読み込んで機械学習をやってみた

SQLとPyhtonのコラボレーション
2022.07.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

大阪オフィスの玉井です。

Hex上でSnowflakeのデータを読み込み、そのまま簡単な機械学習を(Pythonで)行ってみました。

Hexとは?

以下の記事をどうぞ。

やってみた

以下のプロジェクトを真似してみます。ただし、読み込むデータは、csvファイルではなく、Snowflakeを使います。

ちなみに、このプロジェクトでやることは「家の面積から家の価格(住宅価格)を予測する」です。

前段

Hex側

今回のための、新規プロジェクトを用意しておきます。

Snowflake側

ドキュメントにあるCSVを、事前にロードしておきます。

今回のプロジェクトは「家の面積から家の価格(住宅価格)を予測する」なので、このデータも住宅に関するデータとなっています。

Snowflakeを接続する

それでは、HexにSnowflakeをつないでみましょう。

プロジェクトを開いたら、画面左のメニューから、データソースを接続するメニューがあるので、そこからSnowflakeを選択します。

接続するSnowflakeの各種情報を入力します(Hex用のVWHを用意しておくのが良いと思いますが、今回は -めんどかったので- 既存のVWHを設定しています)。

接続に成功すると、下記のように、プロジェクトに「繋がれているデータソース」みたいな感じで表示されるようになります。

ちなみに、接続しているDWHのDBやスキーマなどは、Hex上のエクスプローラー的な機能で参照することができます。便利です。

SnowflakeのテーブルをSQLで参照する(DataFrameにする)

HexにつないだDWHは、Hex上のプロジェクトから、直接参照することができます。今回はSQLセルで参照してみます。

以下のように、簡単なSQLを、SQLセルで実行してみます。すると、Snowflakeのワークシートと同じようなノリで、簡単にデータを参照することができました。

Hexとして強力なのがSQLで参照したデータをそのままDataFrameにできる機能です。上記のスクショの下を見ればわかりますが、SELECT文を実行しただけで、その結果をDataFrameに入れてくれています。当然、このDataFrameは、後に続くPythonから扱うことができます。今までは、DWHにあるデータをNotebookで扱う際は、DWH側が用意したSDK等を使って、プログラム内で呼び出さないといけませんでしたが、HexではSQLが使えるため、この部分が格段に便利です。

データの確認する

ここから機械学習フェーズになります。実行するコードは上記ドキュメントそのままなので、ここにテキストとして載せることはしません(ドキュメントからコピーできます)。

散布図で確認する

データの分布を確認するため、散布図を使います。色々なライブラリがありますが、ここはHexの標準機能で散布図を描画します。

まず、必要なPythonライブラリをインポートしておきます(上記ドキュメント参照)。

繰り返しになりますが、今回は「家の面積から家の価格(住宅価格)を予測する」ので、必要なデータだけ抜き出したいと思います(つまり、面積と価格)。

先程、SQLでSnowflakeからとってきたDataFrameを早速使っています。

次にDisplayセルからChartを選びます。

以下のように設定値を入力し、散布図を作成します。

ヒストグラムで確認する

散布図を見ると、なんとなく面積と価格は比例しているようにも見えますが、左下にデータがかたまっており、データが偏っている可能性があるため、ヒストグラムも見てみます。

やはり分布が歪んだデータになっていました(右歪曲分布)。機械学習として、こういうデータに対する対処方法は色々ありますが、そこについて私は語れるだけの知識を持ち合わせていないため、ドキュメントに従い、今回は対数変換を行います。

正規分布に近づけました。(スクショがないですが)散布図を改めて見ても、塊が無くなり、キレイなデータになったと思います。

線形回帰モデルを作成する

というわけで、いよいよ機械学習モデルを作成します。今回は線形回帰を実施します。

テストデータと訓練データに分けて、いざモデル作成。

Hex側でmodel という変数が出来ているのが確認できますね。

モデルの評価

平均二乗偏差と決定係数の確認

作成した線形回帰モデルが、どのくらい良いモデルなのか(=どれだけ予測できるか)を見ていきます。

まず、テストデータに対して、このモデルを実行し、実際に住宅価格を予測してみます。

今回は、モデルの評価指標として使われる平均二乗偏差(RMSE)決定係数(R2)を、Hex上で可視化してみます。

DisplayセルからSingle Valueを選んで、先程生成されたRMSEとR2を、シングルバリューとして可視化します。

これで、他人がこのプロジェクトをレポートとして読むときも、分かりやすくなりますね。

傾きと切片の確認

モデルに問題が無いため、いよいよ回帰直線を引く段階に入ります。

線を引くための傾きと切片を取得します(ついでにシングルバリューで可視化)。

傾きが0.52ということは、面積が1ユニット変わるたびに、住宅価格が0.52変わるということになります。

線を引いてみる

回帰直線を作成します。

HexのChartで実際に描画してみます。HexのChartは、複数のグラフを重ねることができます。以下も、散布図と回帰直線を重ねています。

おわりに

DWHからSQLでデータをとってきて、そのままPythonに移行できるのは非常に強力ですね。そして、このまま分析レポートとして共有することもできるし、もう少し手を加えて、他の人が使える「データアプリ」にすることもできるっぽいので、とても面白いSaaSだなと思いました。