お久しぶりです。
皆さんは今年の抱負は作りましたか?
私は今年の抱負も「痩せる」です。
今回は久々にpythonを使った分析ネタについて書いてみようと思います。
今回はデータ分析の数値計算に使うライブラリの一つ、
numpy(ナンパイとかナンピイと呼ぶ)ライブラリについて
紹介したいと思います。
今回の記事ではpythonの利用できる前提で話を進めます。
また、numpyは標準ライブラリではないので、
別途インストールする必要がありますが、
python用のライブラリのインストーラーであるpipが入っていれば、
pip install numpy で入ります。
実際に使用する際は以下のようにインポートして使用します
import numpy as np
さて、そもそもnumpyとはどのようなモジュールかというと、
様々な関数の計算(対数関数や三角関数など)や統計用の関数の計算、
さらには多次元配列のデータを用いた計算にも使用でき、
さらに数値計算の高速化可能になる、数値計算に特化した
ライブラリーです。
まず、実際にnumpyを用いた場合の計算速度について
紹介したいと思います。
今回は、1から100000000までの和を求める場合の
実行速度について計測したいと思います。
1、pythonの標準ライブラリを用いて行う場合
start = time.time() sum(range(1, 100000000)) end = time.time() - start print('process_time:{}'.format(end) + 'sec')
実行結果
process_time:5.799577236175537 sec
2、numpyを用いて、データ型をint64型として計算を行う場合
start = time.time() a = np.arange(1, 100000000, dtype=np.int64) a.sum end = time.time() - start print('process_time:{}'.format(end) + 'sec')
実行結果
process_time:0.47188568115234375 sec
3、numpyを用いて、データ型をint32型として計算を行う場合
start = time.time() a = np.arange(1, 100000000, dtype=np.int32) a.sum end = time.time() - start print('process_time:{}'.format(end) + 'sec')
実行結果
process_time:0.20046281814575195 sec
4、numpyを用いて、int型などは指定しないで計算を行う場合
start = time.time() a = np.arange(1, 100000000) a.sum end = time.time() - start print('process_time:{}'.format(end) + 'sec')
実行結果
process_time:0.20148825645446777 sec
以上のような結果になりました。
まず1、と2、の実行結果を見ればわかりますが、
標準ライブラリを使う場合よりもnumpyを使ったほうが
12倍以上速くなりました!!
また、int型は指定なし、int32、int64型で行いました。
(int型に関しては指定しない場合は実行環境に依存して変わるのですが
今回はint32型になっているようです。)
int型に関しては32型と64型でもさらに倍近い時間差が出ていることが分かります。
numpyには平方根の計算や、三角関数に対応した関数も
備わっているのですが、ここでは統計に関する機能のみ紹介します。
まず、以下のような数値が入った1次元配列型のリストがあるとします。
a = [3, 6, 4, 2, 4]
この配列の平均値を求める場合は以下のように、
np.mean(配列)とするだけで求められます。
np.mean(a)
実行結果
3.8
また、中央値を求める場合は
np.median(a)
実行結果
4.0
とするだけです!!
また、与えられた数値データの分散も簡単に求められます。
(分散とは平均からのばらつきのこと)
np.var(a)
実行結果
1.7600000000000002
今回は簡単な数値データを用いて、平均・中央値・分散を求めましたが、
ここはまた改めて統計分布の求め方などを求めてその時に掘り下げたいと思います。
では次に、numpyを用いた配列計算について述べたいと思います。
numpyの特徴は先に述べたように数値計算を行うのに向いているというのも
一つの特徴ですが、そのほかにも配列を用いた計算にも便利なので、
そこでの用い方についても紹介したいと思います。
また、以下の内容は主に行列計算という計算手法に関する話題になります。
なぜここで、ここで行列計算の話題になるかというと、
データ分析の分野では多くのパラメータを用いた分析手法を用いることが一般となっており、
その際に線形代数という手法について
知っておくと幸せになれます。
そして、線形代数の手法を学ぶ際に行列式の計算方法を理解しておく必要があるため、
行列計算の話題を取り上げることにしました。
(ただし、線形代数の詳細は次の話題で取り上げようと思います。)
例えば以下のような2行2列の行列のデータが2つあるとします。
a = [[2, 3], [7, 4]] b = [[7, 4], [6, 4]]
この2つの行列の積を求めるとき、
numpyを使うと簡単に求められます。
np.dot(a, b)
実行結果
array([[32, 20], [73, 44]])
ここで、numpyのdot積という機能を用いました。
この機能を使うと多次元配列同士の積を簡単に求めることができます。
この機能を使わずに同様の計算を行う場合、
2重のforループの計算になるため、計算にかかる時間も、
コードの可読性も悪くなってしまいます。
ですが、numpyを使うと1行で簡単に処理できてしまうのでお勧めです。
上記のようにnumpyを使うことで、少ないコード量で計算できることが
numpyの最大の特徴であり、そのため科学計算もpythonを使うことで
容易に行えるようになりました。
その結果、pythonを使用する科学計算ユーザーが増えたといわれています。
また、このことが理由で、昨今のAI(機械学習)ブームで使われる
プログラミング言語がpythonになった理由とも考えられています。
(最近はjuliaとかいう言語もよさそうですけどね!!)
では、今回はこれくらいにして次は線形代数の内容について
触れていこうと思います。
特にscipyとmatplotlibという描画ライブラリ用いた手法などを
紹介できたらと思います。
では。