- Step3. 実践編
- 1. データの整理と可視化
1-6. ベン図
Step1. 基礎編 9-6. 加法定理の例題3を一部改変し、Step1. 基礎編 8-2. ベン図で学んだベン図の作成を行ってみましょう。
例題:
1から100までの自然数の中で、2で割り切れるもの、3で割り切れるもの、5で割り切れるものの個数を使ってベン図を作成しましょう。
■Excelによる解析例
Excelにはベン図を直接作る機能はないため、自作する必要があります。
- ベン図のすべてのカテゴリーの数を数える
- 2で割り切れるもの:100/2=50個
- 3で割り切れるもの:100/3=33個
- 5で割り切れるもの:100/5=20個
- 2と3で割り切れるもの:100/6=16個
- 2と5で割り切れるもの:100/10=10個
- 3と5で割り切れるもの:100/15=6個
- 2と3と5で割り切れるもの:100/30=3個
- 更に細かいカテゴリーの数を数える
- 2で割り切れるが、3と5で割り切れないもの:50-16-10+3=27個
- 3で割り切れるが、2と5で割り切れないもの:33-16-6+3=14個
- 5で割り切れるが、2と3で割り切れないもの:20-10-6+3=7個
- 2と3で割り切れるが、5で割り切れないもの:16-3=13個
- 2と5で割り切れるが、3で割り切れないもの:10-3=7個
- 3と5で割り切れるが、2で割り切れないもの:6-3=3個
- 挿入 > SmartArtを選択
- SmartArt グラフィックの選択 > 集合関係 > 基本ベン図を選択
- デフォルトのグラフが出力される
- デフォルトのグラフを加工(PowerPointを使って加工します)
27+14+7+13+7+3+3=74なので、1から100までの自然数の中で74個は2か3か5で割り切れます。すなわち、100-74=26個の自然数は、2でも3でも5でも割り切れないことが分かります。
■Rによる解析例
a <- seq(2, 100, 2) #2で割り切れる数の数列を作成 b <- seq(3, 100, 3) #3で割り切れる数の数列を作成 c <- seq(5, 100, 5) #5で割り切れる数の数列を作成 data <- list(divisible_by_2 = a, divisible_by_3 = b, divisible_by_5 = c) #a, b, cの数列からリストを作成 #ベン図を描く方法 library(VennDiagram) venn.diagram( data, #データの読み込み fill = c(2, 3, 4), #ベン図の色の設定 scaled=T, #データのサイズをベン図の円の大きさに反映する filename = "venn_diagram.tiff" #出力ファイル名の設定(venn.diagramでベン図を作る場合には図をoutputファイルに書き出す必要がある) ) #アップセットプロットを描く方法 library(UpSetR) upset(fromList(data), #データをupset用に変換して読み込み order.by = "freq", #棒グラフをfreq(数の大きい順)でソートする sets.bar.color = c("red","green", "blue"), #各カテゴリーの棒グラフの色の設定 text.scale = c(1.5, 1.5, 1.5, 1.5, 1.5, 1.5)) #文字サイズの設定
アップセットプロットは、複雑なベン図を見やすく表すことができる図です。Set Sizeは各グループ(2で割り切れるもの、3で割り切れるもの等)に属するものの数を、Intersection Sizeは各カテゴリー(2だけで割り切れる、2と3だけで割り切れる等)に属するものの数を表します。Intersection Sizeの下のドットと線は各カテゴリーを模式的に表したもので、ドットがついているところはそのグループの条件を満たしていることを表します。例えば、一番右端のドットと線は2、3、5で割り切れるもののカテゴリーであることを示します。
■Pythonによる解析例
#ベン図を描く方法 import numpy as np from matplotlib_venn import venn3 import matplotlib.pyplot as plt a = np.arange(2, 101, 2) #2で割り切れる数のアレイを作成 b = np.arange(3, 101, 3) #3で割り切れる数のアレイを作成 c = np.arange(5, 101, 5) #5で割り切れる数のアレイを作成 venn3(subsets=[set(a), set(b), set(c)], set_labels=("divisible_by_2", "divisible_by_3", "divisible_by_5")) #a, b, cを使ってベン図を描く、それぞれにラベルを付ける plt.show() #アップセットプロットを描く方法 import pandas as pd from upsetplot import plot import matplotlib.pyplot as plt a = np.arange(2, 101, 2).tolist() #2で割り切れる数のリストを作成 b = np.arange(3, 101, 3).tolist() #3で割り切れる数のリストを作成 c = np.arange(5, 101, 5).tolist() #5で割り切れる数のリストを作成 all_dat = set(a + b + c) #a, b, cのユニークなデータリストを作成 df = pd.DataFrame([[V in a, V in b, V in c] for V in all_dat], columns = ["divisible_by_2", "divisible_by_3", "divisible_by_5"]) #a, b, cのリストの中に、ユニークなデータリストの数字が含まれているかどうかを調べる、それぞれにラベルを付ける df2 = df.groupby(["divisible_by_2", "divisible_by_3", "divisible_by_5"]).size() #アップセットプロット用にデータを変換 plot(df2, sort_by="cardinality") #変換したデータを使ってアップセットプロットを描く plt.show()