見出し画像

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

(方法その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

スクリーンショット 2020-10-25 14.37.20

(方法その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

画像2

(方法その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

画像3

棒グラフ描画

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

画像4

matplotlibによるグラフ描画方法について:

(以上)

この記事が気に入ったらサポートをしてみませんか?