【解説】手を動かしながら平均値と中央値の抽出方法を学ぶ | データサイエンス100本ノック【問27〜問28 回答】

【解説】手を動かしながら平均値と中央値の抽出方法を学ぶ | データサイエンス100本ノック【問27〜問28 回答】




当ページのリンクには広告が含まれています。



目次

この記事の対象者


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

・ Pythonのgroupby, agg, reset_index, sort_valuesメソッドの使い方を知りたい人

・ aggメソッドを使って平均値、中央値を出力する方法を知りたい人

本記事で学ぶpythonのメソッドと関数



本記事では以下のメソッドを学びます。前回の記事で学んだメソッドの復習も兼ねて学びましょう。

  • groupbyメソッド: データフレームの特定の列のユニークな値でグルーピングするメソッド。
  • aggメソッド: aggはgroupbyでグルーピングされた列に対して統計量を取るためのメソッドです。
  • reset_indexメソッド: reset_indexメソッドは、インデックスが存在しないデータフレームにインデックスを付与するメソッドです。

早速データサイエンス100本ノックの問題を題材に、これらの使い方を学んでいきたいと思います。

データサイエンス100本ノックの始め方は、以下の記事を参考にしていただければと思います。

>>データサイエンス100本ノックの始め方

第27問目: 平均値の出力方法

P-027: レシート明細データフレーム(df_receipt)に対し、店舗コード(store_cd)ごとに売上金額(amount)の平均を計算し、降順でTOP5を表示せよ。

これまでの問題を取り組んできた方であれば、問題文を読んだ段階で、groupby()メソッドとagg()メソッド、そして、sort_values(), head()を用いることが思いつくと思います。

問題文を読んだ段階でこの発想が出てこなかった方は、以下の記事で紹介している23問目〜26問目の問題を復習しましょう。

>>100本ノックの23問目〜26問目を復習する

まずは、df_receiptを確認します。

1
df_receipt
出力
1
2
3
4
5
6
7
8
9
10
11
12
13
	sales_ymd	sales_epoch	store_cd	receipt_no	receipt_sub_no	customer_id	product_cd	quantity	amount
0 20181103 1541203200 S14006 112 1 CS006214000001 P070305012 1 158
1 20181118 1542499200 S13008 1132 2 CS008415000097 P070701017 1 81
2 20170712 1499817600 S14028 1102 1 CS028414000014 P060101005 1 170
3 20190205 1549324800 S14042 1132 1 ZZ000000000000 P050301001 1 25
4 20180821 1534809600 S14025 1102 2 CS025415000050 P060102007 1 90
... ... ... ... ... ... ... ... ... ...
104676 20180221 1519171200 S13043 1132 2 ZZ000000000000 P050101001 1 40
104677 20190911 1568160000 S14047 1132 2 ZZ000000000000 P071006005 1 218
104678 20170311 1489190400 S14040 1122 1 CS040513000195 P050405003 1 168
104679 20170331 1490918400 S13002 1142 1 CS002513000049 P060303001 1 148
104680 20190423 1555977600 S13016 1102 2 ZZ000000000000 P050601001 1 138
104681 rows × 9 columns

これまで学んだ通り、groupby()メソッドとagg()メソッドを使ってデータを表示させていきます。

平均を求めるにはagg({'カラム名': 'mean'})のように指定します。

1
df_receipt.groupby('store_cd').agg({'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
	amount
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

store_id毎にamountの平均を表示することが出来ました。

indexを設けるために、reset_index()を活用します。

1
df_receipt.groupby('store_cd').agg({'amount': 'mean'}).reset_index()
出力
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
	store_cd	amount
0 S12007 307.688343
1 S12013 330.194130
2 S12014 310.830261
3 S12029 315.623908
4 S12030 288.533727
5 S13001 348.470386
6 S13002 313.445736
7 S13003 350.915519
8 S13004 330.943949
9 S13005 316.202811
10 S13008 327.912480
11 S13009 328.141988
12 S13015 351.111960
13 S13016 329.639950
14 S13017 317.581070
15 S13018 312.464427
16 S13019 330.208616
17 S13020 337.879932
18 S13031 307.879634
19 S13032 321.472550
20 S13035 324.804446
21 S13037 299.907832
22 S13038 306.478167
23 S13039 310.918699
24 S13041 329.234177
25 S13043 318.125000
26 S13044 304.718549
27 S13051 309.659942
28 S13052 402.867470
29 S14006 315.136605
30 S14010 348.791262
31 S14011 335.718333
32 S14012 303.027754
33 S14021 314.953174
34 S14022 321.643457
35 S14023 325.561521
36 S14024 308.213897
37 S14025 319.079814
38 S14026 332.340588
39 S14027 314.918466
40 S14028 324.317244
41 S14033 321.506206
42 S14034 326.350974
43 S14036 322.811410
44 S14040 318.447368
45 S14042 278.338886
46 S14045 330.082073
47 S14046 309.098127
48 S14047 330.077073
49 S14048 308.257895
50 S14049 297.816774
51 S14050 290.591304

最後に、上位5位を出力するためにソートを行います。

ソートは、sort_values('amount', ascending=False)でしたね。

>>ソートを復習する

1
df_receipt.groupby('store_cd').agg({'amount': 'mean'}).reset_index().sort_values('amount', ascending=False).head(5)
出力
1
2
3
4
5
6
7

store_cd amount
28 S13052 402.867470
12 S13015 351.111960
7 S13003 350.915519
30 S14010 348.791262
5 S13001 348.470386

上記のコードで、head(5)というふうに明示的に5という数字を入れていますが、head()というふうにしても同じ出力が得られます。headメソッドは、引数を含めない場合、デフォルトで5つを表示する仕様になっているためです。

第28問目: 中央値の表示方法

P-028: レシート明細データフレーム(df_receipt)に対し、店舗コード(store_cd)ごとに売上金額(amount)の中央値を計算し、降順でTOP5を表示せよ。

処理としては、第27問目とほぼ同じになります。

中央値を求めるにはagg({'カラム名': 'medium'})のように指定します。

今回は一気に全てのメソッドを使って表示します。

1
df_receipt.groupby('store_cd').agg({'amount': 'median'}).reset_index().sort_values('amount', ascending=False).head(5)
出力
1
2
3
4
5
6
	store_cd	amount
28 S13052 190
30 S14010 188
51 S14050 185
44 S14040 180
7 S13003 180

これでOKです。




まとめ: 平均値と中央値の表示方法を学びました。

本記事は、「【Python】手を動かしながら平均値と中央値の抽出方法を学ぶ | データサイエンス100本ノック【問27〜問28 回答】」というテーマでまとめました。

  • 平均を求めるにはagg({'カラム名': 'mean'})のように指定
  • 中央値を求めるにはagg({'カラム名': 'medium'})のように指定

>> 続きはこちら

コメント