【Python】臨床研究のための医療統計データを可視化する方法①

 

 

 

 

 

今回はPythonを使用してデータの可視化、色々なグラフを作成したいと思います。

グラフをいっぱい作っていくので、jupyter-notebookを使用します。

pythonでキレイなグラフを作成するにはSeabornを使います。

Pythonでグラフを作成するにはMatplotlibかSeaborn

 

グラフ作成に必要なものをインポートします。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from numpy.random import randn
sns.set()
%precision 3
%matplotlib inline

 

1変量データに対するグラフの扱い

Matplotlibでグラフ作成

標準正規分布からランダムに1000個のデータを取得します。

Matplotlibのpyplotを使用してヒストグラムを作成します。

dataset1 = randn(1000)
plt.hist(dataset1)
ヒストグラム

f:id:Medicmed:20180623123906p:plain

matplotlibのpyplot.hist()を使用するとヒストグラムを作成できます。

binは区切りのことでデフォルトでは10本になっています。

binの値を変えてみます。

plt.hist(dataset1,bins=1)
bin=1としたヒストグラム

f:id:Medicmed:20180623124148p:plain

グラフの色を変えるにはcolorという引数に値を渡します。

plt.hist(dataset1,bins=100,color='indianred') 
colorをindianredに変更したグラフ 

f:id:Medicmed:20180623124656p:plain

グラフを標準化するにはnormedという引数にTrueを指定します。

plt.hist(dataset1,normed=True,color='indianred')
標準化したグラフ

f:id:Medicmed:20180623125041p:plain

グラフの標準化とは平均=0、分散=1にすることです。

このように変形することによって、ヒストグラム全体の面積が1になるように変形でき確率のように解釈することができます。

次にSeabornでグラフを作成していきたいと思います。

Seabornは高機能なので、よりキレイなグラフを作ることができます。

 

Seabornでグラフ作成

Seabornでヒストグラムを作成するには「distplot()」を使用します。

sns.distplot(dataset1,bins=10)
Seabornでのヒストグラム

f:id:Medicmed:20180623125626p:plain

ヒストグラムの他に滑らかな曲線が一緒に描かれており、これを「カーネル密度推定」と呼びます。

ヒストグラムはデータポイントの個数を数え上げるのに対して、カーネル密度推定はデータがある所にそれぞれガウス分布(正規分布)を作って足し合わせてものです。

ヒストグラムには「区分をどのように設定するかによってグラフの形状を変えることができる」という問題があり、カーネル密度推定はそれを解決してくる優れものという理解でオッケーだと思います。

カーネル密度推定の曲線はデフォルトで描かれるので、不要な場合はkdeにFalseを与えます。

sns.distplot(dataset1,bins=10,kde=False,color='indianred')
カーネル密度推定を非表示にしたグラフ

f:id:Medicmed:20180623125851p:plain

 

2変量データに対するグラフの扱い

1変数におけるグラフ作成をみてきましたが、2変数でのグラフ作成を行っていきます。データは統計検定の公式ページにあるデータセットを使用します。

 

日本統計学会公式認定 統計検定2級対応 統計学基礎

日本統計学会公式認定 統計検定 2級 公式問題集[2015〜2017年]

日本統計学会公式認定 統計検定 2級 公式問題集[2015〜2017年]

 

 

dataset2 = pd.read_table("第2章/本文/Mansion2.data")
dataset2.head()
  徒歩 近さ 家賃 間取り 大きさ 方角 築年数
0 8 B 7900 1K 30.03 3
1 9 B 8500 1K 21.90 5
2 10 B 10800 1K 27.05 4
3 10 B 10800 1K 29.67 4
4 10 B 11000 1LDK 37.04 18

 

「近さ」と「家賃」の2変数データに変形します。

multi_data = dataset2.drop(['徒歩','間取り','大きさ','方角','築年数'],axis=1)
multi_data.head() 

日本語だと見づらいため英語に変換します。

「近さ」でグループ化し、主要な要約統計量を表示してくれるdescribe()を使用します。

multi_data.columns = ['NearBy','Price']
multi_data.groupby('NearBy').describe()

f:id:Medicmed:20180623134132p:plain

「近さ」ごとに「家賃」データを取り出してそれぞれ変数に格納します。

ある列の特定の値だけを抜き出してくるにはquery()を使用します。

NearBy_A = multi_data.query('NearBy == "A"')["Price"]
NearBy_B = multi_data.query('NearBy == "B"')["Price"]

ヒストグラムを描く関数を2回連続で実行するとヒストグラムを重ねることができます。

sns.distplot(NearBy_A,bins=10,color='red',kde=False)
sns.distplot(NearBy_B,bins=10,kde=False)
「近さ」で層別化した家賃のグラフ

f:id:Medicmed:20180623131641p:plain

seabornのjointplot()を使用すると「散布図+ヒストグラム相関係数」をまとめてグラフにしてくれるため便利です。

seabornを使用してマンションデータから「家賃」と「大きさ」を取ってきてグラフにします。

sns.jointplot(dataset2['大きさ'],dataset2['家賃'], size=10)
Seabornのjointplot()によるグラフ

f:id:Medicmed:20180623131911p:plain

「peasonr」というものが相関係数のことです。家賃と大きさには「0.89」という値の正の相関があることが分かります。

「kind」引数を変えると、散布図から色々な種類に変更することができます。

sns.jointplot(x='大きさ',y='家賃', size=8,data=dataset2,kind='hex')
kind=’hex’としたグラフ

f:id:Medicmed:20180623132107p:plain

色の濃さでデータの密度が分かるためどのポイントに集中しているのかが分かりやすくなりました。

kind引数に”reg”を渡すと「回帰直線」のグラフを描いてくれます。

kind=’reg’としたグラフ

f:id:Medicmed:20180623132331p:plain

jointplot()ではカーネル密度推定のグラフも作成することができます。

kind=’kde‘としたグラフ

f:id:Medicmed:20180623132422p:plain

カーネル密度推定にするとよりデータ分布が視覚的なって分かりやすい気がします。

カーネル密度推定のグラフはSeabornのkdeplot()を使用しても作成できます。

デフォルトだと基底関数に正規分布が指定されていますが、基底関数を色々な密度関数に変更してグラフを作成することもできます。

plt.figure(figsize=(10,8))
kernel_options = ['biw','cos','epa','gau','tri','triw']
for kern in kernel_options :
sns.kdeplot(dataset2['家賃'], kernel=kern, label=kern)
カーネル密度推定の基底関数を変化させたグラフ

f:id:Medicmed:20180623133017p:plain

今度は基底関数を変えるのではなく、バンド幅を変えてグラフの変化を見たいと思います。

バンド幅のイメージはそのデータポイントの影響幅がどこまで拡がるかであって、小さければあまり拡がらず、大きいと裾野が拡がっていきます。

plt.figure(figsize=(10,8))
for bw in np.arange(0.5, 2, 0.25) :
sns.kdeplot(dataset1, bw=bw, label=bw)
カーネル密度推定のバンド幅を変化させたグラフ

f:id:Medicmed:20180623133221p:plain

 

Pythonでグラフを作成する際に、ぜひ参考にしてみてください。

終わり。

 

今回参考にした書籍はコチラ!
Pythonで学ぶあたらしい統計学の教科書

Pythonで学ぶあたらしい統計学の教科書

 

 

 

統計学を本格的に勉強したい方向け!

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください