Data Science Experience(DSX)とは、分析に必要なツールがまとまった環境です。この記事では、DSX を IBM Cloud から利用し、データの可視化や予測を行います。
当記事の説明文と画面キャプチャは一部変更前のものであり現在の ”Watson Studio” のものとは異なる部分がございます。ご了承ください。 ※Watson Studio は DSX クラウド版の後継製品です。 Watson Studio の詳細はこちら
はじめに
無料で Data Science Experience (Watson Studio) を使う IBM Cloud に登録
「データ分析を始めたいけれど、環境を整えるのが大変そう」 と思っていませんか。確かに、ツールやライブラリーをインストールする作業には、手間も時間もかかります。
IBM Cloud では、必要なツールがまとまった環境である Data Science Experience(DSX)をサービスとして提供しているため、すぐに分析を始められます。簡単な例を用いて、データの可視化や予測を試してみましょう。
Data Science Experience について
概要
Data Science Experience (DSX) とは、データ分析に必要なツールを提供する、クラウドベースの開発環境です。コードやその実行結果、データソースの定義を、プロジェクト内のメンバーで効率的に共有できます。
利用するツール
今回のチュートリアルで利用するツールを紹介します。
- Jupyter Notebook: ブラウザ上で使用できる、対話型の実行環境です。セル単位でコードを開発・実行して、分析結果を即時に確認できます。また、グラフ描画のライブラリーを用いることで、データをその場で可視化し表示することが可能です。この Jupyter Notebook から、Python(データ分析の分野でよく利用されているプログラミング言語)を用いて、分析を行います。その際、以下のライブラリーを利用します。
- pandas: DataFrame という 2 次元の表の形でデータを操作できるライブラリーです。
- Brunel: 簡単なコードでデータを可視化できるライブラリーです。
- scikit-learn: 分類、回帰、次元削減などが可能な、機械学習のライブラリーです。
これらのツールとライブラリーは、予め DSX に組み込まれているため、インストール不要です。
前提
- IBM Cloud のアカウントを持っていること。
- 基本的なプログラミングの知識を有していること。ただし、コードは予め用意したものを使用します。
- チュートリアルを始める前に、sakura_handson.zip をダウンロードしてください。これは以下のファイルを含みます。
sakura_handson.ipynb
: Jupyter Notebook を用いて開発したコードを、ファイルとして保存したものobs_station.csv
cherry_blooming.csv
weather_data.csv
チュートリアルの概要
ここではチュートリアルとして、気象データの可視化、および桜の開花日の予測を行います。
データについて
気象庁の Web サイトで公開されている気象観測データを、扱いやすいように加工したものを、分析データとして用います。データの利用に関しては、リンク先の利用規約をご確認ください。
加工済みデータのファイルは、以下の 3つです。
obs_station.csv
気象観測所の位置情報が記録されています。cherry_blooming.csv
日本の 53 都市における、2007-2017 年の桜の開花日が記録されています。
これは以下のリンクから取得したデータを加工したものです。weather_data.csv
日本の 53 都市における、2007-2017 年の 1/1-6/30 の期間の気象情報が記録されています。blooming というカラムには、cherry_blooming.csv を元に、開花日より前は 0、開花日以降は 1 の値が入っています。
予測には weather_data.csv
のデータのみを利用します。他の 2つのデータは可視化に利用します。
手順の流れ
以下の流れで、環境の準備および分析を行います。
- 環境の準備
- DSX サービスの作成
- プロジェクト作成
- Notebook の作成
- 分析
- データの読み込み
- データの理解
- Brunel を利用してデータを可視化
- データの加工
- pandas を用いて特徴量を作成
- モデル作成
- scikit-learn を用いて桜の開花日を予測
チュートリアルの手順
環境の準備まずは分析を行うための環境を準備します。
DSX サービス (Watson Studio) の作成以下の手順で、IBM Cloud のスペースに DSX (Watson Studio) サービスを作成します。
- IBM Cloud にログインし、カタログを開きます。(新規登録・ログイン)
- 検索欄に「Watson Studio」と入力し、検索結果の中から「Watson Studio」を選択します。
- 表示された画面を下方へスクロールし、「Lite」プランであることを確認します。
- 「作成」をクリックすると、Watson Studio サービスが作成されます。
- 完了後、サービスの画面に入り「Get Started」をクリックすると、Watson Studio の画面が開きます。
注: 「Select Organization and Space」のポップアップが出てきた場合は、項目を入力して「Continue」をクリックし、表示された画面の「Get Started」をクリックします。
プロジェクト作成
以下の手順で、Watson Studio 上に新規プロジェクトを作成します。
- 開いた Watson Studio の画面で、「New Project」をクリックします。
- プロジェクトの種類として、「Jupyter Notebooks」 を選択し、「OK」をクリックします。
- ここでは、「Name」の項目に「tutorial」と入力し、「Create」をクリックすると、プロジェクトが作成されます。
- 作成したプロジェクトの画面には以下のタブがあり、各情報を確認できます。
- Overview : プロジェクトの概要
- Assets : アップロードしたデータや、作成済みの Notebook の一覧
- Collaborators : メンバーの確認・設定
Notebook の作成
以下の手順で、プロジェクト内で Jupyter の Notebook を作成します。
- プロジェクトの画面で、「Add to project」から「Notebook」を選択します。
- 「From file」タブを選択し、 「Notebook file」の「Browse…」から、ダウンロードした sakura_handson.ipynb を選択します。
- 「Create Notebook」をクリックすると、Notebook が作成されます。
- 作成した Notebook が編集モードで開きます。
注: Notebook を閉じてしまった際は、プロジェクトの Asset タブから再度開くことができます。図のように編集マークが表示されている場合は、クリックして編集モードに切り替えます。
分析
作成した Notebook 上で分析を行います。
データの読み込み
以下の手順で、必要なデータをファイルから読み込みます。
- 右上のデータマークをクリックし、表示された点線枠内の領域へ
obs_station.csv
をドロップします。 - アップロードが完了したら、セル 1-1 の 2 行目をクリックしてカーソルを合わせます。
obs_station.csv
の項目の「Insert to code」から、「Insert pandas DataFrame」を選択すると、カーソルを合わせた部分にコードが挿入されます。- 挿入されたコードの下 2 行の「df_data_1」を、「df_station」と書き換えます。
- 「Run」をクリックすると、フォーカスが当たっているセル (ここではセル 1-1) 内に記述されたコードが実行されます。
- 下図のように、セルの左の In [ ]の箇所に * が入っているときは実行中、数字に変化したら実行完了です。
ここまでの手順で、obs_station.csv のデータを pandas の DataFrame の形式に変換し、df_station という変数に格納しました。セル 1-1 の下にはデータの先頭部分が表示されますが、ご覧の通り、DataFrame は 2 次元の表の形で表されます。カラム名は CSV ファイルの 1 行目から取得したもので、行に割り当てられる Index は通し番号です。 - 同様に、セル 1-2 で cherry_blooming.csv を「df_cherry_blooming」として読み込み、セル 1-3 で weather_data.csv を「df_weather」として読み込みます。
読み込んだ 3 つのデータの内容は、表 1-3 の通りです。
Table 1. 表 1 df_station(観測所の位置データ)
カラム名 | 説明 |
---|---|
location_name | 観測所名 |
prec_id | 地域 ID |
block_id | ブロック ID(観測所を示す ID) |
latitude | 緯度 |
longitude | 経度 |
height | 高度 |
Table 2. 表 2 df_cherry_blooming(桜の開花日のデータ)
カラム名 | 説明 |
---|---|
location_name | 観測所名 |
y2007 … y2017 | それぞれ 2007 年から 2017 年の桜の開花日 |
prec_id | 地域 ID |
block_id | ブロック ID(観測所を示す ID) |
Table 3. 表 3 df_weather のカラム(気象データ)
カラム名 | 説明 |
---|---|
location_name | 観測所名 |
prec_id | 地域 ID |
block_id | ブロック ID(観測所を示す ID) |
date | 日付(2007-2017 年の 1-6 月の範囲) |
atmospheric_pressure | 気圧の平均値(hPa) |
precipitation | 1 日の降水量の合計(mm) |
temperature_avg | 1 日の平均気温(℃) |
temperature_highest | 1 日の最高気温(℃) |
temperature_lowest | 1 日の最低気温(℃) |
humidity | 1 日の平均湿度(%) |
daylight_hours | 1 日の合計日照時間(h) |
blooming | 桜の開花の状態(0:未開花、1:開花) |
データの理解
データを理解するため、Brunel を用いて可視化します。
ここからは、セルごとにどのような処理を行っているかを説明します。「Run」をクリックしてセルを実行しながら、コードと合わせて確認してください。
セル 2-1. DataFrame の Index の変更:
DataFrame の Index は、デフォルトで通し番号になっています。ここでは、df_weather の Index を日付(date カラムの値)に、df_station と df_cherry_blooming の Index を観測所名(location_name カラムの値)に変更します。
セル 2-2. Brunel によるデータの可視化:
まず、import 文により、Brunel をインポートして利用できる状態にします。そして、グラフに表示する分のデータを抽出します。具体的には、df_weather
のうち東京で観測された 2015 年以降のデータを条件として抽出し、df_tokyo
とします。
%brunel
から始まるコードにより、グラフが出力されます。可視化する項目は、表 4 のように指定しています。
Table 4. 表 4 セル 2-2 の可視化で指定している項目
項目名 | 説明 | 指定値 |
---|---|---|
data | 可視化するデータ(DataFrame) | df_tokyo |
x | 横軸に用いるカラム | date(日付) |
y | 縦軸に用いるカラム | temperature_highest(最高気温) |
color | 色分けに用いるカラム | blooming(開花状態) |
tooltip | マウスオーバーしたときに表示する情報 | location_name(観測所名)、date、precipitation(降水量) |
セル 2-3. データの結合:
観測所の位置に桜の開花日を紐付けて可視化するために、Index(観測所名)をキーとして、df_station と df_cherry_blooming を結合します。結合には、pandas の concat 関数を用います。
セル 2-4. 地図上でのデータの可視化:
観測所の位置情報を元に、2016年の開花日データを日本地図にプロットします。map(‘japan’)
は日本地図を表し、開花日データの可視化のコードを+で繋いで追記することで、両者を重ねて表示します。
データの加工
pandas を用いてデータを加工し、より予測に有用な特徴量を作成します。
セル 3-1. ループ処理用のリスト作成:
df_weather の観測所名(location_name)と年(year)のリストを作成します。その際、重複は除きます。
セル 3-2. 特徴量の作成:
前のセルで作成したリストを元にループ処理を行うことで、各都市の年ごとにデータを加工します。桜の開花は過去の天候に影響されるため、その情報を含んだ特徴量を作成する必要があります。
ここでは、以下の特徴量を作成します。
- 最高気温の 7 日間移動平均(ただし 0℃以下は一律 0℃とみなす)
- 2月以降の平均気温の累積値(ただし 0℃以下は一律 0℃とみなす)
- 3月以降の平均気温の累積値(ただし 0℃以下は一律 0℃とみなす)
- 1月の平均気温の平均(ただし 3℃以下は一律 3℃とみなす)
これらの特徴量については予め、
- 春先に気温が高くなってくると開花する
- 冬の間に低い気温にさらされていた場合、開花しやすくなる
という、桜の性質を考慮した上で、いくつかの特徴量の候補を作り出し、モデル作成を何度か試行しながら、精度が高くなるものを選択しました。このように、実際に分析する際は、適切な特徴量やアルゴリズムを選択するため、データ加工からモデルの作成・評価までを、繰り返し試行することになります。
また、3日後に開花するかどうかを判断するモデルを作成するため、その正解となるラベル(3 日後に開花するなら 1、しないなら 0)も共に作成します。
セル 3-3. データの統計量の確認:
DataFrame の describe 関数により、加工したデータの統計量を確認します。
セル 3-4. 特徴量の可視化:
毎日の最高気温(temperature_highest)と、最高気温の 7日間の移動平均(th_mean7
)とを比較すると、th_mean7
の推移の方が滑らかで、季節の変動をよりよく表すことがわかります。
モデル作成
気象データを元に、3日後に開花するかどうかを判別するモデルを作成します。
ここで、モデルとは、特徴量を入れると、内部に持っているパラメーターを使って計算し、ある値を出力するものです。モデルの学習とは、学習用データを入れた時に、正解の値(ラベル)と近い値をモデルが出力するよう、パラメーターを調整する処理のことです。
セル 4-1. ライブラリーのインポート:
機械学習ライブラリーの scikit-learn を使用します。scikit-learn でデータを使用する際は、数値計算用ライブラリーである Numpy の Array の形式に変換する必要があるため、Numpy も共にインポートします。
セル 4-2. モデルの定義と学習:
ラベルには、3 日後に開花するかどうかを 2 値で表したものを使います。説明変数(モデルに入力する特徴量)には、最高気温の 7 日間移動平均(th_mean7)、2 月以降の平均気温の累積値(ta_cumsum2)、3 月以降の平均気温の累積値(ta_cumsum3)、1 月の平均気温の平均(ta_mean1)の 4 つを用います。
2016 年以前のデータを学習用、2017 年のデータをテスト用として分割します。また、スケールの異なる説明変数を用いるので、それを揃えるためにデータの標準化も行います。
scikit-learn の LogisticRegression(ロジスティック回帰モデル)でモデルを定義した後、fit 関数に学習用データの説明変数とラベルを入れることで、学習を行います。ロジスティック回帰とは、特徴量を用いて、2 値(ここでは開花と未開花)に分類するような問題に適しているアルゴリズムです。
セル 4-3. テストデータでの予測:
作成したモデルにテストデータを入力して、予測結果を出力します。予測には、モデルの predict 関数を用います。
セル 4-4. 予測結果の表示:
例として、奈良の予測結果を表示します。label と prediction の値が一致していれば、正しく予測できています。
セル 4-5. モデルの評価:
各観測所に対し、ラベル(実測値)と予測結果が 1(開花)になる日付をそれぞれ取得します。それらの日付のずれが何日分かを計算します。
セル 4-6. 地図上での誤差の表示:
予測と実測の差と、観測所の位置情報を結合します。そのデータを地図上に表示することで、地域によってモデルの誤差にどのような傾向があるかわかります。
モデルの誤差を確認した結果、精度を高めたい場合には、特徴量の追加、アルゴリズムの再検討などを行い、モデルの試行を繰り返します。
まとめ
無料で Data Science Experience (Watson Studio) を使う IBM Cloud に登録
ここまでのチュートリアルを通じて、DSX を用いて分析を行う方法についてご紹介しました。データさえあれば、手軽に分析を始められるということを感じていただけたかと思います。今回扱ったツールやライブラリーは一例で、状況に応じて選択可能なので、他のツールもぜひお試しください。
参考資料
機械学習や分析についてさらに勉強したい方は、以下のような Web 記事や書籍等をご覧ください。
- 機械学習チュートリアル @Jubatus Casual Talks
- 機械学習超入門 – Qiita
- 【連載】 Python で学ぶ 基礎からの機械学習入門 | マイナビニュース
- Machine Learning | Coursera
- pandas/Pandas_Cheat_Sheet.pdf at master · pandas-dev/pandas · GitHub
- scikit-learn Tutorials — scikit-learn 0.19.1 documentation
- Python によるデータ分析入門―NumPy、pandas を使ったデータ処理
著: Wes McKinney
訳: 小林 儀匡、鈴木 宏尚、瀬戸山 雅人、滝口 開資、野上 大介
出版社: オライリージャパン - 実践 機械学習システム
著: Willi Richert、Luis Pedro Coelho
訳: 斎藤 康毅
出版社: オライリージャパン