Python

【Python】95%信頼区間の求め方・計算方法と棒グラフのエラーバーで表示する方法

Python

どうも、月見(@Suzuka14144156)です。

今回は、95%信頼区間の求め方・計算方法と棒グラフのエラーバーで表示する方法を解説します。

この記事では、以下のようなグラフを得ることができるようになります。

95%信頼区間とは?

  • 95%信頼区間とは、「正規分布に従う母集団から標本得た平均が、95%の確率で母平均が含まれる」区間ということ

詳細は、以下の本で学ぶのがオススメです。

参考:基礎から学ぶ統計学

95%信頼区間はどうつかうの?

95%信頼区間は、エラーバーに使うことがよくあります。

なぜなら、95%信頼区間を求めることで、2標本間に有意差があるかどうかを判断しやすいためです。

2標本間の95%信頼区間が重ならない場合は、有意差があると言えます。

  • 例えば、以下の二標間には有意差(p<0.05)があるということがグラフから分かります。
  • なぜなら、95%信頼区間のエラーバーが重なってないためです
  • 95%信頼区間のエラーバーが重なる場合でも、有意差あり(p<0.05)と判定されることがあるので注意ください。

なので、以下のようなグラフになった場合は、有意差があるかわからないとなります。

95%信頼区間とエラーバーと有意差の関係については、以下の記事で解説していますので、参考にしてみてください。

参考:95%信頼区間とエラーバーと有意差について

Pythonで95%信頼区間を計算するための環境の構築

今回は、Jupyte Labを用います。

Juptrer Labのインストール

インストール方法は以下2種類ある。

  1. Anacondaをインストール
  2. JupyterLabを直接インストール
月見
月見
  • どちらでもOKです

ただ、Anacondaをインストールする方が時間がかかるのでお急ぎの方は、「JupyterLabを直接インストール」がオススメ。

Anacondaをインストール

以下の記事を参考にしてください。

JupyterLabを直接インストール

コマンドプロンプトから、以下のコードを入力ください。

pip install jupyterlab

Pandasのインストール

Pandasは二次元のデータ配列を扱うために用いるライブラリです。

コマンドプロンプトから、以下のコードを入力ください。

anacondaをインストールした場合は、自動でインストールされるはずなので、以下のコマンドは不要です。

pip install pandas

Scipyのインストール

Scipyは、95%信頼区間を扱うために用いるライブラリです。

コマンドプロンプトから、以下のコードを入力ください。

pip install scipy

Matplotlibのインストール

Mtplotlibは、グラフに可視化するためのライブラリです。

コマンドプロンプトから、以下のコードを入力ください。

pip install matplotlib

日本語対応するために以下もインストールする。

pip install japanize-matplotlib

sklearnのインストール

sklearnは、アイリスデータを用いるために使用するライブラリです。

コマンドプロンプトから、以下のコードを入力ください。

anacondaをインストールした場合は、自動でインストールされるはずなので、以下のコマンドは不要です。

公式では、以下のコマンドをたたくように指示しています。

pip install -U scikit-learn

Pythonで95%信頼区間を計算する方法

アイリスデータのロード

import pandas as pd
from sklearn.datasets import load_iris
iris=load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris['target']
df

ヒストグラムで可視化

import matplotlib.pyplot as plt
import japanize_matplotlib
target_0 = df[df.target == 0]
target_1 = df[df.target == 1]
plt.hist(target_0['sepal length (cm)'],alpha=0.5,label='target=0')
plt.hist(target_1['sepal length (cm)'],alpha=0.5,label='target=1')
plt.legend()
plt.show()
  • df[df.target == 0]を用いることで、target=0のみの行を抽出することができる

sepal length (cm)をtarget=0とtarget=1毎にヒストグラムを描きます。

各統計量を確認

target_0['sepal length (cm)'].describe()
target_1['sepal length (cm)'].describe()
  • describe()を用いることで、統計量を一発で算出できます

95%信頼区間を算出

from scipy import stats
def get_95(df):
    a = 0.95 #信頼水準
    d = len(df)-1 #自由度
    m = df.mean() #標本平均
    s = stats.sem(df) #標準誤差
    target_95per_section = stats.t.interval(alpha = a, df = d, loc = m, scale =s)
    target_95per = (target_95per_section[1] - target_95per_section[0])/2
    return target_95per 

target_0_95per = get_95(target_0['sepal length (cm)'])
target_1_95per = get_95(target_1['sepal length (cm)'])
yerr = [target_0_95per,target_1_95per]
yerr

以下がtarget_0とtarget_1の95%信頼区間。

95%信頼区間をエラーバーで可視化

x=['target_0','target_1']
bar_y = [target_0['sepal length (cm)'].describe()['mean'],target_1['sepal length (cm)'].describe()['mean']] 
plt.bar(x,bar_y,yerr=yerr,capsize=5)
plt.ylabel('sepal length (cm)')
plt.text(x=-0.4,y=6,s='エラーバー:95%信頼区間')
plt.text(x=-0.4,y=5.5,s='n=50')
plt.show()

この結果から、target_0とtarget_1には、有意差がありそう。

  • ただし、正確に有意差の有り無しを判断するには、t検定で確認する必要がある

(ちなみに)標準偏差をエラーバーで可視化

#エラーバーが、標準偏差の場合
x=['target_0','target_1']
yerr_std = [target_0['sepal length (cm)'].describe()['std'],target_1['sepal length (cm)'].describe()['std']] 
bar_y = [target_0['sepal length (cm)'].describe()['mean'],target_1['sepal length (cm)'].describe()['mean']] 
plt.bar(x,bar_y,yerr=yerr_std,capsize=5)
plt.ylabel('sepal length (cm)')
plt.text(x=-0.4,y=6,s='エラーバー:標準偏差')
plt.text(x=-0.4,y=5.5,s='n=50')
plt.show()

(ちなみに)標準誤差をエラーバーで可視化

import math
#エラーバーが、標準誤差の場合
x=['target_0','target_1']
yerr_std = [target_0['sepal length (cm)'].describe()['std']/math.sqrt(target_0['sepal length (cm)'].describe()['count']),
            target_1['sepal length (cm)'].describe()['std']/math.sqrt(target_1['sepal length (cm)'].describe()['count'])] 
bar_y = [target_0['sepal length (cm)'].describe()['mean'],target_1['sepal length (cm)'].describe()['mean']] 
plt.bar(x,bar_y,yerr=yerr_std,capsize=5)
plt.ylabel('sepal length (cm)')
plt.text(x=-0.4,y=6,s='エラーバー:標準誤差')
plt.text(x=-0.4,y=5.5,s='n=50')
plt.show()

本記事の関連の参考書や講座

基本的なPythonのコード知識を学ぶには、以下の書物がオススメです。

Udemy

Udemyはオンライン講座です。

一度購入すれば、ずっと閲覧できるのでオススメです。

【世界で8万人が受講:Python for Finance】Pythonを使って学ぶ現代ファイナンス理論と実践
ポートフォリオ理論、コーポレートファイナンス、資本資産評価モデル(CAPM)、デリバティブの値決め、モンテカルロシミュレーションといった内容を中心に、Pwcなどで活躍した講師が理論と実践に基づき解説します。

まとめ

この記事では、Pythonで95%信頼区間の求め方・計算方法を解説しました。

コメント

タイトルとURLをコピーしました