sql >> データベース >  >> RDS >> Database

SQLで保持率を計算する方法は?

    既存顧客維持率は、製品/サービスを継続して使用する顧客の数として定義されます。コホート保持分析を計算することは困難です。顧客維持分析のためにSQLで維持率を計算する方法は次のとおりです。これを使用して、MySQL、PostgreSQL、SQL Server、およびOracleの保持率を計算できます。また、顧客維持のためのSQLクエリについても見ていきます。既存顧客維持率は、毎週や毎月などの定期的な間隔で、登録した週ごとにグループ化されたリピーターの数として測定されます。

    SQLで毎週のコホートごとに保持を計算し、次のような表を作成します。これは、数週間前に最初にサインアップした後に、サインアップの各週について再度ログインした顧客の数を示しています。

    >

    SQLで保持率を計算する方法は?

    SQLで保持率を計算する手順は次のとおりです。各ユーザーの訪問のuser_idとlogin_dateを格納する次のテーブルがあるとします。

    mysql> create table login(login_date date,user_id int, id int not null auto_increment, primary key (id));
    
    mysql> insert into login(login_date,user_id)
         values('2020-01-01',10),('2020-01-02',12),('2020-01-03',15),
         ('2020-01-04',11),('2020-01-05',13),('2020-01-06',9),
         ('2020-01-07',21),('2020-01-08',10),('2020-01-09',10),
         ('2020-01-10',2),('2020-01-11',16),('2020-01-12',12),
         ('2020-01-13',10),('2020-01-14',18),('2020-01-15',15),
         ('2020-01-16',12),('2020-01-17',10),('2020-01-18',18),
         ('2020-01-19',14),('2020-01-20',16),('2020-01-21',12),
         ('2020-01-22',21),('2020-01-23',13),('2020-01-24',15),
         ('2020-01-25',20),('2020-01-26',14),('2020-01-27',16),
         ('2020-01-28',15),('2020-01-29',10),('2020-01-30',18);
    
    
    mysql> select * from login;
    +------------+---------+----+
    | login_date | user_id | id |
    +------------+---------+----+
    | 2020-01-01 |      10 |  1 |
    | 2020-01-02 |      12 |  2 |
    | 2020-01-03 |      15 |  3 |
    | 2020-01-04 |      11 |  4 |
    | 2020-01-05 |      13 |  5 |
    | 2020-01-06 |       9 |  6 |
    | 2020-01-07 |      21 |  7 |
    | 2020-01-08 |      10 |  8 |
    | 2020-01-09 |      10 |  9 |
    | 2020-01-10 |       2 | 10 |
    | 2020-01-11 |      16 | 11 |
    | 2020-01-12 |      12 | 12 |
    | 2020-01-13 |      10 | 13 |
    | 2020-01-14 |      18 | 14 |
    | 2020-01-15 |      15 | 15 |
    | 2020-01-16 |      12 | 16 |
    | 2020-01-17 |      10 | 17 |
    | 2020-01-18 |      18 | 18 |
    | 2020-01-19 |      14 | 19 |
    | 2020-01-20 |      16 | 20 |
    | 2020-01-21 |      12 | 21 |
    | 2020-01-22 |      21 | 22 |
    | 2020-01-23 |      13 | 23 |
    | 2020-01-24 |      15 | 24 |
    | 2020-01-25 |      20 | 25 |
    | 2020-01-26 |      14 | 26 |
    | 2020-01-27 |      16 | 27 |
    | 2020-01-28 |      15 | 28 |
    | 2020-01-29 |      10 | 29 |
    | 2020-01-30 |      18 | 30 |
    +------------+---------+----+
    

    毎週のコホート分析を作成します。製品/サービスに応じて、月次/日次に変更できます。

    MySQLを使用してSQLの保持率を計算します。 PostgreSQLの解約率を計算することもできます。

    1。週ごとのバケット訪問

    SQLで保持率を計算するには、まず、ログインの週ごとに各訪問をグループ化します。

    mysql> SELECT
                    user_id,
                    week(login_date) AS login_week
                    FROM login
                    GROUP BY user_id,week(login_date);
    +---------+------------+
    | user_id | login_week |
    +---------+------------+
    |       2 |          1 |
    |       9 |          1 |
    |      10 |          0 |
    |      10 |          1 |
    |      10 |          2 |
    |      10 |          4 |
    |      11 |          0 |
    |      12 |          0 |
    |      12 |          2 |
    |      12 |          3 |
    |      13 |          1 |
    |      13 |          3 |
    |      14 |          3 |
    |      14 |          4 |
    |      15 |          0 |
    |      15 |          2 |
    |      15 |          3 |
    |      15 |          4 |
    |      16 |          1 |
    |      16 |          3 |
    |      16 |          4 |
    |      18 |          2 |
    |      18 |          4 |
    |      20 |          3 |
    |      21 |          1 |
    |      21 |          3 |
    +---------+------------+
    

    MySQLで週次アクティブユーザー(WAU)を計算する方法も確認してください。

    2。各ユーザーのログインの最初の週を計算します

    次に、SQLで保持率を計算するには、各ユーザーのログインの最初の週を計算する必要があります。 MIN関数とGROUPBYを使用して、各ユーザーの最初のログイン週を計算します

    mysql> SELECT
                    user_id,
                    min(week(login_date)) AS first_week
                    FROM login
                    GROUP BY user_id;
    +---------+------------+
    | user_id | first_week |
    +---------+------------+
    |       2 |          1 |
    |       9 |          1 |
    |      10 |          0 |
    |      11 |          0 |
    |      12 |          0 |
    |      13 |          1 |
    |      14 |          3 |
    |      15 |          0 |
    |      16 |          1 |
    |      18 |          2 |
    |      20 |          3 |
    |      21 |          1 |
    +---------+------------+
    

    3。 login_weekとfirst_weekの2つのテーブルをマージします

    次に、以下のクエリをINNER JOINとともに使用して、各ユーザーのlogin_weekとfirst_weekを並べて取得し、SQLでの保持率を計算します。

    mysql> select a.user_id,a.login_week,b.first_week as first_week  from   
                  (SELECT
                    user_id,
                    week(login_date) AS login_week
                    FROM login
                    GROUP BY user_id,week(login_date)) a,
                  (SELECT
                    user_id,
                    min(week(login_date)) AS first_week
                    FROM login
                    GROUP BY user_id) b
            where a.user_id=b.user_id;
    +---------+------------+------------+
    | user_id | login_week | first_week |
    +---------+------------+------------+
    |       2 |          1 |          1 |
    |       9 |          1 |          1 |
    |      10 |          0 |          0 |
    |      10 |          1 |          0 |
    |      10 |          2 |          0 |
    |      10 |          4 |          0 |
    |      11 |          0 |          0 |
    |      12 |          0 |          0 |
    |      12 |          2 |          0 |
    |      12 |          3 |          0 |
    |      13 |          1 |          1 |
    |      13 |          3 |          1 |
    |      14 |          3 |          3 |
    |      14 |          4 |          3 |
    |      15 |          0 |          0 |
    |      15 |          2 |          0 |
    |      15 |          3 |          0 |
    |      15 |          4 |          0 |
    |      16 |          1 |          1 |
    |      16 |          3 |          1 |
    |      16 |          4 |          1 |
    |      18 |          2 |          2 |
    |      18 |          4 |          2 |
    |      20 |          3 |          3 |
    |      21 |          1 |          1 |
    |      21 |          3 |          1 |
    +---------+------------+------------+
    

    4。週数を計算する

    これ以降、SQLでの保持率の計算は簡単です。次に、login_weekとfirst_weekの差を計算して、week_number(週数)を計算します

    mysql> select a.user_id,a.login_week,b.first_week as first_week,
                  a.login_week-first_week as week_number from   
                 (SELECT
                    user_id,
                    week(login_date) AS login_week
                    FROM login
                    GROUP BY user_id,week(login_date)) a,
                 (SELECT
                    user_id,
                    min(week(login_date)) AS first_week
                    FROM login
                    GROUP BY user_id) b
            where a.user_id=b.user_id;
    +---------+------------+------------+-------------+
    | user_id | login_week | first_week | week_number |
    +---------+------------+------------+-------------+
    |       2 |          1 |          1 |           0 |
    |       9 |          1 |          1 |           0 |
    |      10 |          0 |          0 |           0 |
    |      10 |          1 |          0 |           1 |
    |      10 |          2 |          0 |           2 |
    |      10 |          4 |          0 |           4 |
    |      11 |          0 |          0 |           0 |
    |      12 |          0 |          0 |           0 |
    |      12 |          2 |          0 |           2 |
    |      12 |          3 |          0 |           3 |
    |      13 |          1 |          1 |           0 |
    |      13 |          3 |          1 |           2 |
    |      14 |          3 |          3 |           0 |
    |      14 |          4 |          3 |           1 |
    |      15 |          0 |          0 |           0 |
    |      15 |          2 |          0 |           2 |
    |      15 |          3 |          0 |           3 |
    |      15 |          4 |          0 |           4 |
    |      16 |          1 |          1 |           0 |
    |      16 |          3 |          1 |           2 |
    |      16 |          4 |          1 |           3 |
    |      18 |          2 |          2 |           0 |
    |      18 |          4 |          2 |           2 |
    |      20 |          3 |          3 |           0 |
    |      21 |          1 |          1 |           0 |
    |      21 |          3 |          1 |           2 |
    +---------+------------+------------+-------------+
    

    5。結果をピボットする

    最後に、結果をピボットして、SQLで保持率を計算し、コホートテーブルを生成する必要があります。ピボットテーブルでは、 first_weekごとに1つの行があります。 値、および week_numberごとに1つの列 製品/サービスを使用するために「n」週間後に戻ったユーザーの数が含まれます。このために、次のクエリを使用します。

    mysql> select first_week,
         SUM(CASE WHEN week_number = 0 THEN 1 ELSE 0 END) AS week_0,
           SUM(CASE WHEN week_number = 1 THEN 1 ELSE 0 END) AS week_1,
           SUM(CASE WHEN week_number = 2 THEN 1 ELSE 0 END) AS week_2,
           SUM(CASE WHEN week_number = 3 THEN 1 ELSE 0 END) AS week_3,
           SUM(CASE WHEN week_number = 4 THEN 1 ELSE 0 END) AS week_4,
           SUM(CASE WHEN week_number = 5 THEN 1 ELSE 0 END) AS week_5,
           SUM(CASE WHEN week_number = 6 THEN 1 ELSE 0 END) AS week_6,
           SUM(CASE WHEN week_number = 7 THEN 1 ELSE 0 END) AS week_7,
           SUM(CASE WHEN week_number = 8 THEN 1 ELSE 0 END) AS week_8,
           SUM(CASE WHEN week_number = 9 THEN 1 ELSE 0 END) AS week_9
        
           from  (
        
           select a.user_id,a.login_week,b.first_week as first_week,a.login_week-first_week as week_number  from   (SELECT
                    user_id,
                    week(login_date) AS login_week
                    FROM login
                    GROUP BY user_id,week(login_date)) a,(SELECT
                    user_id,
                    min(week(login_date)) AS first_week
                    FROM login
                    GROUP BY user_id) b
            where a.user_id=b.user_id
        
            ) as with_week_number
        
             group by first_week
         order by first_week;
    +------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
    | first_week | week_0 | week_1 | week_2 | week_3 | week_4 | week_5 | week_6 | week_7 | week_8 | week_9 |
    +------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
    |          0 |      4 |      1 |      3 |      2 |      2 |      0 |      0 |      0 |      0 |      0 |
    |          1 |      5 |      0 |      3 |      1 |      0 |      0 |      0 |      0 |      0 |      0 |
    |          2 |      1 |      0 |      1 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |
    |          3 |      2 |      1 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |
    +------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
    
    

    これで、SQLで保持率を計算する方法がわかりました。上記のクエリを使用して、MySQL、PostgreSQLの保持率を計算することもできます。

    最後に、データ視覚化ツールを使用して、上記の保持コホート分析を表にプロットできます。これは、Ubiqを使用して作成されたコホート保持テーブルです。

    ちなみに、MySQLデータベースからピボットテーブル、チャート、ダッシュボードを作成したい場合は、Ubiqを試すことができます。 14日間の無料トライアルを提供しています。

    1. java.lang.NoSuchFieldError:Spring 3、maven、JPA、c3p0で休止状態のNONE

    2. SQLServerの一時テーブルの概要

    3. SQLServerの複雑さを軽減するためのヒント

    4. OracleLISTAGG関数を使用して重複を排除します