Pandasを使って複数の独立した実験データから平均値と標準偏差を算出する方法
三回の独立した実験(exp_number, 1-3) で,サンプルa-cの酵素活性(relateive_activity) を算出したデータ例を使用し,平均値(mean)と標準偏差(std)を計算する。
自作関数を作ってそれぞれを計算する方法も記録しておく。
データの準備
# import modules
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.DataFrame({'exp_number':[1,1,1,2,2,2,3,3,3],\
'sample':['a','b','c']*3,\
'relative_activity':[10, 20, 35, 8.5, 21, 40, 7, 26, 45]})
データの読み込み
display(df)
(方法その1)Group byとaggを使って算出する
stdはddof=1として不偏標準偏差を算出する(デフォルトだとddof =0 )
df_ga = df.groupby('sample')['relative_activity']\
.agg({'mean':np.mean, 'std': lambda x: np.std(x, ddof = 1)})\
.reset_index() # インデックスをリセット
df_ga
(方法その2)Group by とdescribeを使ってを算出する
groupbyでsampleをソートし平均値(mean)と,標準偏差(std)を算出する。
(両者ともにdescribe()で算出されるので,それを使う)
df_gd = df.groupby('sample', as_index = True)['relative_activity'].describe().loc[:,['mean','std']].reset_index()
df_gd
(方法その3)自作関数を使った平均値と標準偏差の計算
こちらの方が使い回しができるので楽かもしれない。
平均値と標準偏差を計算するための自作関数を作成
def mean_sd(exp_number, sample, activity):
df4mean_sd = pd.DataFrame({'exp':exp_number, 'sample':sample, 'activity':activity})
mean_sd = df4mean_sd.groupby('sample', as_index = True)['activity']\
.agg({'mean':np.mean, 'std': lambda x: np.std(x, ddof = 1)})\
.reset_index()
return mean_sd
関数を使って実際に計算 (方法その1と同じ結果が得られている)
df_gb2 = mean_sd(df['exp_number'], df['sample'], df['relative_activity'])
df_gb2
棒グラフ描画
sns.set()
sns.set_style('darkgrid',{"axes.facecolor": ".9"})
sns.set_context('talk')
# グラフサイズ指定
fig, ax = plt.subplots(figsize = (6,10))
# グラフ描画
ax = sns.barplot(df_gb['sample'],df_gb['mean'], edgecolor='black')
ax.set(title = 'Relative Activity of Sample ”a–c”') # title設定
# errorbarの付加
#ax.errorbar で xの値(0-2)とyの値(df_gb['mean']) sd(df_gb['std'])を指定する
for x, (y, sd) in enumerate(zip(df_gb['mean'], df_gb['std'])):
ax.errorbar(x, y, sd, capsize=10, capthick = 1.5 ,linewidth = 1.5, ecolor='black')
# ループでエラーバー付けるのがわかりづらければ,下記のように個別に設定してももちろんいいけども。。。
# ax.errorbar(df_gb.loc[0,'sample'], df_gb.loc[0,'mean'], df_gb.loc[0,'std'], capsize=10, capthick = 1.5 ,linewidth = 1.5, ecolor='black')
# ax.errorbar(df_gb.loc[1,'sample'], df_gb.loc[1,'mean'], df_gb.loc[1,'std'], capsize=10, capthick = 1.5 ,linewidth = 1.5, ecolor='black')
# ax.errorbar(df_gb.loc[2,'sample'], df_gb.loc[2,'mean'], df_gb.loc[2,'std'], capsize=10, capthick = 1.5 ,linewidth = 1.5, ecolor='black')
matplotlibによるグラフ描画方法について:
(以上)
この記事が気に入ったらサポートをしてみませんか?