『Pythonエンジニア養成読本』読書会便り ~基礎やTipsから質疑応答の内容まで~

第3回PyData入門-Pythonでのデータ処理

はじめに

鈴木たかのりです。

前回に引き続きPythonエンジニア養成読本という書籍の読書会イベントについてレポートします。

第3回の読書会は7月23日(木)にアライドアーキテクツ株式会社の会議室で開催されました。

当日はだいたい以下のタイムテーブルで進めました。

  • 19:00-19:15 参加者の自己紹介
  • 19:15-21:00 ⁠第4章 PyData入門」
  • 21:00-22:00 ビアバッシュ(ビールとピザでの参加者懇親会)

今回も過去2回と同様に書籍の読みあわせはせず、ページ数の関係で削ったところや、出版後の追加情報を中心に解説を行いました。

写真1 Pythonエンジニア養成読本読書会03
写真1 Pythonエンジニア養成読本読書会03

自己紹介

いつものように参加者全員で自己紹介を行いました。全部で21名の方が参加してくださいました。

自己紹介の中では3回全て参加されている方から「集合知プログラミングのコードがだんだん読めるようになってきた」といううれしい進捗報告がありました。他にも「前回チーム開発でGitHubが紹介されていたので、アカウントを作ってまずはドットファイル(設定ファイル)をアップしてみた」という方もいました。今回が初参加の方もおり、会場を借りているアライドアーキテクツの新人の方や、4月に転職してPythonをはじめた方などが参加していました。

現在までの3回をフル参加している方も数名いて、この読書会に参加することでなにか面白いことや得るものがあるのかなと思い、開催者としては非常にうれしいです。

第4章 PyData入門

自己紹介のあとは、早速本題のPyData入門の解説に入りました。最初に著者の池内孝啓@iktakahiroから改めて自己紹介と今日の読書会でのポイントについて説明がありました。

写真2 池内孝啓(@iktakahiro)
写真2 池内孝啓(@iktakahiro)氏

自己紹介

ALBERTという会社で働いており、データ分析をしているそうです。データの前処理などの用途でPythonを使うようになったそうです。

また、コミュニティ活動としてはPyData.Tokyoのオーガナイザーをしているそうです。

昨年開催されたPythonのカンファレンスPyCon JP 2014のチュートリアルで、PyData入門の講師として行い、そこでいろんな出会いがありPyData.Tokyoを立ち上げたそうです。PyCon JP 2015は10月に開催予定です。つい先日トークの募集が締め切られ、機械学習、データ処理系のProposalが結構出ていたそうで[1]⁠、今年も楽しみにしているそうです。

最後に、今日の読書会ではPandasを中心に話し、他には紙面の都合で触れられなかった話をしたいとのことでした。また、出版後にPandasの新バージョン(0.16.2)がリリースされたので、アップデート情報についても触れるとのことです。

4-1 IPythonの使い方

この節ではIPythonの基本的な使い方について解説しています。

IPythonはPythonの対話モードをより強力にしたものです。IPythonでは以下の機能を備えています。

  • 補完:Tabを入力してモジュール名やオブジェクト名を補完できます
  • Magic Functions:%pwdと入力して現在のディレクトリ名を取得したり、%envで環境変数を取得できます
  • OSのコマンドライン環境との統合:!のあとにコマンドを入力するとOS上で実行してその結果を表示します
  • オブジェクトの確認:オブジェクト名の後ろに?をつけるとオブジェクトの型、長さ等の情報を表示します
  • Notebook:後述するIPython Notebookの機能を提供します

書籍を校正しているときにIPythonのバージョン3.0がリリースされましたが、差分の反映が間に合わないためバージョン2.4を対象としました。またインストール時に以下のようにしているのは、あとで出てくるIPython Notebookで使うためのモジュールもまとめてインストールするためです。

pipでIPythonをインストール
$ pip install ipython[notebook]==2.4.0

IPythonのNotebook以外の機能を利用した例は以下の様な感じです。

IPythonの利用例
In [1]: import r # ←ここで Tab を入力
random readline resource rfc822 rmagic runpy
re repr rexec rlcompleter robotparser
In [2]: %pwd
Out[2]: u'/home/pydata/pydata'
In [3]: !ls -l
total 8
drwxr-xr-x 25 pydata pydata 850 1 1 10:00 bin/
drwxr-xr-x 3 pydata pydata 102 1 1 10:00 include/
drwxr-xr-x 3 pydata pydata 102 1 1 10:00 lib/
-rw-r--r-- 1 pydata pydata 60 1 1 10:00 pip-selfcheck
In [4]: data = [1, 2, 3]

In [5]: data?
Type: list
String form: [1, 2, 3]
Length: 3
Docstring:
list() -> new empty list
list(iterable) -> new list initialized from iterable's items

ここで「コマンドラインでIPython使っている人はいるのか?」という質問がありました。会場ではコマンドラインで使っている人はあまりおらず、IPythonは以下の2パターンで使用している人が多いようでした。

  • IPython Notebookで使用している
  • IDE経由でIPythonを使用している

4-2 PyData用パッケージの基本

この節ではPyDataというカテゴリで語られる、Pythonでデータ解析を行うためのパッケージについて紹介しています。

著者の池内さんの会社ではデータ解析にはR言語を使っている人が多いそうです。データの加工、集積にはSQLを使っている人が多く、Pythonのユーザーは最近増えてきているそうです。

R言語を使用している理由としては、論文で出てきたアルゴリズムの実装やライブラリがR言語で公開されるのが早く、R言語そのものの情報も多いのだそうです。

そこでなぜPythonなのかというと、Pythonは汎用のプログラミング言語なので、一つ覚えればなんでもできるところが魅力だと語っていました。PyData関連のパッケージを使用すればデータ解析もできるし、Webアプリを作ったりも当然できます。データ解析した結果をWebで表示するデモアプリを作ったり、といったことも一つの言語で完結しているのが魅力だと語っていました。

また、Pythonはプログラミング言語として書きやすいし読みやすいことも魅力であると言っていました。

書籍の中では最近流行っている深層学習(ディープラーニング)についてPylearn2を紹介していましたが、最近リリースされたChainerが話題になっていると紹介されていました。ChainerはPylearn2とは違いPython的に書けるのがよいそうです。また、日本で開発されており、日本語のドキュメントが豊富なことも魅力です。

読書会では以下のPyData関連パッケージについて紹介しました。

NumPy

Pythonでは大量のデータをfor文で処理すると時間がかかります。しかし、NumPyを上手に使うと、行列計算などを高速に処理ができます。

NumPyの行列データはPyCharm(Python用のIDE)で可視化でき、見やすいです。PyCharmは最近PyData系のサポートが厚くなっているそうです。

余談ですが画像処理のOpenCVにはNumPyが必要です。これは、画像データを高速に処理するために、NumPyの行列データを利用しているためです。

SciPy

マーケティング領域のデータ分析では、対象がどの程度似ているかどうかを距離計算によって測ることがよくあります。距離計算は、⁠ユーザーがどの程度似ている」⁠アンケート結果がどの程度似ている」といったものを表します。距離の計算方法にはいろいろな種類がありますが、ユークリッド距離が有名です。距離計算はSciPyを使用すると簡単にできるそうです。

SciPyは距離計算以外にも非常に沢山の機能を提供しています。

SymPy

SymPyはPythonで記号計算を行うためのパッケージです。ここは趣味で紹介したそうです。実例はとくに思いつかないので、教えてほしいとのことでした(笑⁠⁠。

もし中学生のお子さんがいたら、数学の教科書に書いてある式を入力するとSymPyが因数分解や微積分を解いてくれるので試してみてください。

Pandas

Pandasはデータ解析を行うためのパッケージです。

CSV、Excelなどのデータを読み込んでDataFrameという行列のデータを生成します。行と列にそれぞれ名前が付いていることが特徴です。R言語にもデータフレームがあり、Pandasを作った人もR言語を意識しているのではないかとのことでした。

R言語をすでに使っている人は、Pandas使ってみるとよいかもとのことです。

質疑応答

質疑応答では以下の様な議論がありました。

  • Q:PandasのDataFrameをSelialize(オブジェクトをファイルなどに書き出し可能な形式に変換すること)してサーバークライアント間(どちらもPython)で通信している。パフォーマンスが出るのはなにか?
    • A:両方Pythonだったらpickleでいいのでは? DataFrameにはto_msgpack()メソッドがあるので、パフォーマンスがよいかも知れない
  • Q:PandasをVersion 0.16にしたらwarningが出るようになった
    • A:警告表示を抑制するオプションを使うでとりあえずは大丈夫だと思う
  • Q:以前Python 2とPandasで書いたスクリプトをPython 3で使いたい。気をつけるところはあるか?
    • A:Pandasとしては問題ない。日本語周りは気をつけた方がいい。
  • Q:Pythonでfor文を使ってはいけないのか。mapとかはなかなか難しい。
    • A:大量のデータを扱う場合はfor文だと遅いのでNumPyを使った計算ができないか検討しましょう。通常のfor文よりも内包表記のほうが僅かに速いです。またPythonの組み込み関数mapfilterは勉強しましょう。

余談としてデータ分析の高速化についてのPyData.Tokyoでのレポートが紹介されていました。

写真3 参加者との質疑応答の様子
写真3 参加者との質疑応答の様子

4-3 はじめてのIPython Notebook

IPython NotebookはWebブラウザから対話的にPythonプログラミングなどを行う環境です。IPythonの最新バージョンは3.2.1となっています。書籍で紹介していたバージョン2.4と大きく変わったところは、IPython Notebookの名前がJupyterになったことです。IPython Notebookは今後はJupyterとして、PythonだけでなくJulia、R言語などさまざまな言語に対応したNotebook機能を提供していきます。

最近ではIPython Notebookを使用してプレゼンを行う人もおり、この日も追加資料として以下のNotebookを利用して解説が行われました。下記のリンクをクリックするとIPython Notebookの中身が表示されますが、これはGitHubがNotebookファイルの表示に対応するようになったためですGitHub + Jupyter Notebooks = <3⁠。

上記のNotebookを使用して、2つのデータを結合する例を解説しました。for文をまわしてif文で分岐なども可能ですが、Pandasを利用するとmerge()メソッドでSQLのような感じで2つのデータを結合できます。

また、Pandas 0.16.2でpipe()メソッドが追加になりました。データフレームに対して.pipe(f)で処理を行うフィルターのようなもの関数を指定できます。またpipe()は複数重ねることも可能なため、サンプルコードでは食料品のデータに対して割引処理と消費税計算を行っています。

IPython Notebookでは棒グラフなどのグラフ描画ができますが、見た目的にはデフォルト形式よりもggplot形式がお勧めとのことです。他にも以下のようなグラフ描画用のライブラリが紹介されていました。ただし、プレゼン資料でなければグラフの見た目について頑張る必要はないという話もしていました。

他の人が作成したNotebookファイルが閲覧できるnbviewerというサイトがあります。このサイトはグラフ描画などの参考になります。

IPython Notebookを使用するには普通にpip install ipython[notebook]でもよいのですが、Wakari.ioというサイトではクラウド上でIPython Notebookが使用できるのでお試しで使うには便利です。また、Anacondaというデータ分析用のパッケージのセットがありますが、この中にもIPython Notebookが含まれています。

RodeoというWebブラウザ上で動作するPythonのIDEがあります。これはIPython Notebookと似ていますが、よりリッチな操作ができるそうです。データフレームの値を見て、対話形式で絞り込みなどが行えるそうです。

まとめとして、IPython Notebookはあまり長いコードを書くのには向いていないので、サンプルのような短めのコードと結果を参照するのに使用することをおすすめするとのことです。もしかしたらRodeoは長いコードを書く用途にも向いているかも知れないとのことでした。このあたりは実際に使ってみた人の感想を聞いてみたいところです。

4-4 [実践編]オープンデータの利用と可視化

この節ではオープンデータを利用してIPython Notebookで可視化する例を紹介しています。ここで裏話として書籍の中で利用するオープンデータを探すのが大変だったという話がありました。データ取得が面倒だったり、データ形式が利用しにくいものが多いそうです。その点、書籍で利用した横浜のデータはよこはまオープンデータカタログ(試行版)でライセンス付きで公開されており、CSVファイルなどを直接ダウンロードできます。

ここで全体を通して以下のような質疑応答がありました。

  • Q:横浜のグラフを、地図データで可視化しようと思ったが挫折した。地図データの可視化はbasemapがお勧めか?
    • A:Pythonではないが、Tableau(BIツール)で地図上にマッピングとかをしているが、日本の地図はそこまで細かくない。日本だと県ごと白地図しかない。今だとJAXAの衛星データ全球高精度デジタル3D地図(ALOS World 3D)とかにマッピングすると面白そう。
  • Q:IPython Notebookをサーバーに入れて、みんなが使えるようにできないか?
    • A:自分が以前やったのは、複数のサーバーをポートを分けて実行した。
  • Q:Notebook上でデモするときに、パラメーターをユーザーに入力させることは可能か?
    • A:IPython Notebookでシークバーを表示して値を変更するといった使い方が可能。
  • Q:WindowsでAnacondaを使っている。IPython Notebookの終了方法がわからない。
    • A:基本的にはコマンドをCtrl-Cで終了させる。
  • Q:R言語やJavaScriptなど、言語間での連携はできないか?
    • A:連携する方法はないので、CSVなどのファイル渡しがよい。

余談ですが、ALBERTのページに「統計学とデータ分析」について書いているので、これから勉強しようとする人は読むとよいという紹介がありました。

ビアバッシュ(懇親会)

読書会の終了後は毎回恒例の懇親会(ビアバッシュ)です。ビールとピザを片手に会話を楽しみ、その後ライトニングトークを行いました。

写真4 ビアバッシュの様子
写真4 ビアバッシュの様子

ライトニングトーク一つ目は前回に続いて阿久津@akucchan_worldさんから業務のためのPython勉強会#3 - connpassの紹介がありました。次回は8月10日(月)に開催予定とのことです。

写真5 阿久津(@akucchan_world)さんの発表
写真5 阿久津(@akucchan_world)さんの発表

著者の一人である嶋田健志@TakesxiSximadaさんからは自身が出したPyCon JP 2015 の Proposalについて紹介がありました。Twitter/Facebook等でシェアをよろしくお願いしますとのことです。なお、チュートリアルのほうは「Pythonエンジニア養成読本」の内容がベースとなっています。

写真6 嶋田健志(@TakesxiSximada)さんの発表
写真6 嶋田健志(@TakesxiSximada)さんの発表

同じく著者の一人の関根裕紀@checkpointさんからは2015年10月に開催されるPyCon JP 2015のお知らせや、現在トーク一覧が参照できるので、ぜひTwitter/Facebookで拡散してほしいという話がありました。

ちなみに関根さんが担当した章は、次回読書会でやる「入門Webアプリケーション開発」です。

写真7 関根裕紀(@checkpoint)さんの発表
写真7 関根裕紀(@checkpoint)さんの発表

最後に私からも宣伝LTとしてPyCon JPのプロポーザルとPython入門について話すイベントについて告知させてもらいました。

まとめ

3回目の読書会もビアバッシュでのゆるめのライトニングトークが盛り上がったのでよかったです。ぜひ他の参加者のみなさんも発表の練習だと思ってなにかしゃべってもらえればと思います。

次回読書会は8月27日(木)に開催します。内容は「第5章 入門Webアプリケーション開発」です。本を読んで試して疑問がある方、もっとここが知りたい!! という所がある方など、ぜひ参加してください。参加申し込みは下記のURLからできます。

では、次回もよろしくお願いします。

おすすめ記事

記事・ニュース一覧