スタバの呪文注文は受入れられているのにSUBWAYがだめな理由

SUBWAYが店舗を減しているそうで

サブウェイが4年で170店舗も閉めた理由 | プレジデントオンライン

「サブウェイ」4年で170店舗も閉店していた…「好きなのに」「近くに店舗がない」とファンからは悲しみの声 - Togetter
サブウェイの注文方法の改善案とオススメデッキレシピの共有「何も知らない状態で『君だけの最強デッキをつくりだせ!』とかいきなり言われるのは確かにやばい」 - Togetter

SUBWAYヘビーユーザーのこの俺が貴様らにSUBWAYの使い方を伝授してやる: 不倒城

SUBWAYが店舗を減らしているニュースを知り、以前からSUBWAYブランディングと注文方法に問題があると考えていたので、その点をグダグダとツイートしてたら、攻略記事が書かれていた。まさに、SUBWAYの注文は「攻略」であり、デッキを構築するゲームに近い。デッキを構築する楽しみはあるが、そんなことをしたくない人もいるだろう。そういう人のためにも、SUBWAYはスターターパックを用意して欲しい。

Chipotle(チポトレ)上陸して欲しいなぁ

ちなみに、私はSUBWAYの注文方法の改善、あるいは根付かせる方法には興味はあるが、SUBWAYそのもにの興味はあんまりない。SUBWAYの注文を改善したい理由は、アメリカ発のメキシカンである「Chipotle(チポトレ)」が日本に上陸して欲しいと願っているからだ。Chipotle(チポトレ)の注文スタイルはSUBWAYのそれに近いが、より複雑である。クオリティは自信を持ってオススメできるが、注文方法を変えなければ日本では流行らないだろう。

https://tokuhain.arukikata.co.jp/losangeles/2014/10/_chipotle.html
マクドナルドの売り上げがアメリカでも激減している理由とは?
Chipotle(チポトレ)では、先ずにタコス、ボウル、ブリトーを選ぶ。そして、ライスを入れるかを決める。ライスを入れるとボリュームたっぷりになるので、個人的には入れない。次に肉、トッピングを選ぶのだが、ここは恐らくSUBWAYよりも複雑だ。追加料金なしのトッピングもあれば、そうでないものもある。しかし、それが一見して分かるようにはなっていない。SUBWAYの注文方法が受入れられなければ、Chipotle(チポトレ)が日本進出しても成功の見込みはないだろう。

SUBWAYの注文スタイルをブランディングする

SUBWAYの注文方法はややこしい。しかし、ややこしさとしてはスターバックスの呪文注文や二郎系ラーメンの注文方法と変わらない。なぜ、SUBWAYはダメなのか。
組み合わせが多すぎるからだろうか。しかし、ファミレスなどでも数種のメニューから組み合わせを「選択」するセットに帯する不満などは聞かれない。

スターバックスではオプションを選択すると結果的に呪文注文が生成されるが、オプションを選択しなけば指さしのみで注文可能である。二郎も「普通で」などど言っておけば済む。ファミレスなどのセットメニューでも、指さしのみで意思は伝わるし、順々に選んでいくため迷うことはあっても道筋は見える。SUBWAYでは道筋が見えない。
SUBWAYで選択の道筋が見えないのは、オプションが多すぎるからだ。主に、対話でのコミュニケーションが必要であるのも、道筋を見えなくしている。また、オプションの選択が強制されているのも避けられる理由かも知れない。

サブウェイが店舗デザインを一新、業績回復に貢献するか | BUSINESS INSIDER JAPAN
改善する一つの方法は、店員との対話を減らすこと。アメリカでは、アプリで注文を選択し店舗で受け取ることができるように改善されている。店頭に設置されたタブレット端末から選択したり、注文票を用意するなどの方策が考えられるだろう。
もう一つは、デフォルトの設定を用意すること。つまりスターターパックである。野菜は基本的に全部入りにして、苦手な野菜を抜く形式が望ましい。足し算ではなく、引き算にするわけだ。

スタバや二郎の注文が受入れられているもう一つの理由は、それがブランディングされているからだろう。調理が目の前で行われるのは一つのイベントである。きちんと注文さえできれば満足できるはずた。つまり、SUBWAYの注文スタイルそのものをブランディングすることが可能なはずだ。それができないのは、注文の道筋が見えないからで、注文の方法自体の改善は必要だろう。

まとめ

1. SUBWAYの注文スタイルをブランディングする。
2. 選択肢を明確にし、望みの注文ができるようにする。
3. デフォルトのスタイルを設定する。

スタバや、コストコバーガーキングなどの例のように、アメリカンなスタイルをブランディングすることは十分可能だ。特に、バーガーキングはアメリカ本国とは異なるブランディングをしている点は興味深い。
オプション選択がSUBWAYの魅力の筈だが、それが多すぎる。そのため注文の道筋が見えない。選択肢を明確にする方法として、モバイルアプリや店頭での注文票やタブレットの導入が考えられる。選択肢を予め明確に示すことができれば、どのような方法でも良いと思う。
それと同時に、いちいち色々選ぶのが面倒だという人もいる。そのような人のために、「普通で」を用意しておく。そこから、嫌いなものを抜く形式の方が注文も簡単だろう。

というわけで、自分自身としてはSUBWAYの注文形式が広まって、その結果としてSUBWAYスタイルのファストフードが進出して欲しいなぁと願っているのでした。ただし、日本でメキシカンを広めるなら、最近流行のキッチンカーの方が向いてそうですね。

黒本に嘘の情報を提供したスクウェアの罪と罰

嘘の資料を渡したスクウェア

nlab.itmedia.co.jp
live.nicovideo.jp

【FFT】黒本「小数点以下の確率で盗める」【20年目に驚愕の事実発覚?!抜粋コメ付き】

スクウェアの前廣和豊氏がニコ生中に、黒本として名高いファミ通、JK・VOICEが出版したファイナルファンタジータクティクスFFT)について言及し「小数点以下の確率で盗める」の真相が明らかになった。なんと、開発資料を検証もせずに、そのまま掲載する出版社にイラついていた伊藤裕之氏が、嘘の資料を渡していた。

黒本の中で、最も悪名が高いのが「小数点以下の確率で盗める」であり、この記述を信じて挑戦し無残にも諦めたプレイヤーも多いだろう。スクウェアから嘘の資料を渡されるファミ通の信頼性のなさも問題だし、黒本にはこれ以外にも相当数の誤植や誤情報があるため、ファミ通とJK・VOICEの責任は重い。その一方で、最終的に割を食うのはエンドユーザーであるプレイヤーのため、嘘の情報を故意に渡したスクウェアにも責任があるだろう。

スクウェアの攻略事情

誤情報が多すぎる黒本

書籍/【ファイナルファンタジータクティクス大全】 - ファイナルファンタジー用語辞典 Wiki*
dic.nicovideo.jp

ファミ通とJK・VOICEによるFFTの攻略本は、エルムドア以外の記述に関しても誤植、誤字や誤情報が多い。どんなに校正を行っても誤植は生じえるが、それにしたって多い。出版社として最低限やるべき仕事を怠っているのは疑いようがない。

伊藤氏の発言を別角度から見てみると、当時からゲーム開発元とゲーム雑誌の関係が、あまり良好ではなかったことがうかがい知れる。昨年、ファミ通の水間氏が任天堂がグッズを内製し、それを告知するサイトも内製である点を愚痴っていた。ゲーム開発会社と雑誌社が、こんな関係性だからこそ、ゲハ系ブログの影響力が強くなったのかなぁと、暗い気持ちになった。

ゲーム開発会社とゲーム雑誌社の関係性

よくよく考えると、当時のスクウェアデジキューブを立ち上げ、スクウェア・オンラインなど、既存の販路やメディアに依存しない方向を目指していた。まぁ、映画とこれらの事業が上手くいかずに、結果的にエニックスと合併することになるのだけど。スクウェアエニックスと合併した理由の一つに、エニックスが出版を手がけていたからとも言われている。

また、スクウェアの攻略本と言えばNTT出版だったが、PSの頃からは、FF7やサガ・フロンティアの攻略本がファミ通系列の「解体真書」から出版されている。その関係もあり、FFTの攻略本もファミ通が携わることになったのだろう。FF8以降は「解体真書」を手がけた「スタジオベントスタッフ」がアルティマニアデジキューブおよび、デジキューブが倒産してからは、スクウェア・エニックス出版で刊行している。「スタジオベントスタッフ」は、サガ・フロンティアの裏解体真書など、実際にやり込みを行い攻略本を書いていたようなので、スクウェアとの関係も良好だったのだろう。

とは言うものの、解体真書アルティマニアにも誤植や誤情報があるんですけどね。サガフロンティアの1と2なので、どっちもサガですね。
裏解体真書の間違い
アルティマニアの間違い

ファミ通とJK・VOICEは検証しなかったのか?

ファミ通とJK・VOICEによるFFTの攻略本、いわゆる黒本には多くの誤植と誤情報があるため、同出版社がゲーム開発会社から提供された情報を検証もせずにそのまま掲載していた点は間違いない。実際、ファミ通の攻略本は、そのコピーである「大丈夫。ファミ通の攻略本だよ。」を文字って「大丈夫?ファミ痛の攻略本だよ?」とネットで揶揄されほどひどい内容のものがある。
ただし、エルムドアの源氏装備に関しては、ファミ通を擁護する声もある。数々のゲームのレアアイテムを集めるゆっくりレアハンターであるマラリア氏が、その一人だ。

マラリア氏は、2014年にアップロードした動画で、ファミ通とJK・VOICEによるFFTの攻略本における「小数点以下の確率で盗める」関連の記述が不自然であること、および北米版のFFTでは、エルムドアから源氏シリーズを盗めることから、本来は開発側が盗めるように意図していたものの、設定を誤りか変更のため盗めなくなり、結果として誤った情報を元に攻略本が書かれたのではないか?と推測していた*1FF5において、源氏シリーズはギルガメッシュから盗むこと、またエルムドアの見た目がセフィロスっぽいことも相まって、ロマンを追い求めたくなる。

以下に攻略本のエルムドアの正宗および源氏シリーズの記述を引用する。

  • 村正はChapter4でエルムドアが装備している。ただし、盗むのは至難の業。(P125)
  • 超レアアイテムの正宗は、ランベリー城場内に登場するエルムドアが装備している。
  • 源氏シリーズの防具も、ここでしか見れない。

いずれも盗める確率は0パーセントと表示されるが、このゲームでは小数点以下を切り捨てているため、実際は小数点以下の確率で盗める。
気が遠くなるほど低い確率だがゼロではない。
十分にレベルを上げ、即死や、吸血を防ぐアイテム類を完璧に揃え、何度も何度も挑戦すれば盗むことが可能。
盾を壊す事ができれば回避率が下がる為、盗める確率が多少上がる。
スロウも効かないわけではない。ただし成功率は果てしなく低い。(P200)

  • 盗める確率はほとんどの場合において0パーセント。まず盗めない(初版P214)
  • 正宗と源氏シリーズを装備するがいずれもエルムドア専用装備であるため、絶対に盗めない。(第二版P214)

スクウェアがどのような資料を提供したか不明である。「小数点以下の確率で盗める」 がスクウェアファミ通のどちらか来たかはわからない。
仮に上記の通りの資料を渡していたならば、ファミ通の責任はかなり重い。ただし、最終的に不利益を被るのはユーザーなので、スクウェアも無責任である。

伊藤氏は検証すればすぐに分かることとするが、本当に検証可能であろうか。

エルムドアから源氏シリーズを盗めるようにしていた?

エルムドアにはメリットアビリテとして「メンテナンス」が付いているため、バグでもない限りは装備品を破壊することも盗むことも100%不可能だ。

ただし、この特性はゲーム内で明記されているわけではない。また、FFTのアークナイトはNPC専用で公開情報のみから、その特性を判断するのは困難である。アークナイトとして、エルムドアの他に、ディリータやザルバッグが登場するが、彼らはメンテナンスを所有していない*2。また、同じアークナイトであっても異なるアクションビリティを有しており、さらにザルバッグは騎士剣、エルムドアは刀と装備まで違う。エルムドアはサポートアビリティとして格闘を所有している点も解せない。


FFT エルムドアから源氏シリーズを盗む Steal the Genji from Elmdor

北米版のエルムドアには「メンテナンス」が付いていないものの、レベルを上げ、さらにステータスを十分に低下させないと盗むのは困難である。

以上の点から、本来は正宗と源氏シリーズをエルムドアから盗めるようにしていたとの推測も成り立つだろう。ただし、この点がPSP版で修正されていない点が不可解である。北米版の方が設定ミスである可能性もある。

「小数点以下の確率で盗める」は検証可能か?

伊藤氏はすぐに検証できる発言しているため、エルムドアが「メンテナンス」を持っている点をファミ通へ資料提供していたのだろう。その一方で、エルムドアから盗めるとも書いていたのだろう。

再度エルムドアの源氏シリーズに関する記述を読むと、マラリア氏が指摘するように、必死さが感じられる。この件に関しては、実際に試したが、無理だったため必死さのにじみ出る文言なのかもしれない。
「小数点以下の確率で盗める」ならば、仮にそれが0.9%ならば、100回やっても盗める確率は60%で250回でようやく90%ととなる。また0.1%の場合、1000回やっても37%の確率で盗めないことがある。
エルムドアに「メンテナンス」が設定されているとの資料を信じるか、それとも源氏シリーズを盗めるとの情報を信じるか。プレイアブルなキャラクターとNPCでは、同じ能力名であっても違うことがある。特に、アークナイトであるエルムドアに付与されている「メンテナンス」は非公開情報な上、他のアークナイトと比較しても不可解な点も多い。恐らく、最終的に疑いながらも盗める方に賭けたのであろう。

盗めないならスクウェアに正誤を問いあわせるべきではある。しかし、当時のスクウェアファミ通の関係性からは無理そうである。また、松野氏が擁護するように締め切りもある。ただし、そうであっても誤植の多さは大いに問題である。全体としては、ファミ通を擁護しきれないが、困るのはユーザーであるため、意図的に嘘の情報を提供するのは悪質だ。特に、手に入らないレアアイテムの情報は。

開発元が提供した資料に誤りがあったと推測される事例

開発元が出版社に提供した資料に誤りがあり、それを検証せずに掲載するのはファミ通に限らない。もちろん、通常は故意に誤ったデータを渡すわけではない。結果的に誤った情報を渡してしまったケースの方が多いだろう。

FF5の「ちぬられたたて」

NTT出版FF5攻略本である「基礎知識編」では、「ちぬられたたて」がピラミッドで入手できるとされている。しかし、実際にはアイテム変化のバグを起こさない限りは入手できない。データとしては存在しているが、手に入れられないのだ。FC版DQ2のあぶない水着のように没にしたのかも知れないし、あるいはピラミッドに設置し忘れたのかも知れない。

魔界塔士サガにおける共通する誤情報

魔界塔士サガの攻略本にも誤植があったのを思い出したので調べてみたら、面白いことが分かった。魔界塔士サガの攻略本は、徳間書店、ゲイブンシャ、辰巳出版から刊行されているが、三社とも本来5000ギルである「ドア」の値段を500ギルと間違っている。また、徳間書店辰巳出版は共に、「きんのはり」、「じゅうじか」、「めぐすり」、「いきかえりのくすり」の値段を同じように間違っている。刊行の遅い辰巳出版徳間書店の情報をパクった可能性もあるが、スクウェアから提供された資料に誤りがあった可能性が高い。これらの間違いは検証すれば分かることではあるが、どの出版社も締め切りとしてはギリギリだったと考えられる。魔界塔士サガは1989年12月15日の発売だが、徳間書店版はガイドブックという位置づけのため、1月に発売されている。辰巳出版は3月、そしてゲイブンシャは4月発売である。徳間書店は検証する時間はほぼなかったであろう。

魔界塔士SaGa攻略本の正誤表

サガの嘘情報はひどい

スクウェアのゲームの中でもっともひどいのはサガシリーズだ。
ロマサガ2は特にひどく、メニュー上の値と戦闘で参照される値が異なる事例が多々ある。例えば、オートクレールはゲーム上最強の攻撃力である50と表記されているが、実際は35しかない。防具も、メニュー上の表記と実際の値が異なる事例が多い。ほぼ詐欺である。これに加えて隠しステータスがあるため、プレイヤーは何を信じて良いのかさっぱりである。

ロマサガ3においては、仕様の変更により最上位のモンスターが登場しなくなったことを河津氏が明らかにしていた。

先の、解体真書アルティマニアもサガ・フロンティアに誤植や誤情報があった。サガシリーズは納期を絶対に守らせる河津氏の作品だからこそ、仕様と実装の違いが生じやすいのであろう。

「小数点以下の確率で盗める」はスクウェアにも責任あるよね

上記で示したように、開発元から出版社へ提供される仕様に基づいた情報が、100%正確であるとは限らない。ロマサガ3の最上位モンスターのように、意図した仕様と異なってしまうこともあるからだ。
それを検証するのが、攻略本を作製する編集者や出版社の仕事ではある。だがしかし、開発元が意図していない、あるいは認知していない誤情報を、出版社が検証するのは容易ではない。時間も予算も人も限られている。情報があるだけ、余計なバイアスもかかってしまう。出版社はデバッカーではないわけで、出版社だけが責められるべきではないだろう。

もちろん、出版社としての責務を怠り、開発元からの情報を何ら検証せず、また誤植や誤情報だらけの攻略本は責められるべきである。その点で、ファミ通、JK・VOICEにおるファイナルファンタジータクティクスの攻略本、通称黒本は許されるべきではない。しかしながら、この本の誤情報は開発元が故意に提供したものである。ファミ通やJK・VOICEがきちんと検証したかは定かではない。「小数点以下の確率で盗める」に関しては、検証した可能性はありそうだ。「小数点以下の確率で盗める」に関しては、誤情報を故意に提供したスクウェアにも責任があるだろう。最終的に困るのは、ユーザーであるからだ。

*1:ただし、マラリア氏は動画の中程でPSP版ではエルムドアから盗めるようになった説明しているが、最後のお詫びに事実では無い点を謝罪している

*2:ザルバッグはサポートアビリティにセットされることがある

日本には7重内陸区市町村が存在する

f:id:lastline:20180515135054p:plain

n重内陸区市町村問題

世界には、48の内陸国が存在するが、その中でも海に出るために二つの国境を越える必要のある二重内陸国は、リヒテンシュタインウズベキスタンの2国しかない。
二重内陸国を日本の都道府県に当てはめてみようと思ったが、二重内陸都道府県は存在しない。海なし県として、栃木県、群馬県、埼玉県、長野県、山梨県岐阜県滋賀県奈良県があるものの、これらの県は一つの県境をまたげば海に出ることができる。奈良県以外は、互いに他の海なし県と接しているのが面白い。
二重内陸国の概念を市町村に拡張すると、二重ではすまないことが容易に想像できるだろう。言い換えると「日本の市町村において、海に出るまでに n 個の境界を越える必要のある市町村を n重内市町村としたとき、最大の n はいくつか」という問題になる。

市町村の区分としては、基盤自治体を元とする。つまり、東京都の「特別区」は「区」を、政令指定都市の「区」は「市」を境界とする。これは、東京都の「特別区」は「市町村」と同等の基盤自治体であることによる。

白地図に海岸線を有する市町村から順に内陸方向へ塗りつぶすことで、最大のnは7であることが分かった。つまり、7重内陸市町村が存在する。
各地域毎の結果を最後にまとめて表示した。

解法の指針

日本の中心はどの県だ?グラフ理論(ネットワーク)の基本的な諸概念 - アジマティクス
市区町村隣接関係一覧
当初は市町村の隣接データを元に、スクリプトを書いてグラフ理論で解こうと考えていた。しかし、「日本一マクドナルドから遠い場所」において、力業で求めた方がもっともらしい回答が得られていたので、白地図を地道に塗り塗りすることにした。
そもそも、市町村が多すぎるためデータの取り扱いが煩雑である。また、結果を可視化する場合にも色分けされた地図が必要となる。さらに、得られた結果を確認するためにも、ある程度手を動かす必要がある。結果を知りたいだけならスクリプトを書くよりも、地道に塗った方が早そうである。
都道府県における、n重内陸市町村をリストアップするならスクリプトを書いた方が間違いは少ないだろうが、興味があるのは最大の n のみなので、やはり手作業の方が単純で容易そうだ。

日本一マクドナルドから遠い場所 - Qiita
「本当に」日本一マクドナルドから遠い場所|ヌノカワ ユウスケ|note

高解像度の白地図

地図を塗るにも、それなりの高解像度の白地図が必要である。これは、スクリプトを書く場合も同様で可視化のためにベクター形式の地図情報があると便利である。

そこで、白地図 KenMap (白地図作成ソフト)白地図を用いることにした。関東付近は市町村が非常に過密なため、境界がやや曖昧になるものの、塗り分け用の地図としては必要十分である。

ちなみに、国土地理院から白地図を得られるが、市町村の区分まで表示するには倍率を上げる必要がある。一つの県を表示するのがやっとである。これをつなぎ合わせも良いが、手間がかかりすぎる。

Shapefileを読んでみる - 日々適当
shape形式のファイルを読み込む手も考えられるが、全国区で市町村を表示するとかなりの数のポリゴン数になるようである。そもそも、市町村を全国区の表示で見る用途など、想定されていないのだろう。

7重内陸市町村が最大

1重内陸市町村までしか有しない都道府県

1重内陸市町村しか存在しないのは、沖縄県、鹿児島県、長崎県佐賀県山口県愛媛県香川県福井県、石川県、富山県三重県の11県である。
中でも、沖縄県長崎県山口県は、1重内陸市町村を一つしか有しない。それぞれ、沖縄県南風原町長崎県波佐見町山口県美祢市である。島からなる沖縄県に内陸市町村があるのは興味深い。

7重内陸市町村は埼玉県と群馬県にある

n の最大値は7である。つまり、日本には7重内陸市町村が存在する。埼玉県の美里町滑川町東松山市、吉見町、北本市行田市羽生市、および、群馬県千代田町明和町が該当する。

次に、各7重内陸市町村が海へ出るルートを考えてみよう。千代田町群馬県を抜け新潟県へ、明和町は一旦栃木県に入り、再度群馬県にも取り、新潟県側へ出るルートが最も境界が少ない。
また、美里町は、千代田町とほぼ同じ道筋を辿る日本海ルートの他に、長野と山梨を経由して静岡県側から出るルートもある。その他の市町村は東京湾に出た方が境界が少ない。東松山市、吉見町、北本市などはさいたま市を経由し、東京へ出るルートが距離的にも短くなる。行田市羽生市は、細く長く伸びた千葉県野田市のお陰で越えるべき境界数が少なくなっている。

埼玉と群馬にnが最大となる市町村が存在する理由は、関東の市町村が非常に多いことに起因する。特に、埼玉県は小さな市町村が非常に多い。そのため、海に出るために経由すべき境界が増加しやすい。

その他の地域は市町村の合併により、市町村数が減少し、また、本来海外線を有したかった市町村が海外線を有するようになったことにより、n が減少した可能性が考えられる。恐らく、旧市町村の区分だと、 n はより大きくなるだろう。

地域別のn重内陸市町村

地域別に見ると、九州では福岡県と佐賀県に3重内陸市町村が存在する。これは、福岡県に市町村が多いためだ。
中国地方では、岡山県のみに3重内陸市町村がある。山がちな地域のため納得ではある。一方で、四国は2重内陸市町村までである。その中でも徳島に二重内陸国市町村が多いのも山によるものだろう。
関西は奈良県に4重内陸市町村があり、橿原市田原本町などが該当する。山がちな点と、大阪府奈良県に市町村が多いためと考えられる。長野県と岐阜県は意外にも3重内陸市町村しか存在しない。岐阜県高山市や長野県松本市の面積が広いため、多くの市町村と接することになるためだ。
東北地方は福島県に4重内陸市町村があり、北海道は3重内陸市町村までとなる。東北は、海岸線を有する市町村が割と内陸まで入り込んでいる場合が多い。その中で、福島県の場合は地形的のも内陸に入り込み、また市町村が多いため、内陸市町村が多くなっている。

海岸線を有するにも拘わらず、茨城県には5重内陸市町村が存在する。それぞれ、古河市結城市、八千代町であるが、これは海あり県では、最大である。そもそも、海なし県である、群馬県と埼玉県が最大の7重、次いで栃木県に6重があり、5重で茨城県山梨県が並んでいる。他の海なし県である、長野県、岐阜県滋賀県奈良県よりも多いのだ。これは、茨城県の内陸部が海なし県と接しているためであろう。

やっぱりスクリプト書いてみるかなぁ

日本の市町村において、海に出るまでに n 個の境界を越える必要のある市町村を n重内市町村としたとき、最大の n は 7 である。この時、東京都の「特別区」は境界とし、政令指定都市の「区」は「市」を境界とした。
ちなみに、地図は掲載しないが、東京23区をひとまとめにした場合もnの最大値は7となる。また、政令指定都市の区を境界とすると、nの最大値は8となる。

7重内陸市町村は、埼玉県の美里町滑川町東松山市、吉見町、北本市行田市羽生市、および、群馬県千代田町明和町である。それぞれ、日本海側、東京湾および静岡経由で海に抜けるルートが存在する。今回は、最長のルートを有する市町村は考慮しなかったが、これを求めることで、最内陸市町村を決定できそうである。また、今回のルートは山による境などを加味していないため、踏破できないことも十分考えられる。

海あり県では、茨城県に5重内陸市町村が存在する。長野県、岐阜県滋賀県奈良県より多いn重内陸市町村を有している。

スクリプトを書けば、より詳細なリストやルートが得られそうだが、これは今後の課題にしたい。

塗り分けた結果

緑が濃くなるごとにnが大きくなる。
f:id:lastline:20180515133921p:plain
f:id:lastline:20180515134119p:plain
f:id:lastline:20180515134208p:plain
f:id:lastline:20180515134327p:plain
f:id:lastline:20180515134346p:plain
f:id:lastline:20180515134431p:plain
f:id:lastline:20180515134518p:plain

Pythonでスペクトルのフィッティング

非プログラマーがPythonを学ぶために読んだ本 - 最終防衛ライン3 の「2. 一ヶ月勉強して、できるようになったこと」で書いた、Pythonでスペクトルのフィッティングを行った例を示します。matplotlib と pandas などを扱ったグラフの出力に関しては、別当まとめようと思います。matplotlib は手に取ってみるとなんとなくで扱えるのですが、真面目に取り組むと結構ややこしく、自分のためにも備忘録をしっかりまとめておきたい。
フィッティングだけならExcelでもできますが、データを大量に取り扱うとなるとマクロを組む羽目になりますし、マクロよりも、スクリプト言語を扱った方が拡張性があります。デーだ処理だけなら、Rを使う手もありますが、グラフを出力すること以外にもPythonを使った方が、やりたいこと、またできることが多いので。

フィッティングする適当なデータがなかったので、放射線スペクトル表示ツール SPViewer / 説明ページ における スペクトル例(FNF-401) を利用しました。確認用データを生成してそれをフィッティングしても良いのですが、それだとフィッティングできて当たり前ですし。
放射線スペクトルは、正規分布を取ることが知られているのでガウシアンフィッティングに最適。またバックグラウンドも二次式程度で近似できそうなので、丁度良いかなと。

f:id:lastline:20180412092647p:plain

スペクトルのフィット:例2Pythonでやった結果を表示しています。
先ず、pandas で CSV ファイルを読み込み、
フィッティング関数を定義し、scipy.optimize の curve_fit でフィッティングを実行します。
そして、その結果を matplotlib で描画しています。
フィッティング関数の定義や、データの取り扱いには numpy を利用しています。

以下のコードを実行すると、グラフが出力されます。
CSVファイルは、先述のように 放射線スペクトル表示ツール SPViewer / 説明ページ から スペクトル例(FNF-401) をダウンロードし、同名のフォルダに保存してください。URLから直接取得することもできますが、本質ではないのでカット。
過剰とも思えるコメントを付記しています。調べた際に、分かりにくかったポイントをまとめてあります。。そのくせに、関数の document は記述していない。

#モジュールのインポート
#import モジュール名 as * は非推奨。使っているコードを見かけますけど。
import pandas as pd
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

#データの読み込み
#関連として df を用いるが、データに即した変数名を使うべき。
#ベクトルとして取り出すことも可能。
#ただし、x, y を個別に取り出した方がフィッティングの際に扱いやすい。
#engine='python' と指定すると日本語ファイルも読み込めます。
file = 'fnf401_milk.csv'
df = pd.read_csv(file, engine='python', skiprows=250, nrows=350, header=None)

#元データがint値で、そのままではフィッティングできないので、float型に変換している。
channels = np.array(df.iloc[:, 0], dtype=float)
counts = np.array(df.iloc[:, 1], dtype=float)

#フィッティング関数の定義
#n次式を定義しやすいように、0次から記述した。
def quadratic(x, a, b, c):
    return a + b * x + c * x**2

#ガウシアンはより簡素に記述できるが、初期値を類推しやすい式にした。
def gauss(x, a, sigma, mean):
    return a / np.sqrt(2.0*np.pi) / sigma * np.exp(-((x-mean)/sigma)**2/2)

#フィッティング関数は二次関数とガウシアンをまとめて定義してもよい。
#ガウシアンを三度呼び出すので、分けて記述した。
#文頭のアスタリスクのついた*paramaters は引数を幾らでも渡せる。
#本来ならば引数を個別に指定すべき。
#今回はあまりにも冗長になるため、*paramaters と指定した。
def fitting(x, *paramaters):
    a0, b0, c0, a1, sigma1, mean1, a2, sigma2, mean2, a3, sigma3, mean3, = paramaters
    return quadratic(x, a0, b0, c0) + \
           gauss(x, a1, sigma1, mean1) + \
           gauss(x, a2, sigma2, mean2) + \
           gauss(x, a3, sigma3, mean3)

#初期値の設定。
#ガウシアンの場合、meanを適切に設定しないと発散しやすい。
#線形近似であっても適切に設定することが望ましい。
#関数の引数が複数ある場合は、タプルで渡すこと。
initial_quadratic = 70., 0.1, 0.1 #a0, b0, c0
initial_gauss1 = 1., 1., 300. #a1, sigma1, mean1
initial_gauss2 = 1., 1., 325. #a2, sigma2, mean2
initial_gauss3 = 1., 1., 395. #a3, sigma3, mean3

#初期値が多いので、個別に指定して接続した。
initial_parameter = initial_quadratic + initial_gauss1 + initial_gauss2 + initial_gauss3

#フィッティングの実行
#paramater_optimalが最適化されたパラメータで、covarianceは共分散。
paramater_optimal, covariance = curve_fit(fitting, channels, counts, initial_parameter)

#matplotlibの設定
plt.rc('font', family='Arial', size=14) #フォントの設定
plt.rc('xtick.major', width=1, size=6) #x軸の主目盛りの設定
plt.rc('xtick', direction='in', top=True) #x軸目盛りの向き、上側に表示するか
plt.rc('ytick.major', width=1, size=6) #y軸の主目盛りの設定
plt.rc('ytick', direction='in', right=True) #y軸目盛りの向き、右側に表示するか
plt.rc('axes', linewidth=1.5) #枠線の太さ
plt.rc('lines', linewidth=1.0) #プロットの太さ

#今回は、Axes が一つしかないので fig, ax1 = plt.subplots() の方が簡素。
#慣例として ax1 を用いるが、df 同様に意味のある変数名にすべき。
fig = plt.figure(figsize=(8, 6), dpi=80)
gs = gridspec.GridSpec(1, 1)
ax1 = fig.add_subplot(gs[0])

#データをグラフに表示する。
ax1.plot(channels, counts, ls='-', c='g', label='row data')
ax1.set_xlabel('Channel', fontsize=16)
ax1.set_ylabel('Count', fontsize=16)
ax1.yaxis.set_data_interval(0, 100) #set_ylim を使う方が一般的

#フィッティングした曲線の表示
#np.corrcoef で相関係数を求める。
#結果が2×2の行列で返るので、1行目2列目もしくは2行目1列目の値を取得。
ax1.plot(channels, fitting(channels, *paramater_optimal),
         lw=1.5, ls='--', c='k', label='fitting curve\n' + \
         f'$R^2$ = {np.corrcoef(counts, fitting(channels, *paramater_optimal))[0][1]}')

#二次関数のパラメーターを利用したいので、スライスで取り出す。
a0, b0, c0 = paramater_optimal[0:3]

ax1.plot(channels, quadratic(channels, a0, b0, c0), c='b',
         label=r'$y = a_0 + b_0x + c_0x^2$' +'\n'+ f'$a_0$ = {a0}\nb$_0$ = {b0}\nc$_0$ = {c0}')

#各meanをグラフ上に表示する。繰り返しのため for 文を利用。
for i in range(3,12,3):
#この関数内の、a0, b0, c0 はグローバル変数である。
    def quadratic_gauss(x, *paramaters):
        a1, sigma1, mean1, = paramaters
        return quadratic(x, a0, b0, c0) + \
               gauss(x, a1, sigma1, mean1)

#annotate で Axes 内にテキストや矢印を表示できる。
    mean = paramater_optimal[i+2]
    ax1.annotate(int(mean), fontsize = 14,
                 xy=(mean, quadratic_gauss(mean, *paramater_optimal[i:i+3])+3),
                 xytext=(mean, quadratic_gauss(mean, *paramater_optimal[i:i+3])+15),
                 ha="center", va='top',
                 arrowprops=dict(shrink=0.05, facecolor='k'))

#凡例の表示。Figure の判例を出力することもできる。
ax1.legend(loc='upper right', frameon=False)

gs.tight_layout(fig) #グラフ描画前に行うべし。慣例では、fig.tight_layout()
plt.show(fig) #慣例では plt.show() と fig を指定しない。

参考文献やサイト

詳細! Python 3 入門ノート

詳細! Python 3 入門ノート

matplotlib や numpy が簡単ではありますが、まとまっています。

matplotlib や numpy の取り扱いで大変役に立ちました。

Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython

Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython

主に、pandas の取り扱いを参考にしました。

非プログラマーがPythonを学ぶために読んだ本

関連:Pythonでスペクトルのフィッティング - 最終防衛ライン3

プログラミングの経験はほとんどないのですが、最近Pythonの勉強を始めました。自分のやりたいことがそれなりにできるようになりつつあります。いろいろな本を購入したり、図書館で借りたりして勉強したので、折角なのでそれらをまとめておきます。
プログラミング未経験者ではないものの、興味のある人がぴったりのまとめだと思います。
私の目標は、業務で扱う大量のデータ処理の自動化が主で、機械学習にもつなげられたらと考えています。特に科学技術計算を自動化したい。たとえば、大量のデータを同一フォーマットのグラフとして出力するなどですが、この目標は既に達成できました。

1. 私のプログラム歴

プログラム歴はほとんどありません。ビギナーに毛の生えた程度だと思います。

ゲーマーなので、プログラム的なものの親和性は普通の人よりは高いでしょう。一応、HTMLもCSSもそれなりに書けるので、それもアドバンテージではあります。また、大学の授業で一応はC言語をやったので、整数型、浮動小数点型などがあるのも知っています。ただし、それが面倒くさすぎてプログラムを諦めた口です。

その後にウェブページを弄るために、JavaScriptなども触ってみましたが、既存のプログラムを流用するだけだったため、基本的なことが分からず、結局やめてしまいました。
Pythonもたくさんのコードが公開されているので、それらを流用すればそれなりのことができるはずですが、JavaScript に手を出した時の二の舞にならないためにも、基礎をしっかり勉強しようと考え、本を購入したり、図書館で借りたりして、独学で勉強しました。

2. 一ヶ月勉強して、できるようになったこと

基礎を勉強してから、他人のコードを流用しつつ、理解できない部分があったらwebで調べたり、本を読んだりしていたら、大体一ヶ月くらいで、最初の大きな目標に到達できました。
たとえば、スペクトルのフィット:例2 のようなスペクトルのフィッティングができるようになりました。フィッティングなら、有料ソフトを使えば可能ですが、無料かつ自動化が容易なのが Python の利点でしょう。

f:id:lastline:20180411152639p:plain
Pythonでスペクトルのフィッティング - 最終防衛ライン3

pandas で CSV ファイルを読み込み、numpy と scipy.optimize でフィッティングし、それらのデータを matplotlib で描画したグラフを示します。カーブフィッティングを含めた、グラフの描画に関しては、近いうちにエントリーを書くつもりです。

また、私が使用している3DCGソフトであるShadeのスクリプトPythonなので、それが書けるようになったのは渡りに船でした。

クラスの取り扱いがまだまだ不慣れです。自分用のプログラミングなら、そこまで必要はないですが、今後自動化を進める上でも、できるようになった方が楽ができるので、精進するつもりです。

3. 非プログラマー向けの入門書

プログラミングの経験のない人向けの本を紹介しますが、場合によってはもっと簡単な本の方が向いていることもあるでしょう。たとえば、Pythonではなく、プログラミングの概念を紹介している本など。

多くの入門書が、オブジェクトやクラスの説明をかみ砕こうとしていますが、そのほとんどは飲み込めるまでには至っていません。そもそも、それらを理解するには、プログラマー向けの本を読むべきだと思います。また、初等ならばそのような概念があることを頭に入れておく程度で充分でしょう。

どのように書くか、そして何ができるかを指し示した本が、入門書として最適だと考えます。
コードを見ながら入力することを念頭においているため、大判の本を選びました。「みんなのPython」はA5版で小さいため、このような用途には向きません。ハンドブックとして使うには丁度よいサイズではありますが。
広げて読むことを念頭に置いたので、基本的には電子版ではなく書籍を購入しました。広い画面とリッチなタブレットがあれば、電子版でも良いかも知れません。

ここで紹介していない本も、いくつか本屋で見繕ってみましたが、ゲームや会話AIを作る本などは、実践が重視されすぎていて基本が疎かになっている場合が多く、基礎を学びたい自分には適当ではないと感じました。

Pythonスタートブック

オススメ度:☆☆☆☆

Pythonスタートブック [増補改訂版]

Pythonスタートブック [増補改訂版]


プログラミングの経験がなければ、まずこれから始めると良いでしょう。ただ、Python 2をベースに書かれていたので、購入は見送りました。
最近、改訂版が出たので、そちらの購入をお勧めします。

実践力を身につける Pythonの教科書

オススメ度:☆☆☆☆☆

プログラマー向けの入門書として、非常によくまとまっています。基本から、少し発展的なことまでできる構成になっているので、次へとつなげることもできます。
説明も過不足なくなされており、初心者がつまずきやすい「なぜ」を解消できるので、プログラミングの入門書としてもオススメです。

詳細! Python 3 入門ノート

詳細! Python 3 入門ノート

詳細! Python 3 入門ノート

オススメ度:☆☆☆☆
コードやその結果を対比しやすいレイアウトが特徴。余計な図がなく淡々としています。各ライブラリについて、一通りの結果が示されており、割と細かいことまで明示されているので、レシピブックとしても有用です。

本書のコードを一通り書き写せば、基本的なことは身につきますが、淡々としているので、なかなかつらい作業です。Pythonでやりたいことが明確でないと、挫折するかも知れません。

行列を扱う Numpy や グラフ描画のための matplotlib にも軽く触れられており、科学技術計算を目標としている自分としては、役に立ちました。

確かな力が身につくPython「超」入門

オススメ度:☆☆☆

前半は非常に分かりやすく、丁寧に説明されています。図がイラストレーターの方によるものなので、プログラミングの本としては分かりやすいのが特徴です。むしろ、プログラミングの本の図はなぜ分かりづらいのが多いのか。
入門書の中では、オブジェクトやクラスの説明が比較的分かりやすかったです。ただ、後半の実践は「何ができるか」は示される者の、前半で散々説明された「なぜそうするのか」が皆無のため、自分が何をやっているのかが分かりづらいです。つまり、前半と後半のギャップが非常に大きいです。
後半は、Pythonでできることの例示と割り切って読むのもありでしょう。

特に、Webスクレイピングとして Amazon を扱うのはいただけないです。先ず、本書の通りにコードを書いて実行しても同じ結果が得られません。それは、本書の執筆時から、AmazonのHTMLの構成が変更されているため。また、本書を元に書き換えるにしても、 AmazonのHTMLの構成は、非常に解析しづらいです。そもそも、規約上は禁止されていますし。

学生のためのPython

オススメ度:☆☆☆

学生のためのPython

学生のためのPython

学生のためと銘打っているだけあって、他の入門書よりも簡単でした。説明も分かりやすいですが、少々かみ砕きすぎで、正確性に欠ける向きもあります。基本的なことは理解できますが、発展には弱いので、きちんと勉強したい人には物足りないかも知れません。
turtle での描画を軸にコードが例示されるので、結果が見た目でわかりやすいのも初学者向きかなと感じました。

簡単なフラクタルを描画するため、高階関数まで扱っているのが他の入門書にはない特徴で印象に残りました。

Pythonプログラミングのツボとコツがゼッタイにわかる本

オススメ度:☆

Pythonプログラミングのツボとコツがゼッタイにわかる本

Pythonプログラミングのツボとコツがゼッタイにわかる本

ブラックジャックのゲームプログラムを作成し、それをウェブで対戦できるようにしたり、また対戦AIなどを作ったりします。
とりあえず Python で動くプログラムをを作ってみたい!って人には向いていると思いますが、書籍の完成度としてレベルが低いので、個人的にはオススメしません。

著者代表は人工知能の専門家で、人工知能のパートはその方によるものですが、その他の部分は大学生が執筆してるようです。大学生が執筆したパートを著者代表がきちんと監修しているように思えません。文章は平易ではありますが、構成がよくありません。図などを見れば分かりますが、非常に理解しづらいです。

4. 非プログラマーPythonビギナー向き

コードは読めるし、書き方は分かるけど、何ができるか分からない人向けの本を紹介します。
自分のためにプログラムを書くのに適した本を紹介します。

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

オススメ度:☆☆☆☆

「何ができるか」の特化した本です。初心者向きではありますが、それなりにPCに詳しくないと躓く部分が多々あります。Pythonを体系的に学ぶには向いていません。
色々な演習も用意されており、O'Reilly Japan - 退屈なことはPythonにやらせよう に回答が用意されているので、基礎を学んでチャレンジすると、それなりの歯ごたえがあります。

Webスクレイピングだけでなく、CSVExcel、PDF、Wordの操作など、主に事務作業の自動化に特化しています。Word や PDF の処理などは、他の本ではあまり取り扱っていない話題なので、その辺に興味のある人にもオススメです。

速習 Python 3

オススメ度:☆☆☆☆

上編を読めば、Pythonの基礎は身につきますが、非プログラマーには説明が不十分な箇所もあります。また、プログラミング経験者には優しすぎるかもしれません。Python にどんな特長があるのかをさっと読むには適していますが、それなら公式ドキュメントを読むべきでしょう。

中編では、プログラミングの概念や哲学について書かれており、関数型、オブジェクト指向、クラスなどが理解できない自分は、とても役に立ちました。
初学者向きとしては、クラスなどを使う利点がわかりやすい事例で丁寧に説明されています。

世界標準MIT教科書 Python言語によるプログラミングイントロダクション第2版

オススメ度:☆☆☆

プログラムを学ぶ大学生のための教科書です。プログラミング経験のない人には少々難しいかもしれません。
実践向けのプログラミング例もありますが、例示の内容が限界利益率の計算などやや古典的です。レイアウトや配色も、少々読みづらいです。

5. プログラマー向けの入門書

プログラミングの経験のある人向け、あるいは初心者向きの入門書を読破した人向けの本を紹介します。中級者向けと思われる本も含めています。結局、オライリーになっちゃうよね。

入門 Python 3

オススメ度:☆☆☆☆☆

入門 Python 3

入門 Python 3

例示が小粋で面白く、それでいて細かな点も過不足無く説明されています。。
章ごとにステップアップしていき、また少しだけ先の章を先取りするなど、理解のしやすい構成になっています。
プログラマーには少々難しいですが、これから挑戦するのもありでしょう

Python 3 プログラミング徹底入門

オススメ度:☆☆☆☆

Python 3 プログラミング徹底入門

Python 3 プログラミング徹底入門

  • 作者: マーク・サマーフィールド,Mark Summerfield,長尾高弘
  • 出版社/メーカー: ピアソン桐原
  • 発売日: 2009/12/01
  • メディア: 単行本
  • 購入: 1人 クリック: 61回
  • この商品を含むブログ (21件) を見る

私は三冊目に手を出したのですが、「なせそうしなければならないか」を理解する上で役に立ちました。たとえばメソッドや関数の実行方法。なぜメソッドを「ドット」でつなげるのか。なぜ import文には、色々な書き方があるのか。そして、どのような書き方が推奨されるかも。

初学者向けの本でも「なぜそうしなければならないか」は書かれていますが、ツッコんだ説明まではなされていません。プログラムを本格的に学ぶ人に書かれているため、その点もきちんと書かれています。演習問題も適度に難しく作られているので、力がつきやすいです。

Python3の本ではありますが、2009年に出版されたため内容が古いのが残念です。原本の第二版が出版されていますが、日本語訳はないようです。プログラミングの知識がない人が英語で読むには難しい内容だと思います。

Effective PythonPythonプログラムを改良する59項目

オススメ度:☆☆☆☆☆

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

より読みやすいPtyhonのコードを書くための本。見た目は薄いですが、内容は濃いです。どのように書くべきに留まらず、なぜそう書かなければならないかがきちんと示されています。
基礎が固まってきたら、変なクセが付く前に読んでおくと独りよがりなコードを書かなくてすみそうです。
邦訳がやや残念なので、英語が読めるなら英語版の購入をお勧めします。

6. レシピ集

組み込み関数やモジュールをいちいち覚えられないので、リファレンが手元にあると便利です。
プログラマー向けの入門書がレシピブックとしても流用できるので、それらを持っているなら購入する必要はないかなぁと思います。

pythonライブラリ厳選レシピ

オススメ度:☆☆☆

Python ライブラリ厳選レシピ

Python ライブラリ厳選レシピ

一通りは載っていますが、多くのビギナー向けの本がレシピブック集としても機能するので、それを所有していると、かゆい所に手が届かないと感じました。著者が日本人なので、日本語の取り扱いについても書かれているのが利点でしょうか。

逆引きPython標準ライブラリ 目的別の基本レシピ180+!

オススメ度:☆☆☆☆

逆引きPython標準ライブラリ 目的別の基本レシピ180+! (impress top gear)

逆引きPython標準ライブラリ 目的別の基本レシピ180+! (impress top gear)

評判が良かったので購入しましたが、やはりビギナー向けの書籍を持っていると少々物足りなさを感じました。
A5版は手に取りやすいのでレシピブックとしては最適な大きさだと感じました。

7. 科学技術計算、データサイエンス、ディープラーニング

私が科学技術計算を目標としているので、そのために読んだり、購入したりした本を紹介します。

これ一冊あれば大丈夫!という本がありません。特に、グラフを描画するための Matplotlib がなかなかのじゃじゃ馬で、これに特化した専門書が欲しかったのですが、見つけられませんでした。最近、公式ドキュメント*1が改定され、読みやすくなったそうですが、初心者が読むにはハード。お陰で、関数やクラスの勉強にはなりましたが。

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

オススメ度:☆☆☆

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

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

どのような対象に向けて書かれているのかがよく分からない本でした。
Numpy, Scipy, Matplotlib, pandas などが紹介されているものの、簡単なメソッドしか紹介されていません。これは高速化も同様で、この本を読んだからといって科学技術計算ができるようになるわけでも、コードを高速化できるようになるわけでもありません。

私にとっては、Pythonが科学技術計算に向いていることを再確認するためのアリバイ作りのような本でした。科学技術計算をPythonで始めようと思っている人を後押しする本と考えると最適化も。

巻末にPythonの組み込み関数と標準ライブラリ、およびNumpyの関数リファレンスがまとめっているのは便利でした。

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

オススメ度:☆☆

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

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

pandas や Numpy およびそれをIPyhonで扱うための本です。評判は良いのですが、残念ながらPython2ベースのため、Python3と互換性のないコードで書かれている箇所が多々あります。

第二版が出版されましたが、邦訳版はまだ発売されていません。

Python for Data Analysis: Data Wrangling with Pandas, Numpy, and IPython

オススメ度:☆☆☆☆

Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython

Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython

というわけで、英語版を購入しました。レシピブックなので、英語が分からなくてもそんなに困らないと思います。

ただし、そのまま利用すると、日本語ファイルを取り扱う場合にエラーが起こる可能性があります。自分で解決策を見つける力が必要です。
日本語を扱わない手もありますが、それじゃあクールじゃないですよね。

Pythonによる科学技術計算 基礎編

オススメ度:☆☆☆☆☆

早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話 - Qiitaはてなブックマークのコメントで紹介されていたので読んでみたのですが、説明が丁寧で分かりやすかったです。

Matplotlib の記述法として、MATLAB準拠とオブジェクト指向の違いがきちんと説明されているのがすばらしいです。多くのデータサイエンスの本では、その点が全然書かれていないんですよねぇ。

Scipy Lecture Notes

オススメ度:☆☆☆☆☆

書籍ではありませんが、非常によくまとまっています。残念ながら日本語版は2015年で更新が止まっていますが、それでも十分に役に立ちます。SciPyを中心としたガイドではありますが、Matplotlib のレシピ集やクイックリファレンスが大いに役に立ちました。
その他に、SciPyによる画像処理などもまとまっており、一度目を通しておくのをオススメします。

IPythonデータサイエンスクックブック ―対話型コンピューティングと可視化のためのレシピ集

オススメ度:☆☆☆

IPythonデータサイエンスクックブック ―対話型コンピューティングと可視化のためのレシピ集

IPythonデータサイエンスクックブック ―対話型コンピューティングと可視化のためのレシピ集

データ処理のレシピが一通りまとまっており、何ができるのかをざっくりと見渡せますが、コードに関しても理論に関しても、紹介に留まっており、ツッコんだ説明がありません。たとえば、なぜそうするのか、関数を実行した際に何が返ってくるのは書かれていません。
入門書としては微妙だと感じました。統計処理を中心に学びたいのなら役に立つのかも。

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

評判が良いので購入してみましたが、まだ読めていません。

8. 私の勉強方法

最後に、私の勉強変遷をまとめておきます。

先ず「詳細! Python 3 入門ノート」を一通りやって、基本的なことを身につけました。次に、目に見える実践的なことをやりたかったので「退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング」を6章くらいまで演習をやりながら、進めました。
「退屈なことはPythonにやらせよう」の演習問題はプログラミング的な思考の勉強にはなりましたが、関数、メソッド、オブジェクト、クラスなどが今一つ把握できませでした。裏を返せば、それらを意識する必要があまりないので、初心者の演習としては丁度良かったかも知れません。

クラスを理解したかったので、内容は難しかったのですが「Python 3 プログラミング徹底入門」に挑戦してみました。その合間に「確かな力が身につくPython「超」入門」や「学生のためのPython」を読みつつ、図書館や本屋でPythonの本を漁っていました。
それと並行して、matplotlib や pandas などを利用してグラフの作図などを始めました。できる範囲でやりたいことを実現させた方がモチベーションを維持しやすいです。その際に「Pythonによる科学技術計算 基礎編」が役に立ちました。
これを読むために、Kindle Unlimited を再契約したのですが、「速習 Python 3」もKindle Unlimitedだったので試しに読んでみたら、中編がちょうど知りたかった、関数、メソッド、オブジェクト、クラスを取り扱う内容で、理解が深まりました。合わせて「Python 3 プログラミング徹底入門」もそれらの理解を助けてくれました。
さらに、Shadeのスクリプトも書いていました。こちらは、結果が見えやすく、実践につながるため、Pythonを勉強するモチベーションにもなりました。

現在は、「入門 Python 3」や「Effective PythonPythonプログラムを改良する59項目」などを読み進めています。