Lean Baseball

No Engineering, No Baseball.

エンジニアからデータサイエンティストへのキャリアチェンジのお供に「Pythonではじめる数理最適化」は良い教科書になるかもしれない

f:id:shinyorke:20211024133215j:plain
良い本良い魚良いお酒でした

秋も深まり, 緊急事態宣言が解除された今日このごろ, お酒を片手に読書がだいぶ捗るようになりました📖

酒と魚の話はさておき*1, 長いこと友人かつRetty時代の元同僚である岩永さん(とその仲間たち)*2が, 「Pythonではじめる数理最適化」なる書籍を出しました*3.

エンジニアな自分が読んだ感想として,

数理最適化でモデリングをする人だけでなく, エンジニアからデータサイエンティストへのキャリアチェンジを考えている人も必読なのでは?

と思ったので, メモ代わりに感想(とちょっとしたコンテンツ)を残したいと思います.

TL;DR

  • 現実の課題・問題(主に仕事)をデータサイエンティストとして解きたい方の参考書として最高に良き
  • 数理モデル・Pythonコードの解説もいい感じなので真似しやすくて良き(ただしPython関連はちょっといじったほうがいい)
  • エンジニアからデータサイエンティストへのキャリアチェンジ(もしくはフルスタックにやる)事を考えてる人は絶対読んだ方がいい

おしながき

【感想】Pythonではじめる数理最適化

簡単にどんな書籍かを解説しつつ, 私の感想を残します.

どんな本か(誰向けの本か)

出版社のページによると,

本書は、Pythonを用いた数理最適化の入門書です。Pythonを使ってさまざまな課題を実際に解いてみることで、数理モデルを実務で使いこなす力を身につけます。

この本の特徴は、数理最適化のアルゴリズム自体ではなく、数理最適化を用いた課題解決に重きを置いている点です。ビジネスなどにおける課題を数理最適化で解く際に現場で発生しうる試行錯誤が多分に盛り込まれており、実務における手順や気をつけるべきポイントを学習することができます。

となっており,

  • 実務上, 数理モデルやデータサイエンスな手法でビジネス的な課題・問題を解く人(解く必要がある人)
  • 数理最適化のアルゴリズム・仕組み以上に, より実務的な課題解決にフォーカスを当てて実例を知りたい人
  • これらをPythonおよびPython周りのエコシステム(ライブラリなど)を使ってやる人

向けの本かな?と私は解釈しました. より具体的なイメージとしては,

  • 事業会社のデータサイエンティストや機械学習エンジニア
  • コンサルタント会社やSIerに所属するコンサルタント・アナリスト
  • ↑を目指す大人や学生さん(企業でインターンしてる方は特に)

が特に対象になると思います.

なお, 本書を読むための最低限のスキルですが,

  • 総和記号(Σ)がわかる程度の高校数学力
  • Pythonの基本文法の理解

と書籍にありましたが, ホントその通りかなと思います.

Python力に自信が無い方は「独学プログラマー」および, 「改訂版 Pythonユーザのための Jupyter[実践]入門」あたりを抑えると良さそうです*4.

目次&内容

これも出版社のページからの引用ですが, この様な構成で書かれています.

  • 第Ⅰ部 数理最適化チュートリアル
    • 第1章 数理モデルとは
    • 第2章 Python数理最適化チュートリアル
  • 第Ⅱ部 数理最適化のケーススタディ
    • 第3章 学校のクラス編成
    • 第4章 割引クーポンキャンペーンの最適化
    • 第5章 輸送車両の配送計画
    • 第6章 数理最適化APIとWebアプリケーションの開発
    • 第7章 商品推薦のための興味のスコアリング
  • Appendix 利用関数・メソッド一覧

第Ⅰ部が書籍内で扱う数理モデルの定義・基礎およびPythonでのやり方.

第Ⅱ部がこの書籍の醍醐味である「実際の業務でありそうなケースを元にした実践的なケーススタディ」となっています.

特に第Ⅱ部のケーススタディ(第3章以降)の構成がすごく良くて,

  • 導入(そもそもどんな課題でゴールはどこにあるか)
  • 課題整理(ざっくりな課題を整理・因数分解してアプローチ・手法にあたりを付ける&データの理解をする)
  • 数理モデリングと実装(実際にモデリング&実装してみる)
  • 数理モデルの検証(結果の検証・まとめ)
  • まとめ(最終ゴールと照らし合わせる&ふりかえり)

おおよそ, この様な章立て・構成で実務上必要なプロセス・アプローチで丁寧に解説されていて非常に読みやすい・納得感が高い内容になっています.*5

読み方としては,

  • まず一通り読み切る, ななめ読みでOK
  • 自分が気になるトピックスや業務で絡みそうな内容のケーススタディをじっくり読む

のがすごく良さそうと思いました.

私の感想

最後まで読んだ感想として,

  • ケーススタディがとにかくガチで積極的に参考にできそう
  • 章立て・構成がホントに自然で, 必要な順で必要な事が書かれているので安心して読める

この辺がポジティブな感想だったりします, これだけでお値段以上の価値がありそうです.

一方, エンジニアおよびPython使いとしてモヤッとしたポイントとして,

  • 書籍のPythonコード実行環境としてAnacondaが軽くオススメされている(マストではない)が, 今どきのPythonの使い方としてはAnacondaは避けた方が幸せかも
  • FlaskでWebアプリケーションを作る章(第6章)があるが, 今どきな開発だとStreamlitでサクッとやっちゃったほうが筋が良さそう.

と思ったりしました.

この2つはこの後すぐ解説します.

今どきのデータサイエンスなPython

これは自分が心がけていることでありかつ, 本の感想でも触れたところですが.

  • Anacondaをやめてpoetryに
  • プロトタイプはStreamlitで

本の感想と絡めてちょうどよい感じもするので軽く紹介します&書籍を読んで写経する方も是非真似してもらえると嬉しいです.

脱・Anaconda - poetryを使う場合

ちょっと前の話ですが, Anacondaは条件付きで有償になりました.

www.anaconda.com

qiita.com

個人の学習やちょっとした写経には問題ないですが,

  • 自身が条件に該当するような大企業などに在籍している
  • 将来, 条件に該当するような大企業などで仕事をする可能性がある

方はAnacondaは避けるべき対象となりました&仮に該当しなくてもAnaconda以上にパッケージ管理をいい感じにする方法はいくつかあるのでそっちをオススメしたいです.

pipコマンドを直接使うのも良いですが, ライブラリのバージョンなどで動かない等の危険もあるので, poetryなどでやるのがベストかなと思います.

$ poetry init
$ for item in $(cat requirements.txt); do   poetry add "${item}"; done

GithubのISSUEコメントより引用

書籍のサンプルコードもこんな感じでpoetryで行けたりするので, poetryや他の使い慣れたパッケージ管理(pipenvなど)を使うことを推奨します.

WebアプリはとりあえずStreamlitで

第6章のFlask Webアプリ(対象のコード)ですが, Webアプリケーション作成の練習・題材としてちょうどいい感じがします.

が, 業務目的でちょっとしたデモアプリケーションが必要な時はStreamlitで作った方がより楽かつクオリティが高いものができます.

例えば第6章のアプリはいくつかのテンプレートファイルでなどで作られていますが, Streamlitを使うとHTMLを書くこと無くこのレベルまでできちゃいます.

f:id:shinyorke:20211024160225p:plain
第6章のWebアプリ - Streamlit版

ちなみにコードはこんな感じです(Githubはこちら).

import streamlit as st
import pandas as pd
from problem import CarGroupProblem

st.write('# 学生の乗車グループ分け問題')

students = st.file_uploader('学生データ', type='csv')
cars = st.file_uploader('車データ', type='csv')


def preprocess(dataset: dict):
    """リクエストデータを受け取り、データフレームに変換する関数"""
    # 各ファイルを取得する
    students = dataset['students']
    cars = dataset['cars']
    # pandas で読み込む
    students_df = pd.read_csv(students)
    cars_df = pd.read_csv(cars)

    return students_df, cars_df


if students and cars:
    if st.button('最適化を実行'):
        # 前処理(データ読み込み)
        students_df, cars_df = preprocess({'students': students, 'cars': cars})
        # 最適化実行
        solution_df = CarGroupProblem(students_df, cars_df).solve()
        st.write('# 最適化結果')
        st.write(solution_df)

書籍のケーススタディなレベルだと, データサイエンスな人がHTMLを書くのはマストじゃないと思うのでStreamlitで楽して全然OKかと思います.

なお, Webアプリケーションをデータサイエンティストとして作るなどの考え方は(手前味噌ですが)私のPyCon JP 2021の発表が参考になると思うのでそちらも是非どうぞ.

shinyorke.hatenablog.com

結び

というわけで, 「Pythonではじめる数理最適化」の感想と, ちょっとしたオススメの話でした.

全体を通して思ったのが,

エンジニアからデータサイエンティストへのキャリアチェンジを考えている人は考え方・思想含めて真似してみてほしい!

ってことですかね.

特に,

  • 導入(そもそもどんな課題でゴールはどこにあるか)
  • 課題整理(ざっくりな課題を整理・因数分解してアプローチ・手法にあたりを付ける&データの理解をする)
  • 数理モデリングと実装(実際にモデリング&実装してみる)
  • 数理モデルの検証(結果の検証・まとめ)
  • まとめ(最終ゴールと照らし合わせる&ふりかえり)

この辺のプロセス・考え方を自身に如何にインストールして実践するか?で機械学習エンジニア・データサイエンティストとして成功するかがかかってる所であると私自身強く思っているので, これらを学ぶのにも良いかなと思います*6.

読もうかどうか迷ってる方・すでに読んでいて業務に活用しようとしている方の参考になれば幸いです.

*1:このブログではグルメは取り扱わないマイルールがあります笑. ちなみに撮影した場所はこちらです-> 浜魚

*2:余談ですが, Pythonもくもく自習室(#rettypy)の手伝いや参加などもしてもらってました.

*3:写真は自分で買ったKindle版ですが, 岩永さんおよび出版社のご厚意により書籍版も頂きました. 誠にありがとうございます!

*4:Python入門本は世の中に沢山ありますが, 「プログラミングの意味と意義」を振り返るのに独学プログラマー, 書籍のサンプルコードがほぼJupyter notebook(一部Flaskのアプリケーション)なのでJupyter環境のきほんを抑えると良さそう, というニュアンスでこの2冊をオススメしました.

*5:この書籍, 共著者が何人かいらっしゃるのですが皆さんこの構成で書いてるので読んでて特に違和感無く最高でした, 執筆時のルールとして決めていたように見えましたがこれは構成の勝利だなと思います.

*6:というのも, 自分の観測範囲内だと機械学習エンジニアと名乗ってる・仕事をしている人でもこの辺の仕事が苦手(もしくは雑)という方もいる(アウトプットの質や考え方でわかる)ので, 「わかってますよそんなこと」って言われそうなこのプロセスはホント大事かつ難しいなと思っています