pythonで正規分布(ヒストグラム)を書いて確率分布曲線を描くまで
環境
pythonを使うと言ってもそのままVScodeやATOMを使ってやるのではなくjupyter notebookを使用する。まだインストールしてない方はインストールしておくと今後データ分析とかで重宝すると思う。
色々一括でダウンロードできるAnoconda
とか入れるといいかも
- macbook pro 2017
- jupyter notebook
- データは.txtファイルから読み込む
環境を入れたのが結構前なので覚えていないのが申し訳ない。
各自で調べ欲しい。
ただjupyter notebook
さえ入っていればよかった気がするけど忘れた。
jupyter notebookでpython3ファイルを作る
右上のnew
のタブからpython3
を選択して新しくファイルを作ろう
作ったらこんな感じの画面が出てくるのでUntitled
の部分をクリックして名前を変えよう
少しだけjupyterのことを書いたがここでは詳しくは説明しない
ソースコード
では早速コードを書いていく 最初に色々importする
import numpy as np #テキストデータの読み込みで使う import matplotlib.pyplot as plt #ヒストグラムの描画で使う from scipy.stats import norm #標準偏差と平均値の導出で使う from termcolor import cprint,colored #文字に色を付けたりするときに使う
次にテキストデータを読み込む。
data0 = np.loadtxt("sample.txt", comments='!') #comments='!' ⬅️行ごとに読み込んでいる distance0=data0
実際のテキストデータの中身は以下の通り。
[1.00294 1.00302 1.00306 1.00297 1.00294 1.00318 1.00306 1.00288 1.00317 1.00299 1.00315 1.00292 1.00309 1.00296 1.00287 1.00294 1.00297 1.00286 1.00286 1.00297 1.00302 1.00281 1.003 1.00277 1.00311 1.00289 1.00282 1.00273 1.00296 1.00292 1.00286 1.00307 1.00296 1.00285 1.00297 1.00291 1.00299 1.00289 1.00283 1.00275 1.00287 1.00298 1.00292 1.00291 1.00296 1.00288 1.00292 1.00288 1.00296 1.00295 1.00296 1.00298 1.00297 1.00295 1.00306 1.00301 1.00311 1.00288 1.003 1.00289 1.00302 1.00295 1.00314 1.00306 1.00317 1.00306 1.00316 1.00315 1.00308 1.00304 1.00313 1.00309 1.00307 1.00302 1.00304 1.00295 1.00315 1.00317 1.00305 1.00306 1.00326 1.00299 1.00305 1.00305 1.0031 1.00298 1.00309 1.00303 1.00303 1.00297 1.00297 1.00326 1.00299 1.00321 1.003 1.00302 1.00296 1.0031 1.00312 1.00296 1.00297 1.0029 1.003 1.0031 1.003 1.00292 1.00305 1.0029 1.00297 1.00312 1.00307 1.0032 1.00306 1.00312 1.00291 1.00301 1.00308 1.00319 1.00292 1.00305 1.00282 1.00309 1.00302 1.00301 1.00308 1.00312 1.00298 1.00314 1.003 1.00301 1.00298 1.0031 1.00314 1.003 1.00303 1.00315 1.00305 1.00326 1.00308 1.00318 1.00304 1.00304 1.00315 1.00309 1.00315 1.00316 1.00323 1.00304 1.00292 1.00314 1.00309 1.00317 1.00301 1.00326 1.00311 1.00308 1.00316 1.0031 1.0032 1.00291 1.0028 1.00299 1.00288 1.00291 1.00294 1.00299 1.00285 1.00286 1.00298 1.00293 1.00276 1.00287 1.00288 1.0029 1.00292 1.00292 1.00307 1.00291 1.00308 1.00294 1.00284 1.00304 1.00292 1.00291 1.00295 1.00292 1.00304 1.00288 1.0028 1.00269 1.00291 1.00283 1.00287 1.00289 1.00303 1.00283 1.00308 1.00294 1.00309 1.00318]
実際にテキストデータは1行ずつなのでこんな感じです。
次に標準偏差と平均値を表示する。 確率分布曲線を描く際に必要なので定義しておく
param = norm.fit(distance0) #平均値/標準偏差で配列として定義 #loc, std = stats.norm.fit(distance0) cprint('平均値/標準偏差',attrs=['bold']) #cprintを使って文字を強調させている print(param)
最後に実際にヒストグラム と確率分布曲線を描きましょう。
plt.figure plt.xlabel("distance(m)",fontsize=15) #x軸のラベルを変更 plt.ylabel("frequency",fontsize=15) #y軸のラベルを変更 weights0 = np.ones_like(distance0)/float(len(distance0)) #重みつけをするので加重平均を出す plt.hist(distance0,weights=weights0,bins=55,alpha=0.6,color="blue") #weight=重み bins=ビンの数(縦棒の数), alpha=グラフの透明度, color=グラフの色, pdf_fitted = norm.pdf(x,loc=param[0],scale=param[1]) #確率分布曲線(フィッティング)を描く,loc=平均値,scale=正規分布 pdf = norm.pdf(x) plt.figure plt.plot(x,pdf_fitted/50000,'r-') #50000の部分はヒストグラムに合わせて調整する plt.tight_layout() plt.savefig("sample1.png",dpi=1000) #描いたグラフを保存する。dpiが大きいほど高画質になる。1000で十分に高画質 plt.show()
先ほどのテキストデータを使うと以下のようなグラフが書けるはず。 以上
あとがき
説明が曖昧な部分があったりとまだまだ勉強不足で申しわけけない