1 乱数とグラフの基本 2 乱数の生成 #ランダム関数 import random #ランダム関数のモジュールを読み込む print(random.random()) # 0≦X<1の実数(浮動小数点)を生成 print(random.uniform(10,50)) #任意の範囲(ここでは10≦X≦50)の実数(浮動小数点)を生成 print(random.randrange(10)) # 0≦<10の整数を生成 print(random.randrange(9,18,3)) #任意の範囲のステップの整数 #(ここでは9≦X<18で3つおき9,12,15)を生成 print(random.randint(7,9)) #任意の範囲のステップの整数(ここでは7≦X≦9 7,8,9)を生成 3 棒グラフの描画 #棒グラフ !pip install japanize-matplotlib #日本語を使うモジュールのインストール(ブック内で1回実行) import matplotlib.pyplot as plt #グラフを使うライブラリ 名前をpltにします import japanize_matplotlib #日本語を使うライブラリ x = [1,2,3,4,5] #X軸データのリスト y = [10,50,20,40,30] #Y軸データのリスト plt.bar(x,y,color="orange",label="凡例") #棒グラフの描画 plt.xlabel("x ラベル") #X軸のラベル plt.ylabel("y ラベル") #Y軸のラベル plt.title("グラフのタイトル") #タイトル plt.legend() #凡例を表示する plt.show() #グラフを表示する 4 折れ線グラフの描画 #折れ線グラフ #!pip install japanize-matplotlib #日本語を使うモジュールのインストール(初回実行は#を取る) import matplotlib.pyplot as plt #グラフを使うライブラリ 名前をpltにします import japanize_matplotlib #日本語を使うライブラリ x = [1,2,3,4,5] #X軸データのリスト y1 = [10,50,20,40,30] #Y1軸データのリスト y2 = [30,60,30,50,20] #Y2軸データのリスト plt.plot(x,y1,label="1 凡例") #Y1グラフの描画 plt.plot(x,y2,label="2 凡例") #Y2グラフの描画 plt.xlabel("x ラベル") #X軸のラベル plt.ylabel("y ラベル") #Y軸のラベル plt.title("グラフのタイトル") #タイトルを表示する plt.legend() #凡例を表示する plt.show() #グラフを表示する 5 散布図の描画 #散布図 #!pip install japanize-matplotlib #日本語を使うモジュールのインストール(初回実行は#を取る) import matplotlib.pyplot as plt #グラフを使うライブラリ 名前をpltにします import japanize_matplotlib #日本語を使うライブラリ x = [2,5,3,4,5] #X軸データのリスト y = [4,5,3,7,3] #Y軸データのリスト plt.figure(figsize=(4,4)) #グラフの幅と高さの指定 plt.scatter(x,y,c="red") #散布図の描画 色は省略可 plt.xlabel("x ラベル") #X軸のラベル plt.ylabel("y ラベル") #Y軸のラベル plt.title("グラフのタイトル") #タイトルを表示する plt.show() #グラフを表示する 6 円グラフの描画 #円グラフ #!pip install japanize-matplotlib #日本語を使うモジュールのインストール(初回実行は#を取る) import matplotlib.pyplot as plt #グラフを使うライブラリ 名前をpltにします import japanize_matplotlib #日本語を使うライブラリ labels = ["A","B","C","D","E"] #ラベルのリスト data = [56,45,32,21,9] #データのリスト plt.pie(data, labels=labels, autopct='%1.1f%%',\ counterclock=False, startangle=90) #円グラフの描画 plt.title("グラフのタイトル") #タイトルを表示する plt.show() #グラフを表示する 2 クラスに同じ誕生日の人がいる確率 #クラスに同じ誕生日の人がいる確率 #!pip install japanize-matplotlib #日本語を使うモジュールのインストール(初回実行は#を取る) import matplotlib.pyplot as plt #グラフのライブラリをインストール 名前をpltにします import japanize_matplotlib #グラフの日本語化ライブラリをインストール import random #乱数ライブラリをインストール #リストの重複を調べる関数の定義 重複があるとTuleを返す def has_duplicates(seq): #リストを引数として受け取る return len(seq) != len(set(seq)) #len()はリストの要素数を返す set()はリストの重複要素を取り除く #重複がある場合、要素数が少なくなるのでTuleを返す #変数・リストの初期設定 クラス定員 = 60 #調べる最大クラス人数 試行回数 = 1000 #シミュレーションの回数 誕生日 = [] #誕生日のリスト定義 確率 = [] #誕生日が重複する確率 #シミュレーション for クラス人数 in range(クラス定員+1): #クラス人数を0〜クラス定員まで変える 重複 = 0 #重複回数の初期化 for 試行 in range(試行回数): #重複を試行回数調べる 誕生日 = [] #誕生日リストの初期化 for _ in range(クラス人数): #クラス人数分誕生日を生成する 誕生日.append(random.randint(1, 365)) #誕生日を生成してリストにする if has_duplicates(誕生日) == True: #誕生日に重複があるか調べる 重複 = 重複 + 1 #重複があればその回数を累計する print("クラス人数=",クラス人数,"重複する確率=",重複/試行回数) #クラス人数と重複する確率を表示する 確率.append(重複/試行回数) #確率のリストを作る #グラフ表示 x=range(len(確率)) #確率のデータ個数だけx軸のリストを作る plt.bar(x,確率) #確率の棒グラフを描く plt.xlabel("クラス人数") #X軸のラベル plt.ylabel("重複する確率") #Y軸のラベル plt.title("クラスに同じ誕生日の人がいる確率") plt.show() #グラフの表示 応用 計算で確率を求めるプログラムを実行してみましょう #クラスに同じ誕生日の人がいる確率 #!pip install japanize-matplotlib #日本語を使うモジュールのインストール(初回実行は#を取る) import matplotlib.pyplot as plt #グラフのライブラリをインストール 名前をpltにします import japanize_matplotlib #グラフの日本語化ライブラリをインストール #変数・リストの初期設定 クラス定員 = 60 #調べる最大クラス人数 重複確率 = [] #誕生日が重複する確率 非重複確率 = 0 #誕生日が重複しない確率 非重複累積確率 = 1 #誕生日が重複しない確率の累積 #シミュレーション for クラス人数 in range(クラス定員+1): #クラス人数を0〜クラス定員まで変える 非重複確率 = (365 - クラス人数)/365 #誕生日が重複しない確率の計算 非重複累積確率 = 非重複累積確率 * 非重複確率 #誕生日が重複しない確率の累積 重複確率.append( 1 - 非重複累積確率) #重複する確率を余事象として計算して #リストに追加 print("クラス人数=",クラス人数+1,"重複する確率=",(1 - 非重複累積確率)) #クラス人数と重複する確率を表示する #グラフ表示 x=range(len(重複確率)) #確率のデータ個数だけx軸のリストを作る plt.plot(x,重複確率,c="orange") #確率の線グラフを描く plt.xlabel("クラス人数") #X軸のラベル plt.ylabel("重複する確率") #Y軸のラベル plt.title("クラスに同じ誕生日の人がいる確率") #タイトルを表示する plt.show() #グラフの表示 3 円周率を求めよう 3 プログラムを実行してみましょう #モンテカルロ法で円周率を求める #!pip install japanize-matplotlib #日本語を使うモジュールのインストール(初回実行は#を取る) import matplotlib.pyplot as plt #グラフのライブラリをインストール 名前をpltにします import japanize_matplotlib #グラフの日本語化ライブラリをインストール import numpy.random as rd # numpy(Numerical Python)数値計算ライブラリのインストール #(名前をrdにする) plt.figure(figsize=(4,4)) # グラフの幅と高さの指定 試行回数 = 1000 # ランダムに打つ点の総数 弧内点数 = 0 # 四分円の内側の点の数 for i in range(試行回数): # 点の数だけ繰り返し処理 x = rd.random() # 0以上1未満の乱数 y = rd.random() # 0以上1未満の乱数 if x**2 + y**2 < 1.0: # 円の内側の判定 弧内点数 += 1 # 内側の時、1カウント加える plt.scatter(x, y, c="red") # 赤色でプロット else: # 円の外側の時 plt.scatter(x, y, c="blue") # 青色でプロット print(" 円周率:", 弧内点数 * 4.0 / 試行回数)# 円周率の計算と表示 plt.title("円周率(モンテカルロ法)") # グラフのタイトル plt.show() #グラフを表示 py.randomモジュールによる乱数生成 #numpy.randomモジュールによる乱数生成 import numpy.random as rd #numpy.randomモジュールをインポートして名前をrdとする x = rd.random() #0以上1未満の実数を1つ生成 rd.rand()と同じ print(x) x=rd.random(5) #0以上1未満の実数を5つリストとして生成 rd.rand(n)と同じ print(x) x=rd.randint(3,9) #3〜9のランダムな整数を1つ生成 print(x) x=rd.randint(3,9,5) #3〜9のランダムな整数を5つリストとして生成 print(x) 4 モンティ・ホール問題 2 プログラムを実行してみましょう #モンティ・ホール問題シミュレーション #!pip install japanize-matplotlib #日本語を使うモジュールのインストール(初回実行は#を取る) import matplotlib.pyplot as plt #グラフのライブラリをインストール 名前をpltにします import japanize_matplotlib #グラフの日本語化ライブラリをインストール import numpy.random as rd #numpy.randomモジュールをインポートして名前をrdとする #初期設定 変更なし当たり確率,変更あり当たり確率=[],[] #グラフ表示用リストの初期化 変更なし当たり,変更あり当たり=0,0 #変更なし当たり回と変更あり当たりを初期化 試行回数=1000 #試行回数の設定 #シミュレーション for i in range(試行回数) : #シミュレーションを試行回数実行 #当たりドアと選択ドアの設定 ドアリスト=[1,2,3] #ドアのリストを1,2,3とする 当たりドア=rd.choice(ドアリスト) #ドアリストからランダムに1つ選び当たりドアとする 選択リスト=[1,2,3] #プレイヤーが選択するドアリストを1,2,3とする 選択ドア=rd.choice(選択リスト) #選択ドアリストからランダムに1つ選び選択ドアとする #司会者が開かないドア(再選択が可能なドア)を決める if 当たりドア == 選択ドア: #当たりドアと選択ドアが同じ場合 if 当たりドア==1: #当たりドアが1の場合 ドアリスト=[2,3] #司会者が開けずに残すドアのリストは 2,3 elif 当たりドア==2: #当たりドアが2の場合 ドアリスト=[1,3] #司会者が開けずに残すドアのリストは 1,3 elif 当たりドア==3: #当たりドアが3の場合 ドアリスト=[1,2] #司会者が開けずに残すドアのリストは 1,2 再選択ドア=rd.choice(ドアリスト) #残すドアリストからランダムに1つ選び、再選択できるドアとする else: #当たりドアと選択ドアが異なる場合 #当たりドアは開けられないので、再選択できるドアは当たりドアだけになる 再選択ドア=当たりドア #あたり判定と集計 #変更なしで当たる場合 if 選択ドア == 当たりドア: #最初に選択したドアが当たりの判定 変更なし当たり=変更なし当たり+1 #変更なしで当たった回数を集計する #変更ありで当たる場合 if 再選択ドア == 当たりドア: #変更したドアが当たりの判定 変更あり当たり=変更あり当たり+1 #変更ありで当たった回数を集計する 変更なし当たり確率.append(変更なし当たり/(変更なし当たり+変更あり当たり))#変更なしで当たる確率を計算してリストにする 変更あり当たり確率.append(変更あり当たり/(変更なし当たり+変更あり当たり))#変更ありで当たる確率を計算してリストにする #結果 print("試行回数",試行回数) print("変更なし当たり",変更なし当たり,"確率",変更なし当たり/(変更なし当たり+変更あり当たり)) print("変更あり当たり",変更あり当たり,"確率",変更あり当たり/(変更なし当たり+変更あり当たり)) # 確率グラフ表示 plt.title("モンティ・ホール問題") #グラフのタイトル plt.plot(変更なし当たり確率,label='変更なし当たり確率') #折れ線グラフと凡例の表示 plt.plot(変更あり当たり確率,label='変更あり当たり確率') #折れ線グラフと凡例の表示 plt.legend() #凡例を表示 plt.show() #グラフを表示