tsyama記

プログラミングとそのほか

Software Design 2018年9月号を写経する - データ分析編

背景

上司におすすめされて最近Software Designを購読しているのですが、最近買うのが目的になってしまって満足にインプットができていない気がするため、写経でもして強制的なインプットを図ってみようと思います。

使用するのはSoftware Design 2018年9月号です。特集は下記の二つ。

  • ITエンジニアのための統計学入門 データサイエンティストへの道
  • 君は使わずにいられるか? TensorFlow.js

どちらも一般的なwebプログラマをやっているとあまり深く関わることのないような分野なのではないでしょうか。今回は第一特集の「ITエンジニアのための統計学入門」を取り上げます。がっつり統計学に入門するというよりは、Webとも関わりのあるPythonをとっかかりとして、今まで関わったことのない分野をできるだけ浅めにひとさらいするというのを目的としましょう。

なお、本誌の内容をそっくりそのまま記事にするようなことをするとどこかしらに怒られそうなので本誌の内容自体は記載せず、噛み砕いた内容や補足を中心に解説していきます。

第一特集の章立ては下記。

  • 第一章・ITエンジニアにデータサイエンスをオススメする理由
  • 第二章・野球とIT、プロと現場の仕事とは?
  • 第三章・ITエンジニアのための統計・理論武装
  • 第四章・ゼロからはじめるRとRStudio
  • 第五章・データ分析にPythonが選ばれる理由
  • 第六章・初心者のためのベイズ統計

第一章から第三章は読み物メインの章でした。特に第三章は初めて統計学に触れるような人に向けて基本的な用語や考え方を解説しています。わかりやすい。

第四章および第六章はR言語について詳しく書かれているようです。勇み足でR言語に入門するのもいいのですが、今回はひとまずスルーすることにしましょう。ということで、第五章をメインに写経していきます。Pythonでよく使われるデータ分析系ライブラリを紹介しながら、実際に手を動かしてPythonにおけるデータ分析の優位性を解説している章です。

Python環境構築

章のはじめにPythonの環境構築の方法(Windows / MacOS / Linux)が簡単に記載されていますが、個人的な好みにより、Docker上にPython環境を構築します。 詳しい説明は省きますが、docker-composeを導入しているVagrant環境があったのでそちらを利用しました。

version: '2'

services:
  py:
    image: python
    command: tail -f /dev/null
    volumes:
      - ./python/volumes:/root/volumes
    ports:
      - 8080:8080
    expose:
      - 8080

上記のようなdocker-compose.ymlを作成するだけでdocker上にPython環境を構築できます。pythonコンテナはそのままだと起動と同時に終了してしまうため、commandtail -f /dev/nullを指定することで回避しましょう。8080番ポートを開けている点については後ほど解説します。コンテナに入って下記コマンドを実行し、version3以上のPythonが導入されていることを確認してください。

root@7d65c3654f80:~/volumes# python --version
Python 3.6.5

仮想環境作成

普段はPHP開発ばかりであまり馴染みがないのですが、Python開発の際は都度仮想環境を作成しないとOSにインストールされたPythonに影響が出てしまうようです。ここまではデータ分析云々というよりもPythonの基本的なところになるので、ここでは概要をざっと確認しておくにとどめておきます。

仮想環境作成

# mkdir sd9ana
# python -m venv sd9ana

ちなみにVagrantのマウントとdockerのvolumesを使ってWindows→dockerホスト→dockerコンテナとファイル連携させている場合、Vagrantの構築にcoreos-vagrantを使用していると下記のエラーが出てしまい、Python仮想環境が構築できないようです。注意。

Error: [Errno 5] Input/output error: 'lib' -> '/root/volumes/sd9ana/lib64'

coreos-vagrantだとNFSでマウントされているせいでしょうか…。 今回の本旨とずれてしまうためあまりしっかり原因特定はしませんでしたが、coreosが使えないのは少し残念。

仮想環境の有効化

# source sd9ana/bin/activate

仮想環境の無効化

# deactivate

パッケージのインストール

データ分析系のパッケージとして下記が挙げられていたため、これらをそれぞれpipでインストールします。

# pip install pandas==0.23.1
# pip install matplotlib==2.2.2
# pip install jupyter==1.0.0 scikit-learn==0.19.1 scipy==1.1.0

詳細はよくわからないのですが、本誌で解説されている上記手順で進めると三行目のところでエラーが出てしまいました。こちらではscikit-learnのバージョンを0.19.2にするとうまく動いたので、同様の現象が発生している方は試してみてください。

jupyterの起動

jupyterはブラウザで動作するPython実行環境です。 まずは今回使用するディレクトリ(ここではnotebook/とします)を作成し、下記コマンドでjupyterを起動しましょう。

# jupyter notebook --ip=0.0.0.0 --port=8080 --allow-root --no-browser

上の方にあったdocker-compose.ymlで8080番ポートをexposeしたのはこのためです。--allow-root--no-browserオプションもdockerで環境構築をする関係で必要となっているオプションですね。 正しく実行すると下記のような出力がなされます。

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://(5b99e88e9017 or 127.0.0.1):8080/?token=4e30fcaadd1f0ce452ddcd2e377379b833d0bc97b69aa32a

表示されているURLのドメイン部分をdockerホストのIPに変更してブラウザでアクセスするとjupyterのホーム画面が表示されます。これはなかなかリッチなコンソールですね。これにて環境構築部分は一段落です。

データ分析

本題のデータ分析については本誌にあるとおり進めればそのように動くはずなので、実行したコードの仔細はここで取り上げません。行ったデータ分析の流れのみ下記にまとめます。

  • scikit-learnに含まれるサンプルデータセットpandasのDataFrameオブジェクトに食わせる
    • DataFrameオブジェクトのdescribe()メソッドで各種統計量が取得できる
  • pandas.plottingscatter_matrix()メソッドでカラム同士の散布図と各カラムのヒストグラムを表示
  • 相関関係がありそうな散布図を見つけ、個別の基本統計量、散布図およびヒストグラムを取得
  • 線形回帰という手法を利用してデータを予測
    • ひとつのデータについて学習データとテストデータに分ける
    • sklearnLinearRegressionを利用して統計モデルを作成し、学習データを食わせて回帰直線を求める
  • 作成した線形回帰モデルの評価
    • 回帰直線と評価用データの誤差を調べる
      • LinearRegressionオブジェクトのpredict()メソッドで説明変数の評価用データを食わせ、予測データを求める
      • テストデータと予測データから平均二乗誤差を導出する
      • 誤差のヒストグラムおよび残差プロットを描画し、誤差を確認
  • アルゴリズムのパラメータ変更や統計モデルの改善

この一連の流れに当てはめれば、あとはいくつかのメソッドを調べつつ基本的なデータ分析はできそうです。もうちょっと身近なデータがあるとさらに応用の効くデータ分析の技術を習得できるのではないでしょうか。

まとめ

最後に備忘として、データ分析を行う際におさえておくべきエッセンスを箇条書きでまとめておきます。

Jupyter Notebook

ブラウザ上でPythonを実行し、プログラムの実行やグラフの表示をリッチに行うことができるWebアプリケーション。

pandas

データ操作を中心に行うライブラリ。DataFrameで表形式のデータを食わせる。

matplotlib

グラフの描画を行うライブラリ。

scikit-learn

機械学習ライブラリ。サンプルデータセットも含まれる。

目的変数と説明変数

予測を行いたい変数を目的変数、目的変数を決める値を説明変数とよぶ。

ヒストグラム

度数分布表(あるパラメータについて区画ごとに分割したときの分布を示す)をグラフにしたもの。

正規分布

平均値の左右の分布が等しいデータ分布。ヒストグラムで表した際にきれいな山形の形状になる。

線形回帰

説明変数から目的変数を導く直線を求める手法。説明変数をx、目的変数をyとしたときにy=ax+bで表される。

過学習

学習に使用したデータの範囲内では精度の高い予測ができるにもかかわらず、未知のデータに対しての予測精度が低くなってしまう状態。これを避けるためにデータを学習データと評価データに分け、学習に使用したデータを評価するステップを踏む。

おわりに

なにぶんデータ分析やら統計やらは本当に初めてなのでただただ書き写すばかりでしたが、それでもただ漫然と活字を読むよりも強制的にインプットされるような感覚でした。写経も今までやったことがなかったのでその効果には懐疑的だったのですが、これからは積極的にやっていきたいです。

今回行った線形回帰は機械学習の一種のようですし、せっかく同誌にTensorFlow.jsの特集が組まれているので、このまま機械学習についても写経インプットしていきましょう。

ソフトウェアデザイン 2018年9月号

ソフトウェアデザイン 2018年9月号

  • 作者: 中西崇文,中川伸一,橘慎太郎,安部晃生,横山直敬,馬場真哉,藤原秀平,飯塚修平,足立昌彦,藤田稜,やまねひでき,安藤幸央,結城浩,武内覚,宮原徹,北村壮大,平林純,速水祐,樽石将人,清水琢也,山田泰宏,田代勝也,上田隆一,中村壮一,重村浩二,くつなりょうすけ,mattn,小飼弾,すずきひろのぶ,あわしろいくや,中島雅弘,榎真治,法林浩之,関治之,奥村和彦,後藤大地,Software Design編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/08/18
  • メディア: 雑誌
  • この商品を含むブログを見る