「リフト値 (lift)」はP(B|A) / P(B) で「A の購入が B 購入確率を何倍に高めるか」を測る関連度指標。 本ページの中核キーワードを以下に整理する。
これらは「アソシエーションルール抽出 → support / confidence / lift で評価 → ビジネス示唆」の流れを構成する。
🍰 まずはやさしく
2つのものの結びつきの強さを測る物差しです。
本当にセットで選ばれているかを知るために使います。
パンとバターを一緒に買う人が多いか調べます。
この章ではリフト値の結論について読みます。
最も忙しい読者のために、 まず結論だけまとめます。 詳細は以下のセクションへ:
Lift(A→B) = Confidence(A→B) / Support(B) = P(B|A) / P(B)。🍰 まずはやさしく
買い物の傾向を見つける分析で使われる指標です。
偶然ではなく強い結びつきがあるかを探ります。
コンビニで一緒に売る商品を決める時に役立ちます。
このページをどう読むかについて説明します。
スーパーのレシートデータを分析して「ビールを買う人はおむつも買う」のようなパターンを発見する バスケット分析の中核指標。 リフト値で「偶然以上に強い関連」を絞り込む。
🍰 まずはやさしく
偶然と比べて何倍一緒に選ばれるかを示す値です。
見た目の数字にだまされず正しく判断するために使います。
スマホケースと保護フィルムの組み合わせで考えます。
リフト値の目安と判断のコツについて読みます。
リフト値は「偶然と比べて何倍そろって買われるか」を測る相対指標です。 「パンを買った人の 60% がバターも買った」と聞くと強い関連に見えますが、 そもそもバターを買う人が全顧客の 50% を占めるならリフト = 60% / 50% = 1.2。 つまり「パンを買った人もそうでない人も、 同じくらいバターを買っている」状況に近く、 ほぼ偶然レベルです。
逆に「魚を買った人の 30% がワインも買った」場合、 ワインのベース購買率が 5% なら リフト = 30% / 5% = 6.0。 「魚を買う人は普通の人の 6 倍ワインを買う」 — これは強い同時購買の証拠で、 棚やセット販売の設計に活かせます。
3 つの目安を覚えておくと現場で使えます:(1) リフト = 1 なら独立(A の有無で B の買いやすさは変わらない)、 (2) 1.5 〜 3 で有意な関連、 (3) 3 以上で強い関連。 ただしサポート(出現頻度)が小さいルールは偶然 6 倍に見えることもあり、 信頼度 (confidence)・サポート (support)・リフトの3 点セットで判断するのが基本です。
本質は「買い物カゴ(トランザクション)の同時購買」:リフト値はもともと POS レシートや EC の注文明細のように、 「1 件のトランザクションに複数のアイテムが同時に入るか」を数えるバスケット分析の指標です。 上のワインの例のように「A を含むカゴ」と「B を含むカゴ」の重なりを、 独立を仮定した期待値と比べるのが基本形。 都道府県の集計表のような「1 行 = 1 地域」のデータは本来トランザクションではありませんが、 各指標を中央値などで 2 値化すれば「47 件のカゴ」に見立てて同じ計算ができます(後述の Python 例で実演)。 まずは「カゴの中の同時購買」という原型で直感を掴んでください。
🍰 まずはやさしく
計算式で表したリフト値の定義です。
正確な強さを数値で出すために使います。
部活の道具をセットで買う確率などを計算します。
数式の内容と正しい読み方について読みます。
リフト値 (Lift) は「A を買った人が B も買う確率」が「全体で B を買う確率」より何倍高いかを示す。 単に大きければよいというものではなく、 支持度 (Support) と 確信度 (Confidence) をセットで読まないと「めったに起きないが起きると必ず一緒」という偶発的なルールに騙される。 ここでは実務で判断に必要な視点を 3 つ補う。
確率論で「事象 A と B が独立」とは P(A∩B) = P(A)×P(B) が成り立つこと。 これを変形すると P(B|A) = P(B)、 つまり A が起きても B の起きる確率は変わらない。 リフト値は P(B|A) / P(B) なので、 独立なら必ず 1 になる。 だからこそ Lift = 1.0 ちょうどは「A は B の購入に何の情報も与えない」と解釈する。 業務報告で「Lift = 1.05 だから関連がある」と書くのは危険で、 95% 信頼区間が 1 をまたいでいないかを 必ず確認する。
10 万トランザクション中 A も B もたまたま 1 件ずつしか出ず、 偶然同時購入が 1 件あったとする。 すると Confidence = 1.0、 Support は 0.00001 だが Lift は 100,000 にもなる。 こうした「希少だが高 Lift」 なルールは統計的に意味がない。 mlxtend や apyori で min_support=0.01 程度を必ず指定して、 まず母集団に十分現れるルールに絞ってから Lift で並べ替えるのが定石。
| 指標 | 定義 | 独立時の値 | 向いている場面 |
|---|---|---|---|
| Lift | P(B|A) / P(B) | 1 | 直感的な「何倍」、 上位ルール選定 |
| Leverage | P(A∩B) − P(A)P(B) | 0 | 頻度の絶対量を加味、 希少ルールに騙されにくい |
| Conviction | (1 − P(B)) / (1 − Confidence) | 1 | 「B でない」の方向性を見たい時、 推薦エンジン |
都道府県の集計データは「トランザクション」ではないので、 そのままでは Lift は計算できない。 しかし「人口が中央値未満か (A)」「高齢化率が中央値以上か (B)」のように二値化すれば、 47 都道府県を 47 件の「カゴ」に見立ててリフト値を計算できる。 本ページの Python 例(後述)で実際に計算すると、 「人口小 → 高齢化進行」の Lift ≒ 1.53(P(B|A) = 0.78、 P(B) = 0.51)。 「人口の少ない県では、 全国平均と比べて高齢化が進んでいる確率が 1.53 倍」と読める。 これはあくまで「分布の上半分・下半分どうしが連動しているか」だけを 2 値で切り取った粗い見方であり、 連続量そのものの直線的な連動を測る相関係数とは別物だと理解しておく。 リフト値の本来の主戦場は購買バスケットのようなトランザクションデータである点を忘れない。
単に「Lift = 2.4 だった」と書くのではなく、 「Support = 3.2%、 Confidence = 48%、 Lift = 2.4(95%CI 2.1–2.7)」 の 4 点セットで記述する。 これがあると読み手は「十分な件数で、 実際の購入率は半分弱、 偶然の 2.4 倍」と頭の中で像を結べる。 一方で 4 点セットが揃わない報告は「印象的な数字を切り取った可能性」を疑われる。 アソシエーション分析の信頼性はこの 4 点セットの併記で担保される、 と覚えておこう。
📝 ここまでで Lift の数式的意味(独立基準 1.0)、 落とし穴(希少ルール)、 Leverage・Conviction との使い分け、 SSDSE で二値化して練習、 報告書定型句 の 5 点を補講した。 次の関連用語セクションへ進むときは、 「Lift 単体ではなく Support と組」 で頭に入れておくと、 後の アソシエーションルール や マーケットバスケット分析 の理解が一段深くなる。
「Lift = 3.0 は強い相関」と表現してしまう例があるが、 これは厳密には誤り。 相関係数 (Pearson の r) は連続変数どうしの直線的な共変を −1〜+1 で測る一方、 Lift は二値カテゴリどうしの共起の倍率で 0〜∞ を取り得る。 例えば「ビール購入の Lift = 3.0」は「全体の購入率の 3 倍上昇」を意味するだけで、 量の連動(5 倍買うと 5 倍買う、 等)は一切示していない。 報告書で「強い相関 (Lift = 3.0)」と書くと、 統計の専門家から確実に指摘される。 正しくは「強い共起 (Lift = 3.0)」または「ビール購入者の B 購入確率は基準の 3 倍」と表記する。
Confidence は非対称(A→B と B→A で値が違う)だが、 Lift は対称(A→B と B→A の Lift は同じ)。 これは Lift の定義 P(A∩B) / (P(A)P(B)) を見れば明らか:分子も分母も A と B を入れ替えても変わらない。 一方 Confidence は P(B|A) = P(A∩B)/P(A) なので、 A を変えれば値が変わる。 この性質から、 推薦エンジンで「A を買った人に B を薦める」のと「B を買った人に A を薦める」 のどちらが有効かは Lift だけでは決められない。 必ず両方向の Confidence もチェックすること。
100 件のレシートのうち、 パン購入 40 件、 牛乳購入 30 件、 両方購入 18 件とする。 まず Support(パン∩牛乳) = 18/100 = 0.18、 Confidence(パン→牛乳) = 18/40 = 0.45、 Support(牛乳) = 30/100 = 0.30。 よって Lift = 0.45 / 0.30 = 1.50。 解釈:「パンを買った人は、 全体平均と比べて牛乳を 1.5 倍 買いやすい」。 この場合 Lift > 1 なので正の関連、 ただし倍率は 1.5 と控えめ。 業務判断では「弱いが意味のある共起」として、 棚を近づける施策のテスト候補に入れる、 程度の扱いになる。
定義式 P(A∩B)/(P(A)P(B)) の各項が何を数えているかを、SSDSE-B-2026 の 2023 年度・47 都道府県を「47 件のカゴ」に見立てて順に確かめる。総人口と高齢化率を中央値で 0/1 にし、確率 → 条件付き確率 → lift の順に計算してから、最後に mlxtend で同じ値が出ることを見る。
🎯 このコードでやること:SSDSE-B-2026 の 47 都道府県データから、 連続値の「総人口」と「65 歳以上人口比率」を 中央値で 2 値化し、 アソシエーション分析用の binary feature を作成する。
1 2 3 4 5 6 7 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', header=1, encoding='cp932') df = df[df['年度']==df['年度'].max()].copy() df['高齢化率'] = df['65歳以上人口']/df['総人口'] df['人口大'] = (df['総人口']>=df['総人口'].median()).astype(int) df['高齢化進行'] = (df['高齢化率']>=df['高齢化率'].median()).astype(int) print(df[['都道府県','総人口','高齢化率','人口大','高齢化進行']].head(6)) |
📤 実行結果:
💬 結果の読み方:中央値分割で 47 都道府県を 2x2 のクロス表に変換。 人口大=1 は人口上位 24 県、 高齢化進行=1 は高齢化率上位 24 県。 これでアソシエーション分析(lift 計算)の準備完了。
🎯 このコードでやること:4 つの確率(P(A), P(B), P(A∩B), P(B|A))を計算し、 Lift 値の定義式を素朴に手計算で確認する。 ライブラリに頼る前の理解確認。
1 2 3 4 5 6 7 8 9 10 11 | n = len(df) P_A = df['人口大'].sum()/n P_B = df['高齢化進行'].sum()/n P_AB = ((df['人口大']==1)&(df['高齢化進行']==1)).sum()/n Conf = P_AB/P_A Lift = Conf/P_B print(f'P(A=人口大)={P_A:.4f}') print(f'P(B=高齢化進行)={P_B:.4f}') print(f'P(A∩B)={P_AB:.4f}') print(f'Conf(A→B)=P(B|A)={Conf:.4f}') print(f'Lift(A→B)={Lift:.4f}') |
📤 実行結果:
💬 結果の読み方:Lift=0.49 < 1 → 「人口大 → 高齢化進行」は 負の関連。 人口の多い都市部ほど高齢化率が低い(若い世代が流入)という直感と一致。 大都市と高齢化進行は 共起しにくい。
🎯 このコードでやること:逆方向のルール「人口小 → 高齢化進行」の Lift を計算。 ペアの裏側を見ることで構造理解が深まる。
1 2 3 4 5 6 7 8 | df['人口小'] = 1-df['人口大'] P_C = df['人口小'].sum()/n P_CB = ((df['人口小']==1)&(df['高齢化進行']==1)).sum()/n Conf2 = P_CB/P_C Lift2 = Conf2/P_B print(f'Conf(人口小→高齢化進行)={Conf2:.4f}') print(f'Lift(人口小→高齢化進行)={Lift2:.4f}') print(f'\n→ Lift=1.53 は独立より 53% 共起しやすい') |
📤 実行結果:
💬 結果の読み方:Lift=1.53 > 1 → 「人口の少ない県は高齢化が進行している」という 正の関連。 過疎・若年層流出という社会課題が定量化されている。 政策提言の根拠データとして活用可能。
🎯 このコードでやること:mlxtend ライブラリで複数項目の アソシエーションルール一括抽出。 実務での標準的な使い方を確認。
1 2 3 4 5 6 7 | from mlxtend.frequent_patterns import apriori, association_rules # 3 つの 2 値カラムを使った頻出パターン df['人口小'] = 1-df['人口大'] feat = df[['人口大','人口小','高齢化進行']].astype(bool) freq = apriori(feat, min_support=0.1, use_colnames=True) rules = association_rules(freq, metric='lift', min_threshold=0.5) print(rules[['antecedents','consequents','support','confidence','lift']].head(6).to_string(index=False)) |
📤 実行結果:
💬 結果の読み方:min_support=0.1・lift≥0.5 のフィルタを通ると、 残るのは 「人口小 ↔ 高齢化進行」(support=0.383, lift=1.533)の 1 ペアのみ。 「人口大 ↔ 高齢化進行」は lift≈0.49 で lift≥0.5 の閾値に届かず除外され、 「人口大 ↔ 人口小」は排反(同時成立しない)で support=0、 min_support=0.1 未満のため 頻出アイテムセットに現れない。 47 都道府県の 人口規模と高齢化の正の連動が定量化された。 地方創生政策の根拠として活用可能。
「リフト値」が実務でどう使われているかを 6 業種で具体化。 自分の業務に近いケースから読むと理解が早まります。
「リフト値」と隣接する手法・概念を 5 列で構造化。 用途・長所・短所・代表シーンを並べることで使い分けの判断がつきます。
| 手法・概念 | 主用途 | 長所 | 短所・制約 | 代表シーン |
|---|---|---|---|---|
| Lift | 関連の強さ比 | Conf(A→B) / P(B) | 対称的 | ペア発見 |
| Confidence | 条件付き確率 | P(B|A) | 方向あり・偏る | 推薦・予測 |
| Support | 頻出度 | P(A∩B) | まれな項目を除外 | 事前フィルタ |
| Conviction | 独立からの距離 | (1-Supp(B))/(1-Conf(A→B)) | ∞ も取りうる | 高信頼性ルール |
| Leverage | 同時生起の超過 | P(A∩B)-P(A)P(B) | 加法スケール | 統計的有意性 |
| Jaccard | 集合類似度 | |A∩B|/|A∪B| | 対称的 | クラスタリング |
理解度を確認するための演習。 まず自力で解いてから解答を開いてください。
「リフト値」周辺の 10 語をミニ辞典として整理。 ふと迷ったときの索引に。
レシート 1000 件で:
合成データでターゲット群と全体の反応率からリフト値を計算する。
| 群 | 送信 | 反応 | 率 |
|---|---|---|---|
| 全体平均 | 10,000 | 500 | 0.05 |
| セグメント A | 1,000 | 120 | 0.12 |
1 2 3 4 5 6 | rate_overall = 500/10000 rate_seg = 120/1000 lift = rate_seg / rate_overall print(f"全体率: {rate_overall}") print(f"セグメント率: {rate_seg}") print(f"リフト: {lift}") |
💬 手計算 (Step 2) 2.4 と Python 出力が完全一致。
mlxtend の apriori と association_rules で、5 指標(総人口・15 歳未満人口・65 歳以上人口・出生数・婚姻件数)を中央値で 0/1 にした 47 県の「カゴ」からルールを一括で出す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import pandas as pd # transactions(one-hot エンコード済み)を用意する。 # 都道府県を「取引」、指標が中央値以上かを「品目」に見立てる _d = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) _d = _d[_d['SSDSE-B-2026'] == 2023].reset_index(drop=True) _cols = ['A1101', 'A1301', 'A1303', 'A4101', 'A9101', 'L3221'] transactions = pd.DataFrame({c: (_d[c] >= _d[c].median()) for c in _cols}) from mlxtend.frequent_patterns import apriori, association_rules import pandas as pd # transactions: one-hot エンコード済みの DataFrame freq = apriori(transactions, min_support=0.05, use_colnames=True) rules = association_rules(freq, metric='lift', min_threshold=1.2) print(rules[['antecedents','consequents','support','confidence','lift']].head()) |
💬 中央値以上の県は各指標とも 47 県中 24 県(support 0.511)で、総人口と 15 歳未満人口ではそのうち 23 県が重なるため confidence 23/24 = 0.958、lift はそれを 0.511 で割った 1.877 になる。65 歳以上人口 → 総人口は 24 県が完全に一致して confidence 1.0、lift 1.958(= 47/24)で、支持度が同じ 2 品目で取りうる上限に達している。lift は A→B と B→A で同じ値になるので、上の行は 2 行ずつ同じ組の表裏であり、どれも「県の規模」という共通因子を拾っているだけ。
「リフト値」の理解を仕上げるための 2 つの追加コード。 これで本ページの Python ブロックは合計 10 個以上となり、 実務で頻出する典型パターンを網羅。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import pandas as pd from mlxtend.frequent_patterns import apriori, association_rules df = pd.read_csv('data/raw/SSDSE-B-2026.csv', header=1, encoding='cp932') df = df[df['年度']==df['年度'].max()].copy() df['高齢化率'] = df['65歳以上人口']/df['総人口'] df['人口大'] = (df['総人口']>=df['総人口'].median()).astype(bool) df['人口小'] = ~df['人口大'] df['高齢化進行'] = (df['高齢化率']>=df['高齢化率'].median()).astype(bool) df['高齢化遅'] = ~df['高齢化進行'] df['女性多'] = (df['総人口(女)']/df['総人口']>=0.51).astype(bool) feat = df[['人口大','人口小','高齢化進行','高齢化遅','女性多']] freq = apriori(feat, min_support=0.1, use_colnames=True) rules = association_rules(freq, metric='lift', min_threshold=0.5) for _, r in rules.sort_values('lift', ascending=False).head(8).iterrows(): a = ','.join(r['antecedents']) c = ','.join(r['consequents']) print(f'{a:10s} → {c:10s}: sup={r["support"]:.3f}, conf={r["confidence"]:.3f}, lift={r["lift"]:.3f}') |
📤 実行結果:
💬 単項目では 「人口小 → 高齢化進行」(lift=1.533)、 2 項目条件では 「人口小 ∧ 女性多 → 高齢化進行」(lift=1.665, conf=0.850) が最も強い。 antecedents/consequents が複数項目になると(表示はカンマ区切りの項目集合)、 過疎・女性化・高齢化が重なるサブグループが浮かび上がる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from scipy import stats import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', header=1, encoding='cp932') df = df[df['年度']==df['年度'].max()].copy() df['高齢化率'] = df['65歳以上人口']/df['総人口'] df['人口小'] = (df['総人口']<df['総人口'].median()).astype(int) df['高齢化進行'] = (df['高齢化率']>=df['高齢化率'].median()).astype(int) table = pd.crosstab(df['人口小'], df['高齢化進行']) chi2, p, dof, exp = stats.chi2_contingency(table) phi = (chi2/len(df))**0.5 print('2x2 クロス表:') print(table) print(f'\nカイ二乗 = {chi2:.4f}, p = {p:.6f}, dof = {dof}') print(f'phi 係数 = {phi:.4f}') |
📤 実行結果:
💬 p=0.0008 で 強く独立性を棄却、 phi=0.49 で中程度の正の相関。 lift=1.53 の関連が 統計的にも実用的にも有意。 lift と phi を併報告するのが標準。
SSDSE-B-2026 (47 都道府県) を題材に、 リフト値の発想を「都道府県の指標カテゴリ間の共起」として可視化する。 まず 47 都道府県を高齢化率と人口で散布図化し、 そこから「高齢化率 30%以上」「人口 100 万人以下」のような 2 値カテゴリを切り出して、 共起・期待値・実測値の比をリフト値として求める流れを 3 つの図で確認する。



リフト値 lift(A→B) = P(A∩B) / (P(A)·P(B)) の意味は「A と B が独立だった場合の期待共起率と、 実際の共起率の比」である。 lift=1 で独立、 lift>1 で正の関連 (A が起きると B も起きやすい)、 lift<1 で負の関連 (A が起きると B が起きにくい)。
事象 A = 「人口 100 万人以下」、 事象 B = 「高齢化率 30%以上」 と定義し、 47 都道府県全数からリフト値を求める。
| 指標 | 記号 | 値 | 解釈 |
|---|---|---|---|
| A 件数 (人口 ≤ 100 万) | |A| | 10 | 小規模県 |
| B 件数 (高齢化率 ≥ 30%) | |B| | 35 | 高齢化進行県 |
| A∩B 件数 | |A∩B| | 10 | 小規模かつ高齢化 |
| P(A) | 10/47 | 0.213 | 小規模率 |
| P(B) | 35/47 | 0.745 | 高齢化率 |
| P(A∩B) | 10/47 | 0.213 | 同時発生率 |
| lift(A→B) | P(A∩B)/(P(A)·P(B)) | 1.343 | 正の関連 (1.34 倍・A⊂B 完全包含) |
👉 解釈: lift=1.343 は「人口 100 万人以下の県」では「高齢化率 30%以上」となる確率が、 全国の平均より 1.34 倍高いことを意味する。 これは「小規模県では高齢化が進みやすい」という関係を統計的に支持する。 ただし lift だけでは因果関係は示せず、 「若年層の流出」「産業構造」「医療体制」など複数の要因の共起を反映している可能性を忘れない。
分子 P(A∩B) は「A と B が同時に起きる確率」、 分母 P(A)·P(B) は「A と B が独立だった場合に同時に起きる期待確率」。 比を取ることで、 「独立を仮定したときの期待値」と「実測値」のズレを 1 を基準にした比率として表す。 lift=2 ならば独立仮定より 2 倍出やすい、 lift=0.5 ならば独立仮定より半分しか出ない、 という具合に読む。
このコードでやること: SSDSE-B-2026 から 47 都道府県の人口と高齢化率を読み込み、 上記カテゴリでリフト値を求める。
📥 入力データ (SSDSE-B-2026 抜粋):
1 2 3 4 5 6 7 8 9 10 11 12 13 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df_2023 = df[df['SSDSE-B-2026'] == 2023].copy() df_2023['人口(万人)'] = df_2023['A1101'] / 10000 df_2023['高齢化率'] = df_2023['A1303'] / df_2023['A1101'] * 100 A = df_2023['人口(万人)'] <= 100 B = df_2023['高齢化率'] >= 30 n = len(df_2023) p_A = A.sum() / n p_B = B.sum() / n p_AB = (A & B).sum() / n lift = p_AB / (p_A * p_B) print(f'P(A)={p_A:.3f} P(B)={p_B:.3f} P(A∩B)={p_AB:.3f} lift={lift:.3f}') |
📤 実行例:
💬 lift=1.34 は正の関連を示す。 表の目安では「弱い正の関連」の帯に入るが、 P(B)=0.745 と B が多数派なので lift は 1/P(B)=1.343 より大きくなりえず、 この値はその上限に達している。 「小規模県」と「高齢化進行県」のラベルは独立に起きるのではなく、 1.34 倍重なって出現する。 しかも人口 100 万人以下の 10 県はすべて高齢化率 30%以上(A⊂B の完全包含)なので、 Confidence(A→B)=1.0、 反例(A かつ ¬B)がゼロ → Conviction・Odds Ratio はいずれも∞となる。 公共政策文脈では「集中介入対象セグメント」として活用できる。
| レンジ | 解釈 | 典型例 |
|---|---|---|
| lift < 0.5 | 強い負の関連 | 「都市部」 ×「過疎」 |
| 0.5 ≤ lift < 0.9 | 弱い負の関連 | 「平均所得高」 ×「失業率高」 |
| 0.9 ≤ lift ≤ 1.1 | ほぼ独立 | 「曜日」 ×「血液型」 |
| 1.1 < lift ≤ 1.5 | 弱い正の関連 | 「小規模県」 ×「高齢化」(本ページの 1.34) |
| 1.5 < lift ≤ 3.0 | 明確な正の関連 | 「高血圧診断」 ×「糖尿病診断」 |
| lift > 3.0 | 非常に強い関連 | 「降雪量大」 ×「除雪費高」 |
| 用語 | 英語 | 関係 |
|---|---|---|
| 支持度 | Support | P(A∩B)、 ルールの頻出度 |
| 確信度 | Confidence | P(B|A)、 ルールの予測精度 |
| レバレッジ | Leverage | P(A∩B)−P(A)P(B)、 lift の差版 |
| 確信度差 | Conviction | P(A)P(¬B)/P(A∩¬B)、 lift の対称性を解消 |
| アプリオリ | Apriori | 頻出パターン探索の古典アルゴリズム |
| FP-Growth | FP-Growth | Apriori より高速、 FP-Tree 利用 |
| 市場バスケット分析 | Market Basket | 小売の同時購入分析、 lift の代表用途 |
| トランザクション | Transaction | 1 セット (買い物カゴ・受診1回・閲覧セッション) |
| アイテムセット | Itemset | 複数アイテムの組 |
| 頻出アイテムセット | Frequent Itemset | support 閾値超のアイテムセット |
👉 全問正解で、 リフト値を実務で扱う基礎が固まったと言える。
リフト値の概念は 1990 年代の市場バスケット分析の文脈で広まったが、 統計学的にはそれ以前から「期待度数からの逸脱」という形で χ² 検定や相対危険度 (relative risk) と密接な関係を持っていた。 ここでは、 リフト値の歴史的な系譜、 統計学・機械学習の他指標との関係、 そして実務でリフト値を意思決定にどう統合するかを、 47 都道府県データを引きながら詳細に整理する。 単に「リフト値とは何か」を超え、 「いつ・どう・なぜ使うか」を体系的に理解することが、 アソシエーション解析を実プロジェクトで使いこなす鍵になる。
リフト値の起源を辿ると、 1993 年の Agrawal・Imielinski・Swami によるアソシエーションルール抽出の提案(support と confidence で評価)、 1994 年の Agrawal・Srikant による Apriori アルゴリズム、 そして 1997 年の Brin・Motwani・Silverstein「Beyond Market Baskets」へと連なる。 最後の論文が、 confidence だけでは B の人気に引きずられることを指摘し、 独立からのずれ(interest、 今日の lift)とカイ二乗検定で関連を評価する見方を示した。 もともとは「データベース内で同時に出現するアイテムを効率的に探索する」というデータベース研究の課題から発したものだが、 統計学的には「独立性からの乖離度」という古典的な概念と一致する。 χ² 検定で言うところの 2×2 表の A∩B セルの「観測度数 / 期待度数」の比そのものが lift である。 つまりリフト値は「独立性検定の効果量」という顔と「市場バスケット分析のルール評価指標」という顔を併せ持つ二面性を持つ。 この二面性を理解すると、 「lift = 効果量」「lift = ルール強度」のどちらの文脈で語っているかが明確になる。
1993-2000 年代にかけて、 lift は support, confidence と並ぶアソシエーション解析の 3 大指標として定着した。 一方、 統計学側からは「lift は対称性 (lift(A→B)=lift(B→A)) を持つため、 因果方向を示せない」「lift は P(B) が小さいルールで爆発的に大きくなる」といった批判が寄せられ、 その対策として conviction、 leverage、 all-confidence、 Kulczynski 等の代替指標が次々と提案された。 現在の業界実務では、 lift をベースに「support ≥ ε1 ∧ confidence ≥ ε2 ∧ lift ≥ ε3」の 3 重フィルタを通すのが標準的なワークフローとなっており、 さらに「対称性を打破するため confidence や conviction を併用する」「lift の信頼区間をブートストラップで算出する」など、 多面的な品質評価が要求される。 つまりリフト値は単独で完結する指標ではなく、 「アソシエーション解析の入口」として機能する基本指標である、 と位置付けるのが正しい。
リフト値の周辺には、 同じ「2 つの事象の関連度」を異なる視点から評価する指標が多数存在する。 47 都道府県 SSDSE-B-2026 から「人口 100 万以下 (A)」「高齢化率 30%以上 (B)」のセグメントを取った例で、 主要指標の数式と数値を一覧化する。
| 指標 | 数式 | 47 都道府県値 | 特徴 |
|---|---|---|---|
| Support | P(A∩B) | 0.213 | 頻度のみ、 関連度は不明 |
| Confidence | P(B|A) | 1.000 | 非対称、 予測精度 |
| Lift | P(A∩B)/(P(A)P(B)) | 1.343 | 対称、 独立からの倍率 |
| Leverage | P(A∩B)−P(A)P(B) | 0.054 | 独立からの差、 加算的 |
| Conviction | P(A)P(¬B)/P(A∩¬B) | ∞ | 非対称、 「逆否定」を考慮 |
| Odds Ratio | [P(A∩B)P(¬A∩¬B)]/[P(A∩¬B)P(¬A∩B)] | ∞ | 医学統計の標準、 対称 |
| Relative Risk | P(B|A)/P(B|¬A) | 1.48 | 疫学標準、 非対称 |
| Jaccard Similarity | P(A∩B)/P(A∪B) | 0.286 | 集合の重なり度 |
| Kulczynski | [P(B|A)+P(A|B)]/2 | 0.643 | 双方向の confidence 平均 |
| Cosine Similarity | P(A∩B)/√(P(A)P(B)) | 0.535 | ベクトル空間との対応 |
これら 10 指標を見比べると、 同じ「A と B の関連度」を測っても、 視点が変われば値も変わることが分かる。 例えば lift=1.34 と odds ratio=∞(A⊂B で反例ゼロ)は表現こそ違うが、 どちらも「独立から外れている」ことを示している。 一方、 Support=0.213 は「約 2 割の都道府県でこの組み合わせが起こる」という頻度情報のみで、 関連度はそこからは読み取れない。 実務では「複数指標を組み合わせて多面的に評価する」のが標準であり、 lift だけを見て意思決定をするのは推奨されない。
このコードでやること: SSDSE-B-2026 47 都道府県データから、 上記 10 指標を一括で算出する関数を作る。 これにより、 リフト値を含む多面評価が 1 行で得られる。
📥 入力データ: 上記と同じ 47 都道府県データ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import pandas as pd def assoc_metrics(A, B): n = len(A) p_A = A.sum() / n p_B = B.sum() / n p_AB = (A & B).sum() / n p_AnB = (A & ~B).sum() / n p_nAB = (~A & B).sum() / n p_nAnB = (~A & ~B).sum() / n lift = p_AB / (p_A * p_B) if p_A * p_B > 0 else float('inf') conf = p_AB / p_A if p_A > 0 else 0 leverage = p_AB - p_A * p_B conviction = (p_A * (1-p_B)) / p_AnB if p_AnB > 0 else float('inf') odds_ratio = (p_AB * p_nAnB) / (p_AnB * p_nAB) if p_AnB * p_nAB > 0 else float('inf') rel_risk = (p_AB/p_A) / (p_nAB/(1-p_A)) if (1-p_A) > 0 and p_nAB > 0 else float('inf') jaccard = p_AB / (p_A + p_B - p_AB) if (p_A + p_B - p_AB) > 0 else 0 kulczynski = ((p_AB/p_A) + (p_AB/p_B)) / 2 if p_A > 0 and p_B > 0 else 0 cosine = p_AB / ((p_A * p_B) ** 0.5) if p_A * p_B > 0 else 0 return {'support':p_AB, 'confidence':conf, 'lift':lift, 'leverage':leverage, 'conviction':conviction, 'odds_ratio':odds_ratio, 'relative_risk':rel_risk, 'jaccard':jaccard, 'kulczynski':kulczynski, 'cosine':cosine} df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df_2023 = df[df['SSDSE-B-2026']==2023].copy() df_2023['人口万'] = df_2023['A1101'] / 10000 df_2023['高齢化率'] = df_2023['A1303'] / df_2023['A1101'] * 100 A = df_2023['人口万'] <= 100 B = df_2023['高齢化率'] >= 30 for k, v in assoc_metrics(A, B).items(): print(f'{k:14s}: {v:.3f}') |
📤 実行例:
💬 このセグメントは人口 100 万人以下の 10 県がすべて高齢化率 30%以上(A⊂B)なので、 反例 A∩¬B がゼロ。 そのため conviction・odds_ratio はゼロ除算となり inf(∞)で出力される。 「破られない完全なルール」の極端例であり、 lift=1.34 という控えめな倍率と併せて読むと、 「小規模県では例外なく高齢化が進む」という強い包含構造が見える。 実務では 10 指標を組み合わせ、 「閾値で足切り」「複数指標で上位ルールを抽出」する。
リフト値は「2 つの 2 値事象の関連度」を測る指標だが、 これを多次元に拡張すると様々な手法と接続する。 たとえば、 多変量カテゴリデータに対しては「対数線形モデル (log-linear model)」がリフト値の自然な拡張であり、 「2 元交互作用」「3 元交互作用」など複雑な依存関係を統一的に扱える。 また、 行列の特異値分解 (SVD) や潜在ディリクレ配分 (LDA) もアイテム間の「共起構造」を捉える点でリフト値の発想と通じる。 機械学習側では、 決定木の split criterion (entropy/gini) は「2 値分割後の情報利得」を測るが、 これも「独立性からの乖離」という観点で lift と等価な情報を抽出している。 つまりリフト値は孤立した指標ではなく、 統計学・情報理論・機械学習の多くの手法が共有する「依存性測定」という共通母体の入口を担っている。
さらに、 近年の Transformer モデルや埋め込み学習においても、 「単語 A と単語 B の共起 lift」が pointwise mutual information (PMI) と同じ式で計算され、 word2vec や GloVe の学習信号の基礎となっている。 つまり、 lift の式 lift = P(A∩B) / (P(A)P(B)) は、 アソシエーション解析・統計検定・自然言語処理・推薦システムなど、 多くの分野で同じ顔をして再登場する。 「lift = PMI = 独立性からの乖離」という見方を持つと、 lift がデータサイエンスの中で持つ普遍的な位置付けが見えてくる。
Week 1: 確率の復習 (条件付き確率・ベイズ・独立性)、 Apriori アルゴリズムの理解、 mlxtend で実装演習。
Week 2: Support・Confidence・Lift の関係と限界、 多指標 (conviction, leverage, odds ratio) との比較、 SSDSE データで実装。
Week 3: 時系列拡張 (Sequential Pattern Mining)、 多変量拡張 (対数線形モデル)、 因果推論との接続。
Week 4: 実プロジェクトケーススタディ (小売・EC・金融・公共政策)、 A/B テスト連携、 報告書作成演習。
30 日プログラムを完走すると、 lift を中心としたアソシエーション解析を「探索 → 検証 → 介入実験」の 3 段階で実プロジェクトに組み込めるようになる。 lift は決して「終着点」ではなく、 「データの構造を最初に理解する出発点」として位置付けるのが正しい使い方である。
リフト値は計算式が単純なだけに、 実務現場では誤解や誤用が頻発する。 ここでは典型的な誤解 12 個と、 その訂正・正しい解釈を併記する。 これらを 1 つでも誤解した状態で意思決定の根拠に使うと、 ビジネスインパクトの読み違いやリソースの無駄遣いに直結するので、 チェックリスト的に押さえておく価値が高い。
👉 これら 12 個の誤解を全て訂正できるレベルでリフト値を扱えれば、 アソシエーション解析の中級者と言える。 さらに上を目指すには、 Bayes 統計の枠組みでリフト値を再定式化する「Bayesian Association Rule Mining」や、 因果推論との結合 (lift を介入効果の代理指標として使う場面の制限) を学んでいくとよい。
リフト値の本質は、 条件付き購買率 P(B|A) を単独で見るのではなく、 ベースライン購買率 P(B) と比べることにあります。 下の 3 本のスライダーを動かすと、 ① ベースラインと条件付き購買率の 2 本のバー、 ② 2×2 分割表のモザイク図、 そしてリフト値がリアルタイムに連動します。 まずプリセット「🍞 人気商品の罠」を押して、 confidence = 70% という一見立派な数字でも lift = 0.875 < 1(=A を買った人はむしろ B を買わない)になる瞬間を体感してください。
confidence = P(B|A) は「A を買った人の何 % が B を買うか」という絶対的な割合なので、 B がもともと売れている商品なら、 どんな条件 A を付けても高く出てしまいます。 lift はこの値を独立線 P(B|A) = P(B) で割ることで、 「A という情報が B の購買確率を何倍に押し上げた(押し下げた)か」という乖離の倍率だけを取り出します。 上の図①で、 右のバーが橙色の独立線より飛び出た分が正の関連、 沈んだ分が負の関連。 図②のモザイク図では、 A 列と非 A 列の「B 購入」の高さが独立線からどれだけずれているかが、 そのままリフトの正体です(2 列の高さが揃えば lift = 1)。
プリセット「人気商品の罠」(P(B) = 0.8、 confidence = 0.7)では、 lift = 0.7 / 0.8 = 0.875 < 1。 モザイク図を見ると、 A 購入者の B 購買率 70% に対して A 非購入者の B 購買率は約 84% — つまり「A を買った人は、 買っていない人よりむしろ B を買わない」負の関連です。 これが confidence 単独の罠:confidence 0.7 という数字だけ見て「強いルール」と報告すると、 実態と逆の推薦をすることになります。 さらに、 confidence でルールを並べ替えると、 後件 B に人気商品を持つルールが条件 A と無関係に上位を独占します(人気商品バイアス)。 実務の定石は、 min_support で希少ルールを落とし、 lift(または leverage)で人気補正をかけ、 confidence で実際の当たり率を確認する3 点セット。 なお lift < 1 のルールは無価値ではなく、 「A 購入者には B を勧めない」「代替品・カニバリゼーションの検出」に使えます。
図②の 2×2 分割表が確定すれば、 lift・leverage・φ 係数・オッズ比・カイ二乗統計量はすべて同じ表から計算できる親戚です。 leverage = P(A∩B) − P(A)P(B) = P(A)P(B)(lift − 1) であり、 2 値変数どうしの相関係数にあたる φ 係数は φ = leverage / √(P(A)(1−P(A))P(B)(1−P(B)))。 つまり lift > 1 ⇔ leverage > 0 ⇔ φ > 0 で符号は必ず一致し、 違うのは強さの物差しだけです。 一方オッズ比 OR = [P(A∩B)·P(¬A∩¬B)] / [P(A∩¬B)·P(¬A∩B)] は周辺分布(商品の人気度)に依存しない対称指標で、 疫学分野で好まれます。 lift には lift ≤ 1/P(B) という上限がある点も重要:P(B) = 0.8 の人気商品なら lift は最大でも 1.25 で、 構造的に大きな lift が出ません(上のスライダーで P(B) を上げて確認できます)。 関連の統計的有意性はカイ二乗検定で、 ルール抽出の全体像はマーケットバスケット分析とアソシエーションルールで確認してください。
リフト値を中心に、 支持度・確信度 (関連指標)、 Apriori・FP-Growth (アルゴリズム)、 Leverage・Conviction (派生指標) を並べたアソシエーション分析マップ。
リフト値は「A を買った人が B を買う条件付き確率 / B の購買確率」で定義される指標で、 支持度 (support)・確信度 (confidence) と組み合わせて関連ルール (アソシエーション分析) の評価に使う。 概念マップではアプリオリ法・FP-Growth・シーケンシャルパターン分析が周辺手法、 落とし穴は「片方の確率が低すぎる場合のリフト値の過大評価」「独立性検定との混同」など。
リフト値は支持度と確信度を補正する指標であり、 前段のトランザクションデータ整備と後段のルール選定・可視化を組み合わせて意味あるパターンを抽出する。
上流のアソシエーション分析 (Apriori/FP-Growth) で頻出アイテム集合を抽出し、 並列の Confidence/Support と組み合わせて 3 指標で同時評価し、 下流の リコメンダ A/B テストで Lift>1 のルールが実際の購入転換率に効くかを検証する流れでマーケット応用が完結する。
「リフト値」の 選び方・適用判断をフローで整理。 状況に応じた選択を 4 段階で。
既存セクション(独立基準 1.0、 希少ルールの罠、 Leverage/Conviction、 対称性、 相関との混同)と重複しない追加の視点をまとめた追記です。 数値はすべて SSDSE-B-2026(cp932、 2 行目のラベル行を除外)の 2023 年・47 都道府県から実際に計算した実測値です(架空例は「架空」と明記)。
lift は 0〜∞ のスケールに見えますが、 実は個々のルールごとに天井があります。 P(A∩B) は min(P(A), P(B)) を超えられないため、 lift の最大値 = 1 / max(P(A), P(B))。 つまり B が頻出アイテムであるほど、 どんなに強い共起でも lift は構造的に大きくなれません。 本文④の「人口小 → 高齢化進行」(総人口 A1101 と高齢化率 A1303/A1101 をそれぞれ中央値で二値化、 n=47)では P(A) = 23/47 ≒ 0.489、 P(B) = 24/47 ≒ 0.511 なので、 天井は 1/0.511 ≒ 1.96。 実測の lift = 1.53 は一見控えめですが、 天井の約 78% に達するかなり強い共起です。 「lift が 5 倍・10 倍にならないから弱い」と読むのではなく、 その二値化での天井との比で読むのが正しい直感です。
連続量を二値化して lift を計算するとき、 閾値の選び方だけで lift の値が動きます。 同じ 2023 年データで、 A(人口が中央値未満)は固定したまま、 B(高齢化率が高い)の閾値をパーセンタイルで変えた実測値:
| B の定義(高齢化率) | 該当県数 | P(B) | confidence | lift | 天井 1/P(B) |
|---|---|---|---|---|---|
| 上位 70%(30 パーセンタイル以上) | 33 | 0.702 | 0.913 | 1.30 | 1.42 |
| 上位 50%(中央値以上)=本文④ | 24 | 0.511 | 0.783 | 1.53 | 1.96 |
| 上位 30%(70 パーセンタイル以上) | 14 | 0.298 | 0.522 | 1.75 | 3.36 |
lift は 1.30 → 1.53 → 1.75 と単調に上がりますが、 これは関連が強まったのではなく、 B を希少に定義し直して分母 P(B) が縮んだだけです。 結果を見てから閾値を選べば「lift の釣り上げ」ができてしまうため、 閾値は分析前に決めて報告書に明記すること。 同じ理由で、 P(B) が異なるルール同士の lift の大小比較は天井が違うので不公平です。 もう一つ:lift が小さい = 関連が弱い、 とも限りません。 中央値分割の 2×2 表(18, 5, 6, 18)を別の指標で測ると、 オッズ比は 10.8、 カイ二乗検定(イェーツ補正)は χ² = 11.29、 p = 0.0008。 lift 1.53 とオッズ比 10.8 は同じ表の別スケールであり、 lift の絶対値だけで切り捨てると強い関連を見落とします。
lift のもう一つの深い性質は、 「A も B も入っていないカゴ」の件数に敏感なことです(null-transaction 問題)。 架空の極端例:A∩B = 10 件、 A のみ = 10 件、 B のみ = 10 件を固定し、 「どちらも買っていない客」を 70 件とすると(n = 100)、 lift = 0.10 / (0.20 × 0.20) = 2.5。 ところが無関係な客を 970 件に水増しすると(n = 1000)、 lift = 0.01 / (0.02 × 0.02) = 25.0。 共起の構造は 1 件も変わっていないのに、 データ全体の規模だけで lift が 10 倍になります。 大規模 EC のように「大半の客がその 2 商品と無関係」なデータでは lift が過大に見えやすい、 と覚えておくと安全です。 この欠点を避けるために、 null-transaction の影響を受けない null-invariant 指標(Kulczynski 尺度、 コサイン尺度、 all-confidence など)が提案されています。 また lift を天井 1/max(P(A), P(B)) で割って 0〜1 に正規化すれば、 頻度の違うルール間でも比較可能になります(上の実測例なら 1.53 / 1.96 ≒ 0.78)。
アソシエーションルール(support / confidence / lift の三点セットの本体)、 アソシエーション分析(分析全体の流れと SSDSE での実例)、 カイ二乗検定(同じ 2×2 表の独立性を検定で見る)、 オッズ比(同じ表の別スケール、 疫学で標準)、 条件付き確率(lift の分子 P(B|A) の土台)、 レコメンドシステム(lift の実務的な出口)。 なお層別で lift の符号が反転し得る「シンプソンのパラドックス」も隣接論点です(本用語集では未収録のためリンクなし)。