보물 데이터의 JSSDK에서 수집한 로그에서 사용자 세그먼트를 만드는 방법

1, 데이터 준비


  • TreasureData의 JavaScript SDK를 이용하여 데이터를 수집.
  • 참고 문서
  • 수집된 데이터

  • 2, 세그먼트 생성



    만들 세그먼트를 정의해 봅니다.


    세그먼트 이름
    의미


    Weekly_Over5_Access
    1주일 이내에 5회 방문한 사용자

    Hour_Over5_Access
    시간별로 5회 이상 액세스한 사용자

    Weekday_Over5_Access
    요일별로 5회 액세스한 사용자

    Conversion_User
    일정 기간 동안 전환 페이지를 밟은 사람

    Smartphone_User
    iOS 또는 Android 사용자

    Iphone_User
    iPhone을 사용하는 사용자

    Windows_User
    Windows를 사용하는 사용자


    위의 세그먼트는 다른 세그먼트와 겹칠 수도 있습니다.

    다음은 SQL에서 위에서 정의한 세그먼트를 SQL로 표현합니다.
    그럼 하나 하나 봅니다.

    액세스 빈도계(Frequency)


  • 단말기별 1주일 내에 5회 이상 액세스한 사용자: Weekly_Over5_Access
  • 
    -- Presto
    SELECT
      a.td_client_id as td_client_id
     ,a.td_os as td_os
     ,'Weekly_Over5_Accesses' as segment_name
    FROM
    (
     SELECT
      td_client_id
     ,td_os
     ,count(1) as cnt
     FROM 
      access
     WHERE
         TD_TIME_RANGE(time,'2015-05-24 00:00:00','2015-05-31 00:00:00','JST')
     GROUP BY td_client_id,td_os
     HAVING count(1) >= 5
    ) as a
    
  • 20시~24시에 5회 이상 액세스하고 있는 사람:Hour_Over5_Access
  • -- Presto
    SELECT
      a.hour as hour
     ,a.td_client_id as td_client_id
     ,a.td_os as td_os
     ,'Hour_Over5_Access' as segment_name
    FROM
    (
     SELECT
      td_time_format(time,'HH') as hour
     ,td_client_id
     ,td_os
     ,count(1) as cnt
     FROM 
      access
     WHERE
         TD_TIME_RANGE(time,'2015-04-01 00:00:00','2015-06-01 00:00:00','JST')
     GROUP BY 
      td_time_format(time,'HH')
     ,td_client_id
     ,td_os
     HAVING count(1) >= 5 
    ) as a
    WHERE
     a.hour BETWEEN '20' AND '23'
    
  • 요일별 액세스로 5회 이상 액세스하고 있는 사람:Weekday_Over5-Access
  • -- Hive
    SELECT
      a.weekday as weekday
     ,a.td_client_id as td_client_id
     ,a.td_os as td_os
     ,'Weekday_Over5_Access' as segment_name
    FROM
    (
     SELECT
      weekofyear(td_time_format(time,'yyyy-MM-dd')) as weekday
     ,td_client_id
     ,td_os
     ,count(1) as cnt
     FROM 
      access
     WHERE
         TD_TIME_RANGE(time,'2015-04-01 00:00:00','2015-06-01 00:00:00','JST')
     GROUP BY 
     weekofyear(td_time_format(time,'yyyy-MM-dd'))
    ,td_client_id,td_os
     HAVING count(1) >= 5 
    ) as a
    

    이번 세그먼트는 하나의 조건이지만,
    SQL로 표현이 가능하면 곱셈도
    가능하다.

    전환 시스템



    * 일정 기간 전환한 사용자: Conversion_User
    전환 페이지: '/201506FreeUserSeminar_marketo-summit-2015-thankyou.html'
    SELECT 
      td_client_id,
      td_os,
      COUNT(1) AS cnt
    FROM
      access
    WHERE
      TD_TIME_RANGE(time,'2015-04-01 00:00:00','2015-06-01 00:00:00','JST')
      AND td_path = '/201506FreeUserSeminar_marketo-summit-2015-thankyou.html'
    GROUP BY
      td_client_id,
      td_os
    ORDER BY
      cnt DESC
    

    경력별


  • smartphone 사용자: Smartphone_User
  •  WHERE td_os in ('iOS','Android')
    
  • iphone 사용자: Iphone_User
  • td_os in ('iOS')
    
  • windows 사용자: Windows_User
  •  td_os like '%Windows%'
    

    동일한 사용자가 여러 단말기를 가지고 있는 경우의 집계 방법


  • ID 집계 : PC와 smartphone 기타 태블릿 등을 이용하는 사용자를 집계
  • SELECT
      td_ip
     ,count(distinct(td_client_id)) as cnt
    FROM
      access
    WHERE
      TD_TIME_RANGE(time,'2015-04-01 00:00:00','2015-06-01 00:00:00','JST')
    GROUP BY 
      td_ip
    HAVING
      count(distinct(td_client_id)) > 1
    

    * 같은 IP로 다른 ID의 경우는 집약해도 좋은 것인가?  

    여기의 논의에 관해서는, 동일한 wifi의 IP를 이용하고 있기 때문에
    같은 사람의 단말로 판단하여 집약하고 있는 예이다.

    앞으로는 세그먼트 작성을 SQL에서의 <응용편>과 <확장편>을 정리합니다.

    좋은 웹페이지 즐겨찾기