【データサイエンス】Pythonで最頻値を表示する方法 | データサイエンス100本ノック【問29 回答】

【データサイエンス】Pythonで最頻値を表示する方法 | データサイエンス100本ノック【問29 回答】

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



✓目次

本記事の対象者


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

・ lambda式の使い方の基礎を知りたい人

・ 最頻値の求め方を知りたい人

本記事で学ぶPythonの基礎



本記事では以下のメソッドおよび記法を学びます。

  • applyメソッド: データフレームの各行もしくは各列に対してなんらかしらの関数を適用するメソッド
  • modeメソッド: 離散データの最頻値を表示する。

  • lambda式: Pythonにおける関数作成を簡素化することができる記述様式

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

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

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

第29問目: 最頻値の出力方法

P-029: レシート明細データフレーム(df_receipt)に対し、店舗コード(store_cd)ごとに商品コード(product_cd)の最頻値を求めよ。

最頻値を求める際は、少し特殊な方法が用いられます。

データフレームの各行もしくは各列に対してなんらかしらの関数を適用するメソッドであるapplyメソッドを使用します。

applyメソッドの使い方としては、データに適用したい関数もしくはlambda式を定義し、applyの引数に渡します。

最頻値を求めるメソッドは、modeメソッドになりますので、lambda式を用いてmodeメソッドを適用することになります。

lambda式とは

lambda式とは、Pythonにおける関数作成を簡素化することができる記述様式です。

例えば、以下のように2乗を出力関数を定義したとします。

通常の関数定義
1
2
def func(x):
return x ** 2

これをlambda式を用いると以下のようにコードを簡素化することが出来ます。

lambda式による関数定義
1
func = lambda x: x**2

このようにlambda式の構造はlambda 引数: 返り値という構造になります。

lambda式に引数を渡して実際に計算する場合は、以下のように指定するだけで、defで作成した関数と同じように使用できます。

lambda式に引数を渡して計算
1
2
# funcに引数aを渡して、計算結果をyに格納する
y = func(a)

データフレームと併用する場合は、df.apply(lambda 引数: 返り値)とすれば良いです。

データフレームと併用する場合のlambdaの使い方
1
2
df = DataFrame({"id": [10, 20, 30], "age": [5, 10, 15], "weight":[30, 40, 50]})
df.apply(lambda x: x+10)

実際にlambda式を使う例を以下に紹介します。

1
2
3
4
5
import pandas as pd
from pandas import DataFrame

df = DataFrame({"id": [10, 20, 30], "age": [5, 10, 15], "weight":[30, 40, 50]})
df.apply(lambda x: x+10)
出力
1
2
3
4
	id	age	weight
0 20 15 40
1 30 20 50
2 40 25 60

このように、全てのフィールドに10がプラスされたことが分かります。

これらの知識を用いて問題を解いていきます。

第29問目の回答

過去の問題で学んだgroupbyメソッドを用いて、store_cdをグルーピングし、product_cdに対してapplyメソッドを適用し、modeで最頻値を表示します。

>groupbyメソッドの使い方の詳細はこちら

1
df_receipt.groupby('store_cd').product_cd.apply(lambda x: x.mode())
出力
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
56
57
store_cd   
S12007 0 P060303001
S12013 0 P060303001
S12014 0 P060303001
S12029 0 P060303001
S12030 0 P060303001
S13001 0 P060303001
S13002 0 P060303001
S13003 0 P071401001
S13004 0 P060303001
S13005 0 P040503001
S13008 0 P060303001
S13009 0 P060303001
S13015 0 P071401001
S13016 0 P071102001
S13017 0 P060101002
S13018 0 P071401001
S13019 0 P071401001
S13020 0 P071401001
S13031 0 P060303001
S13032 0 P060303001
S13035 0 P040503001
S13037 0 P060303001
S13038 0 P060303001
S13039 0 P071401001
S13041 0 P071401001
S13043 0 P060303001
S13044 0 P060303001
S13051 0 P050102001
1 P071003001
2 P080804001
S13052 0 P050101001
S14006 0 P060303001
S14010 0 P060303001
S14011 0 P060101001
S14012 0 P060303001
S14021 0 P060101001
S14022 0 P060303001
S14023 0 P071401001
S14024 0 P060303001
S14025 0 P060303001
S14026 0 P071401001
S14027 0 P060303001
S14028 0 P060303001
S14033 0 P071401001
S14034 0 P060303001
S14036 0 P040503001
1 P060101001
S14040 0 P060303001
S14042 0 P050101001
S14045 0 P060303001
S14046 0 P060303001
S14047 0 P060303001
S14048 0 P050101001
S14049 0 P060303001
S14050 0 P060303001
Name: product_cd, dtype: object

indexがなくなっているので、reset_index()メソッドでindexを付与します。

>reset_indexの使い方の詳細はこちら

1
df_receipt.groupby('store_cd').product_cd.apply(lambda x: x.mode()).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
54
55
56
	store_cd	level_1	product_cd
0 S12007 0 P060303001
1 S12013 0 P060303001
2 S12014 0 P060303001
3 S12029 0 P060303001
4 S12030 0 P060303001
5 S13001 0 P060303001
6 S13002 0 P060303001
7 S13003 0 P071401001
8 S13004 0 P060303001
9 S13005 0 P040503001
10 S13008 0 P060303001
11 S13009 0 P060303001
12 S13015 0 P071401001
13 S13016 0 P071102001
14 S13017 0 P060101002
15 S13018 0 P071401001
16 S13019 0 P071401001
17 S13020 0 P071401001
18 S13031 0 P060303001
19 S13032 0 P060303001
20 S13035 0 P040503001
21 S13037 0 P060303001
22 S13038 0 P060303001
23 S13039 0 P071401001
24 S13041 0 P071401001
25 S13043 0 P060303001
26 S13044 0 P060303001
27 S13051 0 P050102001
28 S13051 1 P071003001
29 S13051 2 P080804001
30 S13052 0 P050101001
31 S14006 0 P060303001
32 S14010 0 P060303001
33 S14011 0 P060101001
34 S14012 0 P060303001
35 S14021 0 P060101001
36 S14022 0 P060303001
37 S14023 0 P071401001
38 S14024 0 P060303001
39 S14025 0 P060303001
40 S14026 0 P071401001
41 S14027 0 P060303001
42 S14028 0 P060303001
43 S14033 0 P071401001
44 S14034 0 P060303001
45 S14036 0 P040503001
46 S14036 1 P060101001
47 S14040 0 P060303001
48 S14042 0 P050101001
49 S14045 0 P060303001
50 S14046 0 P060303001
51 S14047 0 P060303001
52 S14048 0 P050101001
53 S14049 0 P060303001
54 S14050 0 P060303001

これで完成です。

まとめ: 最頻値を表示する方法を学びました。

本記事は、「【データサイエンス】Pythonで最頻値を表示する方法 | データサイエンス100本ノック【問29 回答】」というテーマでまとめました。

最頻値を表示するためには以下のメソッドを活用しましょう。

  • applyメソッド: データフレームの各行もしくは各列に対してなんらかしらの関数を適用するメソッド
  • modeメソッド: 離散データの最頻値を表示する。

  • lambda式: Pythonにおける関数作成を簡素化することができる記述様式

以上です。




コメント