当ページのリンクには広告が含まれています。
目次
この記事の対象者
・ データサイエンティストを目指している人
・ Pythonで標本分散、標本標準偏差、パーセンタイル値、平均の表示方法を学びたい人
以降はデータサイエンス100本ノックの問題を題材に、標本分散、標本標準偏差、パーセンタイル値、平均の表示方法について学んでいきます。
データサイエンス100本ノックの始め方は、以下の記事を参考にしていただければと思います。
>>データサイエンス100本ノックの始め方
第30問目: 標本分散
P-030: レシート明細データフレーム(df_receipt)に対し、店舗コード(store_cd)ごとに売上金額(amount)の標本分散を計算し、降順でTOP5を表示せよ。
標本分散とは、値のばらつき具合を表す指標であり、平均値との差を2乗して平均をとった値になります。
n子の標本x1, x2, …., xnがあり、その平均値を$\bar{X}$としたとき、標本分散は次のように求められます。
標本分散を求めるためにはvarメソッドを使用します。
引数にddof=0
を指定することで、標本分散の計算が可能となります。
それでは実際に問題をときながら使い方を学びましょう。
groupby
メソッドでstore_cd
をグルーピングした後、amount
カラムを抽出し、var
メソッドを使用して標本分散を表示します。
1
| df_receipt.groupby('store_cd').amount.var(ddof=0)
|
出力1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| store_cd S12007 199878.572908 S12013 221059.615563 S12014 200946.440113 S12029 194078.594456 S12030 185542.898104 S13001 295431.993329 S13002 242059.930949 S13003 231834.539236 S13004 226455.728493 S13005 215435.376538 S13008 227235.505306 S13009 251489.424870 S13015 295294.361116 S13016 253452.683072 S13017 234753.973479 S13018 203451.893003 S13019 213341.443915 S13020 220908.207476 S13031 202691.947134 S13032 201224.407848 S13035 277995.278909 S13037 194914.825343 S13038 212083.104690 S13039 192184.721032 S13041 219580.092539 S13043 221157.560674 S13044 189597.952968 S13051 205374.495312 S13052 440088.701311 S14006 234499.584787 S14010 258454.256075 S14011 306314.558164 S14012 197658.564411 S14021 254009.419689 S14022 249962.529667 S14023 237506.764336 S14024 225465.703516 S14025 198167.977160 S14026 232049.175817 S14027 214589.332709 S14028 224943.573036 S14033 210995.918401 S14034 296920.081011 S14036 230690.599933 S14040 223042.093872 S14042 172061.187082 S14045 266450.744884 S14046 264262.537937 S14047 221985.136499 S14048 245204.120332 S14049 180361.837396 S14050 157698.130359 Name: amount, dtype: float64
|
store_ce
ごとの売上金額(amount)の標準分散を出力できました。
あとは、reset_index
メソッドでindexを付与し、降順でTOP5を出力しましょう。
1
| df_receipt.groupby('store_cd').amount.var(ddof=0).reset_index().sort_values('amount', ascending=False).head(5)
|
出力1 2 3 4 5 6 7
| store_cd amount 28 S13052 440088.701311 31 S14011 306314.558164 42 S14034 296920.081011 5 S13001 295431.993329 12 S13015 295294.361116
|
これで完了です。
第31問目: 標本標準偏差
P-031: レシート明細データフレーム(df_receipt)に対し、店舗コード(store_cd)ごとに売上金額(amount)の標本標準偏差を計算し、降順でTOP5を表示せよ。
解き方については、第30問目とほぼ同様で、標本標準偏差を出力する点のみが異なります。
標準偏差とは、分散の平方根を取った値であり、分散と同様に、値のばらつき具合の指標になります。
標準偏差は、単位の次元が元の値と同じなので、値の散らばり具合を直感的に表現するのに適しています。
標準偏差は、stdメソッドで計算することが出来ます。ddof=0
を引数で指定することで、標本標準偏差を計算することができます。
それでは早速問題を解いていきましょう。
これまでのやり方の通りgroupby
メソッドを用いてstore_cdをグルーピングして、amount
カラムを指定し標本標準偏差を計算しましょう。
1
| df_receipt.groupby('store_cd').amount.std(ddof=0)
|
出力1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| store_cd S12007 447.077815 S12013 470.169773 S12014 448.270499 S12029 440.543522 S12030 430.746907 S13001 543.536561 S13002 491.995865 S13003 481.491993 S13004 475.873648 S13005 464.150166 S13008 476.692254 S13009 501.487213 S13015 543.409938 S13016 503.440844 S13017 484.514162 S13018 451.056419 S13019 461.888995 S13020 470.008731 S13031 450.213224 S13032 448.580436 S13035 527.252576 S13037 441.491591 S13038 460.524814 S13039 438.388778 S13041 468.593739 S13043 470.273921 S13044 435.428471 S13051 453.182629 S13052 663.391816 S14006 484.251572 S14010 508.383965 S14011 553.456916 S14012 444.588084 S14021 503.993472 S14022 499.962528 S14023 487.346657 S14024 474.832290 S14025 445.160620 S14026 481.714828 S14027 463.237879 S14028 474.282166 S14033 459.342920 S14034 544.903736 S14036 480.302613 S14040 472.273325 S14042 414.802588 S14045 516.188672 S14046 514.064722 S14047 471.152986 S14048 495.180897 S14049 424.690284 S14050 397.112239 Name: amount, dtype: float64
|
いつもどおり、indexが失われているのでreset_index
メソッドでindexを付与し、降順にソートさせ先頭の5件を表示させましょう。
1
| df_receipt.groupby('store_cd').amount.std(ddof=0).reset_index().sort_values('amount', ascending=False).head(5)
|
出力1 2 3 4 5 6
| store_cd amount 28 S13052 663.391816 31 S14011 553.456916 42 S14034 544.903736 5 S13001 543.536561 12 S13015 543.409938
|
これで完成です。
第32問目: パーセンタイル値
P-032: レシート明細データフレーム(df_receipt)の売上金額(amount)について、25%刻みでパーセンタイル値を求めよ。
パーセンタイル値とは、ある列のデータを昇順に並び替え全体を100%としたとき、任意の%の位置にある値を指します。
例えば、[1, 3, 5, 8, 18, 22, 31, 45, 67, 72, 87, 100]
という昇順に並び替えられたリストがあったとします。
100%のパーセンタイル値は、最大値になるので100
となります。
50%のパーセンタイル値は、中央値を求めることになるので、(22 + 31)/2 = 26.5
となります。
Pythonでパーセンタイツ値を求める関数は、numpyのpercentileになります。
percentile関数は、第一引数にデータ、第二引数に求めたいパーセンタイル値のリストを指定します。
問題を解きながら使い方を学びましょう。
以下の通り、percentile
関数を使用します。
1
| np.percentile(df_receipt['amount'], q=[25, 50, 75, 100])
|
出力1
| array([ 102., 170., 288., 10925.])
|
これでOKです。
第33問目: 平均値の計算
P-033: レシート明細データフレーム(df_receipt)に対し、店舗コード(store_cd)ごとに売上金額(amount)の平均を計算し、330以上のものを抽出せよ。
平均値を求めるには、mean
メソッドを使用します。
早速問題を解きながらmean
メソッドの使い方を学びましょう。
これまで学んできたとおりgroupby
メソッドを使用してstore_cd
をグルーピングします。その上で、amountカラムの平均値を表示します。
1
| df_receipt.groupby("store_cd").amount.mean()
|
出力1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| store_cd S12007 307.688343 S12013 330.194130 S12014 310.830261 S12029 315.623908 S12030 288.533727 S13001 348.470386 S13002 313.445736 S13003 350.915519 S13004 330.943949 S13005 316.202811 S13008 327.912480 S13009 328.141988 S13015 351.111960 S13016 329.639950 S13017 317.581070 S13018 312.464427 S13019 330.208616 S13020 337.879932 S13031 307.879634 S13032 321.472550 S13035 324.804446 S13037 299.907832 S13038 306.478167 S13039 310.918699 S13041 329.234177 S13043 318.125000 S13044 304.718549 S13051 309.659942 S13052 402.867470 S14006 315.136605 S14010 348.791262 S14011 335.718333 S14012 303.027754 S14021 314.953174 S14022 321.643457 S14023 325.561521 S14024 308.213897 S14025 319.079814 S14026 332.340588 S14027 314.918466 S14028 324.317244 S14033 321.506206 S14034 326.350974 S14036 322.811410 S14040 318.447368 S14042 278.338886 S14045 330.082073 S14046 309.098127 S14047 330.077073 S14048 308.257895 S14049 297.816774 S14050 290.591304 Name: amount, dtype: float64
|
indexが失われているのでreset_index
メソッドを使用してindexを作成し、query
メソッドを用いてamountが330以上のレコードを出力します。
1
| df_receipt.groupby("store_cd").amount.mean().reset_index().query('amount>=330')
|
出力1 2 3 4 5 6 7 8 9 10 11 12 13 14
| store_cd amount 1 S12013 330.194130 5 S13001 348.470386 7 S13003 350.915519 8 S13004 330.943949 12 S13015 351.111960 16 S13019 330.208616 17 S13020 337.879932 28 S13052 402.867470 30 S14010 348.791262 31 S14011 335.718333 38 S14026 332.340588 46 S14045 330.082073 48 S14047 330.077073
|
これでOKです。
リンク
まとめ: 標本分散、標本標準偏差、パーセンタイル値、平均値の計算を学びました。
本記事では、「【Python】標本分散、標本標準偏差、パーセンタイル値、平均の表示方法を学ぶ | データサイエンス100本ノック【問30〜問33 回答】」というテーマでまとめました。
>> 続きはこちら
なお、データサイエンティストに必要な知識は、TechAcademyのデータサイエンスコースでの学習がおすすめです。