SQL がはじめてのひとも、ニガテなひとも - 技術評論社『これからはじめる SQL 入門』

昨年から執筆していた書籍『これからはじめる SQL 入門』(以下、本書)が 2018年5月2日に技術評論社さまより刊行されます。今回はその紹介記事を投稿します。

これからはじめる SQL入門

これからはじめる SQL入門

どんな本か

本書はいわゆる一つの SQL 入門本です。SELECT文、INSERT文、UPDATE文... にはじまり、JOIN や GROUP BY、データ型や関数などの基礎知識をひととおり解説しています。

本書では PostgreSQL 10 がサポートする SQL の構文を解説の対象としていますが、MySQLSQL Server など他の RDBMS でも通用する知識が得られるはずです。

本書はSQL の基礎知識をひととおり学ぶことを目的として書かれた一冊です。データベースとはなにか、SQLとはなにかといったことに触れつつ、SELECT文やINSERT 文などのSQL の構文を中心に解説を進めていきます。はじめてSQL を学ぶ方を対象としていますので、プログラミングやシステム開発に関する知識を前提としない内容になっています。同時に本書は、読者が本書を通読したあとに「SQL入門者」のレベルを脱していられるような情報量と難易度となっていることを狙って書かれています。

(はじめに より)

なぜ書いたのか

企画段階で編集チームよりオファーいただいたのが本書執筆のきっかけです。

また、SQL を日常的に使っているけれども苦手意識をもっているソフトウェア開発者の層が一定数いるものと認識しており、そういった方々があらためて SQL を学びなおす本があったら良いと考えたというのが動機の一つです。

ゼロから SQL を学びたいと考えている人がいるときに「これ読んでおいて」と言える本が一冊あるといいなと考えたということもありました。

本書は、筆者が初心に戻り「自分がSQL を学び始めたときにこのような解説書があればよかった」と思える一冊に仕上げようという思いで筆を執ったものです。

(はじめに より)

誰のための本か

本書は以下の方に向けて書かれています。

  • これから SQL を学ぼうとしている方
  • SQL に苦手意識をもっている方
  • 普段 O/RM に頼っていてじつは 素の SQL には自信がないという方

本書がSQL をはじめて学ぶ方の学習の手助けになること、SQL に対して苦手意識をお持ちのかたが再入門するきっかけになることを願っています。

(はじめに より)

書名のとおり初心者向けではあるものの、SQL を基礎から改めて学び直したいという方も対象としています。

こだわりポイント1 : 反復

本書を読み終えたあと、SQL が以前より肌に馴染むようになっていて欲しい、ということが本書の構成を考えるうえでこだわったポイントです。

SQL を身につけるコツとしてお勧めしている方法を本書より引用します。

筆者がSQL初心者であったころの悩みは「それぞれの意味はわからなくないけど、なかなか覚えられない」というものでした。筆者の経験を踏まえて、1 つアドバイスがあります。それはコピー& ペーストに頼らず、自分の手でタイプして体になじませるというものです。

(84ページ 章末コラムより)

具体的な方法として以下を提案しています。

  1. SQL を書き写してみる(写経)
  2. 書き写したSQL の列名や絞り込み条件を変更してみる
  3. エラーが発生することを恐れずに、期待どおりの結果がでるまで書き直す
  4. 別のSQL を書き写してみる

(84ページ 章末コラムより)

この思想にもとづき、本書では多くの SELECT文 に ORDER BY句 や LIMIT句 が付与されていたり、INSERT文 実行結果を確認するための SELECT文 を添えたりしています。

  • 解説対象外であっても ORDER BY句 や LIMIT句 を使用している例
SELECT id,
       isbn,
       user_id,
       ROUND(score)
  FROM rating
 ORDER BY id ASC
 LIMIT 3;

SQL とその実行結果を一致させるという意味においては特別な配慮ではないかも知れませんが、冗長であっても実際に頻繁に使用するであろう SQL の構文をくり返し学んだほうがよいという意図をもってサンプルコード群が構成されています。

  • INSERT文のあとに SELECT文を使用している例
INSERT INTO b2 (published_at, id, title)
VALUES ('2017-09-14', '3', 'Angular アプリケーションプログラミング');

-- INSERT文 実行後の結果を確認
SELECT *
  FROM b2
 ORDER BY id DESC;

本書では INSERT文や UPDATE文 などのテーブルに対する更新処理を行ったあと、SELECT文 で処理内容の結果を確認するようにしています。

こだわりポイント 2 : ベン図

本書では図表による解説は必要最小限にしていますが、AND句 と OR句 の解説箇所ではベン図を多用しています。

f:id:iktakahiro:20180416233438p:plain:w300
(67ページより)

f:id:iktakahiro:20180416233455p:plain:w300
(72ページより)

図解書ではないのでメインはコードと文書ですが、JOIN や WHERE句 など、初学者にとって概念が難しいと思われる部分では図説を取り入れた解説を行っています。

サポートサイト公開中

本書に関するサポートサイトとして以下のリポジトリを作成しました。本書中で利用している主要な SQL コードも公開しています。

本書中では諸般の事情により VirtualBox を使って PostgreSQL の学習環境を構築しているのですが、上記リポジトリでは Docker を利用した学習環境の構築方法を解説しています。(ここだけの話ですが、著者としては Docker 利用を推奨します...!!)

コマンドラインが苦手な方は PostgreSQL と pgweb をセットで構築できる docker-compose.yml を使ってみると幸せになれるかも知れません。

f:id:iktakahiro:20180430141529p:plain:w600
参考: pgweb を使った PostgreSQL へのアクセス

レビュー記事(随時追記)

本書のレビューにご協力いただきました @t2y さんが素敵なレビューを書いてくださっています。

t2y.hatenablog.jp

『Python エンジニアファーストブック』- Python活用 の "さわり" がコンパクトに詰まった一冊

2017年9月9日に技術評論社より『Python エンジニアファーストブック』が刊行されました。

Pythonエンジニア ファーストブック

Pythonエンジニア ファーストブック

  • 作者: 鈴木たかのり,清原弘貴,嶋田健志,池内孝啓,関根裕紀
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/09/09
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

本書は以下の構成からなります。

  • 第1章 Pythonの動向 - その特徴、歴史とコミュニティの紹介
  • 第2章 最低限知っておきたいPython言語の基本 - Pythonで開発を始める前に知っておくべきこと
  • 第3章 開発環境とチーム開発 - チーム開発で使われている開発環境とツール
  • 第4章 スクレイピング - PythonによるWebスクレイピング
  • 第5章 PyData入門ガイド - Pythonによるデータ分析のはじめの一歩
  • 第6章 Webアプリケーション開発 - Webフレームワークを使ってWebアプリケーション開発に挑戦

さまざまな場面で利用される Python の魅力のエッセンスともいうべき情報がコンパクトにまとめられた内容になっています。

その中で今回「第5章 PyData 入門ガイド」の執筆を担当いたしました。Python 本の執筆としては 2014年に『Pythonエンジニア養成読本(以下、養成読本)』の執筆チームに参加させていただいたのが初めてでして、今回はその大幅改訂版ということで個人的には感慨深くもあるプロジェクトでした。

いっぽう、これだけデータ分析業界のタレントやプレーヤーが増えてきた中で、改めて僕が本章の筆を執ることに若干の躊躇いもあったのですが、「Data Engineering のはじめの一歩」を伝える内容になれば意義もあろうというモチベーションで取り組みました。

なお、本エントリでいう「Data Engineering(データエンジニアリング)」とは、いわゆる Data Science(データサイエンス) とは異なるもので、この定義も実際容易ではないわけですが、データ収集や前処理などの工程や、ある程度フロー化された統計解析への取り組み、分析プロセスの高度な自動化(より具体的にいうとバッチ処理化やプロトタイピングのプロダクションコード化)などの領域を指しています*1

第5章は Data Engineering 領域の一部の入門的内容を取り扱っているという(自分の中での)位置づけです。

第5章 PyData 入門ガイド の読みどころ

それでは、担当章の読みどころを簡単に紹介してみようと思います。

構成

第5章の構成(= 節見出し)としては次のとおりです。

  1. PyData とは
  2. はじめての Jupyter Notebook
  3. 実践 レゴデータ分析[データ探索編]
  4. 実践 レゴデータ分析[データ可視化、分析編]
  5. Anaconda環境の利用
  6. PyData パッケージガイド

養成読本では、PyData パッケージのいくつかについてダイジェストで紹介した上で、最後にオープンデータを可視化してみるという構成でした。こんにち、パッケージの使い方的な情報はすでにありふれており、養成読本のデータの可視化はおまけ程度の内容でしたので、抜本的に改訂が必要であろうということで大方の内容を書きかえました。

メインコンテンツ紹介

「第4章 スクレイピング」で収集したレゴのデータを利用して、データの読み込み、集計、簡単な統計解析、可視化に取り組むというのがメインコンテンツです。ツール的には Jupyter、pandas、SciPy、Matplotlib が登場します。統計解析的な要素としては単回帰分析を用いています。

f:id:iktakahiro:20170922230632p:plain:w400
pandas を使ったデータ探索の解説(本書200頁)

f:id:iktakahiro:20170922230803p:plain:w400
pandas (Matplotlib) を使ったデータ可視化の解説(本書207頁)

本書全体をとおして読むと、

  1. Python の使い方がわかり
  2. スクレイピングで Web からデータが収集でき
  3. PyData パッケージを使ったデータエンジニアリングの初歩が学べる

という流れになっています。

こぼれ話

データ可視化は主に pandas の plot() メソッドを利用して行っています。

theme_ranking10 = count_theme.sort_values(ascending=False).head(10)
theme_ranking10.plot.bar(figsize=(10, 5))

さまざまな方法を検討しましたが、簡単にグラフ出力したいならたぶんこれが一番楽だと思います。Matplotlib を直接触っているところもあります。

すごく余談ですが、最近僕の中で、Python データ可視化パッケージのキャラ付けは以下のようになっています。

  • 論文書くなら Matplotlib 先生
  • 実務に手堅い Seaborn 中尉
  • お一人様なら pandas くん
  • よそゆき Bokeh さん

この話はまた別のどこかでしたいと思います(しません)。

あと執筆期間中に発覚した衝撃(?)の事実として matplotlib は固有名詞としては先頭大文字始まりの Matplotlib だったというものがありました。ロゴが小文字なので小文字と思い込んでいたのですが*2、公式ドキュメントではしっかり大文字表記でした。

回帰分析には SciPy を使っています。scikit-learn のほうが良かったという説がありますが、機械学習以前の領域を取り扱いたいということもありましたのでご容赦ください。

Anaconda と すばらしき PyData パッケージたち

Python の環境としては公式インストーラーの Python を利用する前提の解説ですが、補足情報として Anaconda の conda コマンドを紹介しています。

また Appendix 扱いで、PyData パッケージガイドとして NumPy や scikit-learn、TensorFlow などの超メジャーなものから、比較的あたらしめの PyTorch などを一覧で紹介しています。本書中でも触れているのですが、PyData 関連パッケージも日進月歩ですので、Awesome Python で探すといいよ、というのが本音ですね。

まとめ

次の書評ブログがとても端的に本書の特色を示していると思います(まとめを人様のブログに委ねるスタイル)。

massa142.hatenablog.com

本書は Python を活用してくための情報がコンパクトに詰まった一冊です。@checkpoint 渾身の Django 解説も見所です。

サイズ的にも気軽に手に取れる仕上がりですので、ぜひご覧いただければと思います。

あわせて読みたい

拙著で恐縮ですが、Jupyter や データ可視化についてもっと詳しく知りたい方向け。

PythonユーザのためのJupyter[実践]入門

PythonユーザのためのJupyter[実践]入門

4章でスクレイピングに興味をもった方へ激しくお勧めな一冊。Scrapy の詳解あります。

Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-

Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-

じつは Python 文法よくわかってなかったわ… という方はこちらをどうぞ。

みんなのPython 第4版

みんなのPython 第4版

*1:Data Engineer ≠ Data Scientist

*2:https://matplotlib.org/_static/logo2.svg

PythonユーザのためのJupyter実践入門 - JupyterユーザーによるPython ユーザーのためのJupyterの本

2017年9月9日に、書籍『PythonユーザのためのJupyter[実践]入門』(以下、本書)が発売になりました。僕含めた4名の著者による共著本です。

PythonユーザのためのJupyter[実践]入門

PythonユーザのためのJupyter[実践]入門

何の本か

書名に Jupyter とあるとおり、Jupyter Notebook を取り扱った書籍です。同時に、pandas 基礎、Matplotlib および Bokeh 詳解をメインコンテンツとした書籍でもあります。

jupyter.org

本書の見出しを以下に記載します。

  • 第1章: Jupyter Notebookを導入しよう
  • 第2章: Jupyter Notebookの操作を学ぼう
  • 第3章: pandasでデータを処理しよう
  • 第4章: Matplotlibでグラフを描画しよう
  • 第5章: Matplotlibを使いこなそう
  • 第6章: Bokehでグラフを描画しよう
  • 第7章: Bokehを使いこなそう
  • 第8章: Jupyter Notebookをカスタマイズしよう
  • 第9章: クラウド上でJupyter Notebookを使おう
  • 第10章: Jupyter NotebookでRubyとRを使おう
  • Appendix: ipywidgetsとJupyterLab

なぜ書いたのか

Jupyter Notebook は IPython Notebook という名称であった時代から人気のツールで僕自身もよく利用しており、何らかの形で書籍にできればよいとかねてから考えていました。

Jupyter Notebook は最低限の機能を使用するだけならマニュアルが必要ないほど簡単に利用できるツールです。それ故に、キーボード・ショートカット機能や設定ファイルの活用などより便利な用法を知らずに使われがちであると考えていました。

Matplotlib は可視化ツールとしてよく知られていますが、歴史が長く、かつ多機能であるため公式ドキュメントを手繰ったとしても機能の要所を掴むことは容易ではありません。

これらの状況を踏まえて、和書として Jupyter Notebook と可視化 について詳しく取り扱った書籍があれば有意義なのではないかという理由で執筆プロジェクトがスタートしました。

見所

著者視点で本書の見所をいくつかピックアップします。

カラーページを使い可視化例を豊富に掲載

本書では、データの可視化を中心に取り扱った一部の章について、カラーページを採用しています。

f:id:iktakahiro:20170912131735p:plain:w700

f:id:iktakahiro:20170918001405p:plain:w500

単色で表現できる簡単なグラフから、透過や重ね合わせを組み合わせた複雑なグラフのどちらもカラーで紹介しているので、具体的なイメージを確認しながら学べる内容になっています。

サブプロットが使いこなせるようになる

本書は Matplotlib の ここがわからない という疑問を解消できるように配慮して構成されています。1例として、複数のグラフを並べて 1つのプロットとする サブプロット の解説に紙面を割いています(本書144頁)。

# フィギュアの生成
fig = plt.figure()

# フィギュア内にサブプロットを3つ配置します
ax1 = fig.add_subplot(221) # 2行2列の1番
ax2 = fig.add_subplot(222) # 2行2列の2番
ax3 = fig.add_subplot(223) # 2行2列の3番

plt.show()

上記のコードに含まれるような、add_subplot(221) という記述を見たたけでは、サブプロットのコードとグラフの関係は判然としません。本書では、コードと図説を交えて、サブプロットについての解説を行っています。subplots() 関数についての言及もあります。

f:id:iktakahiro:20170918001850p:plain:w400

本書を読むことで、なんとなく利用していたサブプロットを使いこなせるようになるでしょう。

コーディングスタイルについて言及

本書では、Matplotlib のコーディングスタイルとして、通称 MATLAB-style と、オブジェクト指向スタイルである OOP-style という2つのコーディングスタイルを紹介し、後者のほうが明示的なコードであり望ましい、という意見を表明しています。

MATLAB-style のコードと、それに言及した一文を本書 252 - 253頁より引用します。

%matplotlib inline

import matplotlib.pyplot as plt

x = [1, 2, 3]
y = [3, 6, 9]

plt.bar(x, y)
plt.title('Sample Bar Chart')
plt.xlabel('X')

— 略 — まず、グラフを作成するために、pyplotモジュールのtitle()やxlabel()を直接呼び出して利用しています。このコードをアレンジして複数のグラフを描こうと考えたとき、どのようにすればよいか手がかりがありません。

また、グラフの描画について暗黙的な動作をしています。plt.xlabel(‘X’)を実行するとグラフが描画されますが、plt.xlabel(‘X’)を削除するとplt.title()の実行後にグラフが描画されます。

このトピックは公式ドキュメントにも Coding Styles*1 として解説があります。本書ではなぜ「OOP-style がいいのか」「OOP-style のどこが明示的なのか」という点をコード例を交えて解説しています。

Matplotlib のユーザー、あるいは PyData 関連パッケージのユーザー構成の特長として、いわゆるソフトウェアエンジニアではない層が一定数存在するということが挙げられます。ソフトウェアエンジニアが前提として持っている(あるいは持っていて欲しい)コーディング規約やコーディングスタイルに関する知識および関心をあまり持たないユーザーに対して、Zen of Python の設計思想を伝える意図を持って、この一節が盛り込まれました。

なんだか見所紹介が Matplotlib 推しみたいになってしまいましたが、実際推しメンなので*2 紹介してみました!

謝辞

本書の刊行にあたり、共著者のほかに、出版社のみなさま、編集プロダクションのみなさま、レビューにご協力いただいたコミュニティのみなさまの多大なるサポートをいただきました。特に、今回はレビュワーのかたのご協力なしには完遂できなかったプロジェクトでした。裏を返すと、僕の進行の拙さにより執筆チームに負担を強いる結果となり、反省も多い企画となりました。お世話になりましたみなさまには、この場を借りて心よりの御礼を申しあげます。

経過はともあれ、成果物としての本書の善し悪しは読者のみなさまにご裁定いただくものと考えています。本書がわずかでもお役に立つことを願っています。

*1:https://matplotlib.org/faq/usage_faq.html#coding-styles

*2:といいつつ、執筆箇所でいうと僕はおもに Jupyter 周りの担当でした

Python プログラミングを学ぶための準備運動 - 翔泳社『スラスラわかる Python』

このたび、縁あって『岩崎圭、北川慎治 著書、寺田学 監修 (2017). スラスラわかる Python, 翔泳社』(以下、本書) を恵贈賜りました。

著者並びに出版社の皆様にお礼とご慰労をかねまして、僭越ながら本エントリにて一読後のレビューを兼ねたブログを投稿いたします。

スラスラわかるPython

スラスラわかるPython

総評

本書は、これからプログラミングや Python を学ぶための 準備運動 として最適な一冊に仕上がっています。

初学者が Python を学び進めるにあたり、本書には次の良い点があるでしょう。

  1. ボリュームが適度
  2. Python 文法の中で重要な点が抽出されている
  3. 図説、コード、解説のバランスが良い

「1.」および「2.」について、本書が構成されるにあたり、多くの取捨選択がなされています。例えば本書では「リスト型」の説明をするにあたり Python の特長の 1つでもある「リスト内包表記」の説明はなされません。リスト型や辞書型の説明はありますが集合型の説明は省略されています。当然のようにクラスの解説も登場しません。

まず Python を知ってもらう、プログラミングが動く楽しさを体験する という観点でこの取捨選択は妥当と言えます。反面、網羅性は犠牲になっていますので、Python の基礎レベルに到達するためには最低でも別のもう1冊の書籍から学びを得る必要があります。その意味で、準備運動のつもりで本書に取り組む姿勢が望まれます。

本書を通読したということは、充分に体がほぐれたことを意味します。

その自信をつけたうえで別の−−網羅性の高いものが望ましい−−入門本を手に取り、プログラミング学習という長い道のりを走り出すのがよいでしょう。

雑感: 例外処理と型について

例外処理について改めて感じたことですが「Python の例外の仕様がわかる」と「Python で適切な例外処理が記述できる」という両者には隔絶の差があります*1。比較的平易であるとされる Python の言語仕様において例外が例外なのか (※ 駄洒落ではない) 例外処理そのものが難しいのか……。

本書でもこのことは考慮されており、入力チェックについて例外処理を濫用せずに if 文でチェックを実施する方法が参考情報として解説されています。

# 114ページのコードを一部変更したもの

def add_10(num):
    if not isinstance(num, int):
        print('Invalid num')
    
        return False

    add_num = num + 10
    print('add_num is {}'.format(add_num))

    return add_num

Python としては普通の感じですが (Early Return していて好き) 、型があればよりシンプルにな制御で済むし、False または int が戻る関数というのも少し収まりが良くありません*2。これはコード例が悪いということではなく例外処理難しいですねと思ったということです。

おそらく説明平易性を維持するために Type Hints*3 には触れられていないのだと推察しますが、こうも書けるでしょうか。

def add_10(num: int) -> int:
    add_num = num + 10
    print(f'add_num is {add_num}')

    return add_num

ただ Type Hints を付けたからといって データ型にまつわる例外処理や条件分岐を無条件で省略可能になるわけではないです。

型論争みたいなところに首を突っ込むと Python だけに藪蛇 (※ 注釈略) になりそうなので深い言及は避けたいですが、適度な制約は学習曲線向上の手助けになると感じています。つまり Python を初学者に教えるにあたり Type Hints は積極的に推していくのがよいと思っています。ただしこの考えはおそらく本流ではないです。

雑感でした。

*1:これはどんなものもそうだと思いますが、例外処理が特に、という意味です

*2:Go に慣れた今では特に。error を常に返したいと思ってしまう

*3:typing — Support for type hints https://docs.python.org/3/library/typing.html

ReDoc - Angular な静的 Webページを生成できる REST API ドキュメンテーションツール

REST API のドキュメンテーションツールにはいまだこれといった決定打がなく、定期的に「API document tool 2017」などのワードでぐぐってはブラウザを閉じ、ぐぐってはブラウザを閉じるという悶々とした日々を過ごしていました。そんなおり、以下の記事で「ReDoc」というツールを知りました。

簡単にさわってみたところ感じがよかったので紹介します。

なお、本稿で「API」と記載する場合 Web Application の RESTful API を指します。

ReDoc

ReDoc は、API ドキュメントのジェネレーターです。

github.com

手元で作成した成果物のスクリーンショットを掲載します。

f:id:iktakahiro:20170609022023p:plain

詳細は LiveDemo をご覧いただくのがよいでしょう。

ReDoc の特長

ReDoc の特長は以下のとおりです。

  • HTML に redoc.min.js と swagger.json を読み込ませるだけというお手軽設計
  • ドキュメントは Angular ベースの HTML + JS な静的ファイルとして出力される

利用方法

README のとおりですが、アプリケーションの JavaScript と API の定義ファイルを読み込むのみです。

<!DOCTYPE html>
<html>
  <head>
    <title>ReDoc</title>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>
  <body>
    <redoc spec-url="http://petstore.swagger.io/v2/swagger.json"></redoc>
    <script src="https://rebilly.github.io/ReDoc/releases/latest/redoc.min.js"></script>
  </body>
</html>

ローカルの swagger.json を読み込む場合は Web サーバー経由でアクセスします。

ReDoc のよさ

ReDoc のよさを語ります。

静的ファイルであることのよさ

現存する API ドキュメンテーションツールにはモック機能や実際のリクエストを発行できる機能が備わっている場合があります。Swagger UI がその代表例です。

リッチな機能を提供するためか、Swagger UI はサーバーサイドアプリケーションとして実装されていますが、 ごく個人的には、API の入出力情報を示す程度の目的を果たすために、アプリケーションサーバーを運用したくないと考えています。

ReDoc による API ドキュメントは静的ファイルとして構成されます。したがって GitHub PagesAWS S3 などを利用して Static Web Site としてドキュメントを公開できます。

デフォルトスタイルのよさ

ReDoc はデフォルトのスタイルが美しく、そのままで公開クオリティ感があります。3ペインスタイルは、しばしば API Docs 界隈(?)でお手本とされる Stripe.com の API ReferenceAuth0 の API Docs を参考にされているのではないかと推察されます。

構成もシンプルで、サービスロゴを入れたりカラムの色を調整するだけでもほどよいオリジナリティを出せる設計だと思います。

OpenAPI (Swagger) Specification を利用できることのよさ

ここ最近その動向がまったくオープンに感じられない Open API Initiative にはかなり色々思うところがありますが、さておき、OpenAPI (旧Swagger) Specification が API ドキュメントの定義ファイルとして一定の存在感を示していることは否定できません。

OpenAPI Specification のつらさもあってか、RAML のように別の “alt-YAML 的な何か” に走る動きや、そもそも JSON や YAML は無理なので、lord/slate のように Markdown で定義を書かせようという試みも見られます*1

しかしながらひとめぐりしてみると、エコシステムは大きいほうがよいということと、フォーマットとして将来変換可能であったほうがよい *2 といった理由により、次善の策として OpenAPI Specification を採用しておくのは悪手ではないように思われます。

ReDoc は OpenAPI Specification をそのまま利用できるので、いままで Swagger を利用していた場合には資産を活かせます。将来 Swagger 方面に合流することになっても問題ありません。

おわりに

API ドキュメンテーションツールは多く存在します。その中で ReDoc は、OpenAPI Specification を利用しつつ品質のよい静的 Webページを生成する*3というバランスのよいポジションに属していると思います。

まずは現存する自社の API Document をリプレースしてみようと考えています。API ドキュメンテーションをめぐるツールやプラクティスについてどこかで意見交換できるとよいですね。

*1:Apiary… うっ…頭が…

*2:Markdown のような書式では仕様がファジーになりやすく JSON や YAML などに相互変換しにくいという問題があります。仕様によりますが

*3:HTML ファイルが generate されるわけではないので、変換といったほうが適切かも知れません

ケーススタディからはじめよ - 秀和システム『フリーライブラリで学ぶ 機械学習入門』レビュー

このたび縁あって『堅田洋資, 菊田遥平, 谷田和章, 森本哲也 (2017). フリーライブラリで学ぶ 機械学習入門』(以下、本書。著者名は書籍中掲載順)を恵贈賜りました。

著者並びに出版社の皆様にお礼と慰労をかねまして、僭越ながら本エントリにて一読後のレビューを掲載いたします。

フリーライブラリで学ぶ機械学習入門

フリーライブラリで学ぶ機械学習入門

なお読者の益となるようなるべく公正な目線でレビューします。掲載されているコードの正確性については本レビューの対象外とします。

総評

昨今「機械学習、深層学習、人工知能」というトピックを扱った書籍が多く出版されています。本書もその中の一冊と言えますが、以下の点が特長です。

  • Issue を起点としたビジネス領域のケーススタディが含まれていること

本書のうちいくつかの章は、「不動産の成約価格を予測したい」「ニュース記事をグループに分けたい」というような Issue、あるいはニーズを起点に始まります。物事を学ぶにあたり目的設定は理解を深めるための手助けとなり得ます。著者の経験を根拠とするであろうケーススタディは貴重なテキストです。

  • 講義形式であること

本書の内容は著者によって開催されたワークショップの内容がベースとなっています。そのため講義形式および口語体に近い文体で記述されている章があります。この点が冗長だと感じる人もいれば、読み手にやさしいと感じる人もいるでしょう。

本書に掲載されているケーススタディに関心を持たれた方や、ワークショップ形式(の雰囲気)で機械学習を学んでみたいと考えている方は手に取ってみるとよいのではないかと思います。

なお、「フリーライブラリ」と冠されていますが、実質的に活用されているのは Python であり、サンプルコードは Jupyter Notebook 形式で公開されています*1

以下、各章をピックアップして簡単に紹介します。

第2章 予測モデルを作ってみよう

ビジネス要件が登場することが本書の1つの特長です。第2章は、「不動産仲介会社のデータサイエンティストであるあなたが、成約価格の予測システムを作らなくてはならなくなった」という状況設定のもと、予測モデル構築の流れについての解説がなされる章です。ビジネス要件を理解した上で、データを知り、特徴量を設計し、作成したモデルを評価していく… という流れです。

執筆者の堅田さんの経験に基づくものと推察され、参考になる点も多くあると思います。

第3章 クラスタリング入門

機械学習の解説書では頻出の K-means 法 *2を中心に、クラスタリングについて解説される章です。階層型クラスタリングにも言及があります(久しぶりに Dendrogram を見た気がしました)。

しばしば課題になるクラスター数の決定に関するアプローチや、K-means 法の適応に関する注意点などがあわせて解説され実践的な内容になっています。

第5章 レコメンデーション入門

古典的(?)な機械学習の適応例である、協調フィルタリングによるレコメンデーションについての解説が主です。スパースな行列を取り扱う方法としての次元削減 (Dimensionality Reduction) についても紙面が割かれています。

分類器を用いた手法によりレコメンデーションを行う方法が提案としてのみ掲載されていますが、ごく個人的には、ユーザーベース強調フィルタリングの解説は多いため、むしろこちらの詳細な解説を読みたかったりもしました。

第6章 評判分析入門

第6章は自然言語処理を活用して、映画レビュー内容のネガ/ポジ判定を行おうという章です。前提となる自然言語処理の基本、形態素解析や特徴量作成について丁寧に説明されています。

ちなみに、形態素解析の解説など一部内容が第4章の「トピックモデル入門」と重複しておりかつ第6章のほうが説明に紙面が割かれているので、自然言語処理について学びたい読者は先に6章を読んでから4章に遡ったほうが良いかも知れません。

第8章 ディープラーニング理論編 / 第9章ディープラーニング実践編

第8章、第9章は みんな大好きディープラーニングについての話題です。たびたび本書がケーススタディを軸にした解説書であると述べましたが、本章については理論ベースの解説です。

理論編では、Neural Network, Perceptron, 活性化関数などの理論から、CNN や RNN の実装についての解説があります。著者曰く「数式を1個も使わないという制約を己に課し*3」たそうで、講義形式であることも相まって読みやすい構成になっていると思います。

実践編は定番と化した Keras + TensorFlow のコンボを利用したディープラーニングの実践です。Keras を利用した画像およびテキストの分類問題への取り組みです。

Ex 補足資料

本書はある程度「Pythonが書けること」が前提となっていますが、巻末の Appendix にて、Anaconda 環境の導入や Jupyter Notebook の使い方、Python の文法(!)の解説があります。本書のサンプルコードを実行するにあたり実は Python がよく分かっていなかったことに気付いた方は、目をとおすとよいでしょう。

以上です。

関連するかもしれない書籍

  • とても売れているらしい。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 本格的に scikit-learn を活用したい方向け。

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

*1:https://github.com/yosukekatada/mlbook

*2:本書で実践されるのは scikit-learn に実装のある K-means++ です

*3:書籍版 251頁

いまこそ Python に "再"入門!! - 技術評論社『科学技術計算のための Python 入門』

積ん読消化週間ということで『中久喜 健司 (2016). 科学技術計算のための Python 入門 - 開発基礎、必須ライブラリ、高速化, 技術評論社』(以下、本書) を拝読しましたのでレビューを掲載します。

科学技術計算のためのPython入門 ――開発基礎、必須ライブラリ、高速化

科学技術計算のためのPython入門 ――開発基礎、必須ライブラリ、高速化

総評

本書の最大の特徴は、Python の文法や言語仕様の解説と、Python を分析ツールとしてみたときの用法がとてもバランスよく散りばめられている点です。

本書の内容は、大きく2つに別れます。Python の言語仕様や、開発するうえでの基礎知識を得られる前半と、いわゆる PyData パッケージ群について学べる後半です。前者については、動くコードを書くことを求めるあまり Python やプログラミング言語自体への理解がおざなりだったと考えている Python ユーザーに適した内容です。後者は、NumPy や SciPy などの有名な PyData 系パッケージを理解するための足がかりとなる内容で、これから本格的にデータ分析ツールとして Python を使い込んでいこうとするユーザーに役立つ内容です。

対象読者について

近年 Python の人気により、基礎から応用までの文法書は多く出版されています。データ分析に対する需要も引き続き高いようで、統計解析や機械学習関連本の刊行も活発です。後者にフォーカスを当てた書籍においても、副題に「Python 〜」と添えられていたり、サンプルコードが Python であるケースが目立ちます。

既存の書籍の傾向として、Python の文法にフォーカスを当てた書籍ではデータ分析の話題に触れられることは稀で、反対にデータ分析系の書籍においては、Python の文法に関しては概要に触れるだけにとどめられることが多いように思われます。これはもちろん、両者ともに奥深いものであるためいずれかにウェイトを置く必要があるからでしょう。

本書は「文法書」に近い構成です。分析手法や統計アルゴリズムはほぼ登場しません*1。本書後半のパッケージ紹介においても、著名な機械学習パッケージである scikit-learn の解説は省かれています。これが意図的なものであるのは、以下に本書 v頁より引用する想定読者からも明らかです。

本書の想定読者は、これから科学計算技術やエンジニアリングに Python を使い始めてみようと考えている方々で、たとえば以下のような方々です。

  • Python がどのような言語で何ができるのかを学びたい方

  • Python で科学技術計算を行ってみたい方

  • Python によるハイパフォーマンスプログラミングの基礎知識を学びたい方

  • Python の文法に加えて、実践的なプログラム構築法を学びたい方

今回のレビューとしても、上記がそのまま本書をおすすめできる読者層です。Python や科学技術計算といったワードから、例えばディープラーニングについて解説されているかのようなことを連想し期待するとミスマッチになります。

また、これは意見の分かれるところとは思いますが、プログラミング言語自体への入門としてはより平易な他の書籍を探すほうがよいでしょう。変数やデータ型などの基礎から解説されているため入門書とできないこともないのですが、全体的にフォーマルな解説で敷居高く感じられる読者がいるであろうことも否めません。

以下、各章について簡単にレビューします。

第1章 - Python の現状とその人気

導入部分で、技術的な内容よりも、「なぜ Python が使われるのか?」について紙面を割いている章です。「Python は最近人気である」「教育分野で利用が進んでいる」といった一般に聞くことがある内容を、論拠を示して解説しています。やはり一般に弱点とも言われる実行速度についてなどの言及もあり、「Python ってどうなの?」と聞かれた場合の回答としてはこの章を示せば充分なほどです。

第2章 〜 第3章 - 科学計算実装の流れ

「ロケットシミュレータ」を実装するという目的設定のもと、コーディングから静的コード解析、デバッグについて触れられているのが2章です*2。ユニットテストにも言及があるなど実践的でよいのですが、力学についての用語やそれなりの量のコードがいきなり登場するため、平易な内容を期待していた読者は多少面食らうかも知れません。実際、シミュレータ部分は読み飛ばしても全体の理解にはさほど影響がないので、次に進んでしまうのも一手です。

ユニットテストについては標準の unittestdocstring、サードパーティパッケージ nose についての解説があります。これら以外の選択肢としては pytest がよいでしょう。

3章は 定番ツールとも言える IPythonJupyter Notebook、IDE として Spyder が登場します。

本書の内容を学ぶにあたっては Jupyter Notebook の利用が最適でしょう。IDE が必要な方には JetBrains 社の高機能 IDE PyCharm をおすすめします。

www.jetbrains.com

第4章 〜 第6章 - 一歩進んだ Python 文法解説

4章から、Python の文法や言語仕様の解説が始まります。変数や関数の定義、データ型や予約語など、通常プログラミング言語の解説に必要な内容が掲載されていると考えて問題ありません。加えて、リストの状態による shallow copydeep copy の違い関する解説など、Python の Tips がいくつか取り上げられています。

本書中のコードですが、一部変数や関数への lowerCamelCase の採用*3や Single/Double Quote の揺れ*4など気になるものが若干ありました。命名については数学的慣例に基づいたことに依るものもあるように見えましたが、本書中で PEP 8 についての言及もあったことですし、一応この点に留意してコードを参考にするのが宜しいと思います。

また、文字列のフォーマットについて全体的に %演算子 を利用したコードが採用されています。この方法は古い方法であり非推奨とされているので、format() 関数を利用するほうがよいでしょう。

# %演算子
print("%d からカウントダウンします" % m)

# format 関数
"{0} からカウントダウンします".format(m)

余談ですがつい先日リリースされた Python 3.6 から新しい文字列フォーマットの方法*5が増えていますね*6

# Python 3.6 からの新しい方法
f"{m} からカウントダウンします"

第7章 〜 第10章 - PyData 定番パッケージの紹介

第7章からは、いわゆる PyData パッケージの解説です。NumPySciPymatplotlib, pandas の4つに1章ずつ割かれています。いずれも多機能なパッケージであるため、より深い知識を身につけるには専用の解説書や公式ドキュメントの参照が求められます。本書はこれらパッケージの導入として考えるとよいでしょう。

matplotlib の割り付けの指定はとても参考になる解説でした。

第11章 〜 第12章 - パフォーマンス向上のための Tips

11章および12章については、実行速度の高速化についてのトピックです。特に大きなデータを扱う場合に実行速度は重要な点ですから、関心を持たれる方も多いと想像します。本書では、高速化のためのアプローチを4つに大別しています。

  1. ボトルネックの解消 => コードの最適化
  2. 処理の並列化
  3. ライブラリの利用
  4. JIT コンパイラの利用

「1. ボトルネックの解消」として for 文を極力控えるなどの Python における代表的なパフォーマンスに関する注意事項のほか、メモリの利用に関する解説があります。

「2. 処理の並列化」は、multi thread/multi process についての内容が扱われています。一見並列処理による処理速度の実行が期待される multi thread への注意点がありつつ、I/O バウンドのときは multi thread を検討してもよいよというアドバイスは端的でよいと思いました。

「3 .ライブラリの利用」は、パフォーマンス向上の解法として Cython を利用することを紹介する内容です。C言語で実装したライブラリを Python から利用する方法も解説されています。

「4. JIT コンパイラの利用」では代表的な JIT コンパイラ Numba についての解説があります。

Numba は Pure な Python コードに多少手を入れるだけでパフォーマンスを大きく向上させられる可能性があるのでおすすめの方法です。

本書中に別解として Numexpr も登場します。

github.com

まとめ - 文法解説、パッケージ紹介、パフォーマンス Tips のバランスのよい構成

ここまで見てきたように、Python の言語仕様に踏み込みながら、PyData パッケージの導入も担うという点で希有なバランスを保つ本書です。多少でも Python の知識があると読み易いレベル感でもあるため、既に Python ユーザーである読者が 再入門 する際の手引きとして最適です。他のプログラミング言語ユーザーが Python を学ぶための一冊として利用するのもよいでしょう。

高度な分析ツールの普及により、便利なパッケージに手を伸ばしがちな昨今です。いまいちど、本書を片手にプログラミング言語としての Python の特性を確認してみるのもよいかも知れません。

関連するかも知れない書籍

  • NumPy と pandas について深掘りしたいなら

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

  • 機械学習について知りたいんだ!という人向け

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

*1:ロケットシミュレータのくだりや SciPy の章で若干登場します

*2:この設定は著者のバックグラウンドによるもと思われます

*3:157頁 myFunc など

*4:155頁 など

*5:PEP 498 -- Literal String Interpolation | Python.org

*6:そういえば ECMAScript 2015 の template literal っぽいですね