Pythonで学び直す数学【集合・確率編】～例題を解きながら集合とリストの使い方を理解しよう

最近、ニュースなどで「機械学習」や「AI」といったフレーズを耳にすることも増えてきたのではないでしょうか。<b>ただ、数学的な方法をベースにしながらモノを考えるといっても、実際にどう使えばよいだろうとピンと来ない</b>方のほうが多いのではないでしょうか。コンピュータの世界で数学がどのように使えるのか、ということをPythonの基本的な書き方を確認しながら考えていきたいと思います。

<b>「数学的な問題をPythonで簡単なスクリプトを作って動作を確認する」ということを複数回に分けて行っていきたい</b>と思います。Pythonに慣れるという点でも手を動かして考える機会にして頂ければ幸いです。

今回は、Pythonで学び直す数学【集合・確率編】の確認をしていきたいと思います。
<a href="http://semi3del.xsrv.jp/dis/PythonMathBasic1.zip" target="_blank">演習問題のダウンロードはこちらから</a>
<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/81454793-a92d-f812-47ce-9bce2d199515.png)

数学の授業で、<b>「確率を求めるときに、図や一覧表を描いたり、ベン図や集合の要素数を利用して、場合の数を求め、全体でどれだけの数があるか正しく把握してください」</b>と習った方も多いと思います。ここでは今一度、集合の基礎から学んでいきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/67fb3fcd-ad2f-4f5c-16e5-63193b49b5ca.png)

まずは、集合の特徴についてみていきます。

<h3>・集合の定義</h3>
数学の世界で「1から10までの自然数」の集合は、

A = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

のように { } を使って表記します。

「A」は集合に付けた名前で、 { } に含まれる個々の値を要素といいます。
１つの集合に同じ要素が含まれることはなく、また、集合の要素には順番という概念がありません。

下のように「1から10までの自然数」の集合を考えた場合、
B = {2 ,5, 6, 7, 1, 3, 4, 9, 10, 8}

集合Aと集合Bは同じものとして扱われます。
<br>
<b>< Type Python ></b>
Pythonにはset という集合を扱うデータ型があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/bc2ef07b-548a-8e85-67bd-04748b9db1fb.png)
のようにすると、集合Aを定義できます。

集合Aの要素の順番を変えて、集合Bを定義して集合Ａと比べてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/306857ee-5912-0190-7aef-d691277a6556.png)
もう一つ、<b>集合の要素には重複した値が含まれない</b>ことも確認しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/15b269f5-1447-ac63-5133-c81d05f6786c.png)
<b>len() 関数を利用すると、集合の要素数を確認できる</b>ことも覚えておきましょう。

 <h3>・全体集合、部分集合</h3>
集合Aのすべての要素が集合Uに含まれるとき、集合Aを集合Uの<b>「部分集合」</b>といい、
<b>U⊃A</b>
のように表します。

<b>Pythonでは「＜＝」を使って部分集合かどうかを確認</b>することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/a00b1268-4b6e-ce7e-4281-293dbe68d376.png)
部分集合が属する集合Uのことを全体集合といいます。

<h3>・集合演算（和集合・積集合・差集合）</h3>

<b>・和集合</b>

2つの集合の全要素を合わせた集合を和集合といい、
<b>A∪B</b>
のように表します。<b>Pythonでは、｜演算子を使って和集合を取得</b>できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/9cb43d4e-d599-0907-88fd-5d6753a04ad2.png)
<b>・積集合</b>

2つの集合に共通する要素の集合を積集合といい、
<b>A∩B</b>
のように表します

<b>Pythonでは、「＆演算子」を使って積集合を取得</b>できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/6d2afdd7-40f6-3a84-3d2d-e4d8006fa819.png)
<b>・差集合</b>

一方の集合から、もう一方の集合を引いたものを<b>差集合</b>といいます。
どちらの集合から引くかによって結果が変わるので注意してください。

<b>Pythonでは、算術演算子の「－演算子」を使って差集合を取得</b>できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/a8457919-8b67-ef90-ca93-6642151053d4.png)
⇒ ここで、添付資料<b>「集合の要素数」シートにある演習問題を解いてみましょう</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/3e785120-8cd3-dd96-f8aa-648e899ca115.png)

<b>類似するケースとして、Pythonでの辞書, リストの使い方について確認</b>していきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/8f672daf-ef63-cacb-c3f4-4277f30040ed.png)
　<b>辞書（dictionary）とは、「キー：値」をカンマで区切って並べ、全体を「{}」で囲み、1組のデータをキーとそれに対応するペアで管理</b>するデータ型です。

[ 辞書オブジェクトを生成 ]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/72621cae-d8d2-60e0-4815-868913a3e8d8.png)

[ キーと値のペアを変更・追加 ]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/e696db3a-ffcb-b714-ab41-37a2b0c051d3.png)


<b>・キー／値の一覧を取得する</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/f6e85521-12b2-0cf2-cf6b-84a297c31384.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/725934cc-6a3f-c3c3-a94d-e52f6d245e92.png)

<b>keys()、values()、items()メソッドの戻り値は、for文で順に取得</b>できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/1e079b04-a8b9-660f-a279-ea3360415109.png)

参考：<b>formatメソッドは変数の値を埋め込みたい時などに使われます。</b>

　 例えば　<b>‘str1{}:{}str2’.format(var1, var2)</b>　では、
　 1番目の{} にメソッド引数のvar1 が、2番目の{}にメソッド引数のvar2が埋め込まれます。

⇒ ここで、添付資料<b>「辞書の使い方」シートにある演習問題</b>を解いてみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/e0bef68d-a152-c558-7ac3-bae47943dde5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/cb8205cb-2952-150e-102a-5dbc6c6aa474.png)
次は、<b>図や一覧表を描いたり、ベン図や集合の要素数を利用したりして、場合の数の例題を解いていきましょう。</b>

<b>順列：n個のものからr個（r ≤n）を選んで並べる並べ方 nPr </b>は

<b>nPr　= n (n-1) (n-2) … (n-r+1) = n! / (n-r)! (通り)</b>

たとえば、<b>1～9の9種類の数字を使ってできる2桁の数字</b>は　 9×8 = 72 (通り)
Pythonでは、以下のように求めることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/9d9e83c3-ec33-57c3-9c43-5954afffccbc.png)

⇒ ここで、添付資料<b>「順列」シートにある演習問題を解いてみましょう</b>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/9a97a9dc-b04f-7ed6-ac32-a33ea3b26c16.png)
⇒ ここで、添付資料<b>「階乗」シートにある演習問題を解いてみましょう</b>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/b8e5143a-4fd7-1e6e-0184-c9d68fbf3ffb.png)

<b>組み合わせ：n個のものからr個を選び出す組み合わせ nCr </b>は

<b>nCr　= nPr / r! = n! / r! (n-r)! (通り)</b>

たとえば、1～5の5種類の数字から2つの数字を選ぶ組み合わせは 5×4 / 2×1 = 10（通り）

　組み合わせが何通りかを調べるときは、itertoolsモジュールのcombinations() 関数を使います。
<b>1～5のうち、2個の数字を選んだ場合</b>は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/89bb996d-647d-a9e5-df73-5c45ebb5ec46.png)

⇒ ここで、添付資料<b>「組み合わせ」シートにある演習問題</b>を解いてみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/b3d18593-9dbc-88d5-2202-86150fe6ad25.png)


次は確率（ある試行を行ったとき、結果として起こりうる全ての事象のうち、特定の事象になる割合）について考えてみましょう。

サイコロを振った時の特定の目が出る確率について、<b>「大数の法則」という、試行の数が多ければ、確率は収束する</b>という話を数学の授業で聞いたこともあるのではないでしょうか。

今回は実際に確認してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/59b66487-a419-009c-f724-b3dff686b9bb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355311/0c1bf0c4-e9a7-a230-14b2-1d4fc63b887d.png)

<hr>
以前学校で学んできた内容をもとにPythonでスクリプトを実行しながら確認できるのは面白いなと感じる方もいらっしゃるかもしれません。<b>自分にできる範囲のものから少しずつPythonにも挑戦してみようかな</b>と思っていただければ幸いです。

以上となります。


参考文献：
・大津真『基礎Python: 入門から実践へステップアップ』インプレス（2016年）
・谷尻かおり『文系プログラマーのためのPythonで学び直す高校数学』日経BP社（2021年）