ランダムサンプリングは、巨大なデータセットからランダムにデータを抽出して解析をおこなう際に用いられる、統計手法の一つだ。
今回はPythonでおこなうランダムサンプリングの例として、トランプのデッキを作る方法を紹介する。
Pythonで52枚のトランプのデッキを用意する
詳しいコードの解説は割愛する。
以下のコードで52枚のトランプが出来上がる。
import pandas as pd # ハート、スペード、クラブ、ダイヤの頭文字 suits = ['H', 'S', 'C', 'D'] card_val = (list(range(1, 11)) + [10] * 3) * 4 base_names = ['A'] + list(range(2, 11)) + ['J', 'Q', 'K'] # ['A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K'] cards = [] for suit in ['H', 'S', 'C', 'D']: cards.extend(str(num) + suit for num in base_names) deck = pd.Series(card_val, index=cards)
deck[:13] # AH 1 # 2H 2 # 3H 3 # 4H 4 # 5H 5 # 6H 6 # 7H 7 # 8H 8 # 9H 9 # 10H 10 # JH 10 # QH 10 # KH 10 # dtype: int64
トランプのデッキからカードを引く関数を用意する
次に、用意したデッキからカードを5枚引く関数を用意する。
def draw(deck, n=5): return deck.sample(n)
関数が用意できたら、早速実行して結果を見てみよう。
draw(deck) # 10C 10 # 9D 9 # 8S 8 # QC 10 # 5D 5 # dtype: int64
何度か実行してみると、ランダムにデッキから5枚のカードを抽出できていることが分かるはずだ。
グループ化を応用したランダムサンプリング
さて、次は4つのマークから、それぞれ2枚ずつのカードをランダムサンプリングする例を見ていく。
カード名の最後の文字(H、S、C、D)がマークの頭文字を表しているので、これを利用してグループ化すれば簡単だ。
# カードの最後の文字を取得 get_suit = lambda card: card[-1] deck.groupby(get_suit).apply(draw, n=2) # C QC 10 # 8C 8 # D 8D 8 # 5D 5 # H 4H 4 # 2H 2 # S 9S 9 # KS 10 # dtype: int64
applyメソッドは、定義したラムダ関数や組み込みの関数を引数に取り、データフレームやシリーズの各行・列に関数を適用することができるメソッドで、これを活用している。