LoginSignup
33
35

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-01-12

概要

会社でオライリーの『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ファイルを作成。下記を記入。

~/.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。
これはすごい!

スクリーンショット 2016-02-11 20.47.21.png

データ分析をやってみる

事前準備

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

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
~/.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
~/.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

33
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
35