ThinkStats (15)

連続分布の章、面白いですね。練習問題も確認してみます。

練習問題 4-1

ええと、平均が 32.6 の指数分布ということは λ は (/ 1 32.6) という理解で良いのかな。ええと、

[random.expovariate(1/32.6) for i in range(44)]

で CDF を作って云々、なのかな。あとは myplot を使うのであれば以下、とありますね。

myplot.Cdf(cdf, complement=True, xscale='linear', yscale='log')

と、思ったら 4 章なのか。

ぬぬ

諸々なファイルをコピィして試してみたんですが

>>> import random
>>> import Cdf
>>> import myplot
>>> cdf = Cdf.MakeCdfFromList([random.expovariate(1/32.6) for i in range(44)])
>>> myplot.Cdf(cdf, complement=True, xscale='linear', yscale='log')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "myplot.py", line 184, in Cdf
    line = pyplot.plot(xs, ps, label=cdf.name, **options)
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 2467, in plot
    ret = ax.plot(*args, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 3893, in plot
    for line in self._get_lines(*args, **kwargs):
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 322, in _grab_next_args
    for seg in self._plot_args(remaining, kwargs):
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 310, in _plot_args
    seg = func(x[:,j%ncx], y[:,j%ncy], kw, kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 260, in _makeline
    self.set_lineprops(seg, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 201, in set_lineprops
    raise TypeError, 'There is no line property "%s"'%key
TypeError: There is no line property "xscale"

あら、何これ。ちなみに引数略すると以下な戻りな件。

>>> myplot.Cdf(cdf, complement=True)
{'xscale': 'linear', 'yscale': 'linear'}

ソース見てみるに以下で良いのかな。つうかこのまま Show すれば良かったらしい。

>>> myplot.Cdf(cdf, transform='exponential')
{'xscale': 'linear', 'yscale': 'log'}
>>> myplot.Show()

出力が以下なんですが微妙だなぁ。
exercise 4.1
標本が 44 個では少ないということなのか。

標本を約 10 倍に増やしてみる

これ、直線にならんな。引数が微妙なのかどうか。ええと、普通に描画すると指数分布なグラフが出力されますね。

>>> myplot.Cdf(cdf)
{'xscale': 'linear', 'yscale': 'linear'}
>>> myplot.Show()

ちなみに手続き定義を見るに transform='exponential' な場合は以下がアレなのか。

    xs, ps = cdf.Render()
    scale = dict(xscale='linear', yscale='linear')

    if transform == 'exponential':
        complement = True
        scale['yscale'] = 'log'

    if complement:
        ps = [1.0-p for p in ps]

    line = pyplot.plot(xs, ps, label=cdf.name, **options)
    return scale

んーと、complement な分岐を見るに -λ な直線にはならない記述ですね。あら、でも y 軸を対数に云々、って記述があるなぁ。むむむ。