Tasuke HubLearn · Solve · Grow
#Web Performance

画像最適化A/B計測設計【2025年版】:LCP/INP/CLSとCVRで効果検証する

画像最適化の施策(フォーマット/品質/sizes/priority/プリロード)をA/Bで検証するための設計ガイド。割当・イベント計測・サンプルサイズ推定・分析まで、Next.jsコード例付きで解説。

時計のアイコン13 September, 2025
TH

Tasuke Hub管理人

東証プライム市場上場企業エンジニア

情報系修士卒業後、大手IT企業にてフルスタックエンジニアとして活躍。 Webアプリケーション開発からクラウドインフラ構築まで幅広い技術に精通し、 複数のプロジェクトでリードエンジニアを担当。 技術ブログやオープンソースへの貢献を通じて、日本のIT技術コミュニティに積極的に関わっている。

🎓情報系修士🏢東証プライム上場企業💻フルスタックエンジニア📝技術ブログ執筆者

目的と効果測定の軸

画像最適化はLCPに直結します。本記事は「施策の正当性をA/Bで検証」するための設計と実装を示します。主要KPIは LCP/INP/CLS + CVR(目標行動率)。


ベストマッチ

最短で課題解決する一冊

この記事の内容と高い親和性が確認できたベストマッチです。早めにチェックしておきましょう。

割当:クッキーで安定バケット

// middleware.ts
import { NextResponse } from 'next/server';
export const config = { matcher: ['/'] };
export function middleware(req: Request) {
  const url = new URL(req.url);
  const res = NextResponse.next();
  const v = (url.searchParams.get('ab') ?? '') || (req.headers.get('cookie')?.match(/ab=([AB])/i)?.[1]) || (Math.random() < 0.5 ? 'A' : 'B');
  res.cookies.set('ab', v, { path: '/', maxAge: 60*60*24*30 });
  return res;
}

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

実装:A(ベース)とB(最適化)

// app/page.tsx(概念例)
import Image from 'next/image';

function HeroA() {
  return <Image src="/hero.jpg" alt="" width={1280} height={720} />; // 既定
}

function HeroB() {
  return (
    <Image src="/hero.jpg" alt="" width={1280} height={720} priority sizes="(max-width:768px) 100vw, 1280px" />
  ); // priority + sizes 最適化
}

export default function Page() {
  const variant = typeof document === 'undefined' ? 'A' : (document.cookie.match(/ab=([AB])/i)?.[1] ?? 'A');
  return <main>{variant === 'A' ? <HeroA/> : <HeroB/>}</main>;
}

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

計測:web-vitalsをA/Bと紐付け

// app/web-vitals.ts
import { onLCP, onINP, onCLS } from 'web-vitals';

function send(kind: string, value: number) {
  const ab = document.cookie.match(/ab=([AB])/i)?.[1] ?? 'A';
  navigator.sendBeacon('/api/metrics', JSON.stringify({ kind, value, ab }));
}

onLCP(m => send('LCP', m.value));
onINP(m => send('INP', m.value));
onCLS(m => send('CLS', m.value));

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

サンプルサイズ推定(概略)

LCP中央値の差を検出したい場合、正確には分布仮定が必要ですが、近似として平均差のt検定を想定し、必要サンプルを粗く見積もれます。

// 二群平均差のサンプルサイズ近似
function sampleSize(effectMs: number, sdMs = 1200, alpha = 0.05, power = 0.8) {
  const z = (p: number) => Math.sqrt(2) * erfcinv(2 * p); // 近似
  const z1 = z(1 - alpha / 2), z2 = z(power);
  return Math.ceil(2 * Math.pow((sdMs * (z1 + z2)) / effectMs, 2));
}

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

解析:ダッシュボード指標

  • LCP/INP/CLS のp50/p75、CVR、滞在、離脱。
  • 端末/ネットワーク別にセグメントし、差分が一貫するかを確認。

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

まとめと推奨順序

  1. 割当を安定化 → 2) ヒーロー画像の priority/sizes → 3) フォーマット自動化(AVIF/WebP) → 4) プリロード最適化 → 5) 結果をA/Bで検証し継続改善。

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

この記事をシェア

続けて読みたい記事

編集部がピックアップした関連記事で学びを広げましょう。

#Web Performance

INP最適化決定版【2025年版】:反応性を根本から改善する実践テクニック

2025/9/13
#Image Optimization

画像最適化トラブルシュート集【2025年版】:ぼやけ・切り抜き・色ズレ・遅いを一掃

2025/9/13
#LLM

LLM推論コスト最適化パターン集【2025年版】:品質を落とさず費用を半減する

2025/9/13
#Web Performance

画像最適化クイックスタート【初心者向け/2025年】:3ステップでLCPを即改善

2025/9/13
#Web Performance

画像CDN実践比較【2025年版】:Cloudinary / Imgix / Cloudflare Imagesの選び方

2025/9/13
#Web Performance

フロントエンド性能最適化チェックリスト【2025年版】:Core Web Vitalsで確実に速くする

2025/9/13