2016년 7월 27일 수요일

구글 애널리틱스 스팸 막기

자체 로봇 제거에도 불구하고, 다수의 스팸 패킷이 들어온다.
이를 막기 위한 좋은 방법을 소개한다.

스팸 막는 방법 두 가지 (필터 활용)

1. 포함하는 방법
다수의 스팸 사이트들이 호스트 이름과 화면 해상도가 (not set)으로 표기된다.
필터 시점에 호스트 이름의 경우 무효값으로 인지하고, 화면 해상도는 (not set)으로 인지한다.
So, 명확한 호스트 이름을 포함하는 패킷과 화면 해상도가 (not set)인 패킷을 제외하는 조건으로 필터한다.
**
무효값은 필터를 무시한다.

2. 제외하는 방법
스팸으로 판단되는 캠페인 소스에 대해서 정규식 패턴을 찾아서 제외한다.
한줄에 들어가는 정규식 패턴의 글자수가 256자로 제한이 있다.

결론

두 가지 방법을 혼용 할때, 각각의 이점을 최대한 살릴 수 있다.
1번 방식으로 다수의 스팸을 걸러내고, 나머지는 2번 방식으로 조금 명확한 기준의 정규식을 사용한다.

2016년 7월 22일 금요일

Firebase 앱분석 설치 가이드

구글에서 2014년 인수한 백엔드 서비스인 Firebase의 앱분석 설치 과정을 다룬다.

크게 보면 아래 두 가지 내용이다.
가. iOS 기반에서 firebase analytics 를 사용하는 방법
나. 구글 태그 매니저 연동 방법

먼저 iOS 기반에서 firebase analytics를 사용하는 방법이다.


맥에서 CocoaPods를 설치한다.
아마도 에러가 발생한다.
ERROR:  Error installing cocoapods:
activesupport requires Ruby version >= 2.2.2.

구글 커뮤니티는 다음 차선책을 제시한다.
sudo gem install activesupport -v 4.2.6
sudo gem install cocoapods

**
gem: 세련된 루비 패키지 관리자
CocoaPods: Cocoa 라이브러리 패키지 관리자

xcode 도구에서 개발 프로젝트를 생성한다.
프로젝트 생성 폴더에서 Firebase 라이브러리를 가져온다.
pod init :-> Podfile이 생성된다.
vi Podfile :-> pod ‘Firebase’를 추가한다.
pod install

Firebase에서 서비스 프로젝트를 생성한다.
GoogleService-Info.plist 파일을 내려받아 개발 프로젝트에 추가한다.
GoogleService-Info.plist 내용에 IS_ANALYTICS_ENABLE을 True로 변경한다.

프로젝트에 코딩 작업을 한다.
AppDelegate.swift에 가이드 코드를 추가한다.
import Firebase

func application(application: UIApplication, didFinishLaunchingWithOptions  …) -> Bool {
        // Override point for customization after application launch.
        FIRApp.configure()
        return true
    }

ViewController.swift에 이벤트 로그 코드를 삽입한다. 
import FirebaseAnalytics

FIRAnalytics.logEventWithName(“<eventName>”, parameters: [
“<keyName>”: “<keyValue>”,
… ])

Analytics 디버깅 옵션을 추가한다.
Product > Scheme > Edit Scheme… > Arguments (tab) > Arguments Passed On Launch
에 -FIRAnalyticsDebugEnabled 값을 추가한다.

<<실제 디버그 내용
2016-07-22 17:26:47.742 myFirebaseA[10445:] <FIRAnalytics/DEBUG> Logging event: origin, name, params: app+gtm, test_event, {
   "_o" = "app+gtm";
   eventAction = "test event action";
   eventCategory = "test event category";
}
2016-07-22 17:26:47.796 myFirebaseA[10445:] <FIRAnalytics/DEBUG> Event logged. Event name, event params: test_event, {
   "_o" = "app+gtm";
   eventAction = "test event action";
   eventCategory = "test event category";
}

디버그 로그로 태그 전송 여부를 추측 할 수 있다.
확실히 하기 위해서, 실시간 확인이 가능한 구글 태그 매니저를 활용한다.

다음은 구글 태그 매니저 연동 방법이다.


태그 매니저에서 iOS용 firebase 컨테이너를 생성한다.
게시 버전의 json 파일을 내려 받고, container/<code>.json 형태로 개발 프로젝트에 참조를 건다.

개발 프로젝트에 태그 매니저 라이브러리를 추가한다.
pod 'GoogleTagManager', '~> 5.0' 를 Podfile에 추가하고,
pod install 한다.

<<실제 디버그 내용
2016-07-22 17:26:47.735 myFirebaseA[10445:649284] GoogleTagManager info: Processing logged event: test_event with parameters: {
    eventAction = "test event action";
    eventCategory = "test event category";
}
2016-07-22 17:26:47.740 myFirebaseA[10445:649284] GoogleTagManager info: Sending universal analytics hit: {
    "&ea" = "test event action";
    "&ec" = "test event category";
    "&el" = "test_event";
    "&ni" = 0;
    "&t" = event;
    "&tid" = "UA-012345678-1";
}

2016년 7월 21일 목요일

블로거에 구글 태그 매니저 스니펫 추가

구글 블로거(Blogger)에 GTM 스니펫을 삽입할때 이슈와 해결 방안을 기록한다.

스니펫 코드 입력 후 저장하면 다음 알람을 접한다.

XML을 구문분석하는 중 오류 발생(1272행, 43열): The reference to entity "l" must end with the ';' delimiter.
**
XML에서 <, >, &는 tag와 entity를 표시를 위한 예약문자임으로 아래와 같이 변경한다.
< :-> &lt;
> :-> &gt;
& :-> &amp;

스니펫 코드를 구문 오류를 해결하기 위해서 아래와 같이 변경한다.

'dataLayer'?'&l :-> 'dataLayer'?'&amp;l

2016년 7월 20일 수요일

구글 애드워즈 인증 요약 노트

구글 애드워즈 인증을 준비하면서 요약한 내용들이다.
1년 후를 기약하며 흔적을 남긴다.

타게팅 방법

1. 문맥 타겟팅
    1. 키워드 및 주제를 선택한다.
    2. 검색 유형
        1. 키워드 문맥 일치
            1. 광고 게재위치가 키워드와 문맥적으로 관련이 있다.
        2. 확장 키워드 일치
            1. 광고 게재위치가 키워드 및 광고를 조회한 사용자가 최근에 검색한 페이지등과 관련이 있다.
2. 잠재고객
    1. 관심 분야
        1. 관심사나 공통 화제를 기준으로 타켓팅한다.
    2. 리마켓팅
        1. 과거 사이트 방문 여부를 기준으로 타겟팅한다.
    3. 인구통계
        1. 인구 통계 사용
3. 게재위치
    1. 게재위치
        1. 선택 게재위치를 사용하여 사이트, 모바일, 앱, 동영상을 타게팅한다.
    2. 사이트 카테고리 옵션
        1. 디스플레이 네트워크 카테고리를 기준으로 타게팅한다.
4. 입찰 옵션 두 가지
    1. 타겟팅 및 입찰
        1. 게재위치 타겟팅을 한다고 할때 키워드가 일치 함에도 게재위치가 다르면 노출이 되지 않는다.
    2. 입찰
        1. 게재위치 타겟팅을 한다고 할때 키워드와 일치하면 노출 되고, 게재위치도 맞으면 입찰 가격을 올릴 수 있다.


비용 지불 방식

1. CPC
    1. 클릭수를 늘리는 것이 목표
    2. 자동 입찰 전략
        1. 일일예산을 설정하면 자동으로 입찰가 관리
    3. 수동 입차 전략
        1. 광고그룹, 개별 키워드, 게재위치별로 입찰가 지정 가능
2. ECPC
    1. 기기, 브라우저, 위치, 시간대 등 실시간 정보와 기존 전환값을 비교해 입찰가를 조정한다.
3. vCPM
    1. 조회 가능 노출 1000회당 비용으로 인지도 향상이 목표
    2. 키워드 뿐 아니라 게제위치를 타겟팅 가능함으로 관심이 있는 고객에게 노출 할 수 있다.
4. CPA
    1. 타겟 전환당 비용은 전환을 늘리는 것이 목표
    2. 전환 액션에 따른 전환 코드를 심어야 한다.
    3. 캠페인은 검색 네트워크, 디스플레이 네트워크 또는 둘다 타겟팅하고 있어야 한다.
5. ROAS
    1. 설정된 비용 안에서 ROI (투자 수익)을 최대로 이끌어 낸다.
    2. ROAS를 사용하는 모든 광고 그룹 또는 캠페인에 보고된 기존 전환값을 활용한다.


전환추적 방법

1. 코드 없는 전환추적
    1. Google이 Play 스토어를 소유하고 있기 때문에 앱 다운로드 정보를 제공할 수 있다.
2. SDK 전환 추적
    1. SDK를 통해서 앱에 이벤트를 삽입하는 방법이다.
3. 서버 간 전환추적
    1. 다음 SDK의 단점을 개선 할 수 있다.
        1. SDK를 이용한 방법이 어렵고, 앱이 무거워 질 수 있다.
        2. 전환코드를 잘 못 구현된다면, 앱에서 버그가 발생 할 수 있다.
        3. 변경 코드 반영 시, Play 스토어 검토 과정에서 지연이 발생 할 수 있다.
4. 앱 설치 확인 솔루션
    1. 외부 솔루션을 이용한다.


광고 갤러리

1. 동적 광고
    1. 사용자의 위치 및 표시되는 내용에 일치하는 리치미디어 광고이다.
    2. 라이트박스 광고
    3. 확장형 리치 미디어 디스플레이 광고이다.
    4. 다양한 양방향 형식을 통해 고객의 참여를 유도할 수 있다.
    5. DoubleClick Studio를 사용하면 쉽게 리치 미디어 광고와 동적 소재를 제작할 수 있습니다.
2. 동영상 광고
3. 일반 용도 광고
4. Gmail 광고


디스플레이 캠페인 최적화 (타겟팅 최적화)

1. 공격적인 (aggressive)
    1. 1달에 15건 이상의 전환이 있을때 사용할 수 있다.
    2. 기존의 전환 데이터를 기반으로 최적화하며, 실제 적용된 예산을 조금 초과 할 수 있다.
2. 보수적인 (conservative)
    1. 정해진 키워드와 일치하는 것만 찾는다.
    2. 적용 예산을 초과하지 않는다.


애드워즈 도구

1. 아이디어를 얻을 수 있는 방법을 제공한다.
    1. 키워드 플래너
    2. 디스플레이 플래너
    3. 광고 미리보기 및 진단

구글 태그 매니저의 맞춤 자바스크립트 활용 예제

구글 태그 매니저에서 {{출생년도}}라 정의한 데이터 레이어 변수를 전달 받는다고 가정하자.
전달 받은 값을 가공할 필요가 있을때, 맞춤 자바스크립트를 통해서 간편하게 적용 할 수 있다.

다음은 {{출생년도}} 변수를 {{연령대}}변수로 가공하는 맞춤 자바스크립트 코드이다.
: {{출생년도}}를 '19880917'를 받았을때, {{연령대}}가 '20대'가 된다.

<<EOF
function (){
    // 태어난 년도를 기준으로, 연령대를 계산한다.
    var paramYear={{출생년도}};
    if ( paramYear === '' || isNaN(paramYear) ) {
        // 빈값이거나 숫자가 아니면, 오류로 보고 제외한다.
        return;
    } else {
        // 한국 나이를 기준으로, 연령대를 매핑한다.
        var currentYear=parseInt(new Date().getFullYear()); 
        var bornYear=parseInt(paramYear.substr(0,4));
        var age = currentYear - bornYear + 1;
        if ( age <= 0 || age > 200 ){
            // 미래에서 온 사람과, 200세 이상의 사람은 오류로 본다.
            // 기네스북: 역사상 가장 오래 산 사람은 1997년에 122세 나이로 세상을 뜬 프랑스 여성
            return;
        }
        var userAges;
        switch ( parseInt( age / 10 ) ){
            // IF 반복을 제외하는 이점이 크다고 본다.
            case 0:
                // 희박한 경우라 정렬을 고려하지 않고, 가독성을 높인다.
                userAges = "10대미만";
                break;
            case 1:
                userAges = "10대";
                break;
            case 2:
                userAges = "20대";
                break;
            case 3:
                userAges = "30대";
                break;
            case 4:
                userAges = "40대";
                break;
            case 5:
                userAges = "50대";
                break;
            case 6:
                userAges = "60대";
                break;
            case 7:
                userAges = "70대";
                break;
            default:
                userAges = "80대이상";
        }
        return userAges;
    }
}
EOF

2016년 7월 14일 목요일

구글 애널리틱스 유용한 기능 요약

구글 애널리틱스 사용 시, 자주 사용하는 유용한 기능들을 요약한다.

컨텐츠 그룹
컨텐츠 그룹의 규칙 그룹들을 페이지 URL에 기반한 패턴을 정의한다.
(2016년 7월 1일 기준, 무료 5개 제공)
**
컨텐츠 그룹의 규칙 그룹 단위로 행동 흐름(방문형태)를 한눈에 볼 수 있다.

측정 기준
hit, 세션, 사용자, 제품 범위의 측정 기준을 제공한다.
(2016년 7월 1일 기준, 무료 20개 제공)
**
성별, 연령, 로그인 여부 등의 확장 기준들을 손쉽게 추가 할 수 있다.

채널 그룹
기본 채널 이외에 맞춤 채널을 만들 수 있다.
사이트로 유입 될때, 식별 가능한 정보의 패턴으로 정의 한다.
**
특정 유입 경로(채널)를 그룹화 식별 할 수 있다.

세그먼트
리포트는 세그먼트 단위로 분리해서 볼 수 있다.
조건 필터의 경우 ‘세션’과 ‘사용자’ 단위임에 주의한다.
**
리포트 결과를 다양하게 분류 하여 볼 수 있고, 갤러리를 통해서 공유 할 수 있다.

고급 필터
세그먼트가 전체 데이터에 대한 분류 그룹을 제공하는데 비해서,
이 것은 보고서의 결과 데이터를 여과한다.

맞춤 자바스크립트 변수 (태그 매니저)
HTML 구성 요소를 파싱하여 변수로 사용 할 수 있다.
상품 상세 페이지들에 경로가 아닌 상품 이름을 측정 기준으로 사용할 때 유용하다.
**
예제)
본문 중에,
<h2 id=“test_id”>상품 이름</h2>
맞춤 자바스크립트,
function() {
  var elem = document.getElementById(“test_id”);
  return elem.innerText;
}

사용자 ID (User ID)
기본적으로 제공되는 Client ID는 기기나 브라우저 별 익명으로 식별한다.
웹 : 최초 접속때 생성되고 1차 쿠키에 2년간 유지 된다.
모바일 : 설치된 어플리케이션의 최초 인스턴스 구동 시에 무작위로 생성된다.
이는, 접속 인스턴스를 기반으로 행동 패턴을 추적하는 것을 말하며, 재생성 시에 사용자 정보 또한 갱신된다.
User ID는 회원 코드를 활용하여 (접속 인스턴스에 종속되지) 않는 통합 관점의 사용자 행동 패턴을 추적하는 방법을 제공한다.


목표 시각화
목표 도달을 한 눈에 볼 수 있는 두 가지의 흐름 시각화를 제공한다.

유입경로 시각화
 - 지정한 단일 유입 경로를 표현한다.
 - 세션에 유입 위치가 있으면 순서에 관계 없이 지정한 유입 경로로 이루어진 것으로 본다.
 - 목표 지정 이후 부터 데이터가 쌓인다.

목표 흐름
 - 루프를 포함한 실제 유입 경로를 표현한다.
 - 기존 데이터를 소급하여 바로 보여준다.

공통
 - 무료 버전에서 수집 데이터 집계는 하루 정도 소요된다.
 - 세션 단위 집계로 1 세션에서는 1회 목표 도달된 것으로 표현된다.


향상된 링크 기여
* 특정 페이지의 2개의 다른 링크가 같은 하나의 페이지로 갈때,
* 특정 페이지에서 같은 하나의 링크가 상황에 따라 다른 페이지로 갈때,
와 같이, 더 향상된 인페이지 분석이 필요 할때 사용한다.

애널리틱스의 속성 설정에서 변경하고 사이트에 태그를 추가한다.
태그 매니저에서는 태그의 고급 속성에서 “거짓”을 “참”으로 변경한다.


구글 웹마스터 도구 (Search Console)
구글 검색엔진에서 어떤 검색어에 의해서 웹사이트의 어떤 페이지들이 얼마나 노출 되고 클릭 되는지를 보고한다.
구글 웹마스터 도구와 계정 연결이 필요하다.
웹마스터 도구와 웹사이트를 연결하기 위해서는 사이트 소스 접근 권한이 필요하다.