tkherox blog

データサイエンスおよびソフトウェア開発、たまに育児についての話を書いています

Pythonデータ分析100本ノックを実践【後半】

はじめに

本記事は過去記事のPythonデータ分析100本ノックを実践【前半】の続きの内容になっています.Pythonデータ分析100本ノックの書籍内容については前半にて言及しておりますので,Pythonデータ分析100本ノックとは?という方はまずはそちらを読んでみて下さい.
では早速,後半の50本ノックの内容を中心に書籍を実践してみた感想について記載していこうと思います.

後半部分の内容について

Pythonデータ分析100本ノックの後半では主に以下の3つのトピックを扱います.

大まかに後半の内容をまとめると最適化問題と分析結果のシミュレーションが中心の内容となっていて,画像処理や自然言語処理はおまけといった内容です.

少しだけ画像処理と自然言語処理の内容について言及しておくと,画像処理についてはOpenCVを用いた内容のみとなっておりHOG特徴量などといった人に対しての物体検出のみを扱っています.昨今の画像処理では当たり前となったCNNなどによる一般物体認識などの部分までは扱いません.
また,自然言語処理についても形態素解析が中心の内容となっております.この点については書籍内でも基本的な部分のみであることを明言しており,より広い知識を身に付けたいという方には専門書を読むことを推奨しています.

実践してみて

実践してみた所感を述べていきたいと思います.

まずは最適化問題と数値シミュレーションの部分についてです.
本書の中で私が一番取り組んでよかったと感じたのが最適化問題に関するノックの部分です. というのもデータ分析を実施する中であまり最適化問題を扱う機会が多くはなく,学びが多いノックだったことが背景としてあります.データ分析や機械学習というとネットなどの情報ソースを見ても教師あり学習教師なし学習,深層学習といった情報量が多く,あまり数理最適化問題を目にする機会がそもそも少ない気がしています(人によってはそんなことないと思いますが...).そのため,PuLPCBCのインストールや数理モデル定式化の実装といった最適化問題を実践で扱うために技術を学習するツールとしては非常に良質のコンテンツだと思います.
また,最適化問題では解きたい問題の定式化がポイントだと思うのですが,数式が苦手な方でも問題なく知識を習得できるように本書は設計されているとも感じました.と言うのも,いきなり最適化問題による数式を定義するのではなく,アドホックに分析したプロセスを経て最終的に便利なツールとして数理最適化問題による解法を実践していく流れなので利便性を感じながら着実に知識を習得できるでしょう.

続いて,数値シミュレーションの項目です.
本書では最適化問題で得た解を検証する位置付けで数値上のシミュレーションを題材として取り扱っています.実現場におけるデータ分析においてもA/Bテストや予測モデルのオフライン検証など,モデリンングと併せて検証工程はデータ分析でも非常に重要なプロセスとなっています.数値シミュレーションにおけるノックの内容はその検証工程の重要性を訴える内容になっており,本書の中でも割と重要なポイントの1つかなと思います.
さらに,個人的な学びとしてはあるサービスの会員間のネットワークを可視化するといったお題に対して,複雑ネットワークの学問観点を用いて分析結果をアクションに繋げると言うアプローチが大きな学びとなりました.複雑ネットワークより扱うデータ傾向がスケールフリー型なのかスモールワールド型なのかといったインサイトを導出して次のアクション繋げると言うアプローチの方法は現場のデータ分析でも活用できるシーンが容易に想像できますね.

ja.wikipedia.org

最後に画像処理と自然言語処理についてですが,ここは一言で述べてしまうと物足りないに尽きると思います.
やはり,昨今のトレンドを抑えた内容になっていない点は実際の現場で活きるデータ分析スキルからは程遠い内容だと感じました. 画像処理や自然言語処理の各領域で確立された技術は異なる領域の問題にも適応されることが頻繁に見受けられ,実際の現場でデータ分析に取り組んでいると様々なドメインの技術を複合的に扱って課題を解決しようとします. この点では以下で示すような別の100ノックがありますのでそちらも併用して実践してスキルを身につけていくことが必要のようにも思います.

https://yoyoyo-yo.github.io/Gasyori100knock/yoyoyo-yo.github.io

http://www.cl.ecei.tohoku.ac.jp/nlp100/#ch1www.cl.ecei.tohoku.ac.jp

意外と苦労したポイント

ここでは本書の後半部分を取り組むに当たって少し苦労した点について記載しておきます.

1点目は最適化問題の実践における環境構築です.
以下に私が利用していた環境を記載します.

私自身はPuLPを使って最適化問題に関するノックを実践していましたが,振り返ってみるとノックの実践よりも環境構築に時間を取られてしまいました.
そこで,私は環境構築が容易でかつ高機能なソルバーが使えるGoogle社提供のOR-Toolsを利用することをおすすめします.本書で扱っているライブラリとは異なるため書籍に記載している解法とは若干異なってしまいますが,ライブラリで出来ること及び実現場を想定した技術スキルという観点ではOR-Toolsを用いた方が得策だと思います.是非これから100本ノックを初める方は最適化問題はOR-Toolsを用いて解いてみてください.

インストールもPipで簡単に行えますし,線形の最適化問題であれば以下のように直感的にコーディングすることができます.

  • インストール
$ python -m pip install -U --user ortools
  • 実装例
from __future__ import print_function
from ortools.linear_solver import pywraplp

# ソルバーの定義
solver = pywraplp.Solver('simple_lp',
                             pywraplp.Solver.GLOP_LINEAR_PROGRAMMING)

# 変数の定義
# xとyは0から無限の値を取りうる整数という定義
x = solver.IntVar(0.0, infinity, 'x')
y = solver.IntVar(0.0, infinity, 'y')

# 制約条件①
# x + 2y <= 14.
constraint0 = solver.Constraint(-solver.infinity(), 14)
constraint0.SetCoefficient(x, 1)
constraint0.SetCoefficient(y, 2)

# 制約条件②
# 3x - y >= 0.
constraint1 = solver.Constraint(0, solver.infinity())
constraint1.SetCoefficient(x, 3)
constraint1.SetCoefficient(y, -1)

# 目的関数
# Objective function: 3x + 4y.
objective = solver.Objective()
objective.SetCoefficient(x, 3)
objective.SetCoefficient(y, 4)
objective.SetMaximization()

# 最適化実行
solver.Solve()
opt_solution = 3 * x.solution_value() + 4 * y.solution_value()

developers.google.com

2点目はシミュレーションの項目における処理時間についてです.
本書の解法ではPythonでループを多用しているところが垣間見られ,4重のループにて解いている解法などがありました.実際のところ問題自体は解けるのですが,処理時間として30分ほど計算している処理などもありました.本の目的からすると処理時間は目的外のため考慮していないのかもしれませんが,実際のデータ分析の世界では処理時間は結構シビアに捉える必要があると感じています.本書で扱っているデータは大きくないため問題はそれほど大きくはないですが,数GBにもなるデータを扱うようになると処理スピードは非常に大きな問題へと発展します.
なので,もう少し本書でもその点について言及してくださる良かったと感じます.皆さんもPythonにおけるコーディングスキルや高速化の実装方法は平行して勉強していきましょう.

まとめ

今回はPythonデータ分析100本ノックにおける後半50本ノックの内容を中心に実践してみた感想について記載しました.100本という限られた条件の中で幅広いドメインを扱っており,体系的な知識獲得にはとても良いコンテンツだと思います.
対象者は以前に記載した前半部分の内容の通り,データ分析を実践し始めた方や知識を再確認したい人が適当だと思いますので,該当する方や興味がある方は是非100本ノックに取り組んでみてください.