“みたけ山トレイルラン”のCDF

“みたけ山トレイルラン”のCDFをグラフにしてみます。

以下の内容の続きです
”みたけ山トレイルラン”のPMF

”みたけ山トレイルラン”のPMF

再びの”みたけ山トレイルラン”のヒストグラム

再びの”みたけ山トレイルラン”のヒストグラム

#CDF
累積分布関数(CDF)
 値をパーセンタイル順位に対応づける関数

パーセンタイル順位とは
 分布中の与えられた値以下の値が分布中に占めるパーセント

たとえば、テストの順位で90パーセンタイル順位だった場合、受験者の90パーセントの人と同じかより良い結果をだしたということ。

CDFのグラフの出し方

#秒に変換
df['D'] = df['A'] / pd.to_timedelta('00:00:01') //1

df.head(10)
Out[133]: 
         A     B        C       D
0 01:05:03  13.0 01:05:00  3903.0
1 01:07:10  13.0 01:05:00  4030.0
2 01:07:52  13.0 01:05:00  4072.0
3 01:12:00  14.0 01:10:00  4320.0
4 01:12:14  14.0 01:10:00  4334.0
5 01:12:31  14.0 01:10:00  4351.0
6 01:12:54  14.0 01:10:00  4374.0
7 01:13:23  14.0 01:10:00  4403.0
8 01:13:44  14.0 01:10:00  4424.0
9 01:13:54  14.0 01:10:00  4434.0


cdf = thinkstats2.Cdf(df['D'])
thinkplot.Cdf(cdf)


#グラフ化の体裁を整える
plt.xticks([3600, 4500, 5400, 6300, 7200, 8100,9000,9900], ['1:00:00','1:15:00','1:30:00','1:45:00','2:00:00','2:15:00','2:30:00','2:45:00'])
plt.xlabel('TIME') 
plt.ylabel('CDF')

最初にデータフレームのD列で秒表示にしているのはthinkplotでグラフにできないからです。

グラフはこうなります。

mitake_cdf

CDFを計算すればパーセンタイル順位の計算は簡単にできまうす。Cdfクラスには2つのメソッドが用意されています。

パーセンタイル順位
PercentileRank(X)
 値xについてパーセンタイル順位を計算する。

Percentile(p)
 パーセンタイル順位について対応する値xを計算する

パーセンタイル順位を計算するにはA列でCDFを計算しておいたほうがよいです。

cdf2 = thinkstats2.Cdf(df['A'])

パーセンタイル順位の計算

cdf2.PercentileRank(pd.to_timedelta('1:45:00'))
Out[143]: 25.518925518925517

#今回はタイムが早いほうが順位が高いので、パーセンタイル順位は

100 - 25.518925518925517
Out[144]: 74.48107448107449

になります。

逆は例えば90パーセンタイル順位を知りたいとすると
以下のようにできます。

#パーセンタイル順位から対応する時間を計算
cdf2.Percentile(10)
Out[57]: Timedelta('0 days 01:30:00')

こんな感じです。

以上

”みたけ山トレイルラン”のPMF

”みたけ山トレイルラン”の結果をヒストグラムにしてみたので、今回は確率質量関数にしてグラフをつくってみます。

前回
再びの”みたけ山トレイルラン”のヒストグラム
http://jbclub.xii.jp/?p=573

PMFとは
 確率質量関数(probability mass function, PMF)

PMFは正規化されているので全体としての確率は1となる。
thinkstats2が提供するPmfクラスを使うと簡単です。
↓のデータフレームは前回と一緒です。

df.head(10)
Out[81]: 
         A     B        C
0 01:05:03  13.0 01:05:00
1 01:07:10  13.0 01:05:00
2 01:07:52  13.0 01:05:00
3 01:12:00  14.0 01:10:00
4 01:12:14  14.0 01:10:00
5 01:12:31  14.0 01:10:00
6 01:12:54  14.0 01:10:00
7 01:13:23  14.0 01:10:00
8 01:13:44  14.0 01:10:00
9 01:13:54  14.0 01:10:00

pmf = thinkstats2.Pmf(df['B'])
pmf2 = thinkstats2.Pmf(df['C'])
※CはTimedelta型になっているので、プロットするときにthinkiplotクラスを使うことができない。そのため、プロットする際はBを使用する。

Pmfを棒グラフで描画するときはthinkplot.Histを使う。
Pmfをステップ関数として描画する場合はthink.Pmfを使う。

thinkplot.Hist(pmf)
plt.xticks([12, 15, 18, 21, 24,27,30,33], ['1:00:00','1:15:00','1:30:00','1:45:00','2:00:00','2:15:00','2:30:00','2:45:00'])
plt.xlabel('TIME') 
plt.ylabel('PMF') 

mitake_pmf_hist

thinkplot.Pmf(pmf)
plt.xticks([12, 15, 18, 21, 24,27,30,33], ['1:00:00','1:15:00','1:30:00','1:45:00','2:00:00','2:15:00','2:30:00','2:45:00'])
plt.xlabel('TIME') 
plt.ylabel('PMF') 

mitake_pmf

PMFにすると何がよいのでしょうか。おそらく、二つのグラフを比較するときに分かりやすくなるのだと思います。確率なので標本サイズの違いで紛らわしくなることなく比較できます。今回はほかの比較する用のデータがないので描画してませんが、データがあれば描画してみたいです。ただ、こういう大会結果のデータはPDFで掲載されているので、PDFからCSVへ変換するところが物凄い大変なんですよね。大会関係者は、CSVファイルで掲載してほしいところです。

以上

ThinkStats2のコードは以下からダウンロードできます。
https://github.com/AllenDowney/

再びの”みたけ山トレイルラン”のヒストグラム

今年もまた、みたけ山トレイルランに参加するのですが、再び以前の記録の分布をみてみたくなりましたので、
違う方法で再度ヒストグラムにしてみます。
今回は”Think Stats 第2版 ―プログラマのための統計入門”で提供されているコードを使いました。

ThinkStats2のコードは以下からダウンロードできます。
https://github.com/AllenDowney/

以前のヒストグラム
http://jbclub.xii.jp/?p=532

準備

from pandas import Series, DataFrame
import pandas as pd
import numpy as np
%pylab

thinkstats2のimport

cd C:\ThinkStats2-master\code
import thinkstats2
import thinkplot

データの取り込み

tm = pd.read_csv('C:\work\mitake\mitake2.csv',skiprows=1, names=['Rank', 'No','FamilyName','FirstName','Age','Sex','Pref','Time'], encoding='utf-8')

時間の変換

tmd = pd.to_timedelta(tm['Time'])

ここまでは以前と同じです。

#データフレーム化
df = DataFrame(dict(A=tmd))
df['B'] = df['A'] / pd.to_timedelta('00:05:00') // 1
df['C'] = df['B'] * pd.to_timedelta('00:05:00')

df.head(10)
Out[28]: 
         A     B        C
0 01:05:03  13.0 01:05:00
1 01:07:10  13.0 01:05:00
2 01:07:52  13.0 01:05:00
3 01:12:00  14.0 01:10:00
4 01:12:14  14.0 01:10:00
5 01:12:31  14.0 01:10:00
6 01:12:54  14.0 01:10:00
7 01:13:23  14.0 01:10:00
8 01:13:44  14.0 01:10:00
9 01:13:54  14.0 01:10:00

Aは元の時間のデータです。
BはAを5分で割った値の整数部分です。今回5分毎のヒストグラム(5分事の時間帯に何人いるのか)を出すため5分で割っていますが、10分毎にするなら10分で割ります。
CはBに再度掛け算しています。この値が、その人がどの時間帯に属するかを示しています。
ここが一番引っかかったところで、インデックスされている時間を再サンプリングするやり方はresampleメソッドを使って簡単にできるのですが、時間データの変換をどうするかよくわからず、こういうやり方になってしまいました。うまいやり方があればどなたか教えてほしいです。

ここでthinkstats2のクラスHistをつかってヒストグラムを作成し、thinkplotでグラフ化します。

hist = thinkstats2.Hist(df['B'])
thinkplot.Hist(hist)

グラフ化の体裁を整えます。

plt.xticks([12.5, 15.5, 18.5, 21.5, 24.5,27.5,30.5,33.5], ['1:00:00','1:15:00','1:30:00','1:45:00','2:00:00','2:15:00','2:30:00','2:45:00'])
plt.xticks([12, 15, 18, 21, 24,27,30,33], ['1:00:00','1:15:00','1:30:00','1:45:00','2:00:00','2:15:00','2:30:00','2:45:00'])
plt.xlabel('TIME') 
plt.ylabel('COUNT') 

これでいったんできました。

mitake_hist2

以前の図とおんなじですね。
http://jbclub.xii.jp/?p=532

以上

return top