ponkiti's blog

主に自分用、イベント参加メモや備忘録として利用

PyCon JP 2014 チュートリアルC(PyData入門)に参加しました #pyconjp

PyCon JP 2014の前日に行われたチュートリアルに参加してきました。

Tutorials | PyCon JP 2014 in TOKYO

私が参加したのは、ALBERT池内氏によるチュートリアルCのPyData入門。Python3系とPandasをはじめとしたデータ分析や科学計算に特化したライブラリを使い、実際にデータ分析のためのプログラムを実装するということで参加を決めました。

データを分析するためのツールや言語、サービスなどの紹介はよくありますが、実際に某かの言語を用いて実装するという講座はあまり見かけることがないような気がします(統計学をベースとした講座でRの使い方を学ぶ、というのはありますが)。

今回導入したPythonのバージョンとライブラリ

  • Python3.4.1
  • ライブラリ
    • NumPy
    • Scipy
    • Pandas
    • scikit-learn
    • matplotlib
    • IPython

私が持っているPython関連の書籍ではそのほとんどがPython 2系のため、今回初めて、この講習のためにPython 3系を利用することになりました。このような機会でないと3系に移行しなかったかもしれません。

事前に共有されたドキュメントにて、pyvenvの環境を準備するようにと記載がありましたが、pyvenvを知りませんでした。pyvenvは3.3から採用されたコマンドなんですね。

事前に調べた2系と3系の違い

まだPythonを知ってから間もなく、業務でがっつり書いているわけでもないため、2系と3系の違いを簡単に調べてみました。そもそもPython3系は2008年12月に公開されていたのですね。公開からかなりの年数が経っていますが・・・。

  • Print文の関数化
  • Unicodeに統一
    • Unicode文字列と8ビット文字列からテキスト(str)型とバイナリデータ(bytes)型に変更
    • デフォルトのソースコードエンコーディングはUTF8
    • テキストとバイナリデータを混在した場合にエラーとして処理
  • リスト処理の変更
  • 整数をint型に統一

【レビュー】登場! Python 3.0 - 2系との違いを比較 (1) print命令からprint関数へ変更 | マイナビニュース 3系の変更点覚書 - さりんじゃーのプログラミング日記

今回紹介された「statistics」モジュール

9.7. statistics — Mathematical statistics functions — Python 3.4.1 documentation

Python3.4から標準搭載された統計用モジュール。Rの関数summary()のような機能を持っていて、そのデータに対する平均や中央値、最頻値などを一度に出力してくれる。最小値や最大値は出力しないようです。

  • mean()
  • median()
  • median_low()
  • median_high()
  • median_grouped()
  • mode()

今回学んだ分析手法

  • 階層クラスター分析
    • チュートリアル参加前に事前のアンケートに答えていたのですが、そのアンケートの内容をWard法を用いて分析し、SciPyとmatplotlibで可視化したものを紹介。
    • 主なクラスターとしては、エンジニア寄りの層・エンジニアでありアナリストでもある層・分析はしていないけれどこれから分析を行う意欲のある層の3つに分かれたようです。
  • アソシエーション分析

分析を行う際、各分析を実現するのにどのアルゴリズムを実装しているのかを確認しておくこと。選択したアルゴリズムによってその精度や実行速度が異なるため、例えば精度が低くても早く結果を出したい場合など、その用途によってアルゴリズムは選択するべきだということです。

ライブラリの紹介

事前にインストール済みの各ライブラリについての紹介がありました。 それぞれNumPy(なんぱい)、Scipy(さいぱい)、Pandas(ぱんだす)、scikit-learn(さいきっとらーん)と呼ぶらしいです。今まで読み方が分からず、自信なげに紹介していたので分かってホッしました。

  • pandas
    • Rのデータフレームのような機能があり、件数の多いデータのうち、最初(や最後)の指定した件数のデータを確認することが可能。

      • print(data_frame.head(2))
      • print(data_frame.tail(5))
    • クロス集計の際、データが多いと横に広がってメモリの消費が激しいが、pandas.merge(インナージョイン)を利用するとよい。

    • オンメモリでマージする時に便利。SQL感覚で書ける。

おさえておくべきモジュール

itertoolsとcollectionsをimportしておくとよい。

  • itertools
    • accumulate():累積和
    • permutations():順列
    • combinations():組み合わせ
  • collections
    • defaultdict:組込みのdict(辞書)のサブクラス
    • Counter:ワードカウント用のサブクラス

データ分析にはPython

 データ分析時のクレンジングや整合性の確認に手間がかかること、データ抽出はSQL、分析はRなどとツールが散らばること、それらをツール化しても同じ分析を行なうとは限らず汎用性が低いこと。そのため、前処理・分析・可視化を通して行うことができ、データ処理や分析系ライブラリが豊富であるPythonが、データ分析には最も適しているのではないか、とのことです。

所感

データ分析のツールとして何を使うべきか

統計を教えている方に「データを分析するにはどのツールを使用すればいいか」と聞いた時にExcelやR、SPSSと挙げられました。他にもPerlPythonsedawkなど。そしてアドテク分野の分析者はGoogle Analyticsを利用しているのではないでしょうか。

元々、弊社でデータ分析するにはどの言語を用いるのがよいのか悩んでいたのですが、上記に挙げていたように様々なため、まだ「これを使う」というような決定版はありません。

社内ではPerlをメイン言語としておりPerlに強いエンジニアがいること、CPANと呼ばれるモジュールが豊富なこともあり、社内のKPIの集計プログラムはPerlで実装しています。

しかし、データを簡単に操作する、可視化するなどのデータ分析に特化した機能はPerlにはあまりありません(Perlに詳しい方は異論があると思いますが、初学者には取っ付きにくいです)。また、Perlはその言語特性からプログラムの記述方法が豊富であり、そのためにプログラムの書き方が統一されておらずコードの保守が大変です。

その点、Pythonは前述したとおりデータ分析に特化したライブラリが豊富で、Perlと似たような記述方法ではありますが、記述方法はほぼ一通りと決まっています。一部、2系と3系で互換性がないことも問題視されてはいますが、個人でデータ分析を行なうのであれば問題ないと判断しています。

個人的な好みとしてのPython

Perlの思想が言語のように書き方は様々なのに比べて、Pythonは数学的であり高い一貫性を持っています。私はこの数学的なシンプルさと言う点でPythonの設定思想に親しみを覚えています。

入社から8ヶ月が経過し、各ツールや言語を理解するうちに「実現させたい機能毎に、使用する言語の背景を理解し、柔軟に言語を選択していくこと」が重要だと考えるようになりました。Pythonをその選択できる言語のうちの一つにするべく、今後利用していくつもりです。

Python

Python の設計者は、高度な数学の教育を受けた人物です。Python が高い一貫性を持った言語になったのは、そのおかげでしょう。構文もツールセットも驚くほど、均質になっています。そして、ごくわずかな基本概念から言語のほとんどの部分が作られている、という点も実に「数学的」と言えます。

Perl

Perl の設計者は言語学に通じた人です。そのことが Perl という言語の作りに影響しています。Perl では、同じことをするにも何通りもの方法が考えられます。まるで自然言語のように、言語の構成要素の持 つ意味が文脈によって、非常にきめ細かく変化します。Perlのこうした特徴は「There's more than one way to do it(それをするための方法は1つではない)」というよく知られた標語にも現れています。Perl言語、そして Perl のユーザコミュニティには、コードを書く際の「表現の自由」を重んじるという伝統があります。書く人によってコードの書き方は大きく異なるのです。Perl ユーザの間では、個性的で手の込んだコードを書くことが 称賛の対象になる、ということがよくあります。

Mark Lutz著、夏目大訳『初めてのPython 第3版』p16、O'Reilly

初めてのPython 第3版