太陽がまぶしかったから

C'etait a cause du soleil.

Mac & Python3でmatplotlibのグラフ表示とscikit-learnの機械学習

Ein schnelles Apfelmännchen

Python3環境の準備

 データ解析基盤Mac で Python3 環境での開発を行う準備を環境を準備した際の備忘録。Anacondaなどを利用すれば一発で入るけど、サーバー環境に移行する場合にコンフリクトするのが面倒なのと自身の理解のためにいちからやってみる。まずは『パッケージ管理システム Homebrew - Qiita』を見ながら Homebrew をインストール。続いて Python3のインストール。

$ brew install python3
$ pip3 install --upgrade setuptools
$ pip3 install --upgrade pip
$ brew linkapps

 .bash_profileに以下の記述を行って、デフォルトで利用するPythonを3系にする。

alias python="/usr/local/bin/python3"
alias pip="/usr/local/bin/pip3"

 シェル設定を有効可して、PythonとPipのバージョンを確認。

$ . .bash_profile
$ python --version
Python 3.6.0
$ pip --version
pip 9.0.1 from /usr/local/lib/python3.6/site-packages (python 3.6)

仮想環境を作成して必要なパッケージをインストール

 ライブラリを独立管理するための仮想環境を作成。Python2系の頃はサードパーティツールの virtualenv を使うイメージがあったけれど、Python3 では組み込みの venv を使うのがよいらしい。

$ python -m venv ./data_analysis
$ cd data_analysis
$ .  bin/activate
(data_analysis) $ 

 数値計算ライブラリの numpy、データ解析基盤の pandas をインストール。

(data_analysis) $ pip install numpy
(data_analysis) $ pip install pandas

NumpyとPandasで正規分布乱数表を生成して簡易分析

 いよいよ pythonでプログラミング。NumpyとPandasで正規分布乱数表を生成して簡易分析させてみる。

import pandas as pd
import numpy as np

## 10行5列の正規分布乱数を生成
r = np.random.randn(10,5)

# カラムにA〜Eを割り付けてデータフレームを作成
df = pd.DataFrame(r, columns=list("ABCDE"))

# 乱数表を表示
print(df)

# 分析概要を表示
print(df.describe())

 これだけで、正規分布の乱数を生成して要素数、平均、標準偏差、最小、25パーセンタイル、中央値、75パーセンタイル、最大値を出力させられる。

(data_analysis) $ python test.py 
          A         B         C         D         E
0 -0.475664 -0.279614  0.769798 -0.842362 -0.990630
1 -1.515329  0.359877 -1.012964 -0.902889 -0.422315
2 -1.005066 -0.744064 -1.739727  0.370189 -0.788447
3  1.084547 -0.669911  0.869942 -0.593359 -0.729903
4 -0.994824  0.976057  2.317380  2.101970 -0.527500
5  1.189061 -0.938198  0.397261  0.396541 -0.773025
6  1.355600 -0.279438  2.599107  0.020310 -0.942765
7  0.109022 -0.436186 -0.796743  0.610479  0.330171
8  0.889160 -0.721003 -0.592103 -0.919960  0.508450
9 -0.488005 -0.230929  1.244978  2.349501 -0.175396
               A          B          C          D          E
count  10.000000  10.000000  10.000000  10.000000  10.000000
mean    0.014850  -0.296341   0.405693   0.259042  -0.451136
std     1.053487   0.577961   1.436626   1.185935   0.520875
min    -1.515329  -0.938198  -1.739727  -0.919960  -0.990630
25%    -0.868119  -0.708230  -0.745583  -0.780111  -0.784592
50%    -0.183321  -0.357900   0.583529   0.195250  -0.628702
75%     1.035700  -0.243057   1.151219   0.556995  -0.237126
max     1.355600   0.976057   2.599107   2.349501   0.508450

 サンプル数が少ないとばらつきが大きいので1000行づつ生成させて表示。

import pandas as pd
import numpy as np

r = np.random.randn(1000,5)
df = pd.DataFrame(r, columns=list("ABCDE"))

print(df.describe())

 実行。標準偏差は限りなく1に近づき。正規分布にしたがったパーセンタイルになる。

(data_analysis) $ python test.py 
                 A            B            C            D            E
count  1000.000000  1000.000000  1000.000000  1000.000000  1000.000000
mean      0.033938    -0.023520     0.030100    -0.017647    -0.006550
std       0.990832     0.972516     0.994633     0.997848     0.987670
min      -3.689006    -3.528158    -2.744848    -3.627054    -3.991040
25%      -0.617739    -0.700103    -0.640078    -0.633762    -0.632677
50%      -0.013711    -0.056635     0.043262    -0.020641    -0.011819
75%       0.647932     0.617857     0.714928     0.599148     0.679650
max       3.535475     3.768816     2.684675     2.929153     3.028185

Pythonでグラフを表示

 グラフ表示を可能とするために matplotlib をインストール。

(data_analysis) $ pip install matplotlib

 乱数配列をヒストグラム化するプログラムを作成。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# ヒストグラムのY軸を正規化(確率)して表示させる関数
def show_normed_hist(data, title, xlabel, ylabel, bins):
    plt.hist(data, normed=True, bins=bins)
    plt.title(title)
    plt.xlabel(xlabel)
    plt.ylabel(ylabel)
    plt.show()

r = np.random.randn(1000,5)

df = pd.DataFrame(r, columns=list('ABCDE'))
print(df.describe())
show_normed_hist(r, 'Histgram', 'n', 'prob', 50)

 下記のコマンドでプログラムを実行。

(data_analysis) $ python test.py & 
[1] 40776

 グラフ表示を終了させるまでシェルの制御が戻ってこなくなるため、"&" を付けてバックグラウンド実行とする。

f:id:bulldra:20170222073611j:plain

 ヒストグラムの表示結果。2次元配列を渡しても matplotlib 側で制御してくれる。

scikit-learn のインストール

 続いて機械学習ライブラリの scikit-learn をインストールする。普通にPIPインストールすると失敗するので調べたら、SciPy が必須とのこと。

Python (>= 2.6 or >= 3.3),
NumPy (>= 1.6.1),
SciPy (>= 0.9).

Installing scikit-learn — scikit-learn 0.24.1 documentation

 先に SciPy をインストールしてから scikit-learnをインストール。scikit-learnは途中でコンパイルが必要となるため、sudoで実行する。

(data_analysis) $ pip install scipy
(data_analysis) $ sudo pip install scikit-learn

scikit-learn でクラスタリング

 乱数配列を Kmeans法でクラスタリングするプログラムを作成。

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans

## Kmeans 表示
def show_kmeans(data):
    # Kmeas
    kmeans_model = KMeans(n_clusters=3, random_state=10).fit(data)
    # クラスタラベルを結合
    df = pd.concat([pd.DataFrame(kmeans_model.labels_, columns=['Label']), data], axis=1)
    print(df)

r = np.random.randn(10,5)
df = pd.DataFrame(r, columns=list('ABCDE'))
show_kmeans(df)

 前回インストールした pandas で配列同士を結合すると便利。

(data_analysis) $ python test.py 
   Label         A         B         C         D         E
0      0  0.462018  1.573145  1.356272  2.077497 -0.442880
1      0  0.105133  0.314921  1.316209  1.887002  1.163974
2      1 -1.092522  1.290340  1.187348 -1.262344  0.037429
3      0  0.733690 -0.245179  0.304962  0.459715  1.306258
4      0  0.570241 -0.238423  0.353163  0.241814  0.874983
5      1 -0.420605 -0.783803  0.036591 -1.197135 -0.534035
6      1 -0.691496  0.767393 -0.682319 -1.080912  0.580725
7      2  2.951777  0.570069 -0.311573 -0.072250 -1.133658
8      0  0.932389  0.179889  0.166576  0.873454 -0.396965
9      0  0.156743 -0.671090  1.227245 -0.024907  0.041011

 結果を表示。なんとなく特徴のある行ごとにクラスタリングできたっぽい。

Pythonによる機械学習入門

Pythonによる機械学習入門

  • 発売日: 2016/12/01
  • メディア: 単行本(ソフトカバー)