Python

Python3で統計の勉強まとめ

投稿日:2018年8月19日 更新日:

Hackerrank 10 Days of Statistics

Hackerrankのチュートリアルから統計10日間を終えたので、そのメモ.
(10日間だけどプログラム的な数え方なので、Day0からDay9でした.)

なお、数学については素人ですので間違ってるかもしれません.

プログラミング技術としては、公式を実装するだけなので、難易度高くない.
英語文を翻訳しながら、実装していけば、高校生くらいでも解ける.

困ったら、Discussionsを開けば、同じようなことで困ってる人が発言しているので答えがだいたいわかる.

Day0 平均値、中央値、最頻値

平均値、中央値、最頻値

平均値は、観測値の総和を観測値の個数で割ったもの.
中央値は、データを小さい順に並べたときに、中央に位置する値.ただし、データが偶数個の場合は中央に近い値2つの平均値をとる.
最頻値は、データの中でもっとも頻繁に出現する値.

これらは代表値といってデータの性質をあらわす値のことをいう.

つぎのデータセットがある. x1の平均値、x1,x2の中央値、x3の最頻値を求めよ
x1 = [1,2,3,4,5,6,7,8,9]
x2 = [1,2,3,4,5,6,7,8]
x3 = [1,1,1,2,3,4,4,4]

Python tips 内包表記

こういうfor文は内包表記に置きかえられる.

単純なfor文などは内包表記にしたほうが簡潔で実行速度も早い場合が多い.

和を求めるときはsumを使えばよい.総和を求めるのはΣの計算でよく出てくる.

加重平均

加重平均とは、各データの重みを考慮した平均値のこと.

りんご(200円)、みかん(100円)、バナナ(60円)を売っているお店がある。このお店の商品の値段の平均はいくらか。
ただし、お店にはりんごが10個、みかんが5個、バナナが20本ある。

Day1 四分位数、四分位範囲、標準偏差

四分位数、四分位範囲

四分位数、四分位範囲、標準偏差はデータのちらばり具合を示す値.
四分位数は、データを昇順に並べたとき、25%、50%、75%に位置する値.
50%の第2四分位数は中央値と同じ.
25%、75%の第1四分位数と第3四分位数は中央値の計算と同じくデータが偶数のときは中央に近い2値の平均を取る.
四分位範囲は、第1四分位数から第3四分位数までの範囲で、(第3四分位数ー第1四分位数)で求められる.

次のデータの四分位値、四分位範囲を求めよ.
x1 = [6, 7, 15, 36, 39, 40, 41, 42, 43, 47, 49]
x2 = [7, 15, 36, 39, 40, 41]

標準偏差

標準偏差は、データの散らばり具合を示す1つの基準.
平均値と各値の差を2乗をデータの総数で割ったものを分散と呼び、標準偏差(σ)は分散の平方根で求められる.
データが正規分布に従うとき、+-1σに約68%のデータが収まり、+-2σに約95%のデータが収まるという性質がある.

次のデータの標準偏差を求めよ
x = [10, 20, 30, 40, 50]

Numpyをつかう

母標準偏差と標本標準偏差

今回のように全データがわかっている場合の標準偏差を、母集団の標準偏差なので母標準偏差という.
母集団の標準偏差と異なり、母集団からサンプリングしたデータから誤差を含めて計算したものを標本標準偏差という.
ライブラリをつかって標準偏差を求めるときは、どちらを求めるのか間違えないようにする必要がある.

pandasで基本統計量をみる

平均値、中央値、最頻値、四分位数、標準偏差などはデータの性質をあらわす基本統計量という.
pandasのデータフレームを使えばデータの基本統計量を表示することができる.

Day2 確率

確率は、(求めたい事象/全事象)で求められる.
事象の数え方には、順列(Permutation)と組み合わせ(Combination)がある.
順列は、nPr = n! / (n-r)!で求められる.n!は階乗といって、n * (n-1) * … * 2 * 1
組み合わせは、nCr = nPr / r! = n! / r!(n-r)!で求められる.

Python Tips 高階関数

高階関数は、関数型プログラミングの概念で、だいたい関数を引数にして関数を返す関数のこと.
mapとかreduceとかfilterとか.
イテレータがきれいに書ける.

Python Tips lambda

ラムダ式は無名関数の一種.高階関数などと一緒につかうことが多い.
うえの例は下のように書ける.

math.factorial

じつは、n!の階乗計算はmathライブラリのfactorialで簡単に計算できる.

Scipyをつかって順列、組み合わせを求める

Scipyにperm、combというそのものズバリな関数がある.
これを使えば簡単に順列と組み合わせの数が求められる.

Day3 条件付き確率

条件付き確率

AとBが独立しているとして、Aが起きたときにBが起きる確率とP(B|A)とあらわす.
この条件付き確率P(B|A) = P(A∩B) / P(A)で求めることができる.

ある夫婦には子供が二人いる。二人のうち少なくとも一人は男の子であるということが分かった。このとき,二人とも男の子である確率を求めよ。
ただし,男の子が生まれる確率,女の子が生まれる確率はともに0.5とする

(参考)

この答えは、1/3.
直感的に非常にわかりにくい.
A:二人の子供の少なくとも一人が男の子
(男男 男女 女男 女女)の4つの組み合わせで、P(A)=3/4
B:二人の子供の両方が男の子
同様に、P(A∩B)=1/4

よって、P(B|A) = (1/4) / (3/4) = 1/3

ベイズの定理

上の式は、P(A∩B) = P(B|A)P(A)と置き換えることができる.
同様に、P(A∩B) = P(A|B)P(B)である.
よって、P(B|A)P(A) = P(A|B)P(B)といえる.
これをベイズの定理という.

つまり、P(B|A) = P(A|B)P(B) / P(A)であり、例えば、P(B|A)は、残りのP(A|B)とP(B)とP(A)が判明すれば計算することができる.

ベイズの定理は、次の式に展開できる.(ベイズの展開公式)

P(Bi|A) = P(A|Bi)P(B) / Σ(j=1⇒k)(P(A|Bj)P(Bj))

(参考)

日本人の0.01%が罹患しているある病気について考えます。この病気の検査方法では、実際に病気に罹患している人が陽性と判定される確率が95%、逆に罹患していない人が陰性と判定される確率は80%であると言われています。 ある人がこの病気の検査を受けて陽性という判定を受けた時、本当にこの病気に罹患している確率はいくらでしょうか。

問題文をつぎのとおりに整理する.
P(A): 検査方法で陽性
P(B): 病気に罹患 0.01%
P(A|B) 病気に罹患している人が陽性となる確率 95%
P(A-|B-) 病気に罹患していない人が陰性と判定される確率 80%
P(B|A) 陽性と判定された人が病気に罹患している確率 x

ここで、検査で陽性になる確率P(A)は、病気に罹患している人×95%+病気に罹患していない人×20%なので、0.01%95%+(1-0.01%)(100%-80%)=20.0075%

で、ベイズの定理をつかって、X=95% * 0.01% / 20.0075 = 0.04748219417%

すると、陽性と判定されても実際に病気に罹患している確率は0.047%に過ぎない.

単純ベイズ分類器

単純ベイズ分類器は、メールのスパムフィルターなどに使われる機械学習の一種.ナイーブベイズ分類器ともいう.
単純というのは、各確率が独立しているという意味.
学習用データには、メール本文とスパムにあたるかどうかのデータがある.
まず、メール本文を単語に分解して、単語ごとにスパムメールに含まれていた回数、含まれていなかった回数をカウントする.
このデータを集めることで、P(単語|カテゴリ)が求められる.あるカテゴリ中に単語が出現する確率である.
次に、ここからP(ドキュメント|カテゴリ)を求めることができる.
例えば、P(単語A|スパム)=20%、P(単語B|スパム)=80%なら、P(単語A & 単語B|スパム)=20% * 80% = 16%と求めることができる.ドキュメントに含まれる全単語の確率を掛け算すればドキュメントに対する確率になる.
ここから、P(カテゴリ|ドキュメント)がわかれば、あるドキュメントがカテゴリに属する確率を求めることができる.
ベイズの定理から、P(カテゴリ|ドキュメント) = P(ドキュメント|カテゴリ) * P(カテゴリ) / P(ドキュメント)
P(カテゴリ)は、あるドキュメントがカテゴリに属するか否かなので、(カテゴリに属するドキュメント数)/(全ドキュメント数)で求められる.
P(ドキュメント)については無視してよい.
ということで、晴れてP(カテゴリ|ドキュメント)=(あるドキュメントがカテゴリに属する確率)が求められる.

これが単純ベイズ分類器のおおざっぱな仕組み.
つまり、ベイズの定理は、P(ドキュメント|カテゴリ)をP(カテゴリ|ドキュメント)にひっくり返すことができるので、これを利用して学習結果から推測を行うことができるということ.

「集合知プログラミング」に単純ベイズ分類器の仕組みも紹介されていたけど、古い本なので、今となっては原始的な仕組みがざっとわかるだけ.勉強するなら最新の本を買ったほうがよいと思う.

集合知プログラミング

集合知プログラミング書籍

作者Toby Segaran

クリエーター當山 仁健, 鴨澤 眞夫

発行オライリージャパン

発売日2008年7月25日

カテゴリー大型本

ページ数392

ISBN4873113644

Supported by amazon Product Advertising API

scikit-learnでナイーブベイズ分類

Day4 二項分布、幾何分布

二項分布

コイン投げのように表か裏かの2つのいずれかしか結果がない試行をベルヌーイ試行という.
P(X=1) = p
P(X=0) = 1 – p
ベルヌーイ試行をn回行って、成功するx回の確率分布を二項分布という.
(ベルヌーイ分布はn=1の場合)
二項分布のパラメータには、成功する確率pと試行回数nがある.
n回のベルヌーイ試行を行って、ちょうどk回成功する確率P(X=k)は、
P(X=k) = nCk * p ** k * (1 – p) ** (n – k)
であらわすことができる.

コインを10回投げて表がちょうど3回出る確率
(表が出る確率は0.5)

累積確率

P(X=k)はちょうどk回成功する確率をあらわす.
n回試行を行って、a回からb回成功する確率は、
P(a<=X<=b) = Σ(j=a⇒b)P(X=j)
であらわすことができる.

コインを10回投げて表が1~3回出る確率
(表が出る確率は0.5)

幾何分布

幾何分布は、ベルヌーイ試行をn回行って、はじめてx回目に成功する確率の分布のことをいう.
成功率pのベルヌーイ試行をn回行って、はじめてk回目に成功する確率P(X=k)は、
p(X=k) = (1 – p) ** (k – 1) * p
であらわすことができる.

ある機械が不良品を出す確率は1/3である。
5回目の検査で初めて不良品が見つかる確率を求めよ。

Day5 ポアソン分布、正規分布、累積分布関数

ポアソン分布

ポアソン分布は、ある期間に平均λ回起きる現象が、一定の期間内にx回起きる確率の分布のこと.
ある期間に平均λ回起きる現象が、一定の期間内にk回起きる確率は、
P(X=k) = (e ** -λ) * (λ ** k) / k!

製品Aを作る工場では平均して200個に1個の割合で不良品が発生します。製造された製品Aを10個抜き取る時、この中に不良品が含まれる個数がポアソン分布に従うとすると、不良品が1個含まれる(x=1となる)確率はいくらでしょうか。

(参考)

正規分布

平均値、中央値、最頻値が一致する分布を正規分布という.

ある工場で1台の車を組み立てるのにかかる時間は、次の正規分布に従う.
平均20時間、標準偏差2時間.
この工場で1台の車が組み立てられる時間について次の確率を求めよ.
1. 19.5時間以内に1台車が組み立てられる確率.
2. 20時間から22時間の間に1台車が組み立てられる確率

ところで、ある現象がいろいろな値を取るとき、取りうる値全体を確率変数という.(この例では時間)
確率変数には、離散型と連続型があり、サイコロの目のように飛び飛びの数値で隣り合う数字の間がない場合を離散型確率変数といい、この例のように19.5時間のように数値が連続する場合を連続型確率変数という.
正規分布は連続型確率変数の分布で、一定の範囲の確率変数に対して、発生する確率をあらわす式を確率密度関数という.(この例ではx時間以下で車が1台できる確率)
正規分布の確率密度変数 N(μ, δ ** 2) = (1 / (δ * root(2π))) * e ** -((x - μ) ** 2/2δ ** 2) であらわせる.
ただし、μは平均、δ ** 2は分散、δは標準偏差をあらわす.
そして、連続型確率変数の場合の累積確率は、正規表現をグラフで表したときに、必要な確率変数の範囲に対応する面積を積分を使って求めることになる.
F(x) = P(X<=x) = ∫ x -∞ f(t)dt

で、もろもろ展開すると、こうなるらしい.
正規分布の累積分布関数
φ(x) = 1/2 * (1 + erf((x-μ) / (δ * root(2))))

erfは誤差関数
erf(z) = (2/root(π))∫ z 0 e ** (-x ** 2)dx
なお、Pythonでは、erfはmath.erfで求められる.

Day6 中心極限定理、Zスコア

中心極限定理

母集団が平均μと標準偏差σに従うとして、標本数nが十分に大きいとき、標本の分布は正規分布N(μ’, σ’)に近づく.
μ’ = n * μ
σ’ = root(n) * σ

人気のドーナッツ屋で、一人の客がドーナッツを購入する分布は、次の分布に従うことがわかっている。
平均2.4個、標準偏差2.0個.
今、行列に100人の客が並んでいるが、残りのドーナツは250個しかない。
客全員がドーナツを購入できる確率を求めよ。

サイコロを100回振った時、その目の和が300以上420以下となる確率を求めよ。
サイコロの出る目Xはμ=7/2、σ**2=35/12の離散一様分布に従う。

Day7 ピアソン相関係数、スピアマンの順位相関係数

ピアソン相関係数

ピアソン相関係数は、2つのデータの関係をあらわす.
-1-1の値を取り、1に近いほど正の相関が強い、0に近いほど相関がない、-1に近いほど負の相関が強いということになる.
ここで、共分散とは2つの変数の関係を表す値で、「平均値からの偏差の積の平均」で求められる。
Sxy = 1/n * Σ(i=1⇒n)(xi – μx)(yi – μy)
μx、μyはそれぞれx、yの平均値
ピアソン相関係数は、(xとyの共分散) / ((xの標準偏差) * (yの標準偏差))で求められる.

次の2つのデータセットがある.ピアソン相関係数を求めよ.
10 9.8 8 7.8 7.7 7 6 5 4 2
200 44 32 24 22 17 15 12 8 4

numpy.corrcoef

ピアソン相関係数は、numpy.corrcoefで求めることができる.

レコメンデーション

ピアソン相関係数は、レコメンデーションという分野など機械学習でもつかう.
データとして、あるサイトのメンバーがいろいろな映画を5段階で評価したものがある.
ここから好みの似た人を推薦することを考える.
類似尺度のひとつとして、二人ずつピアソン相関係数を求めて、一番相関が高い人を推薦するという方法がある.

これも、「集合知プログラミング」の中で紹介されていた.

スピアマン順位相関係数

ピアソンの相関は、2つの連続変数間の線形関係を評価するのに対して、スピアマンの相関では、2つの連続変数または順位変数間の単調関係を評価する。

まず、データセットに順位をつける.
x = {0.2, 0.1, 2.5, 0.4, 1.4}なら、Rankx = {2, 1, 3, 5, 4}
RankxとRankyについてピアソン相関係数を求める.

その式は、もろもろ変形すると、
Rs = 1 – (6 * Σ(i)(di ** 2)) / (n * (n ** 2 – 1))

次の2つのデータセットがある.ピアソン相関係数とスピアマン相関係数を求めよ.
10 9.8 8 7.8 7.7 1.7 6 5 1.4 2
200 44 32 24 22 17 15 12 8 4

scipyでスピアマン相関係数を求める

Day8 線形回帰

線形回帰

2つの変数を比較するとき、2つの変数を対等に見た場合を相関、1つの変数に着目して、もう1つの変数との関係を見た場合を回帰という.
回帰において、前者の変数を独立変数、後者の変数を従属変数という.
英語で、regression line of y on xというと、xを独立変数、yを従属変数とすることになる.

2つの変数が直線的な関係になるとき、回帰直線は、Y=a+bXとあらわすことができる.

bは次の2つの数式のいずれかで求めることができる.
b = (n * Σ(xi * yi)-(Σxi) * (Σyi)) / (n * Σ(xi ** 2) – (Σxi) ** 2)
b = p * (σY) / (σX) pはピアソン相関係数、σXはデータXの標準偏差、σYはデータYの標準偏差

aは次のとおり求められる.
a = μy – b * μx μxはXの平均、μyはYの平均

数学のテストと統計学のテストの一覧がある.
maths = [95, 85, 80, 70, 60]
stats = [85, 95, 70, 65, 70]
ある生徒が数学のテストで80点だった場合、統計のテストは何点になるか.
最小二乗法を用いて算出すること.

sklearnをつかう

sklearnを使えばもっと簡単に計算できる.

線形回帰の適用

Day9 重回帰分析

重回帰分析

YがX={1, x1, x2, x3…xn}というデータに依存しているとき、Y=a + b1x1 + b2x2 + b3x3 + … bnxnと表現できる.
このとき、Y = [1, x1, x2, x3, …xn] * [[a], [b1], [b2],[b3], …[bn]]と行列で表現できる.
ここで、[1, x1, x2, x3, …xn]をX、[[a], [b1], [b2],[b3], …[bn]]をBとすると、Y=XBとシンプルに表現できる.
ここで、B=(X.T*X).inverse * X.T * Yで求められる.
X.Tは転置行列(tranpose)、inverseは逆行列を表す.

次のとおり、X1、X2、Yというデータセットがある.
X1=[5,6,7,8,9]
X2=[7,6,4,5,6]
Y =[10,20,60,40,50]

Yの各値は、X1,X2が各値のときの数値を意味する.
X1=5、X2=5のときのYを求めよ.

Python Tips Numpy

Numpyは数値計算用のライブラリ.数学の計算が簡単にできるライブラリがそろっている.
例えば、Arrayはプログラム的な配列を扱うけど、Numpy.matrixでは、配列を行列として計算をすることができる.
(Numpy.ndarrayは汎用的な多次元配列)

sklearnをつかう

sklearnをつかえば、もっと簡単に計算できる.

Pythonデータサイエンスハンドブック ―Jupyter、NumPy、pandas、Matplotlib、scikit-learnを使ったデータ分析、機械学習

Pythonデータサイエンスハンドブック ―Jupyter、NumPy、pandas、Matplotlib、scikit-learnを使ったデータ分析、機械学習書籍

作者Jake VanderPlas

クリエーター菊池 彰

発行オライリージャパン

発売日2018年5月26日

カテゴリー単行本(ソフトカバー)

ページ数556

ISBN4873118417

Supported by amazon Product Advertising API

-Python
-, , , , , ,

執筆者:

関連記事

Raspberry Pi3とsense HATで遊ぶ

By: Su Yin Khoo – CC BY 2.0 目次1 Raspberry Pi32 Raspbian3 Raspbianでsshを使う4 raspi-configで初期設定5 R …

はじめてのKaggle~pandas、scikit-learn

By: Internet Archive Book Images – Flickr Commons 目次1 kaggle2 kaggleコマンドのインストール3 タイタニック:災害の機械学 …

Pythonではじめての強化学習3〜Actor and Critic model

By: Banalities – CC BY 2.0 目次1 課題 出力が連続値の場合2 Actor and Critic3 Actorにノイズを付与する4 結果 MountainCarC …

Pythonではじめての機械学習2〜scikit-learnとpandasで決定木

By: vaboo.com – CC BY 2.0 目次1 決定木(Decision Tree)2 サンプルデータの用意3 学習用データと検証用データにわける4 scikit-learn5 …

Python3で株式売買のシミュレーション〜pandas

By: Michael Gwyther-Jones – CC BY 2.0 目次1 株式売買シミュレーション2 ファイルの構造3 pandas4 DataFrameの作成、構造5 csvか …