Python

【Python】階乗と順列と組合せ

投稿日:2019年6月27日 更新日:

目的

統計的なデータ分析アプローチの中には確率的な考え方も多く使われます。今回は確率的な手法を用いる際に必要となる基本知識について、pythonのコードの勉強もかねて実践してみたいと思います。具体的には階乗、順列、組合わせです。

階乗の計算方法

階乗とはある変数の並び方が何通りあるかの計算です。

例えばAさん、Bさん、Cさん、Dさんという4人の組があった場合に、この人たち並べ方のパターンは4×3×2×1=24通りあります。

一般化した式は以下の通りです。

$$n! = n(n-1)(n-2)(n-3)…4\times3\times2\times1$$

この\(n\)の計算が階乗です。

これをpythonで計算すると以下のようになります。mathライブラリのfactorialメソッドの引数に変数の数\(n\)を入れて計算します。

#math ライブラリの読み込み
import math

# n=4 の階乗を計算
math.factorial(4) #24

順列の計算

今度はAさん、Bさん、Cさん、Dさんの4人の中から2人だけ選んで並び替えるとした時に何パターンあるかを計算したいとします。
この考え方を順列と呼びます
まず、最初にどの人を選ぶかで4パターンあります。次に残った3人から誰を選ぶかで3パターンあります。この時点で\(4\times3\)パターンあります。
そして、選んだ二人の並び替えでどちらが先にくるか、で2パターンあります。よって\(4\times3\times2\times\)で24パターンあることになります。

このとき、最初にどの人を選ぶかで4パターンあります。次に残った3人からだれを選ぶかで3パターンあります。この時点で\(4\times3\)パターンあります。
そして、選んだ二人の並び替えでどちらが先にくるか、で2パターンあります。よって\(4\times3\times2\times\)で24パターンあることになります。

ただし、この場合は先にAさんを選んでからBさんを選んで並べた場合と、先にBさんを選んでからAさんを選んで並べた場合で同じ並びが出てきます。そのため、重複した分の2で割ってやる必要があります。
よって、結局は\(24 \div2=12\)で12通りになります。

人数を\(n\)人、選ぶ人を\(r\)人とすると以下のように一般化できます。

$$ {}_n P_r= n(n-1)(n-2)…(n-r+1)=\frac{n!}{(n-r)}$$

\({}_n P_r\) の計算を順列と呼びます。

pythonでは上述のfactorialメソッドを使った コードで計算できます。
\(n\)が総人数、\(r\)が選ぶ人数です。

import math

n=4
r=2

# n!/(n-r)
P = (math.factorial(n))/math.factorial((n-r))

print(P) #12

組合せの計算

順列の計算では4人から2人を選んで並び替えを行いましたが、組合せは選んだ2人の並び方は問わない場合に何通りあるか、という考え方です。例えばAさん、Bさん、Cさん、Dさんの4人からAさん、Bさんを選んだとします。

この時、順列の計算の場合はABという並びとBAという並びを区別し、2通りとカウントしましたが、組合せはABとBAは同一とみなします。

よって順列の計算結果からさらに重複を削除することになります。よって、4人から2人を選ぶ組合せは順列の計算結果の\(12\)を重複数の2で割りますので、\(12\div2=\)で6通りとなります。

一般化を考えた場合、\(n\)人から\(r\)任を取り出した際の順列計算からの重複分は\(r!\)となります。よって以下の式になります。

$${}_nC_r = \frac{n!}{r!(n-r)!}$$

この \({}_nC_r\)の計算が組合せです。

pythonで記述すると以下のようになります。

import math

n = 4
r = 2

# n!/(n-r)!
C = (math.factorial(n))/(math.factorial(r)*math.factorial((n-r)))

print(C) #6

まとめ

math.factorial()が使えれば階乗と順列と組合せは非常に簡単に計算できてしまいます。ただ、やはり考え方や式はきっちり理解した上で使いたいなぁと思います。

-Python

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

【Python】cx_Oracleでデータを一括挿入する方法

Contents1 概要2 環境3 Step1 : Oracle側テーブル作成4 Step2 : Pythonによる一括挿入コード5 まとめ 概要 pythonからOracleデータベースを操作するラ …

【Python】算術平均と幾何平均計算

Contents1 目的2 平均3 算術平均4 幾何平均5 まとめ 目的 統計学を使いこなしたい。でも参考書を読んでいても難しい概念や数式が沢山出てきて、その時は分かったつもりになっても後で実践的に使 …

Python scikit-learnのImportError

Anaconda3でscikit-learnのdatasetsのimport時にエラーが出たため、対処法についてメモ Contents1 環境2 エラー3 対処 環境 ①OSWindows10 ②An …

【Python】PaSoRiでカードを読み取ったら音を鳴らす

Contents1 目的2 音源3 音を鳴らすためのライブラリ4 コード5 結論 目的 前回、PaSoRiの上にICカードを置いた状態からカードの中の情報を読み取る、というものをPythonで試しまし …

KerasからMNISTを取得して白黒表示するまで

Contents1 概要2 Step1 : MNISTの取得3 Step2 : MNISTを画像で表示4 Step3 : グレースケールで表示する5 参考)コード 概要 ディープラーニングの勉強などで …

言語切り替え

カテゴリー