Pandasを使ったデータ操作の基本

データ分析の会社に転職してから3ヶ月。
最初の1ヶ月はPandasの扱いに本当に困ったので、 昔メモしてたことを簡単にブログに記録しておく(o ・ω・)ノ

【追記】2017/07/31 0:36 データが一部間違ってたので修正しました

Pandasとは

行列データを扱いやすくしたり、集計を行うライブラリ。
例えばデータがcsvファイル担っていた場合、pandas.read('hoge.csv') とするだけで、 扱いやすい(DataFrame型という)行列データとして扱えるようになる。
簡易的な可視化機能もついており、Pythonでデータの分析をする際に、最初に使うことになることが多いライブラリである。

とても便利なのだが、操作にかなり癖があるため、慣れるまでにかなり操作で戸惑うことが多い。

pandasでよく使う型

Pandasで扱う代表的な型が以下の3つである。 最初はどの型で何ができるのかわからなくなるので、タブで以下のリファレンス見ながら操作していくのがいい。

説明 リファレンス
DataFrame 行列型 pandas.DataFrame — pandas 0.20.2 documentation
Series DataFrameの中の1列 pandas.Series — pandas 0.20.2 documentation
GroupBy DataFrameやSeriesをグルーピングしたもの API Reference#groupby — pandas 0.20.2 documentation

テストデータについて

今回はタイタニック号乗船客の生存者を予測するデータから一部抜粋した以下を使う。

Survived,Pclass,Sex,Age,Fare,Embarked
1,1,male,80.0,30.0,S
1,2,female,4.0,39.0,S
0,2,female,24.0,13.0,S
0,2,male,37.0,26.0,S
0,3,female,11.0,31.275,S
1,3,female,13.0,7.2292,C
0,3,male,22.0,7.25,S

これをsample.csvとする。

ちなみに各列の意味は、以下である。

  • Survived 生存者かどうか
  • Pclass 部屋のグレード
  • Sex 性別
  • Age 年齢
  • Fare 乗船代金
  • Embarked どの港から乗ったか

余談

こちらは機械学習のコンテストで知られるKaggleでも最も有名なチュートリアル用の例題なので、
もしデータの操作や解析に興味がある人はぜひ問題に挑戦してみて欲しい。 データはこちらからDLできる。

Pandasでのデータ操作入門

pandasのload

pandasは慣習的にこのようにimportする。

import pandas as pd

データ(csv)のロード

まずはじめにcsvファイルのロードの仕方。

pd.read_csvでDataFrame型に変換してくれる。

titanic_df = pd.read_csv("sample.csv")
titanic_df
Survived Pclass Sex Age Fare Embarked
0 1 1 male 80.0 30.0000 S
1 1 2 female 4.0 39.0000 S
2 0 2 female 24.0 13.0000 S
3 0 2 male 37.0 26.0000 S
4 0 3 female 11.0 31.2750 S
5 1 3 female 13.0 7.2292 C
6 0 3 male 22.0 7.2500 S

pandas.DataFrame — pandas 0.20.3 documentation

データのサイズ

titanic_df.shape
(7, 6)

DataFrame.shapeでその行列のサイズ(行数, 列数)がわかる。
行数を知りたいシチュエーションは多いので、そういうときは以下のようにするのが一般的。

titanic_df.shape[0]
7

データのカラム

データのカラムは DataFrame.columnsで見ることが出来る。

titanic_df.columns
Index(['Survived', 'Pclass', 'Sex', 'Age', 'Fare', 'Embarked'], dtype='object')

行列から必要な列(カラム)を取り出す

# 1列を取り出す: [] でキーを指定 Series型が返ってくる
titanic_df['Age']
0    80.0
1     4.0
2    24.0
3    37.0
4    11.0
5    13.0
6    22.0
Name: Age, dtype: float64
# 2列以上を取り出す: []にキーの配列を指定 DataFrame型で帰ってくる
titanic_df[['Age', 'Sex']]
Age Sex
0 80.0 male
1 4.0 female
2 24.0 female
3 37.0 male
4 11.0 female
5 13.0 female
6 22.0 male

こんな風にして必要なキーだけを宣言し、絞り込むような事が多い。

valiables = ['Survived', 'Pclass', 'Sex', 'Age']
titanic_df = titanic_df[valiables]
titanic_df
Survived Pclass Sex Age
0 1 1 male 80.0
1 1 2 female 4.0
2 0 2 female 24.0
3 0 2 male 37.0
4 0 3 female 11.0
5 1 3 female 13.0
6 0 3 male 22.0

条件にマッチするデータを取り出す

1. DataFrame.queryで取り出す

ここでは DataFrame.queryによるデータの取り出し方を紹介する。

Pandasでは様々な方法で条件に合ったデータを取り出せるのだが、
.queryによる取り出しが読んだときに一番「この条件で取り出している」というのがわかりやすいと感じるので、
まずはこの方法を覚えるのが良いかと思う。

# 1つの条件にマッチするデータを取り出す
titanic_df.query('Age > 20')
Survived Pclass Sex Age
0 1 1 male 80.0
2 0 2 female 24.0
3 0 2 male 37.0
6 0 3 male 22.0
# 2つ以上の条件にマッチするデータを取り出す
titanic_df.query('(Age > 20) & (Sex == "female")')
Survived Pclass Sex Age
2 0 2 female 24.0

True/FalseのSeries型を指定し、Trueの行だけを取り出す

次に各行に対してTrue/FalseがアサインされたSeries型(列)を指定することで、Trueの行だけを取り出す書き方。

Series型に対して条件を並べると、以下のようなTrue/FalseのSeries型が返ってくる。 (numpyの配列もこういった処理に対して同じような挙動をする)

titanic_df['Age'] > 20
0     True
1    False
2     True
3     True
4    False
5    False
6     True
Name: Age, dtype: bool

このTrue/FalseのSeriesを更にDataFrameに指定することで、Trueの行だけを取り出すことができる

titanic_df[titanic_df['Age'] > 20]
Survived Pclass Sex Age
0 1 1 male 80.0
2 0 2 female 24.0
3 0 2 male 37.0
6 0 3 male 22.0

複数条件を並べる場合は()で条件同士はくくってあげる必要がある。

titanic_df[(titanic_df['Age'] > 20) & (titanic_df['Sex'] == 'female')]
Survived Pclass Sex Age IsChild
2 0 2 female 24.0 0

Queryと、この配列に条件に入れる2つの方法でデータを取り出すことが多い。

行列から必要な行番号を指定してを取り出す

行を取り出すには、DataFrame.locという関数を使っていく。

locでは、loadした時にdfの一番左に自動的に割り当てられる「index」を指定して行を取り出す。
DataFrame.loc[start:end]としたときに、startとendをどちらも含んだ状態で取り出すので注意。

titanic_df.loc[0:2]
Survived Pclass Sex Age
0 1 1 male 80.0
1 1 2 female 4.0
2 0 2 female 24.0

他にもilocやixといった行を取り出せる関数があるが、基本はlocを使う場合が多いのでまずはコレだけ覚えられればよいかと。

グループ分けと集計

groupby関数を用いると、指定された列を値毎にグルーピングしてくれる。 帰ってきたgroupbyオブジェクトで集計関数を呼び出すと、 グループごとの平均や最大値、中央値などを調べることができる。

詳しくはこちら: API Reference — pandas 0.20.3 documentation #groupby

# Survive列が0か1かで生存したかどうかを示している。
# 生存した人たちと、していない人たちで各値の平均をとってみる。
titanic_df.groupby(['Survived']).mean()
Pclass Age
Survived
0 2.5 23.500000
1 2.0 32.333333

※集計関数は、集計出来る列だけを集計してくれる。(今回は文字列のSex/Embarkedは集計されていない)

reset_index()を呼び出すことでこの行列自体を更に操作していきやすくなる。

titanic_df.groupby(['Survived']).mean().reset_index()
Survived Pclass Age
0 0 2.5 23.500000
1 1 2.0 32.333333

新たな列を追加する

詳しく知りたい方はこちらが参考になります。

sinhrks.hatenablog.com

sinhrks.hatenablog.com

固有値を追加する

ただ単に1をもつ「one」という列追加する方法。自分はassignを使うことが多い。

titanic_df.assign(
    One = 1
)
Survived Pclass Sex Age One
0 1 1 male 80.0 1
1 1 2 female 4.0 1
2 0 2 female 24.0 1
3 0 2 male 37.0 1
4 0 3 female 11.0 1
5 1 3 female 13.0 1
6 0 3 male 22.0 1

他の列を加工して新たな列を作る

Ageを加工して、20歳以下かどうかを示す列「is_child」を作る。

titanic_df.assign(
    IsChild = titanic_df['Age'] < 20
)
Survived Pclass Sex Age IsChild
0 1 1 male 80.0 False
1 1 2 female 4.0 True
2 0 2 female 24.0 False
3 0 2 male 37.0 False
4 0 3 female 11.0 True
5 1 3 female 13.0 True
6 0 3 male 22.0 False

True / False だと扱いづらいことも多いので、True=1, False=0 にして入れる場合は以下のようにする

titanic_df.assign(
    IsChild = (titanic_df['Age'] < 20).astype(int)
)
Survived Pclass Sex Age IsChild
0 1 1 male 80.0 0
1 1 2 female 4.0 1
2 0 2 female 24.0 0
3 0 2 male 37.0 0
4 0 3 female 11.0 1
5 1 3 female 13.0 1
6 0 3 male 22.0 0

書き換えてしまって良いのであればこういった書き方もできる。 ただし、この書き方はSettingWithCopyWarningが出る。

titanic_df['IsChild'] = (titanic_df['Age'] < 20).astype(int)
titanic_df
Survived Pclass Sex Age IsChild
0 1 1 male 80.0 0
1 1 2 female 4.0 1
2 0 2 female 24.0 0
3 0 2 male 37.0 0
4 0 3 female 11.0 1
5 1 3 female 13.0 1
6 0 3 male 22.0 0

他の複数列を加工して新たな列を作る

Pclass の値とSurvivedの値を足した列をつくってみる (この場合はそんな列に意味はないが・・・)

titanic_df.apply(lambda x: x['Pclass'] + x['Survived'], axis=1)
0    2
1    3
2    2
3    2
4    3
5    4
6    3
dtype: int64

これで対応するSeries型がつくれたので、Assignするだけ

titanic_df.assign(
    X=titanic_df.apply(lambda x: x['Pclass'] + x['Survived'], axis=1)
)
Survived Pclass Sex Age IsChild X
0 1 1 male 80.0 0 2
1 1 2 female 4.0 1 3
2 0 2 female 24.0 0 2
3 0 2 male 37.0 0 2
4 0 3 female 11.0 1 3
5 1 3 female 13.0 1 4
6 0 3 male 22.0 0 3

追記

こっちのほうが列×列で早い。(書き換えたかったらtitanic_df.loc[:, 'X']に代入すればいい)
↑のやつだと行ごとに処理を行うのでめっちゃ時間かかる。

titanic_df.assign(
    X=titanic_df['Pclass'] + titanic_df['Survived']
)
Survived Pclass Sex Age IsChild X
0 1 1 male 80.0 0 2
1 1 2 female 4.0 1 3
2 0 2 female 24.0 0 2
3 0 2 male 37.0 0 2
4 0 3 female 11.0 1 3
5 1 3 female 13.0 1 4
6 0 3 male 22.0 0 3

条件にあったセルだけを書き換える

例えばIsChildの1のところを1ではなく5にしてみる。

この書き方は SettingWithCopyWarningが出ることがあるのだけど良い書き方がわからないので、 知ってる方がいたら教えて欲しい。 (値自体はちゃんと変わる。)

titanic_df.loc[titanic_df['IsChild'] == 1, ['IsChild']] = 5
titanic_df
Survived Pclass Sex Age IsChild
0 1 1 male 80.0 0
1 1 2 female 4.0 5
2 0 2 female 24.0 0
3 0 2 male 37.0 0
4 0 3 female 11.0 5
5 1 3 female 13.0 5
6 0 3 male 22.0 0

setやリストに存在する値のデータだけを取り出す

PClassが1か3の場合の行を取り出したいとする。 そんなときはDataFrame.isinを使う。

target_set = set([1, 3])

condition = titanic_df['Pclass'].isin(target_set)
titanic_df[condition]
Survived Pclass Sex Age IsChild
0 1 1 male 80.0 0
4 0 3 female 11.0 5
5 1 3 female 13.0 5
6 0 3 male 22.0 0

さいごに

とりあえずいつも使っている操作をばーっと書いてみた。
Pandasは同じことをするのにいろんな書き方がある(´・ω・`)

今回も他にも書ける書き方があるにもかかわらず、使わないほうがいいと自分が思っているのはあえて紹介しなかった。 自分の書いてる書き方でも、あまりよろしくない書き方とかも有るかもしれない。

触っていくうちに皆自分のベストプラクティス的なのを見つけられるといいのかな。

おまけ

Pandasは書き方を一歩間違えるとめちゃくちゃ計算時間が遅くなったりもする。 行列計算は に対して何かをするのでなく、に対して加工を行おうとする意識が大事。 引数に axis=1が入る場合は行に対して操作を行うときなので、 自分のコードにあったら、他の書き方がないか考えてみよう。

1ヶ月で統計学入門したので「良かった本」と「学んだこと」のまとめ

前回の「ゲームプログラマからデータサイエンティストに転職しました」 の記事でもお話したとおり、5月からデータ解析する人になりました。

とはいえ、データ解析に関しては未経験。 少しでも不安を減らすために、4月の有給消化期間は統計学のお勉強しました。

今回はおすすめしてもらった中で読んで良かった本の紹介、そして読んだ本の簡単なまとめを書いて行きたいと思います。

※前提: 4月時点の自分の知識に関して

  • 自分は大学は情報科学を専攻していたが、難しい数式は苦手
  • 統計学は1コマ分受講していたが、単語を覚えている程度でかなりあやうい

まず一番最初に読みたい本 「完全独習 統計学入門」

「簡単に統計学の全体像がつかめる入門書はないか」とTwitterで相談したら、こちらの本を数名の方が薦めて下さった。

完全独習 統計学入門

完全独習 統計学入門

☆読み終えるまでの時間: 4時間

「数式がでてこない」がコンセプトな、算数程度の知識で読める入門書。
とてもわかりやすく、統計学をざくっと知るにはとてもよい本。

これから勉強しようとする人がまず最初に全体像を把握しようとする目的においてもお勧めできる。

私はこれを読みながらもっと詳しく統計学を知りたい!という気持ちを作ることができた。

統計学をどうやってビジネスに応用する? 「ビジネス活用事例で学ぶ データサイエンス入門」

ビジネス活用事例で学ぶ データサイエンス入門

ビジネス活用事例で学ぶ データサイエンス入門

☆読み終えるまでの時間: (サンプルを読み飛ばして) 3時間

勉強したデータ解析や統計手法をどのように実際のビジネスに繋げていくかという話。 統計学の本を読んだだけでは、どうやって活用していくのかが見えにくいので、そのあたりのイメージがつかめる良い本だった。

Rでサンプルがかかれているが、私は活用事例をしっかり読んで、データ加工の部分のサンプルコードは全部読み飛ばした。

「サンプルを実際に手で動かさないと意味が無いよ!」とアドバイスをいただいたので、 後ほどPythonバージョンでサンプルデータを動かしてみることにする。

たしかに実際データで実践しようとしたら、「やり方が色々有ることはわかるが、どうするのがより良いのか」みたいなのがつかめず苦戦した。 このデータならこういう風に加工するのがいい、というのを身につけておくのが作業を時短するために大事そうだと思った。

しっかり統計学を学ぶ 「統計学入門(通称:赤本)」

統計学入門 (基礎統計学?)

統計学入門 (基礎統計学?)

☆読み終えるまでの時間: 35時間

これまで得た知識をふまえ、さらに基礎がしっかり学べる本。

数式がめちゃくちゃ出て来るが、最初に記号の紹介ページがあるためとても読みやすかった。
(記号表がないと、間をあけて途中から読み始めたときに前回までの記号の意味を忘れがちなので)

1冊目にこの本を手に取ると挫折しかねないので、個人的には2冊目以降にオススメしたい。

基礎をしっかり学びたい人向けであって、「実践向けではない」と、この本を読んでいると人に話すとよく言われた。 私は基礎をしっかり知ってから応用・実践したい派なのでじっくり読んだ。

※持論: 基礎を先に時間を書けて学んだほうが、応用・実践で吸収出来ることが多い。

1日5時間読むようにしていて、大体7日間ほど(計35時間程度)で読んだ。 この本の知識が役に立つかどうかはまだわからないので、実際業務のどんなときにこの知識が役に立ったかわかったら、 また追記したい。 個人的には少なくともクライアントに「こいつ統計の基礎わかってないな」って思われないための基礎知識をつけたいという気持ちで読んだ。

※追記 2017/11/07(書いてから半年) やはり赤本レベルの知識は分析を仕事にする上最低限知っておきたい知識だった。入社前にそこそこちゃんと勉強しておいてよかった。このあたりの知識がないと適当な感覚で分析する羽目になる(乂'ω')。あとこれ読んだ記憶で統計検定2級の過去問やったら8割方理解できたのでやはりしっかり網羅されてて良い本だ。

これから読む本

他にもお勧めされている本があるので、こちらの本はこれから読んで行きたいと思っている。

※最後に書いていたのですが、次の節が長すぎるのでこちらに移動しました。

マンガでわかる統計学

マンガでわかる統計学

マンガでわかる統計学

とても有名で評判の良い本。赤本の前にこちらを読むべきだったかな、という感じのレベル感だと思われる。 (電子書籍で出てくれれば良いのだけど)

データ解析のための統計モデリング入門

こちらも有名な本。 かなり重そうなので、余裕ができたら読みたい。

統計学入門(赤本)まとめ

統計学入門については内容量が多く、読んだだけでは身につかなそうだったので、 以下に後から見直す用に、統計学入門の内容をまとめた。

これを見たからと行って統計学がわかるようなものではなく、読んだ人が後から見直して「あ〜、そうだった」って思うためのもの。 また、まだ知識がないので読み間違えている部分がある可能性がある。見つけ次第・追記修正していきたい。

絶対に覚えておきたい 統計学で使われる基本的な記号

記号 意味
 \mu 母平均
 \overline{x} 標本( x_1 , x_2 \cdots x_n)の平均
 \sigma^{2} 母分散
s^{2} 標本分散
 r_{xy}, r 標本相関係数
 r_{xy \cdot z} 相関係数
 \Omega 全事象・標本空間

一次元データ

級数kの目安 (※スタージェスの公式より)


\displaystyle  k =  1+ \log_{2} n

※棒グラフとかを書くときに、棒の数(=階級数)の目安をこれくらいにしようという話。

データの代表値

  • 算術平均(mean)
    • 一般的に「平均」と呼ばれるもの。外れ値の影響を受けるため、感覚とはズレやすい。
  • 幾何平均

    • \sqrt[n]{x_1 \cdot x_2 \cdot \cdots \cdot x_n}
  • 調和平均

  • 中央値(median)

    • 極端な外れ値の影響を受けづらい。100のデータがあれば下から50番目(真ん中)のデータの値。
  • 最頻値(mode)

データの散らばり具合を示す指標

分散  \displaystyle s^{2}=\frac{1}{n} \{ (x_1 - \overline{x})^{2}  + \cdots + (x_n - \overline{x})^{2} \}

標準偏差  s = \sqrt{s^{2}}


二次元データ

相関

積率相関係数

いわゆる相関係数と呼ばれるもの。


\displaystyle
r_{xy}=\frac
    { \frac{\sum(x_i - \overline{x})(y_i - \overline{y})} {n} }
    { \frac{\sqrt{\sum{(x_i - \overline{x}) }^{2}}}{n} \frac{\sqrt {\sum{(y_i - \overline{y}) }^{2}}}{n} }
    =
    \frac
    {\sum(x_i - \overline{x}) (y_i - \overline{y}) }
    {\sqrt {\sum{(x_i - \overline{x}) }^{2}} \sqrt {\sum{(y_i - \overline{y}) }^{2}}}

  • 分子の部分
  \frac {\sum(x_i - \overline{x}) (y_i - \overline{y}) }{n} は、偏差積の平均で、共分散(covariance,C_{xy})と呼ばれる。
  • 分母の部分はxの標準偏差S_{x}とyの標準偏差S_{y}の積。
  •  -1 \leq r_{xy} \leq 1 で、1に近い時正の相関/-1に近い時負の相関がある
  • 相関係数が0に近くても、因果関係がないとは限らない
相関係数

 |r_{xy}|が1に近くても、実はzを通して|r_{xz}||r_{yz}|が大きく、 r_{xy}には直接的な関係がない場合がある。
こういった場合に判断を間違えてしまうことが多い。

そんなときは相関係数と言って、xyzがあるときにzの影響を除いたxyの相関関係を求める。 zの影響を除いたxyの偏相関係数r_{xy \cdot z}と書き、以下の用に定義する。


\displaystyle
r_{xy \cdot z} = \frac {r_{xy} - r_{xz} \cdot r_{yz}} {\sqrt {1 - {r_{xz}}^{2}} \sqrt {1 - {r_{yz}}^{2}}}

順位相関係数

2つの質的基準がある場合の、iの順位R_{i}R'_{i}の順位の相関を表す基準を順位相関係数という。
(※例: 男性/女性ごとのなにかのランキングの順位の相関関係)

順位相関係数はスピアマンとケンドールによる定義があるが、ケンドールの方はここにかくのはめんどくさいので省く。

スピアマンの順位相関係数は以下のように定義される


\displaystyle
r_{s} = \frac{6}{n^{3} - n}  \sum {(R_{i} - R'_{i})^{2}}

時系列と自己相関

時系列を1時点ずつずらした(x_1, x_2), (x_2, x_3), \cdots , (x_{n-1}, x_n)の相関を
遅れ(lag)1の自己相関係数と言う。

遅れhの自己相関係数は以下のように定義できる。


\displaystyle
r_h = \frac
 {\sum_{i=0}^{n-h} {(x_i - \overline{x})(x_{i+h} - \overline{x}) /  (n - h)}}
 {\sum_{i=0}^{n} {(x_i - \overline{x})^{2}} / n}

例: 一月ごとの売上のデータがあり、毎年同じ月には似た傾向ある場合、r_{12}の自己相関係数が大きくなる

回帰

直線回帰

2変数x,yで、一方のxが他方のyを左右する関係がある時、 xを独立変数 yを従属変数という。

その時 x と y には  y=bx+a という関係式が成立することが想像される。 最小二乗法によって最適なa,bを求める。


\displaystyle
b  =  \frac
{ \sum {x_i y_i - n \overline{x} \overline{y}}}
{ \sum {{x_i}^{2} - n {\overline{x}}^{2}}}


a  =  \overline{y} - b \overline{x}

この b偏回帰係数もしくは回帰係数と呼ばれる。 また、回帰係数は以下のようにも表される。


\displaystyle
b = \frac
{\sum{(x_i - \overline{x}) (y_i - \overline{y})}}
{\sum{(x_i - \overline{x})^{2}} }

さらに、 bとxとyの相関係数r_{xy}の間には、b=r_{xy} \frac{S_y}{S_x} という関係が成立する。

重回帰

独立変数が 2つ以上の場合、重回帰という。

独立変数の数が2だった場合、  y = b_1 x_1 + b_2 x_2 + a となり、直線ではなく三次元空間における平面への当てはめとなる。


確率

条件付確率

既にBの条件を満たすことがわかっている場合のAの確率を、
Bを条件とするAの条件付確率(P(A|B))と言い、以下で表される


\displaystyle
 P(A|B) = \frac { P(A \cap B) } { P(B) }

ベイズの定理

A を得られた結果、  H_1, H_2, \cdots , H_kを原因とする。 一般に得られるのは原因があった場合の結果の確率、つまり P(A|H_i)で有る場合がほとんど。 ベイズの定理は、結果からの原因 P(H_i|A)を求める定理である。

 H_1, H_2, \cdots, H_kが互いに排反で H_1 \cup H_2 \cup  \cdots \cup  H_k = \Omegaである時、以下の規則が成り立つ。 
\displaystyle
P(H_i|A) = \frac { P(H_i) \cdot P(A|H_i) } { \sum{P(H_j) \cdot P(A|H_j)} }

この時、P(H_i)H_i事前確率P(H_i|A)事後確率と呼ばれる。
※事前、事後は事象Aが起こることを基準としている


確率変数

基本的な変数

期待値  E(X)
  •  E(X) = \sum xf(x) (離散)
  •  E(X) = \int_{-\infty}^{\infty} xf(x) dx (連続)
分散  V(X)

 V(X) = E{(x - \mu)^2} = E(X^{2}) - (E(X))^{2}

標準偏差

 D(X) = \sqrt {V(X)}

歪度(わいど)と尖度(せんど)

歪度

確率分布の左右の非対称性の指標

 \displaystyle \alpha_3 = \frac{E(x - \mu)^{3}}{\sigma^{3}} = \frac{E(X^{3}) - 3 \mu E(X^{2}) + 2 \mu^{3}}{\sigma^{3}}

 |\alpha_3|の大きさが、歪みの大きさ。  \alpha_3 \lt 0 なら左の裾が長く、 \alpha_3 > 0ならば右の裾が長い。

尖度

尖りの程度を示す指標

 \alpha_4 = E(X - \mu)^{4} / \sigma^{4}

ふつうは \alpha_4 = 3 と比較する。
 \alpha_4 - 3 \lt 0ならば正規表現よりも丸く鈍い形をしており、
 \alpha_4 - 3 \gt 0ならば正規表現よりも尖っている。

モーメント

以下をXの\gamma次のモーメント(積率)という。
 \mu_\gamma = E(X^{\gamma})

以下を期待値(平均)まわりの\gamma次のモーメントという。
 \mu'_\gamma = E(X - \mu)^{\gamma}

  •  \mu_1 = E(X) は期待値
  •  \mu'_2 = E(X - \mu)^{2}は分散
  •  \mu_0 \equiv 1, \mu'_1 \equiv 0,

また、
以下は\gamma次の標準化モーメントと呼ばれる。
 \alpha_\gamma = E{ (X - \mu) / \sigma}^{\gamma}

※ 歪度の \alpha_3, 尖度の \alpha_4

チェビシェフの不等式

E(X), V(X)のみがわかっている時、一般に以下が成り立つ。

 P(|X - \mu| \ge k\sigma) \le \frac{1}{k^{2}}

つまり、平均からn\sigma以上離れた値は、全体の \frac{1}{n^{2}}を超えることはないということである。

確率分布

このあたりは完全に理解できてはいないのでメモ程度。 また復習し直したい。

二項分布

2種類の結果がありそれが起こる確率が p, 1-pであるような試行をn回繰り返したときの確率分布。 Bi(n, p)で表す。

また、 Bi(1, p)をベルヌーイ分布ということがある。

ポアソン分布

二項分布において、pが小さく、nが大きい場合


 \displaystyle
 f(x) = \frac{e^{-\lambda}\lambda^{x}}{x!}

  • ポアソン分布はPo(\lambda)で表す。
  •  E(X) = \lambda, V(X) = \lambda
    • 確率変数Xがポアソン分布Po(\lambda)に従うとき期待値と分散が等しく\lambdaとなるのが、大きな特徴である。

正規分布


\displaystyle
f(x) = \frac{1}{ \sqrt{2\pi} \sigma } exp{ -(x - \mu)^{2} / 2\sigma^{2} }

指数分布とガンマ分布

指数分布

 f(x) = \lambda e^{-\lambda x}

  •  E(X) = 1/\lambda, V(X) = 1 / \lambda^{2}
ガンマ分布

ガンマ分布は指数分布を一般化*1したものであり、以下の確率密度関数で表される。

期間\gammaごとに1回起こるランダムな事象がn回起こるまでにどれだけかかるかの分布。

 f(x) =
\displaystyle
\frac{\lambda^{\alpha}}{\Gamma(\alpha)} x^{\alpha-1} e^{-\lambda x}

 \Gamma(\alpha)で割られているのは規格化のためである。  \Gamma(\alpha) =
\int_{0}^{\infty} x^{\alpha-1} e^{-x}dx

 \Gamma(\alpha) \alpha が正整数なら(\alpha - 1)!に一致する。また、 \Gamma (\frac{1}{2})= \sqrt{\pi}

  • \alpha, \lambdaで指定されるガンマ分布を Ga(\alpha, \lambda)と表す。
  •  E(X) = \alpha/\lambda, V(X) = \alpha / \lambda^{2}

ベータ分布

 \alpha \gt 0, \beta \gt 0 のとき、ベータ分布は Be(\alpha, \beta)で表す。

 B(\alpha, \beta)積分して1にするための規格化定数である。  B(\alpha, \beta) = \int_{0}^{1} x^{\alpha - 1}(1-x)^{\beta-1}dx
= \Gamma(\alpha)\Gamma(\beta) / \Gamma(\alpha+\beta)

その他の確率分布

以下はまた必要になったときに調べようと思う。

  • コーシー分布
  • 対数正規分布
  • パレート分布
  • ワイブル分布

多次元の確率分布

共分散

 Cov(X, Y) = E \{ (X - E(X)) (Y-E(Y))  \}  =  E(XY) - E(X)E(Y)

 Cov(X, Y) \lt 0 ならXYは大小が反対傾向、 Cov(X, Y) \gt 0なら同傾向。

E(XY)の計算方法:

  • 離散型  E(XY) = \sum_{x} \sum_{y} xy \cdot f(x, y)
  • 連続型  E(XY) = \int \int_{S} xy  f(x, y) dxdy

相関係数

 \rho_{xy} = Cov(X, Y) / \sqrt{V(X)} \cdot \sqrt{V(Y)} ( -1 \le \rho_{xy} \le 1)

大数の法則中心極限定理

大数の法則

標本を増やせばほとんど母集団と同じ様なデータ分布になるよね、というような話。 読むのがよい。

中心極限定理

母集団が何であってもnが十分に大きければ和  X_{1} + \cdots + _{n}の確率分布の形は、だいたい正規分布になる、というような話。 読むのがよい。

標本分布

パラメトリックとノンパラメトリック

言葉としてよく出てくる。

  • パラメトリックの場合: 母集団の分布についてすべて知ることが出来る場合のこと
  • ノンパラメトリックの場合: 母集団の分布の具体的な形が事前にわからない場合のこと(正規分布に従うのか?他の分布に従うのか?等)

母数と統計量

  • 標本: サンプルデータのこと
  • 母集団: 全体のデータのこと
標本平均

 \displaystyle E(\overline{X}) = \frac{X_1 + \cdots + X_n}{n}

  • データが正規分布に従う時  \overline{X} = \mu
  • 標本数が十分に大きい場合  E(\overline{X}) = \mu
標本分散

 \displaystyle
s^{2} = \frac{1}{n - 1} \{  (X_{1} - \overline{X})^{2} + \cdots + X_{n} - \overline{X})^{2}  \}
※標本分散は n - 1 で割ったものであることに注意!この n - 1を自由度という。

  • データが正規分布に従う時、 s^{2} = \sigma^{2} / n
  • 標本数が十分に大きい場合、 E(s^{2}) = \sigma^{2}

推定

最尤法

パラメトリック(どんな分布に従うのかがわかる)な場合、「現実の標本は確率最大の物が実現した」と仮定し、 分布のパラメータを推定することが出来る。

分布fに従う独立なn個の標本がある場合、同時確率は以下である。(※fはデータの確率分布関数)

 L(\theta) = \prod f(x_i)

計算のしやすさのために対数をとり、

 l(\theta) = log L(\theta)

 l(\theta)の値が最大になるfのパラメータを求めることで、パラメータの推定を行う。

モーメント法

母モーメント=標本モーメントとして推定を行う。
ノンパラメトリックな場合にも使える

区間推定

※この区間推定の節は2017/11/06追記

正規母集団の母平均の区間推定

母平均  \mu の 信頼係数 1 - \alpha の信頼区間

 \displaystyle
 \left[ \overline{X} - Z_{\alpha/2} \cdot \frac{\sigma}{\sqrt{n}} ,\   \overline{X} + Z_{\alpha/2} \cdot \frac{\sigma}{\sqrt{n}} \right]

※Zは標準正規分布に従う変数

また、  \sigma^{2}がわからない時は、

\displaystyle
\left[ \overline{X} - t_{\alpha/2}(n - 1) \cdot s / \sqrt{n} ,\  \overline{X} + t_{\alpha/2}(n - 1) \cdot s / \sqrt{n} \right]

 t_{\alpha}(n) はt分布に従う変数

正規母集団の母分散の区間推定

母分散 \mu の信頼係数 1-\alphaの信頼区間

 \displaystyle
\left[ \frac {(n-1)s^{2}} { \chi^{2}_{2/\alpha} (n-1) }, \
\frac {(n-1)s^{2}} { \chi^{2}_{1- 2/\alpha} (n-1) } \right]

 \chi^{2}_{\alpha}(n)  \chi^{2}分布に従う変数

2つの正規母集団の母平均の比の区間推定

 N(\mu_{1}, \sigma_{1}^{2}), N(\mu_{2}, \sigma_{2}^{2})の2つ集団から、 [tex: X_{1} \cdots X_{m}, Y{1} \cdots Y{n}]を抽出したときの、\mu_{1},\mu_{2}の差の区間推定

2つの母分散が等しく \sigma_{1}^{2} = \sigma_{2}^{2} = \sigma^{2} である場合、 2つの標本分散は \displaystyle
s^{2} = \frac {1}{m + n - 2} \left\{
   \sum_{m}^{i=1} (X_{i} - \overline{X})^{2}
+
  \sum_{n}^{j=1} (Y_{j} - \overline{Y})^{2}
\right \}

2標本のt統計量 \displaystyle
t = \frac{(\overline{X} - \overline{Y}) - (\mu_{1} - \mu_{2})} {s \sqrt{1/m + 1/n}}

は自由度は  m + n - 2に従う。したがって信頼係数 1-\alphaの信頼区間

\displaystyle
\left[
\overline{X} - \overline{Y} - t_{\alpha/2}(m+n-2) s \sqrt{ \frac{1}{m} + \frac{1}{n} }, \
\overline{X} - \overline{Y} + t_{\alpha/2}(m+n-2) s \sqrt{ \frac{1}{m} + \frac{1}{n} }
\right]

仮説検定

母集団について仮定された命題を標本に基いて検証すること。

帰無仮説と対立仮説

帰無仮説(たてた仮説)と、帰無仮説と反対の対立仮説をたてる。 有意水準(5%や1%等)を決めて、棄却域に入らなかった場合に 有意水準n%で帰無仮説を棄却しない、入らなかった場合に棄却する。

Aという帰無仮説が採択されても、それは「Aは矛盾しない」ということが分かっただけであり、 正しいと証明されるわけではない。

様々な検定

検定対象 検定方法
母平均に関する検定 t検定
母分散に関する検定 \chi^{2}検定
母平均の差の検定 ウェルチの検定
母分散の比の検定 F検定

実際の検定のやり方については必要なときに調べる。

回帰分析

X : 説明変数/独立変数 Y : 目的変数/従属変数

回帰: 「YをXで説明」すること

  • Xが単独の場合、単回帰分析
  • Xが複数の場合、 重回帰分析

さいごに

いろんな本を読んでみての感想

統計学はビジネスサイドの人、研究者の人、エンジニアの人等色んなが学ぼうとする分野です。 そのため、いろんな人を対象とした本がでています。 統計学を学ぼうと思ったときは「統計学の有名な本」ではなくて、「自分にとっての良いレベルの本」を選ぶのがとても大事だと思いました。

学んでいてとても興味深い分野だったので、これからもっと学んでいきたいですヽ(=´▽`=)ノ

目次

最後の最後だけど、今回の目次です。

*1: x^{\alpha-1} e^{-\lambda x}の部分は\alpha = 1なら、指数分布になる。