ITエンジニアのブログ

IT企業でエンジニアやってる人間の日常について

統計学とプログラミング:平均と分散

平均と分散、さらに代表値の例と標準偏差について書きます。

環境

ライブラリ

Pythonではnumpyを使います。

import numpy as np

C言語ではmath.hを使います。

#include <math.h>

データ

テストの得点を想定して、numpyで0~100までの乱数を用意します。

n個の値をx_k (1 \leq k \leq n)とおきます。

# 乱数初期化
np.random.seed(0)
# scoresに0~100までの整数100個を格納
scores = np.random.randint(0, 101, 100)

中身を確認します。

scores
# 出力
array([ 44,  47,  64,  67,  67,   9,  83,  21,  36,  87,  70,  88,  88,
        12,  58,  65,  39,  87,  46,  88,  81,  37,  25,  77,  72,   9,
        20,  80,  69,  79,  47,  64,  82,  99,  88,  49,  29,  19,  19,
        14,  39,  32,  65,   9,  57,  32,  31,  74,  23,  35,  75,  55,
        28,  34,   0,   0,  36,  53,   5,  38,  17,  79,   4,  42,  58,
        31,   1,  65,  41,  57,  35,  11,  46,  82,  91,   0,  14,  99,
        53,  12,  42,  84,  75,  68,   6,  68,  47,   3,  76, 100,  52,
        78,  15,  20,  99,  58,  23,  79,  13,  85])

平均

算術平均 (mean)

よく\muと書かれます。

\mu = \displaystyle \frac{1}{n} \sum_{k=1}^{n} x_k

Python

meanメソッドを使います。

scores.mean()
# 出力
48.75

C言語

配列の中を全て足し、個数で割り算します。

// count: 要素の個数
// array: 得点の配列
double mean(int count, int* array){
    double sum = 0;
    // 各値について
    for(int i = 0; i < count; i++){
        // sumに足し算する
        sum += (double)array[i];
    }
    // 個数で割り算する
    return sum / (double)count;
}

中央値 (median)

中央値は平均値と違い、外れ値(集団と大きく離れた値)の影響を受けにくいです。

例えば、年収の分布であれば、大金持ちが少数含まれていることが想定できる場合、平均値だけでなく中央値も確認したいところです。

np.median(scores)
# 出力
47.0

分散 (variance)

よく\sigma^2と表される分散は、次の式で求められます。

\sigma^2 = \displaystyle \frac{1}{n} \sum_{k=1}^{n} (x_k - \mu)^2

Python

varメソッドを使います。

scores.var()
# 出力
823.4675

C言語

各値に対し、平均との差分を2乗して合計し、個数で割り算します。

// count: 要素の個数
// array: 得点の配列
double variance(int count, int* array){
    // 平均を求める
    double x_mean = mean(count, array);
    double sum = 0;
    // 各値についてsumに足し算していく
    for(int i = 0; i < count; i++){
        // 平均との差分を求める
        double x_diff = (double)array[i] - x_mean;
        // 2乗する
        sum += x_diff * x_diff;
    }
    // 個数で割り算する
    return sum / (double)count;
}

標準偏差

標準偏差Sは、分散の平方根を取れば求められます。

S = \sqrt{\sigma^2}

Python

scores.std()
# 出力
28.696123431571728

C言語

// count: 要素の個数
// array: 得点の配列
double standardDeviation(int count, int* array){
    // 分散の平方根を計算
    return sqrt(variance(count, array));
}

偏差値得点

平均を50とするもので、よく学力試験でよく見られるものですが、今まで求めた平均と標準偏差を用いて、偏差値得点p

p = 10 \cdot \displaystyle\frac{x - \mu}{S} + 50

とします。標準偏差が約28.7だったので、平均48.75から28.7離れると、偏差値得点が10変わることになります。

10 * (scores - scores.mean()) / scores.std() + 50
# 出力
array([48.34472415, 49.39016153, 55.31430666, 56.35974404, 56.35974404,
       36.14795476, 61.93541005, 40.32970427, 45.55689115, 63.32932655,
       57.40518142, 63.67780568, 63.67780568, 37.19339214, 53.22343191,
       55.66278579, 46.60232853, 63.32932655, 49.0416824 , 63.67780568,
       61.2384518 , 45.90537027, 41.72362077, 59.8445353 , 58.10213967,
       36.14795476, 39.98122514, 60.88997267, 57.05670229, 60.54149355,
       49.39016153, 55.31430666, 61.58693092, 67.51107606, 63.67780568,
       50.08711978, 43.11753727, 39.63274602, 39.63274602, 37.89035039,
       46.60232853, 44.16297465, 55.66278579, 36.14795476, 52.87495279,
       44.16297465, 43.81449552, 58.79909792, 41.02666252, 45.20841202,
       59.14757705, 52.17799453, 42.76905814, 44.8599329 , 33.01164263,
       33.01164263, 45.55689115, 51.48103628, 34.75403826, 46.2538494 ,
       38.93578776, 60.54149355, 34.40555913, 47.6477659 , 53.22343191,
       43.81449552, 33.36012176, 55.66278579, 47.29928678, 52.87495279,
       45.20841202, 36.84491301, 49.0416824 , 61.58693092, 64.72324305,
       33.01164263, 37.89035039, 67.51107606, 51.48103628, 37.19339214,
       47.6477659 , 62.28388918, 59.14757705, 56.70822317, 35.10251738,
       56.70822317, 49.39016153, 34.05708001, 59.49605617, 67.85955518,
       51.13255716, 60.19301442, 38.23882951, 39.98122514, 67.51107606,
       53.22343191, 41.02666252, 60.54149355, 37.54187126, 62.6323683 ])

参考文献

統計学入門」(東京大学出版会

統計学とプログラミング:1次元データの可視化

ヒストグラムを作成します。

環境

ヒストグラムの作成

ヒストグラム(棒グラフ)を作成します。

まず、必要なライブラリを読み込みます。

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

scikit learn にサンプルデータがあるので、それを使います。今回はwineのデータを読み込みます。

from sklearn.datasets import load_wine
wine = load_wine()

pandasのDataFrameに変換します。

wine_df = pd.DataFrame(wine.data, columns=wine.feature_names)

中味を見てみます。

wine_df.head()

alcoholというカラムがアルコール度数のことでしょう。これをヒストグラムで表示します。

rwidthを1から減らして、棒グラフに隙間ができるようにして表示しました。

plt.hist(wine_df["alcohol"], rwidth=0.9)

f:id:tfull:20190424122122p:plain
wine - alcohol

Ubuntuで行う自己流の環境設定集

Virtual Box や、最近はやっていないですがOSをブートするときにUbuntuを選択することが多く、いくつも設定してきたため、いつもやる操作、近頃の 18.04 LTS の例で挙げます。

適宜、更新する可能性があります。

shell$ # 適当なディレクトリで実行
shell ~/dir$ # ~/dir 下で実行

名前変更

Ubuntuを日本語でインストールすると、ディレクトリが日本語になっているため、ターミナルで操作するときに煩わしい。これを回避するために、ディレクトリ名を英語にします。

shell$ LANG=C xdg-user-dirs-gtk-update

確認画面が出てくるので良しなに進める。

ブラウザ

Firefox が最初から使えますが、 Chrome をよく使っているので、入れます。

  1. Google Chrome で検索し、ダウンロード。
  2. Ubuntu ソフトウェアが表示されるので、インストールボタンを押下。

サーバー化

sshでアクセスできるようにする。

shell$ sudo apt install openssh-server

sshの設定

GitHubレンタルサーバーなどへのアクセスに使用。

shell ~$ mkdir .ssh
shell ~$ chmod 700 .ssh

id_rsassh-keygen か既にあるものを用意。

shell ~/.ssh$ chmod 600 id_rsa
shell ~/.ssh$ chmod 600 authorized_keys # あれば

各種ソフトウェア

apt update

新しいパッケージを入れるため。aptをアップデート。

shell$ sudo apt update

その他必要なソフトウェア

shell$ sudo apt install gcc make zlib1g-dev libssl-dev libffi-dev libbz2-dev libreadline-dev libsqlite3-dev

Git

shell$ sudo apt install git

Pythonとpyenv

まずpyenvをインストール。以下リンクから手順に従う。
GitHub - pyenv/pyenv: Simple Python version management

新しいバージョンのpythonをpyenvを使って入れる。

shell$ pyenv install 3.7.3
shell$ pyenv global 3.7.3

AppleのMagic Keyboard, Magic Mouse 2, Magic Trackpad(黒)の使い心地

f:id:tfull:20190326003103j:plain
Macの入力デバイス

主に iMac で使っていたワイヤレスキーボードを交換したあとの記録です。

今まで、テンキーなしのワイヤレスキーボード、マウス、トラックパッドについて、いずれも電池式のものを使っていました。いくつかの欠点のため、数ヶ月前に交換して使っていましたが、結構気に入っています。

前デバイスの欠点

キーボード (Wireless Keyboard)

  • 表面がゴワゴワしている。

マウス (Magic Mouse)

  • 裏側の電池部分のカバーが取れやすい。

トラックパッド (Magic Trackpad)

  • 特になし。

これに加えて、電池式なので、電池がないときに切れると困る、残量が少ないときにたまに切断するという短所があります。

購入

いずれも黒です。キーボードとトラックパッドが15000円ほど、マウスが10000円ほどでした。黒は2000円ほど高かったので悩みましたが、見た目が気に入ってこちらにしました。

不要なものを売却

  • Wireless Keyboard 1400円 * 2
  • Magic Mouse 1000円
  • Magic Trackpad 1400円

合計5200円。ビックカメラで買い取ってもらいました。

購入品の長所

Magic Keyboard

  • 押し心地が丁度よい。

Magic Mouse 2

  • 変化なし。

Magic Trackpad 2

  • クリックが静電式になった。気持ちいい。

購入品の欠点

Magic Keyboard

  • 特になし。

Magic Mouse 2

  • 充電ケーブルを指す部分が裏にあるので、充電中にマウスを使えない。

Magic Trackpad 2

  • 特になし。

その他、全部に共通していますが、充電が結構もち、頻繁に充電する必要がないです。おそらく1ヶ月くらい充電無しで使えてます。電池を管理しないで良いのがとてもよく、夜にコンビニに電池を買いに行かなくて済むようになりました。

気になる点は、充電ケーブルがLightningであるということです。おそらくこれからUSB Type-Cが主流になると読んでいるので、ケーブルが壊れたときにいつまで入手できるのかが問題です。

雑感

色違いというだけで各デバイス2000円も高いのがやはり納得いかないですが、買ってよかったと思います。

ポインティングデバイスMagic Mouse 2 と Magic Trackpad 2 を併用しています。 iMac 27inch で使っていますが、画面移動などのメインではマウスを使っています。MacBook系(ノートPC)ではトラックパッドがとても好きで、マウスは使わないのですが、iMacのようなデスクトップだとマウスが使いやすいです。iMacでは、トラックパッドはスクロールを沢山するような箇所でマウスより使いやすく、重宝しています。正直なところ、どちらかだけでも十分かもしれません。

機械学習用のGPU環境を用意するのが難しい...

良いGPU環境をいろいろ探しています。

動かしたいもの

趣味で書いているリバーシAIプログラムがあります。

github.com

このAIに学習をさせようとしているのですが、これに手こずっています。

まだ最善手を見つけられていませんが、色々調べましたので、それらを列挙していきます。

選択肢

何個か選択肢があります。

GPUを使わない。

GPUを使わずにCPUで全部済ませてしまうという方法もあります。長所は動作環境が限定されず、私が使っているさくらVPSでも実行することができます。

短所は、当然ですが時間がかかりすぎてしまうことです。リバーシのAIを10万回学習させるだけでも、多少複雑なモデルを使えば1日半くらいかかってしまいました。数百万回の学習をさせたい場合は現実的ではありません。

Colaboratory を使う。

別の記事で Colaboratory を挙げました。Jupyter環境が使えます。Googleアカウントさえあれば無料で使えますし、GPUも使用可能ですから、簡単な機械学習にはうってつけだと思います。

しかし、ファイルを分割している場合は読み込みをさせるのが大変です。ドライブのマウントとシンボリックリンクを用いて無理やり複数ファイルを読み込ませました。

また、ランタイムがタイムアウトしたときにおかしな動作になります。学習中にタイムアウト → 勝手に再実行 → ブラウザごとフリーズが何回か起こりました。

クラウドコンピューティングを使う。

AWS の EC2 や GCP の GCE の選択肢も挙がると思います。時間課金なので、少々使う分ならPCを買ったりするよりも安く済む可能性が高いです。また、家に物が増えないのも長所になります。

ただ、短時間で割安なのと同時に、使用時間が長いと大金を請求される可能性もあります。インスタンスを止め忘れたり、不正アクセスされた場合のリスクが大きいです。個人の趣味でやるには敷居が高いかもしれません。

機械学習用PCを買う。

機械学習ができるPCを一度買ってしまえば、あとは電気代しかかかりません。計算資源の利用に制限がなく、自宅サーバーとして勉強用に使用することができます。

しかし、Webで調べたところ、機械学習ができるPCは結構高く、最初から機械学習ができるようにセットアップされた i7 (6core 12 thread), 64GB memory, RTX 2080 graphics でも、50万円以上かかるようです。(私のクレジットカードでは上限超えてしまいます。)自分でOSやドライバを設定すればもう少し安く(25万円程度)になるようですが、ドライバを設定するのは難しいようで、失敗すると画面がつかなくなったりする例もあるらしく、かなりリスクのある買い物になるでしょう。

最後に

未だ選択できていませんが、色々な選択肢はあります。 悩んでる間にもっと良い選択肢が出ることを期待します。

【Colaboratory】Googleアカウント1つでPythonを始める

Googleアカウント1つでPythonの実行環境を用意できる Colaboratory を最近 (2018 ~ 2019) 使っています。

環境構築をする必要がないことに加え、手元のCPU資源を消費せずに使えます。

GPUを使えるようにもなっているので、機械学習のプログラムも動作させることができます。

始め方

まず Google Drive を始めます。Google DriveGoogle 検索するか、Google Chrome のメニュー欄にドライブとあるので起動し、 Google Drive を始めるというボタンがあるので押下すると始まります。

f:id:tfull:20190323154004p:plain
Colaboratoryの起動

ドライブ内で[右クリック] > [その他] > [アプリを追加] で Colaboratory と検索し、入手をクリックすると、[右クリック] > [その他] の欄で Colaboratory が選択できます。

f:id:tfull:20190323160106p:plain
実行例

Python コードを書いて Shift + Enter を押下することで、コードが実行されます。

メモリ約13GBで動作できるので、比較的大きなデータも読み込めます。

Pythonでfalconを用いて簡易APIサーバーを作る。

Python 3.6 です。

falcon を使った簡易APIサーバーです。自然言語処理のブラウザインターフェースを作ろうとして必要になったので、メモとして残します。

構成要素

実装

falcon をインストールします。

pip install falcon

コードは以下。

import falcon
import json
import sys
from wsgiref import simple_server

class Number(object):
    def on_get(self, req, resp):
        result = req.params
        values = [int(v) for v in result["values"].split("_")]
        resp.body = json.dumps({ "answer": sum(values) })

if __name__ == '__main__':
    app = falcon.API()
    app.add_route("/", Number())
    httpd = simple_server.make_server("127.0.0.1", int(sys.argv[1]), app)
    httpd.serve_forever()

req でディクショナリを受け取るので、json文字列を返します。

この例だと足し算を行うプログラムです。

実行

以下でサーバーを起動します。例として port 13337 で起動します。

python server.py 13337

そしてブラウザで

localhost:13337?values=1_2_3_4_5

と入力すると、足し算が行われて、ブラウザに

{ "answer": 15 }

と表示されます。

エラー処理をきちんと追加すれば使用できそうです。