弱々学生の日記

技術的なアウトプットや備忘録としてアップしていきますが技術以外の事もアップするかもです

pythonで正規分布(ヒストグラム)を書いて確率分布曲線を描くまで

環境

pythonを使うと言ってもそのままVScodeATOMを使ってやるのではなくjupyter notebookを使用する。まだインストールしてない方はインストールしておくと今後データ分析とかで重宝すると思う。
色々一括でダウンロードできるAnocondaとか入れるといいかも

  • macbook pro 2017
  • jupyter notebook
  • データは.txtファイルから読み込む

環境を入れたのが結構前なので覚えていないのが申し訳ない。 各自で調べ欲しい。
ただjupyter notebookさえ入っていればよかった気がするけど忘れた。

jupyter notebookでpython3ファイルを作る

右上のnewのタブからpython3を選択して新しくファイルを作ろう f:id:takaya468:20190731171448p:plain 作ったらこんな感じの画面が出てくるのでUntitledの部分をクリックして名前を変えよう f:id:takaya468:20190731171530p:plain 少しだけ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行ずつなのでこんな感じです。 f:id:takaya468:20190731170858p:plain




次に標準偏差と平均値を表示する。 確率分布曲線を描く際に必要なので定義しておく

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()

先ほどのテキストデータを使うと以下のようなグラフが書けるはず。

f:id:takaya468:20190731170903p:plain
出力結果
以上

あとがき

説明が曖昧な部分があったりとまだまだ勉強不足で申しわけけない