Pythonでデータの分析を出来るようになりたい（その２）

(その２）

（文中に出てくるページ参照は [統計学が最強の学問である［実践編］データ分析のための思想と方法 - 西内啓 著](http://www.diamond.co.jp/book/9784478028230.html) という本のページです。）

#コインを2回投げるを1セットとして2セット投げた時の確率

その２では、P61の例のように、「2回投げる」＝「1セット」として、2セット投げた場合（つまりコインは4回投げる）の結果を考える。
コインは4回投げられるから、表が出るパターンは

- 表が0回
- 表が1回
- 表が2回
- 表が3回
- 表が4回

の5通り。

#コード

``` python

from random import randint
from decimal import Decimal
from prettytable import PrettyTable
import numpy as np

def tossBiasedCoin():
    """ Returns 0 or 1 with 0 having 2/3 chance """
    return randint(0,2) % 2

# Make a 3x3 array
counts = [[0 for j in range(3)] for i in range(3)]

# Toss a coin many times to get counts
sampleCount = 50000
for num in range(sampleCount):    
    firstSet = [tossBiasedCoin(),tossBiasedCoin()]
    secondSet = [tossBiasedCoin(),tossBiasedCoin()]
    counts[sum(secondSet)][sum(firstSet)] += 1

# Conert all counts to perentage
TWOPLACES = Decimal(10) ** -2 
for i in range(3):
    for j in range(3):
        value = counts[i][j]        
        counts[i][j] = (100 * Decimal(counts[i][j])/Decimal(sampleCount)).quantize(TWOPLACES)
        print("Converted the value {} to percentage {}".format(value, counts[i][j]))

# Make summaries of number of heads.
keys = np.arange(5)
values = [counts[0][0], # 0
          counts[0][1]+counts[1][0], # 1
          counts[0][2]+counts[2][0]+counts[1][1],
          counts[1][2]+counts[2][1],
          counts[2][2]]
          
# Add row descriptions
counts[0].insert(0, '2nd set 0 head')
counts[1].insert(0, '2nd set 1 head')
counts[2].insert(0, '2nd set 2 heads')

# Create table with column descriptions, add rows, then show it.
table = PrettyTable(["", "1st set 0 head", "1st set 1 head", "1st set 2 heads"])
table.padding_width = 1
table.add_row(counts[0])
table.add_row(counts[1])
table.add_row(counts[2])
print table

# Draw a bar chart
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
rects = plt.bar(keys,
                 values, 
                 0.5,
                 alpha=0.4,
                 align="center", 
                 color='b')

plt.xlabel('Number of heads with two sets')
plt.ylabel('Probability (%)')
plt.title('Probabilities heads with a biased coin')
plt.xticks(keys, np.arange(5))

plt.tight_layout()
plt.show()
```

基本的には前回とほとんど同じプログラム構造。

##結果を格納する変数が増えた
図1-19と同じにするために3x3の list を作る。

```py
# Make a 3x3 array
counts = [[0 for j in range(3)] for i in range(3)]
```

##コインを2セット（1セット=2回）投げる

50万回ループさせ、毎回合計4回コインを投げる。

```py
# Toss a coin many times to get counts
sampleCount = 50000
for num in range(sampleCount):    
    firstSet = [tossBiasedCoin(),tossBiasedCoin()]
    secondSet = [tossBiasedCoin(),tossBiasedCoin()]
    counts[sum(secondSet)][sum(firstSet)] += 1
```

##棒グラフのデータの準備

ちょっと面倒になってきた。「表が2回（枚）」でるパターンは、2セットの内、
1セット目が2枚、2セット目が0枚
1セット目が0枚、2セット目が2枚
1セット目が1枚、2セット目が1枚
の3通りあるから、それをすべて足す。

```py
# Make summaries of number of heads.
keys = np.arange(5)
values = [counts[0][0], # 0
          counts[0][1]+counts[1][0], # 1
          counts[0][2]+counts[2][0]+counts[1][1],
          counts[1][2]+counts[2][1],
          counts[2][2]]
```

##表のデータの準備

2x2構造から3x3構造に変えるために、3行目を加える。

```py
# Add row descriptions
counts[0].insert(0, '2nd set 0 head')
counts[1].insert(0, '2nd set 1 head')
counts[2].insert(0, '2nd set 2 heads')
```

##表と棒グラフを作る

基本的には増えた分に対応して変更を加えている。

```py
# Create table with column descriptions, add rows, then show it.
table = PrettyTable(["", "1st set 0 head", "1st set 1 head", "1st set 2 heads"])
table.padding_width = 1
table.add_row(counts[0])
table.add_row(counts[1])
table.add_row(counts[2])
print table

# Draw a bar chart
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
rects = plt.bar(keys,
                 values, 
                 0.5,
                 alpha=0.4,
                 align="center", 
                 color='b')

plt.xlabel('Number of heads with two sets')
plt.ylabel('Probability (%)')
plt.title('Probabilities heads with a biased coin')
plt.xticks(keys, np.arange(5))

plt.tight_layout()
plt.show()
```

#結果

![image](https://qiita-image-store.s3.amazonaws.com/0/103139/abf7feaf-85ef-ee07-2882-a34c1d85de3a.png)

なんだか「標準偏差」のグラフっぽく見えて来たぞ！っというのがこの本の、この章がデモンストレーションしようとしているそもそもの内容。

さらに「表が1枚」になる確率が一番高いのが分かる。これは「4回投げて表が出る確率（1/3）」はすなわち「4 x 1/3」＝ 1.333。つまり「4枚投げりゃぁだいたい表が1枚でるぞ」ということを表している。

[（その３）](http://qiita.com/yoshiwatanabe/items/09cd9814f1abc7c18c93)につづく。