Bland-Altmanプロットを使用する理由
Bland-Altmanプロットは、二つの機器のメジャーを比較するために医 John Martin Bland&Douglas Altmanの最初の目的は、この質問に答えることでした:
測定の二つの方法は十分に密接に一致していますか? -D.G.アルトマンとJ.M. 当たり障りのない
そうであれば、一方が高コストで最先端であり、もう一方が10倍安い二つの機器があれば、最も安い方法で得られた結果は基準に匹敵し、十分な精度で置き換えることができるということを意味する。 たとえば、$20接続された時計によって提供される心拍数は、心電図の結果として十分に正確ですか? 第二の目的は、結果が非統計学者に容易に理解できる方法を作り出すことでした。
分析において、A/Bテスト(Champion-Challengerとしてよく知られている)は、population_Aに対する新しいアクション/新しい治療/新しいデザイン/…の結果を現在のアクションを持つpopulation_Bと比較するためのテストの一般的な方法論です。 テストの結果が得られたら、それらを分析し、主に非統計学者で構成される決定チームに提示する必要があります。 そのため、Bland-Altmanプロットは、あるプロットのA/B検定の結果と、理解できる方法で表示されるすべての統計的尺度を比較するため、関連性があります。
彼らの論文の中で、彼らはまた、相関係数、平均比較の統計的検定および回帰が、チャンピオンのものと比較して挑戦者の力を決定するためのA/Bテス
使用したデータ
この記事では、”Cookie Catsを使用したモバイルゲームA/Bテスト”と呼ばれるKaggle(DataCampプロジェクトからのもの)で利用可能なデータセットを使用します。 リンクは参照部分にあります。
クッキー猫は、プレイヤーがレベルを進めるように、彼はプレイしたり、購入を行うために継続する前に、いくつかの時間を待つために彼を強制する”ゲート” このような業界では、リテンションは重要な指標の一つであり、最初のゲートがレベル30からレベル40に移動した場合、ゲームを担当するチームは7日間のリテンションに影響を与えることになる。 このような動きの動作を確認するために、彼らはA/Bテストを行い、これらの結果のデータセットを提供しました。 Bland-Altmanプロットが次の質問にどのように答えるかを見ていきます : “待機時間がレベル30からレベル40に移行した7日間の保持レベルでA/B結果を分析する方法は?”
データセットは90.189行で構成され、プレイヤーの一意のid、A/Bテストのバージョン(gate_30/gate_40での待機時間)、ゲームラウンドの合計、retention_1はプレイヤーが翌日に戻ってきた場合のブール値、retention_7は7日後に戻った場合のブール値である。 私たちの質問に答えるために関連するデータを得るためには、いくつかの清掃を行う必要があります。 クライアントはretention_1=True(retention_1=Falseの場合、retention_7もFalseであるため)、ゲームラウンド数≥30(30まで行かなければゲートの影響を受けないため)、ゲームラウンド数<170(ゲームの期間=5分を考慮すると、プレイヤーが7日間に2時間プレイした場合、120*7/5=168ゲームをプレイする。 より高い数はanormal使用法として考慮されます)。 このフィルタの後、データセットは以下の図1のように20.471行で構成されます。 さらに、データセットはgate_30&gate_40の間で均等にバランスされます。
Bland-Altmanプロットの構築方法
このセクションでは、元のBland-AltmanプロットをA/Bテストに適用するためにどのように適応させるかを見ていきます。 まず、プロットが元のバージョンでどのように構築されているかを説明し、次にA/Bテストのデータを使用してプロットを構築する方法を説明します。
オリジナルのBland-Altmanプロットは2つの楽器の測定値を比較しているため、設計上同じ長さを持っています。 例えば、$20connect watchと心電図の間の心拍数測定では、測定は同じ条件で同じ時間に行われ、2つの方法で同じ測定数を持つことになります。 したがって、以下の図2の例のように、各データセットの行をエクスペリエンスとして表すことができます。
ここで最初の”痛みのポイント”に遭遇します。 A/Bテストはユニークな経験とみなされますが、上記のように、プロットを構築するためにはいくつかの経験が必要です。 この制限を回避するために、A/Bテストから同じ&異なる長さの両方を持ついくつかのブートストラップサンプルを作成します。
200から1.000の間の300個の一意でないランダムな整数を生成します。 これらの整数は、ブートストラップされた各サンプルの長さを表し、ブートストラップの統計的特性を利用するために、一意でない各ランダム整数は50回複製されます。 これらの数値は、サンプルの多様性を持つために使用されますが、任意であり、長さは元のデータセットのサイズによって異なります。 200から2.000の間の長さを持つこれらの15.000(300*50)ブートストラップサンプルは、元のデータセットからの置換と無作為抽出によって取得され、それらは一緒に連結されます。 これは図3として表すことができる。
次のコードは、元のデータからブートストラップデータセットを作成します(ブートストラップデータセットの長さは9.184.350行であるため、時間がかかる可能性があります{random_stateを変更することにより、平均して(((200+1.000)/2)*300*50 = 9.000.000 行})。
次に、n_sample(各15のid)でグループ化します。000ブートストラップサンプル)、n_sample_2(各ブートストラップサンプルの長さ)、およびバージョンは、図4のようにゲートごとに7日間のプレイヤーの保持の合計を
後のブートストラップデータセットこの出力は次のように読み取ることができます。ブートストラップされたサンプルn°0/14.999は564行で構成され、98人のプレイヤーが7日で待機時間をgate_30で再生し、105人のプレイヤーが7日で待機時間をgate_40で再生しています。
次に、ブートストラップ標本の平均が分布の真の平均の良い推定値であるというboostrapの統計的性質を使用します。 図5のように、一意のサンプルの長さごとに、ゲートごとの7日間でのプレイヤーの平均保持数を持つために、n_sample_2とversionでグループ化します。
この出力を次のように読むことができます: サンプルに200行がある場合、平均34.60人のプレイヤーがgate_30で待機時間で7日間プレイしているのに対し、34.38人のプレイヤーがgate_40で待機時間で7日間プレイしています。
次に、図6のようにデータセットをより明確な形式にするために、データベースのスタックを解除します。
この段階では、Bland-Altmanプロットを構築するために必要なすべての情報があり、データセットの表現は上の図2と同じです。
Bland-Altmanプロットは2軸で構成されています。 X軸は、比較する2つの方法の平均です。 だからそれは各行のためです:(gate_30i+gate_40i)/ 2 ||| y軸はメソッドAとメソッドBの違いです。(gate_30i-gate_40i)///そして、ここに私たちが持っている2番目の「痛みのポイント」があります。 Y軸をそのままにすることで、サンプルのサイズが大きくなると、差異の変動が大きくなります。 その結果、後で取得する統計的尺度は、最大のサンプルによって重み付けされます。 この制限を回避するために、y軸をパーセンテージで表します。 これを行うには、yの計算は各行に対して行われます:((gate_30i-gate_40i)*100|((gate_30i+gate_40i)|2)|||データセットは図7のようになります。
表示される信頼区間を信頼するために、y軸が正規分布していることを確認する必要があります。 Shapiro-wilk検定を使用するか、少なくともヒストグラムを使用して評価できます。 分布が正規でない場合は、対数変換などの変換を行うことができます。 私たちの場合、私は分布を通常のものと考えています。
Bland-Altmanは3行で構成されています(図9参照):
- yの平均値
- 信頼区間のyの上限(ここでは95%の1.96)
- 信頼区間のyの下限(1.96の場合は95%)
- 信頼区間のyの下限(1.96の場合は95%)
- 信頼区間のyの下限(1.96の場合は95%)
- 95%)
私たちはすべて一緒に入れて、パッケージpyCompareはdbを構築することなく、非常に簡単な方法でBland-Altmanプロットを描画することができます:
それは最初に方法A(チャンピオン)、次に方法B(挑戦者)を取ります。 次に、percentage=Trueの場合、上で行った計算を自動的に行います。 私達が後で論議する他のある変数があります。
A/Bテストの当たり障りのないAltmanプロットの解釈方法
ここにいます! 上記のコードによって生成されたA/BテストのBland-Altmanプロットの図は次のとおりです:
に適用されたBland-Altmanプロットまず、平均と平均の信頼区間(水色のストライプ)は0とは異なります(この場合は高くなります)。 これは、gate_30とgate_40の保持レベル(元の論文ではbiasと呼ばれています)が大きく異なることを意味します。 2.93>0ということは、A>B<->Champion>Challengerということを意味し、その結果、gate_30の待機期間はgate_40の待機期間よりも大きな保持期間を提供します。
二つのサーモンバーは、値の95%が間になると確信しているという95%の信頼区間(元の論文ではlimit of agreementと呼ばれています)を表しています。 私たちの例では、gate_30の保持はほとんど常にgate_40の保持よりも大きくなると言うことができるので、これは非常に強力です。
ご覧のように、上のサーモンストライプの上に2つ、下のサーモンストライプの下に4つの値があり、6/300=0.02<0です。05値の95%が2つの境界内にあることが確実であるため、5%は上または下になり、私たちの場合は2%を表し、完全に正常です;)
pyCompareパッケージには、信頼の境界を変 ここで、関連する質問は次のようになります:「どの割合で、gate_30の保持がgate_40の保持よりも常に大きくなることを確認できますか?「この質問に答えるには、最低の境界は0に等しくなければならないので、図11を提供する以下のコードでわかるように、0を得るために正しい値を見つ:
を変更したときの出力limitOfAgreement=1.55のとき、境界はほぼ0に等しいことがわかります。 次に、正規分布テーブルで1.55の値(0.9394)をチェックする必要があるため、次のようにします((1-0.9394)*2)*100 = 87.88%gate_30の保持は常にgate_40
の保持よりも大きくなる最後の点は、サンプルの平均値が何であれ、それらはプロット上で一様に表されることです。 確かに、ある種の値の円錐表現を見た場合、サンプルのサイズが結果に影響を与えるため、有効な解釈ができないと結論付けることができます。
結論
単純なプロットでのA/Bテストの結果、A/Bテストからプロットを作成する方法、およびそれを解釈する方法について1つのビューを持つために、Bland-Altmanプロットを使用することが関連する理由を見ました。 これは、違いが正常である場合にのみ機能しますが、データを変換する必要があります。
さらに、アプリをチェックしたところ、ゲートはgate_40にあるように見えましたが、7日間の保持は30で優れていることが証明されました。 この場合、収益性と比較して、保持率が従うべき最良の指標ではない可能性があることを示しています。
D.G.Altman and J.M.Bland,Measurement in Medicine:The Analysis of Method Comparison Studies,The Statistician32 (1983) 307-317
https://projects.datacamp.com/projects/184 またはhttps://www.kaggle.com/yufengsui/mobile-games-ab-testing
D.G.AltmanおよびJ.M.Bland、臨床測定の二つの方法の間の一致を評価するための統計的方法、ランセット327 (1986) 307-310
D.Giavarina,Understand Bland Altman analysis,Biochemia Medica25(2015)141-151