質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3404閲覧

matplotlibで一般正規分布の95%の部分を可視化する

退会済みユーザー

退会済みユーザー

総合スコア0

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

2クリップ

投稿2017/07/18 10:21

確率統計の勉強と同時にnumpyとmatplotlibの勉強も進めようと思い一般正規分布の描画をしてみました。

python

1import numpy as np 2import matplotlib.pyplot as plt 3 4np.random.seed(1000) 5 6μ = 5 # 平均値 7σ = 3 # 標準偏差 8N = 100000 # データの個数 9 10r = np.random.normal(μ, σ, N) # 平均μ,標準偏差σの正規分布をN個生成 11r2 = r[np.where((r <= µ+1.96*σ)&(r >= µ-1.96*σ))] # rの95%の範囲 12# print(len(r2) / len(r) * 100) # 94.979% 13 14plt.hist(r, bins=100, color='#ff0000', alpha=0.5) 15plt.hist(r2, bins=100, color='#000000', alpha=0.5) 16plt.show()

赤色の一般正規分布の95%に当たる部分を黒のヒストグラムで重ねようと思ったのですが、横軸についてはちゃんとできているのですが、縦軸についてが上手く行っていません。

コードを見たところ問題無いように思うのですが、どうして95%の部分の上部が黒で描画されていないのでしょうか。

5-1.963 <= 横軸 <= 5+1.963
の範囲は全部黒になると思うのですが、上手く行っていません。
イメージ説明

どなたかわかる方教えていただけませんでしょうか。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

意図しない結果となる原因は 全体表示と±1.96SD表示の時でデータ範囲が違うために、ヒストグラムの区間設定(bins)が異なってしまったためです。
その結果、全体表示に比べ、±1.96SD表示の区間は狭く設定されてしまい、その分ヒストグラムも小さく表示されてしまっております。

rangeパラメータを設定し、2つのヒストグラムのbinsが同じ範囲をとるように設定するとよいかと思います。

Python

1import numpy as np 2import matplotlib.pyplot as plt 3 4mu = 5 5sigma = 3 6N =100000 7 8r = np.random.normal(mu,sigma,N) 9r2 = r[np.where((r <= mu + 1.96 * sigma) & (r >= mu - 1.96 * sigma))] 10 11plt.hist(r , bins=12, range=(-2,12), color='#ff0000', alpha=0.5) 12plt.hist(r2, bins=12, range=(-2,12), color='#000000', alpha=0.5) 13plt.show()

投稿2017/07/18 11:22

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/18 15:55

ありがとうございます!解決しました!! 解決したのは良いんですが、なぜこうした仕様になっているのでしょうか。 http://pythondatascience.plavox.info/matplotlib/%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0 チュートリアルっぽいものを見るとデフォルト値は(x.min(),xmax())になっているようです。 今回のコードで見てみると r.min() # -6.8498020484846514 r.max() # 18.210002187628636 r2.min() # -0.87939299883095501 r2.max() # 10.87921283850276 と言った感じなのですが、これを見てもよくわかりません。 print(len(r2) / len(r) * 100) # 94.979% となるようにデータの数や中身に問題はないことはわかります。 上のページを見るとrangenの説明には「ビンの最大値と最小値を指定」とありますが、これって横軸の話ですよね? 縦軸は2つのグラフとも共通のものと思うのですが、なぜrangeを揃えなければグラフが小さくなってしまうのでしょうか。 あ、それとも実は縦軸は共通ではなく、赤のグラフと黒のグラフの全体が表示されるように拡大縮小されるから黒の方が小さくなってしまうのでしょうか。 恐らくmagichanさんの回答の最初に書かれてあるのですがよくわかりませんでした。 よろしければ回答お願いします。
magichan

2017/07/18 16:35 編集

どもです。せっかくですので、cloudspiderさんのデータに基づいて書きます。 cloudspiderさんが書かれているとおり、rangeの範囲のデフォルトは(x.min(), x.max()) となりますので、 全体表示の方は -6.8498020484846514~18.210002187628636 の範囲を100段階の階級に分割しており、 ±1.96SD表示の方は -0.87939299883095501~10.87921283850276 の範囲を100段階の階級に分割していることになります。 この結果、全体表示の方の各階級の階級幅は0.25程度、対して±1.96SD表示の方の階級幅は0.12くらいです。 (階級幅が2倍以上違います) で、この2つのグラフのデータは元々同じもでですので、階級幅を大きいくとっている前者の方が当然各階級の度数が大きくなりますので、質問のグラフのような結果となります。 > なぜこうした仕様になっているのでしょうか 詳細なところはわかりかねますが、 例えば「全体を10階級で表示したい」という場合は、全体の最小値と最大値の間で10段階を分けるは自然な仕様なのではないでしょうか。
退会済みユーザー

退会済みユーザー

2017/07/19 02:30

なるほど!!! 赤と黒とでは[最小値,最大値]が異なるにも関わらず、同じbins(今回では100本)で表そうとしているから、範囲の小さい黒野グラフのほうが細かく表示されてしまうわけですね。 ということは解決策は2つ合って、簡単に実装できるのがmagichanさんの回答で、わざわざ複雑にして解決するならば「黒のグラフのbinsを赤のグラフに合うように変更していく」というのもあるということですね。 ありがとうございました。勉強になりました!
magichan

2017/07/19 03:12

少しだけ補足します。 binsは階級数(int)を与えるほかに、リストを渡すことも出来ます(各階級幅を自由に設定できる)ので、これを使う方法もありますよ。 こんな感じ。 plt.hist(r, bins=[-3,-1,1,3,5,7,9,11,13], color='#ff0000', alpha=0.5) 階級数が多くなった場合は、numpy.arange()を使えばもう少しスマートに書けます。 plt.hist(r, bins=np.arange(-3.0,13.5,0.5), color='#ff0000', alpha=0.5)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問