実験データの設定

Pythonで学ぶ実験計画法

James Chapman

Curriculum Manager, DataCamp

ランダム化の問題点

1) 不均等の問題:グループの被験者数が異なる

2つのグループで被験者数が異なる図。

Pythonで学ぶ実験計画法

ランダム化の問題点

2) 共変量の問題:一部の共変量のばらつきが大きい → 無作為化でグループ不均衡

反応時間に対する年齢の影響を測るための対照群と処置群。両群で体力の分布が不均一で、主要関心ではないが反応時間に影響しうる。

結果:処置効果の推定が難しくなる

Pythonで学ぶ実験計画法

ブロックランダム化

 

  • 先にサイズ$n$のブロックに分割し、その後に無作為化
    • 不均等の問題を解決

ブロックランダム化の例(オレンジと白の格子2つ)

  • 24人を2群に分けてから無作為化
Pythonで学ぶ実験計画法

本データセット

  • Eコマースデータセット(ecom)(被験者1000人)
    • 平均バスケットサイズ
    • 平均サイト滞在時間
    • パワーユーザー(サイト滞在 平均40分/日以上)
   basket_size  web_time  power_user
0          227         7           0
1          123         5           0
2           98        16           0
3          211        45           1
4          133        17           0
Pythonで学ぶ実験計画法

Pythonでのブロックランダム化

group1 = ecom.sample(frac=0.5, random_state=42, replace=False)
group1['Block'] = 1
group2 = ecom.drop(group1.index)
group2['Block'] = 2
print(len(group1), len(group2))
500,500
Pythonで学ぶ実験計画法

分割の可視化

 

import seaborn as sns
import matplotlib.pyplot as plt
sns.displot(data=ecom, 
            x='basket_size', 
            hue='power_user', 
            fill=True, 
            kind='kde')    
plt.show()

交絡 = 介入ではなく、変数が効果を引き起こす可能性

 

半透明の2つの正規分布のような分布を示すseabornの図。大きい青と小さいオレンジがやや重なり、オレンジが右に寄る

Pythonで学ぶ実験計画法

層別化ランダム化

 

  • 先に共変量で分割
    • その後に無作為化
  • 緑 = すべてパワーユーザー(黄 = 非パワーユーザー)
    • その後に処置/対照へ分割
  • 共変量/交絡の問題を緩和
  • 複数共変量でも可。ただし複雑化

2つのデータ格子(緑と黄)。各セルにTまたはC。黄色の格子の方が大きい

Pythonで学ぶ実験計画法

最初の層

  • パワーユーザーを分離
  • 処置/対照にサンプリング
strata_1 = ecom[ecom['power_user'] == 1]
strata_1['Block'] = 1

strata_1_g1 = strata_1.sample(frac=0.5, replace=False) strata_1_g1['T_C'] = 'T'
strata_1_g2 = strata_1.drop(strata_1_g1.index) strata_1_g2['T_C'] = 'C'
Pythonで学ぶ実験計画法

第2の層

  • 非パワーユーザーを分離
  • 処置/対照にサンプリング
strata_2 = ecom.drop(strata_1.index)
strata_2['Block'] = 2

strata_2_g1 = strata_2.sample(frac=0.5, replace=False) strata_2_g1['T_C'] = 'T' strata_2_g2 = strata_2.drop(strata_2_g1.index) strata_2_g2['T_C'] = 'C'
Pythonで学ぶ実験計画法

層別化の確認

  • ブロックとグループを結合
  • groupbyで割当を確認
ecom_stratified = pd.concat([strata_1_g1, strata_1_g2, strata_2_g1, strata_2_g2])

ecom_stratified.groupby(['Block','T_C', 'power_user']).size()
Block  T_C  power_user
1      C    1              50
       T    1              50
2      C    0             450
       T    0             450
Pythonで学ぶ実験計画法

演習に進みましょう!

Pythonで学ぶ実験計画法

Preparing Video For Download...