Qlikで顧客分析_RFM分析サンプル
更新日:11 分前
RFM分析は売上伝票などから顧客の最終購入日(Recency)、購入頻度(Frequency)、購入金額(Monetary)の3つの指標で顧客グループを分析する手法です。Qlikを使用して簡単にRFM分析を試してみることができます。
※2025年2月時点のQlik Sense SaaSを利用しています。
<RFM分析の基礎>
RFM指標の理解
顧客を評価する指標として次の3つを使用します。それぞれの頭文字を取ってRFM分析と呼ばれています。
▼Recency(最終購入日) 顧客が最後に購入した日を評価します。最終購入日からの経過日数が少ない顧客を高く評価します。 ▼Frequency(購入頻度) 購入回数を評価します。購入頻度が多い顧客を高く評価します。 ▼Monetary(購入金額) 購入金額を評価します。購入金額の総額が多い顧客を高く評価します。 |
RFM指標の使い方
「R」「F」「M」の各指標それぞれでランクに分けて顧客をグループ化することが多いようです。例えば下の表のように5つのランクに分けて顧客がどのランクに所属するか分析することができます。
R:最終購入日 | F:購入頻度 | M:購入金額 | |
ランク1 | 7日以内 | 30回以上 | 5万円以上 |
ランク2 | 30日以内 | 20回以上 | 3万円以上 |
ランク3 | 3か月以内 | 10回以上 | 1万円以上 |
ランク4 | 6ヶ月以内 | 5回以上 | 5,000円以上 |
ランク5 | 1年以内 | 5回未満 | 5,000円未満 |
指標の組み合わせ
RFM分析では、3つの指標を組み合わせることで、顧客グループの特性をより明確にし、効果的な施策を検討しやすくなります。例えば「過去3年間の購入金額が多く、購入頻度も高かったものの、1年以上購入がない」顧客が多い場合、それは対策が必要な重要なサインといえるでしょう。
★RFM分析の悩みどころとQlik SenseRFMのランク付け ランク分けする基準は商材によって様々です。金額も購入頻度も商材によってまったく異なるのでデータの準備が大変です。商材ごとにランク付けデータを準備するのも現実的でない気がします。 フィルタの柔軟性 顧客や商材や地域などいろいろな軸で絞り込みながらRFM分析をするのが大変です。 Qlik Senseはこのあたりの悩みを便利に解消してくれます。ランク基準やフィルタを動的に変更しながら分析できるアプリも簡単に作れるのでぜひお試しください。 |
<Qlik RFM分析チャートの作成方法:RFMランク表>
サンプルデータ
どんなサンプルデータを使うのがよいか迷いましたが、どこにでもあるような売上データにしてみました。

RFM指標の作成について
上記のサンプルデータから次のように3つの指標を取り出すことにしました。
R:最終購入日
=Today() - Max([日付])
F:購入頻度
⁼Count(Distinct [日付])
M:購入金額
=sum([売上金額])
これをもとにそれぞれの指標をランク付けしていきます。顧客ごとに集計した値に対してそれぞれのランク付けをしないといけないのが難しいです。Qlik Senseの場合はAggr関数で計算することができました。
手順1)RFMランク項目の作成
Aggr関数を使用して[得意先KEY]ごとのRFMランクを算出します。数式をシンプルにするため、ランクは3段階に設定しましたが、必要に応じてIF文を追加することでランクの細分化も可能です。
Rランク
=if(aggr(today() - max([日付]) ,[得意先KEY]) <= 7 ,'ランク1 (~'&'7日)' ,
if(aggr(today() - max([日付]) ,[得意先KEY]) <= 30 ,'ランク2 (~'&'30日)' ,
if(aggr(today() - max([日付]) ,[得意先KEY]) > 30, 'ランク3 ('&'30日超)', )))
Fランク
=if(aggr(count(Distinct [日付]) ,[得意先KEY]) <= 10 ,'ランク1 (~'&'10回)' ,
if(aggr(count(Distinct [日付]) ,[得意先KEY]) <= 30 ,'ランク2 (~'&'30回)' ,
if(aggr(count(Distinct [日付]) ,[得意先KEY]) > 30, 'ランク3 ('&'30回超)', )))
Mランク
=if(aggr(sum([売上金額]),[得意先KEY]) <=1000,'ランク1(~'&'1,000円)' ,
if(aggr(sum([売上金額]),[得意先KEY]) <=3000 ,'ランク2 (~'&'3,000円)' ,
if(aggr(sum([売上金額]),[得意先KEY]) >3000, 'ランク3 ('&'3,000円超)' ,
)))
※ Aggr関数については「Aggr関数再入門(Aggr関数の詳細と使用例)」を参考にしました。
手順2)RFMランク表の作成
下図は顧客リストにRFMランクを表示したサンプルイメージです。ランクごとにハイライトすることで「大和マーケット」が全項目でランク1なのが分かります。(各ランクの基準数値は上述の数式とは異なります。またデータの都合上、最終購入日の基準は「2026/1/25」になっています)

▼シート上にテーブルを作成し、各ランク項目を配置します。
▼ハイライトの設定は次のとおりです。
![]() | Rランクを例に挙げておきます。 Rランク項目の設定で「背景カラー表現」を用いて、ランク1の場合はセルの背景色をCyan()にします。 同様に「テキストカラー表現」を用いて、ランク2の場合はテキストの文字色をLightRed()にします。 |
それぞれの数式サンプルは次のとおりです。配色は定義済みのカラー関数を使用しました。
背景カラー表現
=if(
if(aggr(today() -max([日付]) ,[得意先KEY]) <= 60 ,'ランク1 (~'&'60日)' ,
if(aggr(today() -max([日付]) ,[得意先KEY]) <= 170 ,'ランク2 (~'&'170日)' ,
if(aggr(today() -max([日付]) ,[得意先KEY]) > 170, 'ランク3 ('&'170日超)', )))
)='ランク1 (~'&'60日)',cyan())
テキストカラー表現
=if(
if(aggr(today() -max([日付]) ,[得意先KEY]) <= 60 ,'ランク1 (~'&'60日)' ,
if(aggr(today() -max([日付]) ,[得意先KEY]) <= 170 ,'ランク2 (~'&'170日)' ,
if(aggr(today() -max([日付]) ,[得意先KEY]) > 170, 'ランク3 ('&'170日超)', )))
)='ランク1 (~'&'60日)',lightRed())
<Qlik RFM分析チャートの作成方法:R×F散布図>
手順3)散布図の活用
あまり深く考えずに散布図でグループ分けをすることもあります。下図のサンプルは「R:最終購入日」と「F:購入頻度(回数)」の2つの指標を使って顧客の分布を表しています。
縦に「最終購入からの経過日数」を表しているので下へ行くほど最近購入があったことになります。横に「購入回数」を表しているので右へ行くほど購入回数が多いことになります。また、円の大きさ「M:総購入金額」も表しています。右下にいる大和マーケットは購入回数が多く、最近購入もあり、金額も大きいことが分かります。手順1の表で確認した情報が他顧客との相対的ポジションとともに見えるので、より感覚的につかむことができます。

▼散布図を作ります。「Qlik Sense 散布図の作り方」など参考にしてください。
▼散布図の設定は次のとおりです。
![]() | X軸:購入頻度
⁼Count(Distinct [日付]) Y軸:経過日数
=Today() - Max([日付]) サイズ:売上金額
=sum([売上金額]) |
▼RとFのランクを基準線で表示します。
![]() | [拡張機能]‐[X軸の基準線]に[基準線の追加]をします。 サンプル図では[基準線の数式]に40を設定しています。 同様の手順でX軸、Y軸それぞれに必要な基準線を追加します。 |
<Qlik RFM分析チャートの作成方法:RFMランクの動的設定>
ランク基準を変数で設定する
これまでは、ランクの基準値を定数で指定する方法について説明しました。しかし、分析対象となる商材や販売形態によって適切な基準値は大きく異なるため、定数指定では柔軟な分析が難しくなります。そこで、ここからは基準値を変数として設定し、動的に変更できるようにすることで、より柔軟な分析を可能にしていきます。
※サンプルアプリのアニメーションgifです。

手順1)変数の活用したRFMランク項目の作成
Aggr関数を使用して[得意先KEY]ごとのRFMランクを算出します。定数を指定していた箇所に変数に置き換えています。(赤字が変数です)
Rランク
=if(aggr(vBasedate()-max([日付]),[得意先KEY]) <=vR1,'ランク1 (~'&vR1&'日)',
if(aggr(vBasedate()-max([日付]),[得意先KEY]) <=vR2,'ランク2 (~'&vR2&'日)',
if(aggr(vBasedate()-max([日付]),[得意先KEY]) >vR2,'ランク3 ('&vR2&'日超)', )))
Fランク
=if(aggr(count(Distinct [日付]),[得意先KEY]) <= vF1,'ランク1 (~'&vF1&'回)',
if(aggr(count(Distinct [日付]),[得意先KEY]) <= vF2,'ランク2 (~'&vF2&'回)',
if(aggr(count(Distinct [日付]),[得意先KEY]) > vF2, 'ランク3 ('&vF2&'回超)', )))
Mランク
=if(aggr(sum([売上金額]),[得意先KEY]) <=vM1,'ランク1(~'&vM1&'円)' ,
if(aggr(sum([売上金額]),[得意先KEY]) <=vM2 ,'ランク2 (~'&vM2&'円)' ,
if(aggr(sum([売上金額]),[得意先KEY]) >vM2, 'ランク3 ('&vM2&'円超)' ,
)))
※ Aggr関数については「Aggr関数再入門(Aggr関数の詳細と使用例」を参考にしました。
手順2)変数の作成
数式で使用する変数を作成します。
![]() | シート編集画面の左側メニューから[変数]アイコンをクリックします。 |
![]() | 変数画面で[新規作成]をクリックし、変数の新規作成の[名前]に「vF1」などの変数名を作成していきます。 |
上記の数式サンプルで使用する変数を作成します。
・Rランク用:vR1、vR2
・Fランク用:vF1、vF2
・Mランク用:vM1、vM2
・最終購入日の当日基準用:vBasedate
手順3)動的に変数を設定するためのスライドバーの作成
シート上でRFMランクの基準値を設定するためのスライドバーを作成します。
![]() | シート編集画面の左側メニューから[カスタムオブジェクト]を開き[Qlik Dashboard bandle]‐[Variable input]をシート上に配置します。 |
![]() | [Variable input]の設定例です。 ▼Variable [Name]:「vF1」など変数を設定します [Show as]:「Slider」を設定します。他にButtons、Drop down、Input boxがあります。 [Update on drag]にチェックを入れるとドラッグ状態でも変数値がリアルにシート上に反映されます。 ▼Values [Min]:スライダーの最小値 [Max]:スライダーの最大値 [Step]:スライダーを動かす単位 [Slider label]:スライダー上に設定した値が表示されます。 |
▼それぞれのランク基準値ごとにスライドバーを作成しておきます。

【参考記事】
以上です
コメント