Umit Mert Cakmak, Mert Chuhadaroglu:NumPy によるデータ分析入門

作成日 : 2021-03-24
最終更新日 :

概要

原題は "Mastering Numerical Computing with Numpy"。 コードファイルは下記の GitHub リポジトリに置かれている。
https://github.com/PacktPublishing/Mastering-Numerical-Computing-with-NumPy/
カラー画像のダウンロードはここからできる。
https://static.packt-cdn.com/downloads/MasteringNumericalComputingwithNumPy_ColorImages.pdf

感想

本書は、私には難しい。

1章 NumPy 配列を操作する

NumPy のバージョンについては、特に言及がない。ただ、Anaconda を使って Jupyter Notebook を利用する方法を、 本書では強く勧めている。

私はひねくれものだから、Jupyter Notebook ではなく、JupyterLab を使う。 WSL2 (Windows Subsystemo for Linux 2)の Ubuntu 20.04 を起動し、
$ jupyter lab
と入力すればいい。最初に出てくる Web の画面では、JupyterLab のなかに Python と Julia があるが、 もちろん今回は Python を選ぶ。


2章 NumPy の線形代数

「2.1 ベクトルと行列の数学」から、もう躓いてしまった。次の例がある。

In [8]: a = np.arange(9).reshape(3,3)
        b = n.parange(3)
        print(a)
        print(b)
Out[8]: [[0 1 2]
         [3 4 5]
         [6 7 8]]
        [0 1 2]
In [9]: np.inner(a,b)
Out[9]: array([ 5, 14, 23])
In [10]: np.outer(a,b)
Out[10]: array([ 0,  0,  0],
               [ 0,  1,  2],
               [ 0,  2,  4],
               [ 0,  3,  6],
               [ 0,  4,  8],
               [ 0,  5, 10],
               [ 0,  6, 12],
               [ 0,  7, 14],
               [ 0,  8, 16]])

inner() メソッドは内積、outer() メソッドは外積と説明されているのだが、 私の感覚とは違う。内積、外積はともに同じ次元のベクトルどうしでしか定義できないはずで、 しかも外積は3次元のベクトルどうしでしか定義できないはずだ。

説明を読んでいると、 inner(a,b)というのは、a が m*n 行列で、a_k を n次のベクトルとしたとき a = (a_1, a_2, ..., a_n)T (k = 1, ..., n 、右肩の T は転置を表す)で表されるとき、a_k と b が同じn次のベクトルであって、 inner(a,b) は a_k * b (* は内積)のスカラーを成分とする m 次元ベクトルという意味だということがわかった。

同じく説明を読んで outer(a,b) というのは、a が2次元のm*n行列であっても1次元に伸ばして(平坦化して)、 そのk(k=1, ..., m*n) 成分のスカラーをl次元のベクトル b に乗じて、そのベクトルb_k をk番めの要素とするベクトル、 すなわち m*n 行 l 列の行列となる。この操作は、外積というものではないだろう。

余談だが、inner メソッドや outer メソッドを説明するときは、 a の行と列の次数を変えるのがいいのではないかと思った。 また、arange で作ると1ずつ増えることになって、演算を行う2つの数の区別がつけにくい。 片方を arange で作るならばもう片方は素数の 2 3 5 7 11 などの列を使うといいのではないだろうか。

話が横に行ってしまったが、inner, outer というメソッドがあっても、 内積・外積ということばは一度忘れてしまうのがよさそうだ。


3章 NumPy の統計関数で行う探索的データ分析

ヒストグラムの表示の仕方について述べられている。p.70 ではなく、 ビンの個数と幅の決定はとても重要です。と述べられていることもあり、 ヒストグラムの最適な個数と幅を推定する関数がいろいろある。次の6つが述べられている:

推定関数公式
フリードマン=ダイアコニスの法則`h = 2 (IQR(x)) / n^(1//3)`
Doane の公式`k = 1 + log_2 n + log_2 (1 + abs(g_1)/(sigma_(g1)))`
ライスの法則k = 2 n^(1//3)
スコットの正規化基準法則`h = (3.5sigma) / (n^(1//3))`
スタージェスの公式`k = log_2 n + 1`
平方根選択`k = sqrt(n)`

ここで `k` と `h` が出てきているが、これらが何かの言及はない。調べた結果を書いておくと、 `k` は階級の個数、`h` は階級の幅である。 また、`k` と `h` は次の関係がある。

`h = ceil((max x - min x) / k)`

それにしても、なぜ Doane の公式だけ、原語で書かれているのだろう。Doane College はドーン大学として紹介されるので、 ドーンの公式でいいのだろうか。

ヒストグラムの階級数(`k`)を決める方法は、 情報量統計学でも述べられている。


4章 線形回帰を用いて住宅価格を予測する

p.90 に線形回帰直線の公式が載せられている:

`Y_i = B_0 + B_1X_i`

p.92 で、`B_0`と `B_1`の求め方が示されている。なお、上の式の `X_i` は下の式で `x` に、 上の式の `Y_i` は下の式の `y`に相当する:

`B_0 = (sum y sum x^2 - sum x sum xy)/(n sum x^2 - (sum x)^2)`
`B_1 = (n sum xy - sum x sum y) / (n sum x^2 - (sum x)^2)`

この式は、表示としては美しいが、数値計算の面からは誤差が出やすいという問題がある。 誤差を押さえるには、上記の方程式ではなく、QR 分解を使う方法がよい。QR 分解については、 p.209 に説明がある。


誤植

https://www.oreilly.co.jp/books/9784873118871/ にはない誤植は次の通り。

p.33 の In[8]: の1行おいて下に Out[8]: が抜けている。

p.219 の上から4行目、標準偏差の式に誤りがある。本書では次のようになっているが、

`std = sqrt(1/(1-n) sum_(i=1)^n (X_i - bar(X))^2)`

次が正しい:

`std = sqrt(1/(n-1) sum_(i=1)^n (X_i - bar(X))^2)`

誤った式のままでは、n が 2 以上のとき、根号の中が負になってしまう!

なお、式の表現には MathJax を用いている。

書誌情報

書 名NumPy によるデータ分析入門
著 者Umit Mert Cakmak, Mert Chuhadaroglu
訳 者瀬戸山 雅人、 小林 儀匡、滝口 開資
発行日2018 年 7 月 24 日 初版第1刷
発行所オライリー・ジャパン
発売元オーム社
定 価3800 円(税別)
サイズ
ISBN978-4-87311-845-1
その他越谷市南部図書室で借りて読む
NDC

まりんきょ学問所コンピュータの部屋コンピュータの本Python > Umit Mert Cakmak, Mert Chuhadaroglu:NumPy によるデータ分析入門


MARUYAMA Satosi