pythonで統計学基礎: 01 平均と分散

統計学が大事だとはわかっていても,どこから勉強をはじめたらよいかわかりにくいですよね?大学で理系の学部だったなら一度は講義でやった記憶がある方も多いはずです.でもずっと使ってなかったら何も覚えていないですよね?この連載ではpythonを使いながら統計学の基本的な考え方を頭にすり込んでいくこと目指します.数式を自分でこねくりまわすよりも,コンピュータに計算させながら結果を吟味していく方が最初の理解には役に立つと考えているからです.

はじめに

具体的には「ハンバーガー統計学」こと,「統計学がわかる」をpythonの勉強も兼ねながら読んでいきます.記事は書籍に沿って進めますが,同様の内容がウェブにも公開されています.今回は第1章の平均と分散を扱います.対象とする人は大学で講義があったので一応単位を取ったレベルの人.つまり平均・分散・正規分布といった基本的な単語にはなじみがあるけれども,実は高校レベルも怪しい部分がある人.当然,統計分布や統計手法についてはほとんど覚えていないことを想定しています.基本的な内容を理解しながら,それをどのようにpythonで表現するかを学んでいきましょう.まずはpythonの必要なライブラリをimportしましょう.

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

平均・分散を計算する

まずはpandasのSeriesとして2つの店のポテトの長さを入力していきます.

wakuwaku = pd.Series([3.5, 4.2, 4.9, 4.6, 2.8, 5.6, 4.2, 4.9, 4.4, 3.7,
 3.8, 4.0, 5.2, 3.9, 5.6, 5.3, 5.0, 4.7, 4.0, 3.1,
 5.8, 3.6, 6.0, 4.2, 5.7, 3.9, 4.7, 5.3, 5.5, 4.7,
 6.4, 3.8, 3.9, 4.2, 5.1, 5.1, 4.1, 3.6, 4.2, 5.0,
 4.2, 5.2, 5.3, 6.4, 4.4, 3.6, 3.7, 4.2, 4.8])

mogumogu = pd.Series([4.5, 4.2, 3.9, 6.6, 0.8, 5.6, 3.2, 6.9, 4.4, 4.7,
 3.8, 3.0, 3.2, 4.9, 7.6, 3.3, 7.0, 3.7, 3.0, 4.1,
 5.8, 4.6, 4.0, 2.2, 7.7, 3.9, 6.7, 3.3, 7.5, 2.7,
 5.4, 5.8, 5.9, 3.2, 5.1, 3.1, 6.1, 4.6, 2.2, 4.0,
 6.4, 5.2, 3.3, 6.4, 6.4, 2.6, 2.6, 5.2, 5.8])

pandasでは合計sum()平均mean()分散var()標準偏差std()などを簡単に求めることができます.またdescribe()を使うと基本的な統計量の一覧がすぐに算出できます.

wakuwaku.describe()
count    49.000000
mean      4.571429
std       0.833667
min       2.800000
25%       3.900000
50%       4.400000
75%       5.200000
max       6.400000
dtype: float64

注意点としてはpandasの標準設定では分散・標準偏差は「サンプルサイズ−1」で除した不偏分散を用いています.これはddof(Delta Degree Of Freedom)という変数によって管理されていて,標準設定はddof=Trueまたはddof=1です.

wakuwaku.var(), wakuwaku.var(ddof=0)
wakuwaku.var(ddof=False), wakuwaku.var(ddof=True), wakuwaku.var(ddof=2)
(0.69499999999999995, 0.68081632653061219)
(0.68081632653061219, 0.69499999999999995, 0.70978723404255317)

度数分布表とヒストグラムを作成する

度数分布表

(0,1], (1,2]…のように階級を設定して度数分布表をつくります.各値を階級で分類するにはpandasのcut関数を使うことで実現できます.

bins = np.arange(0,9)
waku_cut = pd.cut(wakuwaku, bins)
0     (3, 4]
1     (4, 5]
2     (4, 5]
3     (4, 5]
4     (2, 3]
5     (5, 6]
・・省略・・

さらにvalue_countsを使って分類ごとに集計することで度数分布表が完成します.標準設定では度数順にソートされてしまうsort=Trueので,これを無効sort=Falseにしています.

pd.value_counts(waku_cut, sort=False)
(0, 1]     0
(1, 2]     0
(2, 3]     1
(3, 4]    14
(4, 5]    19
(5, 6]    13
(6, 7]     2
(7, 8]     0
dtype: int64

もぐもぐの方も同様にやってみましょう.

pd.value_counts(pd.cut(mogumogu,bins), sort=False)
(0, 1]     1
(1, 2]     0
(2, 3]     7
(3, 4]    13
(4, 5]     8
(5, 6]     9
(6, 7]     8
(7, 8]     3
dtype: int64

ヒストグラム

ヒストグラムはpandasのplot機能であるhistを使うことで容易に作成できます.ヒストグラムを眺めることで,実際に分散に違いがあることが視覚的にわかります.

wakuwaku.hist(bins=bins)
mogumogu.hist(bins=bins)


終わりに

今回はまず平均・分散・標準偏差についてpythonを使ってどのように扱うかを学びました.その際にpandasを使うことでこのような基本的な統計量が簡単に算出できること,また標準では不偏分散が算出されることを見ました.続いてpandasのcut機能を使うことで度数分布表が作成できることを学びました.最後にpandasのグラフ作成機能を使うことでヒストグラムを作成しました.これだけでもpandasの便利さを垣間見ることができたかと思いますが,pandasには他にもデータ分析に有用な機能がたくさん用意されています.これから少しずつ学んでいきましょう.

>>次の記事:「pythonで統計学基礎:02 信頼区間・t分布

シェアする

  • このエントリーをはてなブックマークに追加

フォローする