In [26]:
#!/usr/bin/python
#-*- encoding: utf-8 -*-
"""
Sample Codes for ThinkStats2 - Chapter3
Copyright 2015 @myuuuuun
URL: https://github.com/myuuuuun/ThinkStats2-Notebook
License: GNU GPLv3 http://www.gnu.org/licenses/gpl.html
"""
%matplotlib inline
from __future__ import division, print_function
import sys
sys.path.append('./code')
import pandas as pd
import nsfg
import custom_functions as cf
import sys
import math
import numpy as np
import thinkstats2
import thinkplot
Histオブジェクトのvalueが確率になるよう、総数で割る
In [5]:
hist = thinkstats2.Hist([1, 2, 2, 3, 5])
n = hist.Total()
d = {}
for x, freq in hist.Items():
d[x] = freq / n
print(d)
Pmfオブジェクトを使えば、同じことができる
In [6]:
pmf = thinkstats2.Pmf([1, 2, 2, 3, 5])
print(pmf)
例えば、実現値が"2"となる確率、"5"となる確率、"4"となる確率は
In [8]:
print(pmf.Prob(2))
print(pmf.Prob(5))
print(pmf.Prob(4))
次に、pmfのあるkeyのをとる確率を変更してみる。例えば、"2"をとる確率を0.2増やすと、
In [9]:
pmf.Incr(2, 0.2)
print(pmf.Prob(2))
このように0.6になる。しかし、これでは全確率は1になっていない。実際
In [12]:
print(pmf)
print(pmf.Total())
となって、全確率が1.2になってしまっている。そこで、全確率を1になおしてみる。
In [14]:
pmf.Normalize()
print(pmf)
print(pmf.Total())
とすると、全確率を1に標準化してくれる。
確率を変更する方法は他にも、ある値を取る確率をn倍するMultや、
In [16]:
pmf = thinkstats2.Pmf([1, 2, 2, 3, 5])
print(pmf)
pmf.Mult(2, 0.5)
print(pmf)
pmf.Normalize()
print(pmf)
単純に書き換える方法
In [18]:
pmf[2] = 0.2
print(pmf)
pmf.Normalize()
print(pmf)
もある。
棒グラフを横に並べたり重ねたりして、Pmfの様子をプロット
In [39]:
df = nsfg.ReadFemPreg()
live = df[df.outcome == 1]
firsts = live[df.birthord == 1]
others = live[df.birthord > 1]
weeks_f = firsts['prglngth']
weeks_o = others['prglngth']
first_pmf = thinkstats2.Pmf(weeks_f)
other_pmf = thinkstats2.Pmf(weeks_o)
width = 0.45
# 横並べ
thinkplot.PrePlot(2, cols=2) # グラフを2つ横に並べる
thinkplot.Hist(first_pmf, align='right', width=width)
thinkplot.Hist(other_pmf, align='left', width=width)
thinkplot.Config(xlabel='weeks', ylabel='probability', axis=[27, 46, 0, 0.6])
# 重ねる
thinkplot.PrePlot(2)
thinkplot.SubPlot(2)
thinkplot.Pmfs([first_pmf, other_pmf])
thinkplot.Show(xlabel='weeks', axis=[27, 46, 0, 0.6])
In [43]:
weeks = range(35, 46)
diffs = []
for week in weeks:
p1 = first_pmf.Prob(week)
p2 = other_pmf.Prob(week)
diff = 100 * (p1 - p2)
diffs.append(diff)
thinkplot.Bar(weeks, diffs)
thinkplot.Show(xlabel='weeks', ylabel='difference in percentage (firsts - others)')
実際の受講人数の平均は
In [6]:
d = { 7: 8, 12: 8, 17: 14, 22: 4,
27: 6, 32: 12, 37: 8, 42: 3, 47: 2 }
pmf = thinkstats2.Pmf(d, label='actual')
print('mean', pmf.Mean())
生徒の中からランダム・サンプルを取った場合に想定される受講人数の分布を求める
In [7]:
def BiasPmf(pmf, label):
new_pmf = pmf.Copy(label=label)
for x, p in pmf.Items():
new_pmf.Mult(x, x)
new_pmf.Normalize()
return new_pmf
アンケート結果と実際の受講者人数の分布を並べて描く
In [19]:
biased_pmf = BiasPmf(pmf, label='observed')
thinkplot.PrePlot(2)
thinkplot.Pmfs([pmf, biased_pmf])
thinkplot.Show(xlabel='class size', ylabel='PMF')
アンケートで得た観測データから、バイアスを修正した後の受講人数の推定値の分布を求める
In [22]:
def UnbiasPmf(pmf, label):
new_pmf = pmf.Copy(label=label)
for x, p in pmf.Items():
new_pmf.Mult(x, 1.0/x)
new_pmf.Normalize()
return new_pmf
アンケート結果と実際の受講者人数の分布を並べて描く
In [23]:
unbiased_pmf = UnbiasPmf(biased_pmf, label='inverted_observed')
thinkplot.PrePlot(2)
thinkplot.Pmfs([pmf, unbiased_pmf])
thinkplot.Show(xlabel='class size', ylabel='PMF')
適当にデータフレームを作る
In [28]:
array = np.random.randn(4, 2)
df = pd.DataFrame(array)
print(df)
列に名前をつける(列につけた名前をindexという)
In [30]:
columns = ['A', 'B']
df = pd.DataFrame(array, columns=columns)
print(df)
行に名前をつける(行に付けた名前をlabelという)
In [33]:
index = ['a', 'b', 'c', 'd']
df = pd.DataFrame(array, columns=columns, index=index)
print(df)
ある列の値は、次のようにとり出す
In [36]:
print(df['A'])
print("\n or \n")
print(df.A)
ある行の値は、次のようにとり出す
In [37]:
print(df.loc['a'])
print("\n or \n")
print(df.iloc[0]) # 行に名前をつけたあとから、行番号で行をとり出すことも出来る
配列でとり出す行のラベルを複数指定することも出来る
In [40]:
indices = ['a', 'c']
print(df.loc[indices])
print(df.loc[['a', 'c']]) # 上と同じこと
スライスも使える
In [41]:
print(df['a':'c'])
スライスでは数字も使える
In [42]:
print(df[0:2])
In [ ]: