【解説】標本分散、標本標準偏差、パーセンタイル値、平均の表示方法を学ぶ | データサイエンス100本ノック【問30〜問33 回答】

【解説】標本分散、標本標準偏差、パーセンタイル値、平均の表示方法を学ぶ | データサイエンス100本ノック【問30〜問33 回答】





目次

この記事の対象者


・ データサイエンティストを目指している人

・ 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 回答】」というテーマでまとめました。

>> 続きはこちら

なお、データサイエンティストに必要な知識は、Udemyを活用した学習が効率的です。30日間の返金保証、および一流講師へのQ&Aシステムが整ったオンライン学習プラットフォームです。

世界で34万人が受講した以下の講座をご確認ください。

【世界で34万人が受講】データサイエンティストを目指すあなたへ〜データサイエンス25時間ブートキャンプ〜

コメント