概要
会社でオライリーの『Pythonではじめるデータ分析』を買ってもらった。
社内で布教できるよう、構築手順を記録しときます。
追記
社内布教用なのにWindows向け手順がないと言われたので補足。WindowsユーザーはCygwin使ってください。
こちらが参考になります:Cygwin上でpipとsetuptoolsをインストールする方法
pipが使えるようになったら、virtualenv入れ方はこちら
環境構築
ライブラリの導入
pipやvirtualenvの説明は省きます。mkvirtualenvとpipコマンドが使えるようになっておいてね。あと筆者はpython3に慣れてこうと思うので、python3使います。
オライリーにはcanopy expressを入れろと書いてあるけどライブラリは自力で入れてこうと思う。
$ mkvirtualenv --no-site-package --python /usr/local/bin/python3 analytics
(analytics)$ pip install numpy
(analytics)$ pip install scipy
(analytics)$ pip install matplotlib
(analytics)$ pip install ipython
(analytics)$ pip install ipython[notebook]
(analytics)$ ipython
analyticsという環境に切り離しました。今後はこの環境で作業します。ipython他、分析に使われるライブラリをインストール。
インストールしたライブラリを確認
$ pip freeze
appnope==0.1.0
cycler==0.9.0
decorator==4.0.6
gnureadline==6.3.3
ipykernel==4.2.2
ipython==4.0.1
ipython-genutils==0.1.0
Jinja2==2.8
jsonschema==2.5.1
jupyter-client==4.1.1
jupyter-core==4.0.6
MarkupSafe==0.23
matplotlib==1.5.0
mistune==0.7.1
nbconvert==4.1.0
nbformat==4.0.1
notebook==4.0.6
numpy==1.10.4
path.py==8.1.2
pexpect==4.0.1
pickleshare==0.5
ptyprocess==0.5
Pygments==2.0.2
pyparsing==2.0.7
python-dateutil==2.4.2
pytz==2015.7
pyzmq==15.1.0
scipy==0.16.1
simplegeneric==0.8.1
six==1.10.0
terminado==0.6
tornado==4.3
traitlets==4.0.0
wheel==0.24.0
ipython動くか確認。
Python 3.5.1 (default, Dec 7 2015, 21:59:08)
Type "copyright", "credits" or "license" for more information.
IPython 4.0.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]:
Ctrl + d で抜けて、続いてpandasのインストール
$ pip install pandas
動作確認
動作確認してみる。グラフ描画が使えるように--pylabオプションで起動
$ ipython --pylab
...
RuntimeError: Python is not installed as a framework. The Mac OS X backend will
なんかエラー出る。「Python is not installed as a framework.」ってなんだ。ググった結果ここを参考にして解決。
~/.matplotlib配下にmatplotlibrcファイルを作成。下記を記入。
backend : TkAgg
改めて動作確認。
ipython --pylab
In [1]: import pandas # pandasがひける
In [2]: plot(arange(10)) # matplotlibが使えること
直線のグラフが表示されればOK
IPython notebookを使う
ipython notebook
ブラウザが立ち上がってくる。
右上のNewからNotebook作成。コマンドが打てそうなページになるので、まずは、
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
を打って、上の再生ボタンで実行する。これでグラフを描画できるようにして、続いて
plt.plot(np.random.randn(1000))
で再生ボタンを押す。正規分布に従う1000個の乱数を生成してグラフに描画する。こんな感じでコマンドラインを記録していけるのがipython notebook。
これはすごい!
データ分析をやってみる
事前準備
適当な作業ディレクトリに移動し
git clone https://github.com/pydata/pydata-book.git
これで統計の練習に使えるサンプルデータが持って来れる。
cd pydata-book/ch02
この中のusagov_bitly_data2012-03-16-1331923249.txtをPythonで分析してみよう!ちなみにこれ、短縮URL生成のログっぽいです。
分析
書こうと思ったけど、こっから先は教科書丸パクリになるので割愛!
行プロファイラの導入
3章ででてくる便利ツール。環境構築の一部なので記録しておきます。
分析では、ある程度高度な計算を実行するとなると行単位で関数の挙動を見て行きたくなるらしい。たとえば1回10msの計算を100万回繰り返すのを、少し改善して1回5msにできれば、100万回でかなり時間が短縮できる。こういった改善がたぶん大規模な行列を使った科学技術計算になると余計に効いてくるんだと思う。
で、どの処理にどんだけ時間かかってるか、関数の行ごとに評価できる、その便利ツールが行プロファイラらしい。
導入方法
pip install line_profiler
ipython profile create
vi ~/.ipython/extensions/line_profiler_ext.py
import line_profiler
def load_ipython_extension(ip):
ip.define_magic('lprun', line_profiler.magic_lprun)
vi ~/.ipython/profile_default/ipython_config.py
# ------------------------------------------------------------------------------
# TerminalIPythonApp configuration
# ------------------------------------------------------------------------------
c.TerminalIPythonApp.extensions = [
'line_profiler_ext',
]
# ------------------------------------------------------------------------------
# TerminalIPythonApp configuration
# ------------------------------------------------------------------------------
c.TerminalIPythonApp.extensions = [
'line_profiler_ext',
]
関数を評価してみる
In [1]: from numpy.random import randn
In [2]: def add_and_sum(x, y):
...: added = x + y
...: summed = added.sum(axis=1)
...: return summed
...:
In [5]: x = randn(3000, 3000)
In [6]: y = randn(3000, 3000)
上で定義した add_and_sumを実行する。引数がxとyでどれほど時間がかかるかを評価する。
マジックコマンド%lprunで使える。
In [16]: %lprun -f add_and_sum add_and_sum(x, y)
Timer unit: 1e-06 s
Total time: 0.036058 s
File: <ipython-input-2-19f64f63ba0a>
Function: add_and_sum at line 1
Line # Hits Time Per Hit % Time Line Contents
==============================================================
1 def add_and_sum(x, y):
2 1 28247 28247.0 78.3 added = x + y
3 1 7809 7809.0 21.7 summed = added.sum(axis=1)
4 1 2 2.0 0.0 return summed