statistical-analysis について
ビジネスアナリストなど、データを解釈する人向けの統計分析スキルです。記述統計、トレンド、異常値、仮説検定に加え、統計的な結論を慎重に扱うための指針を扱います。
主な機能
- 01記述統計のガイダンス
- 02トレンド分析と簡易予測
- 03外れ値と異常の検出
- 04仮説検定の基礎
- 05統計的主張への注意点
活用シーン
- 01ビジネス指標の分布要約
- 02期間ごとの結果比較
- 03データ内の異常値の確認
- 04A/Bテストの差の評価
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ w95/ awesome-claude-corporate-skills --skill statistical-analysisインストール後、Claude Code で/statistical-analysisを入力して読み込まれたか確認します。
詳細
統計分析スキル
記述統計、トレンド分析、外れ値検出、仮説検定、および統計的な主張に慎重になるべき状況についてのガイダンスです。
記述統計の方法論
中心傾向
データに応じて適切な代表値を選びます。
| 状況 | 使用する指標 | 理由 |
|---|---|---|
| 対称分布で、外れ値がない | 平均値 | 最も効率的な推定量です |
| 歪んだ分布 | 中央値 | 外れ値の影響を受けにくいためです |
| カテゴリデータまたは順序データ | 最頻値 | 数値以外のデータで使える唯一の選択肢です |
| 外れ値を含む大きく歪んだ分布(例:ユーザーあたりの収益) | 中央値+平均値 | 両方を報告します。差が歪みを示します |
ビジネス指標では、平均値と中央値を必ず併せて報告します。 大きく異なる場合、データは歪んでおり、平均値だけでは誤解を招きます。
ばらつきと変動性
- 標準偏差:値が平均値から通常どの程度離れているかを示します。正規分布のデータに使用します。
- 四分位範囲(IQR):p25からp75までの距離です。外れ値の影響を受けにくく、歪んだデータに使用します。
- 変動係数(CV):標準偏差/平均値です、異なる尺度の指標間で変動性を比較する際に使用します。
- 範囲:最大値から最小値を引いた値です。外れ値の影響を受けやすいものの、データの広がりをすばやく把握できます。
ビジネスの文脈でのパーセンタイル
平均値だけの場合よりも詳しい状況を伝えるため、主要なパーセンタイルを報告します。
p1: Bottom 1% (floor / minimum typical value)
p5: Low end of normal range
p25: First quartile
p50: Median (typical user)
p75: Third quartile
p90: Top 10% / power users
p95: High end of normal range
p99: Top 1% / extreme users
説明の例:「セッション時間の中央値は4.2分ですが、上位10%のユーザーは1回のセッションで22分以上利用しており、その結果、平均値は7.8分に引き上げられています。」
分布の説明
分析するすべての数値分布について、次の特徴を示します。
- 形状:正規分布、右に歪んだ分布、左に歪んだ分布、二峰性分布、一様分布、裾の重い分布
- 中心:平均値と中央値(および両者の差)
- ばらつき:標準偏差またはIQR
- 外れ値:その数と極端さ
- 境界:自然な下限(ゼロ)または上限(100%)があるか
トレンド分析と予測
トレンドの特定
ノイズを平滑化する移動平均:
# 7-day moving average (good for daily data with weekly seasonality)
df['ma_7d'] = df['metric'].rolling(window=7, min_periods=1).mean()
# 28-day moving average (smooths weekly AND monthly patterns)
df['ma_28d'] = df['metric'].rolling(window=28, min_periods=1).mean()
期間ごとの比較:
- 週次(WoW):前週の同じ曜日と比較します
- 月次(MoM):前月の同じ期間と比較します
- 年次(YoY):季節性のあるビジネスにおける標準的な方法です
- 前年の同日:特定の暦日と比較します
成長率:
Simple growth: (current - previous) / previous
CAGR: (ending / beginning) ^ (1 / years) - 1
Log growth: ln(current / previous) -- better for volatile series
季節性の検出
周期的なパターンがないか確認します。
- 生の時系列データをプロットします。まずは目視で確認します
- 曜日ごとの平均値を計算します。明確な週次パターンがあるか確認します
- 月ごとの平均値を計算します。年周期があるか確認します
- 期間を比較するときは、トレンドと季節性を混同しないよう、必ず前年比または同じ期間同士で比較します
予測(シンプルな手法)
データサイエンティストではなくビジネスアナリスト向けに、わかりやすい手法を使用します。
- 単純予測:明日=今日。ベースラインとして使用します。
- 季節性を考慮した単純予測:明日=先週または前年の同じ日。
- 線形トレンド:過去のデータに直線を当てはめます。明確な線形トレンドがある場合にのみ使用します。
- 移動平均予測:直近の平均値を予測値として使用します。
不確実性は必ず伝えます。 点推定ではなく、範囲で示します。
- 「過去3か月のトレンドに基づくと、来月の登録者数は10K~12Kになる見込みです」
- 「来月は登録者数が正確に11,234人になります」は避けます
データサイエンティストに相談すべき場合:非線形トレンド、複数の季節性、外部要因(マーケティング費用、祝日)がある場合、またはリソース配分のために予測精度が重要な場合です。
外れ値と異常値の検出
統計的手法
Zスコア法(正規分布のデータ向け):
z_scores = (df['value'] - df['value'].mean()) / df['value'].std()
outliers = df[abs(z_scores) > 3] # More than 3 standard deviations
IQR法(正規分布でない場合にも頑健):
Q1 = df['value'].quantile(0.25)
Q3 = df['value'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = df[(df['value'] < lower_bound) | (df['value'] > upper_bound)]
パーセンタイル法(最もシンプル):
outliers = df[(df['value'] < df['value'].quantile(0.01)) |
(df['value'] > df['value'].quantile(0.99))]
外れ値の扱い
外れ値を自動的に除外しないでください。代わりに、次の手順を行います。
- 調査する:データエラーなのか、正当な極端値なのか、それとも異なる母集団なのかを確認します。
- データエラー:修正または削除します(例:負の年齢、1970 年のタイムスタンプ)。
- 正当な極端値:残しますが、ロバスト統計量(平均ではなく中央値)の使用を検討します。
- 異なる母集団:別途分析するため、切り分けます(例:エンタープライズ顧客と SMB 顧客)。
実施した内容を報告します:「取引額が 5 万ドルを超える 47 件(0.3%)のレコードを除外しました。これらは大口のエンタープライズ注文に該当するため、別途分析しました。」
時系列の異常検知
時系列の異常値を検出するには、次の手順を行います。
- 期待値を計算します(移動平均または前年の同時期の値)。
- 期待値からの偏差を計算します。
- しきい値を超える偏差をフラグ付けします(通常は残差の標準偏差の 2~3 倍)。
- 点異常(単一の異常値)と変化点(継続的な変化)を区別します。
仮説検定の基本
使用する場面
観測された差が実際のものなのか、偶然によるものなのかを判断する必要がある場合は、仮説検定を使用します。一般的な例は次のとおりです。
- A/B テストの結果:バリアント B は実際に A より優れているでしょうか?
- 変更前後の比較:製品の変更によって指標は実際に変化したでしょうか?
- セグメントの比較:エンタープライズ顧客のリテンションは本当に高いでしょうか?
フレームワーク
- 帰無仮説(H0):差はありません(デフォルトの仮定)。
- 対立仮説(H1):差があります。
- 有意水準(alpha)を選択:通常は 0.05(偽陽性となる確率が 5%)。
- 検定統計量と p 値を計算します。
- 解釈:p < alpha の場合、H0 を棄却します(実際の差があることを示す証拠)。
一般的な検定
| シナリオ | 検定 | 使用する場面 |
|---|---|---|
| 2 つのグループの平均を比較する | t 検定(独立) | 正規分布のデータ、2 グループ |
| 2 つのグループの比率を比較する | 比率の z 検定 | コンバージョン率、二値の結果 |
| 対応のある測定値を比較する | 対応のある t 検定 | 同じ対象の変更前後 |
| 3 つ以上のグループの平均を比較する | ANOVA | 複数のセグメントまたはバリアント |
| 非正規分布の 2 グループのデータ | Mann-Whitney U 検定 | 歪んだ指標、順序データ |
| カテゴリ間の関連性 | カイ二乗検定 | 2 つのカテゴリ変数 |
実務上の有意性と統計的有意性
統計的有意性とは、その差が偶然によるものである可能性が低いことを意味します。
実務上の有意性とは、その差がビジネス上の意思決定に影響するほど大きいことを意味します。
差が統計的に有意でも、実務上は意味がない場合があります(大規模なサンプルではよくあります)。必ず次の点を報告してください。
- 効果量:差の大きさはどの程度ですか?(例:「バリアント B によりコンバージョンが 0.3 パーセントポイント改善しました」)
- 信頼区間:真の効果として妥当な範囲はどの程度ですか?
- ビジネスへの影響:売上、ユーザー数、その他のビジネス指標に換算すると、どのような影響がありますか?
サンプルサイズに関する考慮事項
- サンプルが小さいと、p 値が有意でも結果の信頼性は低くなります。
- 比率に関する経験則:基本的な信頼性を確保するには、各グループで少なくとも 30 件のイベントが必要です。
- 小さな効果(例:コンバージョン率の 1%の変化)を検出するには、各グループで数千件の観測値が必要になる場合があります。
- サンプルが小さい場合は、そのことを明記します:「各グループの観測値が 200 件しかないため、X%未満の効果を検出する検出力には限界があります。」
統計的な主張に慎重になるべき場合
相関関係は因果関係ではありません
相関関係を見つけた場合は、次の可能性を明示的に検討してください。
- 逆因果:A が B を引き起こすのではなく、B が A を引き起こしている可能性があります。
- 交絡変数:C が A と B の両方を引き起こしている可能性があります。
- 偶然:変数が十分に多ければ、疑似相関は避けられません。
言えること:「機能 X を使うユーザーは、リテンションが 30%高くなっています」 追加の証拠なしには言えないこと:「機能 X によって、リテンションが 30%高くなっています」
多重比較の問題
多くの仮説を検定すると、偶然に「有意」となるものが出てきます:
- p=0.05で20個の指標を検定すると、約1個が誤って有意になります
- 異なるものが見つかるまで多くのセグメントを調べた場合は、そのことを明記してください
- ボンフェローニ補正(有意水準を検定数で割る)で多重比較を補正するか、実施した検定の数を報告してください
シンプソンのパラドックス
集計データの傾向は、データをセグメントに分けると逆転することがあります:
- 主要なセグメントごとに結論が成り立つか、必ず確認してください
- 例:コンバージョン率は全体では上昇しているのに、すべてのセグメントでは低下している。これは、コンバージョン率の高いセグメントの構成比が上がったためです
生存者バイアス
データセットに残ったエンティティしか分析できません:
- アクティブユーザーを分析すると、離脱したユーザーが無視されます
- 成功した企業を分析すると、失敗した企業が無視されます
- 常に「このデータセットから欠けているのは誰か、その人たちを含めると結論は変わるか」と問いかけてください
生態学的誤謬
集計レベルの傾向が個人にも当てはまるとは限りません:
- 「Xが高い国ではYも高い」からといって、「Xが高い個人ではYも高い」とは限りません
- グループレベルの知見を個々の事例に当てはめる際は注意してください
特定の数値への固執
誤った精密さには注意してください:
- 「次の四半期の解約率は4.73%になります」という表現は、妥当な範囲を超える確実性を示唆します
- 範囲で示すことをおすすめします:「過去の傾向に基づくと、解約率は4~6%になる見込みです」
- 適切に丸めてください:「約5%」のほうが「4.73%」より誠実な場合がよくあります