20 人が閲覧(直近 30 日) データ分析・GA4

リフト値とは?計算方法と1.0基準の目安・ExcelとPythonでの求め方

リフト値とは?計算方法と1.0基準の目安・ExcelとPythonでの求め方

リフト値とは、「Aを買った人はBも買いやすいか」という関連購買の強さを、偶然の水準と比べて何倍かで表す指標です。式は「信頼度 ÷ Bの支持度」で、1.0なら偶然どおり、1.0を超えるほど関連が強いと読みます。この記事では、1,000件のレシートという1つの数値例を最後まで使い回して、手計算・Excelの数式・Python(mlxtend)の実行結果を突き合わせます。あわせて、信頼度が0.650と高いのにリフト値は0.929にしかならない例など、数字の読み方を誤りやすい場面を実数で示します。

まとめ:リフト値の要点

詳細に入る前に、結論を先に示します。

  • リフト値 = 信頼度 ÷ Bの支持度。「Aを買った人のB購入率」を「Bのそもそもの購入率」で割り戻した倍率です。
  • 基準は1.0です。1.0で独立(偶然どおり)、1.0超で正の関連、1.0未満で負の関連を示します。1.5なら偶然の1.5倍の頻度で一緒に買われている、という意味になります。
  • 信頼度が高いこととリフト値が高いことは別物です。後述の例では、信頼度0.650の組み合わせのリフト値が0.929(=1未満)になり、信頼度0.600の組み合わせのリフト値1.500を下回ります。もともとよく売れている商品は信頼度を押し上げるため、リフト値で割り戻さないと判断を誤ります。
  • リフト値は向きを入れ替えても同じ値です。パン→牛乳も牛乳→パンも1.500になります(信頼度は0.600と0.450で異なります)。「どちらを推すべきか」はリフト値では決まりません。
  • リフト値には上限があります。1 ÷(2商品の支持度の大きいほう)を超えられないため、支持度0.667を上回る定番商品は「1.5以上」という閾値に構造的に届きません。全商品に一律の合格ラインは置けません。
  • 件数が少ないと値が跳ね上がります。1,000件中4件しか同時購入がない組み合わせでもリフト値40.0が出ます。リフト値は必ず支持度と実件数とセットで読んでください。

リフト値の定義と2つの計算式

リフト値は、バスケット分析(アソシエーション分析)で使う評価指標の1つです。英語では lift(lift値)と書き、日本語では「リフト値」「リフト率」と訳されます。

同じ指標は、1997年のACM SIGMOD論文「Dynamic Itemset Counting and Implication Rules for Market Basket Data」(Brin、Motwani、Ullman、Tsur、pp.255-264)に “interest” という名前で出てきます。ただしこの論文がリフト値を提案したわけではありません。論文は第4章の冒頭で interest を「従来の指標(traditional measures)」の1つとして挙げており、新たに提案しているのは conviction という別の指標です。「リフト値はこの論文で提案された」と紹介している資料がありますが、論文の記述はそうなっていません。

計算式は次の2つがあり、どちらも同じ値になります。

  • リフト値 = 信頼度(A→B) ÷ 支持度(B)
  • リフト値 = 支持度(AとBの同時購入) ÷ {支持度(A) × 支持度(B)}

前者は「Aを買った人のB購入率が、平均の何倍か」という読み方、後者は「AとBが独立だと仮定したときに期待される同時購入率に対して、実際が何倍か」という読み方に対応します。手計算では前者、ツールでの一括算出では後者の形が使われます。

指標 意味 式
支持度(Support) 全レシート中の出現割合 該当件数 ÷ 全件数
信頼度(Confidence) Aを買った人がBも買う割合 A∩Bの件数 ÷ Aの件数
期待信頼度 Bが買われる割合(=Bの支持度) Bの件数 ÷ 全件数
リフト値(Lift) 信頼度が偶然の何倍か 信頼度 ÷ 期待信頼度

向きを入れ替えても値が変わらない理由

信頼度は方向によって変わりますが、リフト値は変わりません。2つ目の式を見ると、分子が「AとBの同時購入の支持度」、分母が「支持度A × 支持度B」で、どちらもAとBを入れ替えても同じ値になるためです。後述の計算例でも、パン→牛乳の信頼度は0.600、牛乳→パンの信頼度は0.450と違うのに、リフト値はどちらも1.500になります。前掲のSIGMOD論文も interest について「共起を測るだけで含意は測らない。完全に対称だからだ」と指摘しています。

実務上の意味は明確です。リフト値は「この2商品に関連があるか」しか答えず、「どちらを起点に推すべきか」には答えません。レコメンドの向きを決めるときは、リフト値ではなく信頼度と、その商品の粗利や在庫を見て判断してください。

併売率・期待信頼度との呼び方の違い

解説記事によって呼び名が揺れる点を整理します。「併売率」に統一された定義はなく、「AとBが一緒に買われた割合」を指して支持度と同じ意味で使う資料と、「Aを買った人のうちBも買った割合」を指して信頼度と同じ意味で使う資料があります。「期待信頼度」はBの支持度の別名で、リフト値の分母にあたります。つまり、リフト値を「併売率 ÷ 購買率」と説明している資料は、信頼度を併売率、Bの支持度を購買率と呼んでいるだけで、式そのものは同じです。用語が違っても、分母が「Bが単独でどれだけ売れているか」になっているかどうかを見れば同じ指標だと判別できます。

1,000件のレシートを使った計算方法

ここからは、次のクロス集計を最後まで使います。スーパーの1,000件のレシートを、パンと牛乳の購入有無で分けたものです。

牛乳あり 牛乳なし 計
パンあり 180 120 300
パンなし 220 480 700
計 400 600 1,000

パン→牛乳のリフト値を、途中経過ごとに求めます。

  • 支持度(パン) = 300 ÷ 1,000 = 0.300
  • 支持度(牛乳) = 400 ÷ 1,000 = 0.400
  • 支持度(パンと牛乳) = 180 ÷ 1,000 = 0.180
  • 信頼度(パン→牛乳) = 180 ÷ 300 = 0.600
  • リフト値 = 0.600 ÷ 0.400 = 1.500

2つ目の式でも検算できます。0.180 ÷(0.300 × 0.400)= 0.180 ÷ 0.120 = 1.500 で一致します。パンを買った人が牛乳も買う確率は、牛乳全体の購入率の1.5倍ということです。

信頼度が高いのにリフト値が1を下回る例

同じ1,000件のレシートに、おにぎりとお茶の組み合わせを加えます。おにぎりの購入は200件、お茶は700件、両方買ったのは130件でした。

  • 信頼度(おにぎり→お茶) = 130 ÷ 200 = 0.650
  • 支持度(お茶) = 700 ÷ 1,000 = 0.700
  • リフト値 = 0.650 ÷ 0.700 = 0.929

信頼度はパンと牛乳の0.600を上回る0.650です。ところがリフト値は0.929で1.0を下回り、「おにぎりを買った人はむしろお茶を買いにくい」という逆の結論になります。お茶は全体の7割が買っている定番商品なので、おにぎり客の65%が買っていても平均以下だからです。信頼度の順にレコメンドを並べると、この種の組み合わせが上位を占めます。売れ筋商品ほど信頼度が高く出るためで、リフト値はこれを打ち消すために使います。

1.0を基準にした読み方と実務での目安

判断の基準は1.0です。1.0は「AとBが統計的に独立」、つまり偶然どおりに一緒に買われている状態を意味します。

リフト値 意味 実務での扱い
0.9未満 負の関連 セット訴求の候補から外す
0.9以上1.1未満 ほぼ独立 判断材料にしない
1.1以上1.5未満 弱い正の関連 件数が十分なら候補
1.5以上3.0未満 明確な正の関連 陳列・レコメンドの優先候補
3.0以上 強い関連または件数不足 支持度と実件数を確認(同時4件で40.0)

この区切りは本記事の便宜的なもので、公的な基準ではありません。数学的に意味を持つのは1.0という境界だけで、「1.5以上なら採用」といった線引きは各社が自社データの分布から決めているものです。他社記事の閾値をそのまま持ち込むのは避けてください。

閾値を全商品に一律で当てられない理由

好みの問題ではなく、リフト値には計算上の上限があるためです。リフト値 = 支持度(A∩B) ÷{支持度A × 支持度B} の分子は、支持度Aと支持度Bのどちらも超えられません(AとBを両方買った人は、Aを買った人にもBを買った人にも含まれるからです)。ここから上限が決まります。

  • リフト値の上限 = 1 ÷(支持度Aと支持度Bの大きいほう)

お茶は支持度0.700なので、お茶を含む組み合わせはどう転んでも 1 ÷ 0.700 = 約1.43 を超えられません。実際の0.929も、パンと牛乳の上限 1 ÷ 0.400 = 2.5 も、この式のとおりです。つまり「1.5以上を採用」という閾値を全商品に当てると、支持度が0.667を上回る商品は、どんな相手と組んでも自動的に落ちます。定番商品ほど機械的に除外されるということです。実務では固定の閾値ではなく、全組み合わせを算出したうえで分布の上位から検討してください。

ExcelでCOUNTIFSを使って求める手順

1行を1レシート、1列を1商品として、購入を1、非購入を0で入力した行列を作ります。A列にレシートID、B列にパン、C列に牛乳を置き、データが2行目から1001行目にある想定です。F列に集計を置きます。

F2  レシート件数         =COUNT(B2:B1001)                    → 1000
F3  パンの購入件数       =COUNTIF(B2:B1001,1)                → 300
F4  牛乳の購入件数       =COUNTIF(C2:C1001,1)                → 400
F5  両方買った件数       =COUNTIFS(B2:B1001,1,C2:C1001,1)    → 180

F6  支持度(牛乳)       =F4/F2                              → 0.4
F7  信頼度(パン→牛乳) =F5/F3                              → 0.6
F8  リフト値             =F7/F6                              → 1.5

COUNTIFS は複数の条件範囲をAND条件で数えます。Microsoftの公式ドキュメントは「追加する範囲は、それぞれ criteria_range1 引数と同じ行数と列数である必要があります」と規定しており、行範囲がずれていると #VALUE! エラーになります。=COUNTIFS(B2:B1001,1,C2:C900,1) のような書き方は集計されないので、商品列の行範囲は必ず揃えてください。

COUNTがゼロを返して#DIV/0!になる場合

購入フラグを1ではなく TRUE/FALSE や「○」で入力していると、上の式は動きません。COUNT関数の公式仕様は「引数が配列またはセル参照の場合は、その配列またはセル参照に含まれる数値だけが計算対象になります。配列やセル参照に含まれる空のセル、論理値、文字列、またはエラー値は計算の対象にはなりません」と明記しています。つまりTRUE/FALSEの列にCOUNTを使うと0が返り、それを分母にした支持度が全行 #DIV/0! になります。

対処は2つです。1つは、件数を数える対象を必ず全行が埋まっているレシートID列に変えて =COUNTA(A2:A1001) とすること。商品列で COUNTA を使うと落とし穴があります。「○」と空白で入力している場合、空白セルは数えられないため =COUNTA(B2:B1001) は全レシート件数の1,000ではなく○の件数の300を返し、分母が壊れたままになります。もう1つは、フラグ自体を1と0の数値に置き換えることです。後者を勧めます。COUNTIF の条件も 1 ではなく TRUE や "○" に書き換える必要があり、列ごとに条件の書き分けを間違えると気づきにくい誤差になるためです。数値の0/1に統一しておけば、この節の式をそのまま使えます。

mlxtendによる全組み合わせの一括算出

商品が数十を超えると、Excelでの総当たりは現実的ではありません。Pythonのmlxtendを使うと、頻出する組み合わせの抽出からリフト値の算出までを一度に処理できます。ここまでと同じ1,000件のデータを組み立てて実行します。

import pandas as pd
from mlxtend.frequent_patterns import apriori, association_rules

# 1,000件のレシートを再現可能な形で組み立てる
df = pd.DataFrame(False, index=range(1000),
                  columns=["パン", "牛乳", "おにぎり", "お茶"])
df.loc[0:299, "パン"] = True          # 300件
df.loc[120:519, "牛乳"] = True        # 400件(うちパンと重複180件)
df.loc[600:799, "おにぎり"] = True    # 200件
df.loc[0:569, "お茶"] = True          # 570件
df.loc[670:799, "お茶"] = True        # +130件(おにぎりと重複)=合計700件

freq = apriori(df, min_support=0.05, use_colnames=True)
rules = association_rules(freq, metric="lift", min_threshold=0.0)

# パンと牛乳、おにぎりとお茶の行だけを、この順で取り出す
# (rules の行の並びも frozenset の要素の表示順も、文字列のハッシュ値に
#   左右されてプロセスごとに変わる。掲載や比較には並べ替えを明示する)
pairs = [("パン", "牛乳"), ("牛乳", "パン"),
         ("おにぎり", "お茶"), ("お茶", "おにぎり")]
picked = pd.concat([
    rules[(rules["antecedents"] == frozenset([a]))
          & (rules["consequents"] == frozenset([c]))]
    for a, c in pairs])

cols = ["antecedents", "consequents", "support", "confidence", "lift"]
print(picked[cols].round(3).to_string(index=False))

Python 3.9.6、pandas 2.3.3、mlxtend 0.23.4で実行した出力は次のとおりです。

antecedents consequents  support  confidence  lift
       (パン)        (牛乳)     0.18       0.600 1.500
       (牛乳)        (パン)     0.18       0.450 1.500
     (おにぎり)        (お茶)     0.13       0.650 0.929
       (お茶)      (おにぎり)     0.13       0.186 0.929

手計算と一致しています。信頼度が向きによって0.600と0.450、0.650と0.186に分かれる一方で、リフト値は1.500と0.929で対称になっている点も確認できます。min_support は「この割合に満たない組み合わせは無視する」しきい値で、次章で扱う件数不足の組み合わせをここで落とせます。metric と min_threshold は組で効き、上のように min_threshold=0.0 にするとリフト値によるふるい落としをせず全ルールを残します。

association_rulesのnum_itemsets(版による違い)

バージョンによって引数の並びが変わっているため、古いコードをコピーすると動かない場合があります。association_rules の第2引数は現在 num_itemsets で、シグネチャは association_rules(df, num_itemsets=1, df_orig=None, null_values=False, metric="confidence", min_threshold=0.8, ...) です。この引数は0.23.2(2024年11月5日公開)で追加された当初は必須で、指定しないと TypeError になりました。0.23.4(2025年1月26日公開)で「optional な num_itemsets パラメータ」へ変更され、省略できるようになっています。

実務上の注意は1点だけです。metric と min_threshold は必ずキーワード引数で渡してください。association_rules(freq, "lift", 1.0) のように位置引数で書くと、”lift” が num_itemsets に、1.0が df_orig に渡ります。2026年9月時点の最新版である0.25.0(2026年6月6日公開、Python 3.11以上が必要)でも引数の並びは同じなので、キーワード指定にしておけば版を上げても壊れません。なお上の実行環境はPython 3.9.6のため、そこに入る最後の版が0.23.4です。

リフト値だけで判断すると外す場面

リフト値は便利ですが、単独で施策の可否を決めると外します。数字が高く出ているのに実務では使えない、という典型を挙げます。

件数不足によるリフト値の跳ね上がり

1,000件のうち、商品Eが5件、商品Fが20件、両方が4件だったとします。信頼度は 4 ÷ 5 = 0.800、支持度(F)は 20 ÷ 1,000 = 0.020なので、リフト値は 0.800 ÷ 0.020 = 40.0 です。パンと牛乳の1.500をはるかに超えます。

しかし根拠となっているのは4件のレシートだけで、同時購入が1件減れば30.0、1件増えれば50.0に動きます。リフト値の順位表を作ると、上位はこの種の低頻度の組み合わせで埋まりがちです。対策は、リフト値でソートする前に支持度と同時購入の実件数で足切りすることです。mlxtendの min_support を上げるか、同時購入件数が一定数に満たない行を除外してから並べ替えてください。何件を下限にするかは母数次第ですが、1,000件規模なら同時購入30件(支持度0.03)程度が目安になります。

定番商品との組み合わせの埋没

前述のお茶のように購入率が高い商品は、上限そのものが低いためリフト値が伸びません。リフト値だけで候補を絞ると、売上規模の大きい組み合わせが漏れます。おにぎりとお茶はリフト値0.929でも、同時購入は130件あり、実売上への寄与はリフト値40.0の4件を大きく上回ります。売場やレコメンド枠の設計では、リフト値の高さと支持度の大きさは別々の軸として並べてください。リフト値は「意外性のある組み合わせを見つける」用途、支持度は「売上規模の大きい導線を守る」用途と役割が違います。

関連の強さと因果の区別

リフト値1.500は「パンを買わせれば牛乳が1.5倍売れる」という意味ではありません。朝食をまとめて買う客層が両方をカゴに入れている、という第三の要因で説明できる場合がほとんどです。この構造を無視して施策に落とすと、パンの値引きで併売を狙ったのに牛乳の売上が動かない、といった結果になります。因果を確かめたい場合は、対象店舗と非対象店舗を分けた期間比較など、施策の有無を切り分けた検証が別途必要です。リフト値はその候補を絞り込む段階の指標だと位置づけてください。

なお、購買データを起点にした分析全体の流れはバスケット分析の進め方で、リフト値で見つけた組み合わせを施策へ落とす手順はクロスセルとアップセルの使い分けで扱っています。顧客を購入金額順に並べて人数を10等分するデシル分析と組み合わせると、「誰に」「どの組み合わせを」提案するかまで設計できます。

よくある質問

リフト値が1未満だとどういう意味ですか?

AとBが一緒に買われにくい(負の関連)ことを示します。Aを買った人のB購入率が、Bの平均購入率を下回っている状態です。ただし、本記事のおにぎりとお茶の例のように、Bがもともと売れ筋だと1未満になりやすい点に注意してください。1未満だから無関係ではなく、「偶然の水準より少ない」という意味です。件数が少ない場合は値がぶれるため、同時購入の実件数も合わせて確認してください。

リフト値はいくつ以上あればよいですか?

全商品に共通の合格ラインは置けません。リフト値には「1 ÷(2商品の支持度の大きいほう)」という上限があり、支持度0.667を上回る定番商品はどんな相手と組んでも1.5に届かないためです。固定の閾値で切ると、そうした商品が組み合わせごと機械的に落ちます。実務では全組み合わせを算出し、分布の上位から順に、同時購入の実件数と併せて検討してください。

支持度・信頼度・リフト値はどの順番で計算しますか?

支持度、信頼度、リフト値の順です。支持度は各商品と組み合わせの出現割合なので単独で求められます。信頼度は「同時購入件数 ÷ Aの件数」で支持度の材料を再利用できます。リフト値は信頼度をBの支持度で割るため、前の2つが揃ってから求まります。覚えるときは「頻度(支持度)→ 条件付きの割合(信頼度)→ 平均との比(リフト値)」と、絞り込みが1段ずつ細かくなる順序で捉えると迷いません。

手元の資料の併売率は支持度と信頼度のどちらですか?

分母を見れば判別できます。全レシート数で割っていれば支持度、Aを買った人の数で割っていれば信頼度です。「併売率」に統一された定義はないため、語だけでは決まりません。どちらであっても割り戻しをしていないので、Bが売れ筋なら高い値が出ます。リフト値はその値をさらにBの購入率で割り、売れ筋かどうかの偏りを取り除いた指標です。

リフト値はバスケット分析以外にも使えますか?

使えます。式は「ある条件下での発生率 ÷ 全体の発生率」なので、商品の組み合わせに限りません。特定のメール配信を受けた人の申込率を全体の申込率で割る、あるメニューを閲覧した人の資料請求率を全体で割る、といった形で、施策の有無や属性による差を倍率で表せます。分母を「その事象がもともとどれだけ起きるか」に取ることだけ守れば、同じ読み方(1.0が基準)が通用します。

関連記事

お気に入りに入れた記事の一覧

この記事は以下の記事からリンクされています

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.10.23 テックブログ Renta!不正アクセスでサービス停止:再開未定の現状と運営側の停止判断・証拠保全・段階的再開
  2. 2025.01.09 コラム アドレサブルCM(Addressable CM)とは?フジテレビで出る表示の意味・仕組みと視聴データの扱い
  3. 2026.07.09 テックブログ Muse Imageとは?Metaの画像生成AIの使い方・API料金(1枚0.01ドル)と日本での提供状況【2026年10月】
  4. 2026.10.21 テックブログ ふるさとチョイス不正アクセスで445万件流出:対象確認・パスワード変更と再開時期
  5. 2025.12.10 コラム 今の50代は何世代?バブル世代・団塊ジュニア・氷河期の境目と特徴

RELATED POSTS 関連記事

目次