カエデ自動機械

ちょっとしたものづくりや電子工作のメモなど。技術開発とは今は呼べないかな。

Python実践データ分析100本ノック

ブログ書くのも久々です。
夏は別の技術分野(現段階で発信できることは無い)に、それ以降はちょっと技術的活動はプライベートではお休みしていました。

その間はパワポエンジニアなりに仕事で使う技術について調べものをしたりしていたのですが、どうもそれ以上には気分が乗らなかった。
一度途切れてしまうとなんとなく腰が重くなるもので、何かを続けることが難しく、一方で多分、続けるのがとにかく大事なんでしょうね。

前置きが長くなりましたが、「Python実践データ分析100本ノック」本を読んだので記事執筆のリハビリがてら書きます。
実は「書評」とか「学んだことをまとめる」というのは苦手なので、文字数の割に情報量は薄いかも。


books.rakuten.co.jp

本に出会ったきっかけ

今までこんなこと書いてたっけ・・・?

まあ詳しいことは覚えていないのですが、AtCoderとかKaggleみたいなプログラミングコンテストみたいのに(1年近く前ですが)興味が出たことがあって、その時に以下を始め何ヶ所かのwebサイトで紹介されていたのがきっかけでした。

note.com

結局、僕が興味を持つ「技術」とやらが、「豆電球が光ったりモーターが回ったりするのをウットリしながら眺める」という域を出ないせいか、コンテストには参加しなかったのですが、データ分析自体は基礎学力として学んでも良いかも、と、この本だけは購入してありました。

仕事でも使ってるExcelをもう少し真剣に学んだら良いんでないのと思わなくもありませんでしたが、Pythonはロボットを動かす時に使うから慣れれば慣れるほど良いことがありそうだし、データ分析してるっぽくてExcelよりも格好いい気がします。

結局冒頭に書いたような充電期間(?)があったため積ん読状態が続いたのですが、およそ1年越し、昨晩秋にこの本を手に取るに至ったのでした。

本の内容について

総評
  • 良い本。知識はないけどとにかく何か手を付けないことには始まらない、という人に良いのでは。
  • データの前処理、整形に力を入れているため、ここをマスターするだけでも役に立つ気がする(自分は実世界で使ったことがないのでわからない)
  • コードは写経すべきだとは思うけど、たまに正誤表にも載ってないミスがあったり、段々省略がされていくので注意。完全に盲目的に写経しているとエラーを吐くかも
  • 個別の分析手法の仕組みについては解説があまりないので、それだけは別に補う必要アリ。
本の構成など

この本は全4部・10章構成になっていて、それぞれに10節ずつコンテンツが入っています。それぞれでデータ分析に必要な操作がまとめられており、合計で100本というわけらしいです。

100という数字に合わせるために若干重複があったりもしますが、別に目くじらを立てるような話ではないでしょう。

例題として用いるための、分析対象となるデータや画像についてはサポートサイトでダウンロードが可能です。
誤植に関する正誤表も乗っているので、コードを写経して動かすためにはそちらのチェックも欠かせません。
www.shuwasystem.co.jp

関係ないですが、野球の「ノック」という単語、辞書で調べると英語では「fungo」というらしいんですが、本当かな・・・?

データの前処理

最初の2章は「データの前処理」にあてられています。
以前Courseraで機械学習の講座を受けたときにもデータの前処理というのは非常に重要であるとNg先生が言っていたような気がしますし、これは良いことなのでしょう。

仕事はパワポエンジニアなので、なんなら前処理までしか使わないまであります(後はそれっぽくグラフにしてパワポに貼り付けるだけなので)

通販サイトの売上データ(csvファイル)などを例に、日付の表記形式の統一、欠損データの補完、複数のCSVファイルの結合などを学ぶことができます。

データの全体像の把握

第3章はデータの全体像を把握する、ということで、スポーツジムの会員データを例にとり、会員の登録期間、男女別の人数等について、平均を出したり分布を出したりと、基本的な統計データを取り扱います。

そういう意味では、3章までが「機械学習とか、それより前のビッグデータ解析とかが流行りだす前の一般人レベルの、あるいは高校生くらいの知識で一般に想像されるレベルの『データ分析』をスクリプトで自動化する」ことを学ぶフェーズだと捉えることも出来るかと思います。

機械学習の適用

第4章以降は流行りの機械学習が出てきます。

データ分析自体は非常に歴史も長く、使用頻度も高かった行為ですから、機械学習がブームになる前から使われてた手法がもっと色々あるのでは?と思わなくもないですが、お恥ずかしながら殆ど知識が無いためこの辺はわかりません。

「DNNではない」機械学習は、ブームになる遥か前から存在していた手法みたいですし、僕が知らなかっただけか、あるいは当時は機械学習と呼ばれていなかったのかも知れません。

K-means法(教師なし学習の一種らしい)を用いた顧客のクラスタリングとその結果の分析、可視化、線形回帰(教師あり学習の一種らしい)による顧客の退会予測、変数別の寄与度分析などが学べます。

ここでも作業の大半はアルゴリズムに放り込むためのデータの整形が占めています。クラスタリングや予測のアルゴリズム自体を開発するというのは結構な上級者向け行為な気がしますし、これは実世界におけるデータ分析とリンクしているのかも知れませんね。

最適化問題

第6章以降は最適化問題を取り扱います。

総輸送コスト(輸送単価✕輸送量)を目的関数にとり、材料供給能力、生産能力等を制約条件としながら輸送ネットワークを最適化するような問題を取り扱います。

個人的には最適化問題自体よりも、ノードとエッジからなるグラフの可視化の部分が印象に残りました。
こういうのを出力し始めると、いかにも「データ分析をしている」感があって面白いと思うのです。

第8章は上記とは若干性質が異なり、SNSの相互のつながりを可視化し、一定確率で発生する「口コミ」による情報伝播予測やそれに伴う(第3章以降でずっと扱っていた)ジムの会員数の遷移予測などを学びます。

第8章はかなり面白い内容ではあるのですが、SNSの繋がり情報は入手可能なのかとか、口コミ発生を一定確率で発生する事象として取り扱うことが妥当なのかなど、若干疑問は残りました(本に載っているくらいだから実績ある手法なのかも知れませんが)

画像処理

第9章は画像処理で、OpenCVを用いて静止画、動画から人の往来量の分析を行ったりします。

ここはデータ分析よりは電子工作(ラズパイのチュートリアルとか)で学んだりした人の方が多いかも知れません。

印象に残ったのはむしろ、corei5、GTX1070、メモリ16GBを積んだデスクトップPCの割に処理が遅いな?ということでした。
多分GPUは使えていなかったのでしょうが・・・

自然言語処理

アンケート結果(生のコメント)のCSV自然言語処理によって分析する手法を学びます。

形態素分析による各回答文の品詞分解、不要な単語・品詞の除去、使用単語と総合評価(コメントと数値評価の2種類の回答をするタイプのアンケートだった)の関係性、回答毎のコサイン類似度による分析などを行います。

自然言語処理は本当に全くの初めてだったので全てが新鮮で面白かったのですが、生のコメントから「重要でないものを重要でないとして取り除く」という行為であったりとか、その他諸々、自然言語処理以前に言語そのものに対する相当に深い理解が無いと的はずれな分析にしかならないのでは? という疑問が残りました。

総評

冒頭にも書きましたが、僕が疑問に思った部分は手法そのものや関連分野に対する話であって、本に書かれていた内容自体は概ね理解できました。

完走してから1ヶ月くらい経って既に内容は全て忘れてしまっているのですが、これは僕が特別に覚えが悪いのか、人類は大抵こんなものなのかはちょっとわかりません。。。

ただ、CSVデータが与えられた時に、「このような分析手法を採り得る」という知識だけでも身に付いたと思うので、それは良かったかなと思います。
本当に素の状態でCSVデータを渡されたら本当に何をしていいかわからず、とりあえずExcelで開いてA列とB列で折れ線グラフを出すくらいしかできませんので。


コードは全てJupyter Notebookで書くことを想定されているため、基本的にはある節で使用するスクリプトは、前節のスクリプトに追加で書き足すことを想定して書かれています。
従って、個別に.pyファイルで作成したい場合は、若干の脳内補完が必要です。自分は以下のリンクのように後者の手法で行いました。jupyter notebookだと後で見た時読みにくいイメージがあるので・・・まあ後で見返した経験などありませんが。

github.com

正誤表に載っていない誤記(?)について

前述の通り、本書で推奨する環境で実行していないからかもしれませんが。

p113

該当ページ中断のコードのとおりに打ち込むと、7行目(改行の都合上見た目は8行目)でexit_dateを「年月」の形式に変換する際、以下のようなエラーが出ます(行数やディレクトリ名は環境依存)

Traceback (most recent call last):
File "42_extract_leaving_customer.py", line 42, in
exit_customer["年月"] = exit_customer["exit_date"].dt.strftime("%Y%m")
File "/home/username/.pyenv/versions/100fungoes/lib/python3.6/site-packages/pandas/core/generic.py", line 5135, in __getattr__
return object.__getattribute__(self, name)
File "/home/username/.pyenv/versions/100fungoes/lib/python3.6/site-packages/pandas/core/accessor.py", line 187, in __get__
accessor_obj = self._accessor(obj)
File "/home/username/.pyenv/versions/100fungoes/lib/python3.6/site-packages/pandas/core/indexes/accessors.py", line 480, in __new__
raise AttributeError("Can only use .dt accessor with datetimelike values")
AttributeError: Can only use .dt accessor with datetimelike values

エラーの内容は、.dtに関する処理はdatetimelike values(日付形式のデータ)にしか適用できないよ、ということだと思います。
よく見ると4行目でend_dateに対して行われている、日付データへの変換処理がexit_dateには行われていない気がします。

その部分を7行目より前で補完してやれば動くようになります。

exit_customer["exit_date"] = pd.to_datetime(exit_customer["exit_date"])  # 追加する行
exit_customer["年月"] = exit_customer["exit_date"].dt.strftime("%Y%m") # エラーを吐いていた行(p113中断の7行目(8行目))