stats-methods について
データ分析向けの統計手法スキルです。数値の要約、トレンド分析、外れ値への対処、仮説検定を扱い、簡易予測と分析上の注意点もまとめています。
主な機能
- 01代表値とばらつき指標の選択
- 02パーセンタイルによる分布の記述
- 03期間比較とトレンド分析
- 04外れ値の特定と処理
- 05仮説検定の選択
- 06統計分析の落とし穴の回避
活用シーン
- 01ビジネス指標の分布を要約
- 02A/B テストやユーザー群を比較
- 03時系列の異常と季節性を確認
- 04短期指標の予測範囲を算出
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ okou-ai/ okou-skills --skill stats-methodsインストール後、Claude Code で/stats-methodsを入力して読み込まれたか確認します。
詳細
数値データの要約
中心を表す指標の選択
| データの特性 | 推奨される指標 | 理由 |
|---|---|---|
| 対称的で、外れ値がない | 平均値 | 最も効率的な推定量です |
| 非対称、または外れ値が多い | 中央値 | 極端な値の影響を受けません |
| 数値ではない、または順位付けされたデータ | 最頻値 | カテゴリーデータで唯一使える指標です |
| ユーザーあたりの収益などのビジネス KPI | 平均値と中央値の両方 | 両者の差から歪みがわかります |
指針: ビジネス指標を示す際は、平均値とともに中央値も提示してください。両者に大きな差がある場合、分布が歪んでいるため、平均値だけでは誤解を招きます。
ばらつきの定量化
- 標準偏差:平均値からの典型的な距離です。釣鐘型のデータに最適です。
- IQR(四分位範囲):25 パーセンタイルと 75 パーセンタイルの差です。極端な値の影響を受けにくい指標です。
- 変動係数:標準偏差を平均値で割った値です。異なる尺度間で、ばらつきを同じ基準で比較できます。
- 範囲:最大値から最小値を引いた値です。データの広がりをすばやく把握できますが、外れ値の影響を受けやすい指標です。
パーセンタイルでデータの傾向を伝える
平均値にとどまらず、パーセンタイルの段階的な値を報告してください。
p1: Floor of the distribution (bottom 1%)
p5: Lower boundary of typical values
p25: First quartile
p50: Median — the representative observation
p75: Third quartile
p90: Top 10% threshold (heavy users, premium tier)
p95: Upper boundary of typical values
p99: Extreme top 1%
分析例:「すべてのセッションの半数は 4.2 分未満ですが、上位 10%は 22 分を超えており、その結果、平均は 7.8 分になっています。」
分布の特徴づけ
数値列ごとに、以下を記録してください。
- 形状:ガウス型、右裾が長い、左裾が長い、二峰性、一様、裾が重い
- 中心:平均値と中央値、および両者の差の大きさ
- 広がり:適切に標準偏差または IQR を使用
- 極端な値:外れ値の数と程度
- 境界:ゼロを下限とする場合や 100%を上限とする場合など、自然な上限・下限
トレンド分析と予測
ノイズの多い時系列の平滑化
# Weekly smoother — useful for daily data with weekday/weekend cycles
df['smooth_7'] = df['metric'].rolling(window=7, min_periods=1).mean()
# Four-week smoother — irons out both weekly and monthly rhythms
df['smooth_28'] = df['metric'].rolling(window=28, min_periods=1).mean()
期間比較
- 前週比:1 週間隔で同じ曜日を比較します
- 前月比:暦月とその直前の暦月を比較します
- 前年同期比:季節性のあるビジネスで最も信頼できる比較基準です
- 同一暦日比:前年の同じ日付と比較します
成長の測定
Simple rate: (current - prior) / prior
CAGR: (final / initial) ^ (1 / n_years) - 1
Log rate: ln(current / prior) # more stable for volatile series
季節サイクルの特定
- まず生の時系列を目視で確認します
- 曜日ごとに集計し、週次のリズムを明らかにします
- 暦月ごとに集計し、年次のリズムを明らかにします
- トレンドと季節性を切り分けるには、必ず前年同期比または同一期間の比較を使用します
手軽な予測手法
本格的なモデリングではなく、すばやい予測が必要な分析担当者向けの手法です。
- ナイーブ予測:直近の観測値を予測値とします。最低限のベースラインとして機能します。
- 季節ナイーブ予測:前の季節サイクルにおける同じ期間の値を予測値とします。
- 線形外挿:直近の履歴に直線を当てはめます。トレンドが明らかに線形の場合にのみ適しています。
- 移動平均:移動平均を予測値として使用します。
予測は点推定ではなく、必ず範囲で示してください。
- 良い例:「直近四半期の実績に基づくと、来月の登録数は 10,000~12,000 件になる見込みです」
- 誤解を招く例:「来月の登録数は正確に 11,234 件になります」
パターンが非線形の場合、複数の季節サイクルが重なっている場合、広告費や祝日などの外部要因が重要な場合、または予測精度がリソース配分の判断に影響する場合は、専門家に引き継いでください。
外れ値の検出と処理
特定手法
Z スコア法(おおむね正規分布であることを前提とします):
z = (df['val'] - df['val'].mean()) / df['val'].std()
outliers = df[abs(z) > 3] # beyond 3 standard deviations
IQR フェンス法(分布の形状を問いません):
q1 = df['val'].quantile(0.25)
q3 = df['val'].quantile(0.75)
iqr = q3 - q1
lo = q1 - 1.5 * iqr
hi = q3 + 1.5 * iqr
outliers = df[(df['val'] < lo) | (df['val'] > hi)]
パーセンタイルカットオフ法(最も簡単な方法です):
outliers = df[(df['val'] < df['val'].quantile(0.01)) |
(df['val'] > df['val'].quantile(0.99))]
外れ値への対処
外れ値を自動的に除外してはいけません。次の手順に従って判断します。
- 診断する:記録ミスか、正当に極端な観測値か、別の母集団の存在を示すものかを確認します。
- 誤りの場合:修正するか除外します(例:負の年齢、エポックゼロのタイムスタンプ)。
- 正当な極端値の場合:保持しつつ、ロバストな要約統計量(中央値、IQR)に切り替えます。
- 異なる母集団の場合:別々に分析します(例:エンタープライズアカウントとセルフサービス)。
除外した記録はすべて記録します:「注文額が$50Kを超える47件の記録(データセットの0.3%)を除外しました。これらの大口エンタープライズ取引については、別のセクションで扱います。」
時系列の異常検知
- 期待されるベースライン(移動平均または前年同期の値)を設定します。
- 残差を計算します:実績値から期待値を差し引きます。
- 過去の残差の標準偏差の2~3倍を超える残差にフラグを付けます。
- 一時的な急増(一点異常)と継続的な変化(変化点)を区別します。
仮説検定の基本
適用する場面
ランダムノイズと実際のシグナルを区別する必要がある場合は、必ず正式な検定を使用します。
- A/Bテストの結果を評価する
- 製品変更の影響を測定する(変更前と変更後)
- 顧客セグメント間で指標を比較する
手順
- 帰無仮説(H0)を設定する:差は存在しない(デフォルトの立場)
- 対立仮説(H1)を設定する:差が存在する
- 有意水準(alpha)を設定する:標準は0.05(偽陽性の許容率5%)
- 検定統計量とp値を計算する
- 判断する:p < alphaの場合、H0を棄却するのに十分な証拠があります。
適切な検定の選び方
| 問い | 適切な検定 | 条件 |
|---|---|---|
| 2群の平均に差があるか? | 独立サンプルのt検定 | おおむね正規分布、2群 |
| 2つのコンバージョン率に差があるか? | 比率のz検定 | 二値の結果 |
| 同じ対象を2回測定しているか? | 対応のあるt検定 | 同一対象の前後比較 |
| 3群以上の平均を比較するか? | ANOVA | 複数のバリエーションまたはセグメント |
| 正規分布ではないデータで、2群を比較するか? | Mann-Whitney U検定 | 偏りのある指標または順序尺度の指標 |
| 2つのカテゴリ変数に関連があるか? | カイ二乗検定 | 度数表データ |
p値を超えて:実質的な影響
統計的に有意な結果は、効果が偶然による可能性が低いことだけを意味します。実務上重要な効果であることを保証するものではありません。検定結果には必ず次の情報を添えてください。
- 効果の大きさ:「バリエーションBによりコンバージョン率が0.3パーセントポイント向上しました」
- 信頼区間:真の効果として妥当と考えられる範囲
- ビジネス上の解釈:収益、ユーザー、または効率への影響
サンプルサイズへの留意
- サンプルが小さいと、p値が良好に見えても結論の信頼性は低くなります。
- 比率のベースラインの信頼性を確保するには、各群でおよそ30件以上のイベントが必要です。
- 微妙な効果(例:コンバージョン率の1ポイントの変化)を検出するには、各群に数千件の観測値が必要になることがあります。
- データが限られている場合は、その旨を明記します:「各群200件の観測値では、X%未満の効果は検出できない可能性が高いです」
統計上の落とし穴を避ける
相関と因果関係
相関が見つかった場合は、必ず次の可能性を明示的に検討します。
- 逆方向の因果関係:AがBを促すのではなく、BがAを促している可能性があります。
- 隠れた第三の要因:測定されていない変数Cが両方の背後にある可能性があります。
- 偶然:変数のペアを十分な数だけ調べれば、見せかけの関連が見つかることがあります。
安全な表現:「機能Xを利用するユーザーは、継続率が30%高い傾向にあります」 安全でない表現:「機能Xによって継続率が30%高くなります」(実験的な証拠が必要です)
多重検定の落とし穴
多くの検定を実行すると、偽陽性が増加します。
- alpha = 0.05で20個の指標を検定すると、偶然によりおよそ1件の見せかけの有意差が生じます。
- 「興味深い」セグメントを見つけるまでに多数のセグメントを調べた場合は、そのことを明記します。
- ボンフェローニ補正(alpha / 検定数)を適用するか、実施した検定の総数を明示します。
シンプソンのパラドックス
データをサブグループに分けると、全体の傾向が逆転することがあります。
- 集計した結論が、主要な各セグメントでも成り立つことを確認します
- よくある例:自然にコンバージョン率が高いセグメントにトラフィックが移ったため、各セグメントのコンバージョン率は低下しているのに、全体のコンバージョン率は上昇します
生存者バイアス
データセットに含まれるのは、記録されるまで存続した対象だけです。
- 現在のユーザーだけを調べると、すでに離脱したユーザーが見落とされます
- 成功した製品だけを分析すると、失敗した製品が見落とされます
- 定期的に次のように問いかけます。「このデータに含まれていないのは誰で、その人たちを含めると結論は変わるでしょうか?」
生態学的誤謬
集団レベルの傾向が個人にも当てはまるとは限りません。
- 「Xが高い国ほどYも高い」からといって、個人レベルでも同じことが当てはまるわけではありません
- 集計統計を個人レベルの予測に当てはめるのは避けましょう
見せかけの精密さ
過度に細かな数値は、根拠のない確信を示唆します。
- 「来四半期の解約率は4.73%になります」という表現は、実際にはほとんど得られない精度を暗示します
- 「解約率は4%から6%の間になる可能性が高い」のように、誠実な範囲で示しましょう
- 実際に把握している確実性の水準に合わせて、数値を丸めましょう