Pythonでデータ分析の環境整えた記録

## 概要

会社でオライリーの『Pythonではじめるデータ分析』を買ってもらった。

社内で布教できるよう、構築手順を記録しときます。

### 追記

社内布教用なのにWindows向け手順がないと言われたので補足。WindowsユーザーはCygwin使ってください。
こちらが参考になります：[Cygwin上でpipとsetuptoolsをインストールする方法](http://chiranoura.nobody.jp/articles/2014-05-27_01_how_to_install_pip_and_setuptools/)
pipが使えるようになったら、[virtualenv入れ方はこちら](http://terurou.hateblo.jp/entry/20110121/1295538727)

## 環境構築

### ライブラリの導入

pipやvirtualenvの説明は省きます。mkvirtualenvとpipコマンドが使えるようになっておいてね。あと筆者はpython3に慣れてこうと思うので、python3使います。
オライリーにはcanopy expressを入れろと書いてあるけどライブラリは自力で入れてこうと思う。

```bash
$ 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他、分析に使われるライブラリをインストール。
インストールしたライブラリを確認

```bash
$ 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動くか確認。

```bash
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のインストール

```bash
$ pip install pandas
```

### 動作確認

動作確認してみる。グラフ描画が使えるように--pylabオプションで起動

```bash
$ ipython --pylab
...
RuntimeError: Python is not installed as a framework. The Mac OS X backend will

```

なんかエラー出る。「Python is not installed as a framework.」ってなんだ。ググった結果[ここ](http://qiita.com/katryo/items/918667f28301fdec89ba)を参考にして解決。
~/.matplotlib配下にmatplotlibrcファイルを作成。下記を記入。

```text:~/.matplotlib/matplotlibrc
backend : TkAgg
```

改めて動作確認。

```py
ipython --pylab
In [1]: import pandas  # pandasがひける
In [2]: plot(arange(10))  # matplotlibが使えること 
```
直線のグラフが表示されればOK

### IPython notebookを使う

```bash
ipython notebook
```

ブラウザが立ち上がってくる。
右上のNewからNotebook作成。コマンドが打てそうなページになるので、まずは、

```py
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
```

を打って、上の再生ボタンで実行する。これでグラフを描画できるようにして、続いて

```py
plt.plot(np.random.randn(1000))
```

で再生ボタンを押す。正規分布に従う1000個の乱数を生成してグラフに描画する。こんな感じでコマンドラインを記録していけるのがipython notebook。
これはすごい！

![スクリーンショット 2016-02-11 20.47.21.png](https://qiita-image-store.s3.amazonaws.com/0/71836/51159941-3d8c-44b2-a74a-952fc0ff9084.png)



## データ分析をやってみる

### 事前準備

適当な作業ディレクトリに移動し

```bash
git clone https://github.com/pydata/pydata-book.git
```
これで統計の練習に使えるサンプルデータが持って来れる。

```bash
cd pydata-book/ch02
```
この中のusagov_bitly_data2012-03-16-1331923249.txtをPythonで分析してみよう！ちなみにこれ、短縮URL生成のログっぽいです。

### 分析

書こうと思ったけど、こっから先は教科書丸パクリになるので割愛！

## 行プロファイラの導入

3章ででてくる便利ツール。環境構築の一部なので記録しておきます。
分析では、ある程度高度な計算を実行するとなると行単位で関数の挙動を見て行きたくなるらしい。たとえば1回10msの計算を100万回繰り返すのを、少し改善して1回5msにできれば、100万回でかなり時間が短縮できる。こういった改善がたぶん大規模な行列を使った科学技術計算になると余計に効いてくるんだと思う。
で、どの処理にどんだけ時間かかってるか、関数の行ごとに評価できる、その便利ツールが行プロファイラらしい。
### 導入方法

```bash
pip install line_profiler
ipython profile create
vi ~/.ipython/extensions/line_profiler_ext.py
```

```txt:~/.ipython/extensions/line_profiler_ext.py
import line_profiler

def load_ipython_extension(ip):
    ip.define_magic('lprun', line_profiler.magic_lprun)
```

```bash
vi ~/.ipython/profile_default/ipython_config.py
```

```py:~/.ipython/profile_default/ipython_config.py
#------------------------------------------------------------------------------
# TerminalIPythonApp configuration
#------------------------------------------------------------------------------

c.TerminalIPythonApp.extensions = [
  'line_profiler_ext',
]

#------------------------------------------------------------------------------
# TerminalIPythonApp configuration
#------------------------------------------------------------------------------

c.TerminalIPythonApp.extensions = [
  'line_profiler_ext',
]
```

### 関数を評価してみる

```py
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で使える。

```py
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

```