2016-05-14 14 views
1

は、私は次のクエリがあるとします。GoogleアナリティクスAPI:イベント時間とセッション時間

d1 = service.data().ga().get(
     ids='ga:xxxxxxx', 
     start_date='2016-04-25', 
     end_date='2016-05-14', 
     metrics='ga:users', 
     dimensions='ga:dimension1,ga:hour,ga:date', 
     sort='-ga:date', 
     start_index='1', 
     max_results='1500').execute() 

d2 = service.data().ga().get(
     ids='ga:xxxxxxx', 
     start_date='2016-04-25', 
     end_date='2016-05-14', 
     metrics='ga:uniqueEvents', 
     dimensions='ga:dimension1,ga:eventCategory,ga:eventAction,ga:eventLabel,ga:date,ga:hour', 
     sort='-ga:date', 
     start_index='1', 
     max_results='1500').execute() 

ga:dimension1は、各ユーザに固有のユーザスコープのクライアントIDが移入されています。

目標はga:datega:hour、およびga:dimension1d1d2に参加することです。

ユーザが時間10でセッションを開始し、時間12でイベントをトリガするとします。d1は時間= 10を返しますが、d2は時間= 10または12ですか?

答えて

0

イベントにイベントが発生した時刻が表示されます。つまり、d2はあなたの例では時間= 12です。

これを回避するには、クエリーにga:sessionDurationBucketというディメンションを追加します。これにより、セッションの継続時間が秒単位で表示されます(here参照)。私はあなたがAPIにアクセスするためにどの言語を使用しているのか分かりませんが、とにかく私はコードをポストするのではなく、問題を解決するための手順だけです。 (私はRを使用しています。もちろん、役に立つと思うのであれば私のコードを投稿できます)。

  • Iループで、各ga:dimension1によってga:datega:hourga:minute

  • Iグループレコードからレコードやグループ毎にga:sessionDurationBucket

  • のタイムスタンプを構築する:(A )古いタイムスタンプを取得し、最後のタイムスタンプを取得するためにセッション期間(ga:sessionDurationBucket/60 + 1)/(60 * 24)を追加します。(b)最初のタイムスタンプから最後までのすべてのレコードをセッションに割り当てますセッションのタイムスタンプ、および(c) (a)

  • ループの後に、 "すべての"レジスタがセッションに割り当てられ、私は処理を行います。(私は、残りのレコードが残っている、新しい最初のタイムスタンプはこれらの残りのレコードの古いタイムスタンプです。私は割り当てることができないプロセスでは、いくつかのレジスタが、通常は無視できる程度の数)私はそれが十分に明確であり、それが役に立てば幸い

があるかもしれないので、引用符の間のすべてを置きます。あなたはそれが便利だと思うならば、...私はRコードを投稿することができ、または多分あなたは、あなたが使用しているプログラミング言語を教えている場合、私はそれを試してみて、書き換えることができ、コメント後に追加


:サンプルコードRに

私はこれは私が実行したクエリ(私が働いているウェブサイトは、それが設定されていませんので、ノートこのケースでは、私はdimension1を使用していない)で、RGoogleAnalyticsライブラリを使用しています:

query.coll.d <- Init(start.date=start_date.d, 
        end.date=end_date.d, 
        dimensions=c("ga:date", 
            "ga:hour", 
            "ga:minute", 
            "ga:sourceMedium", 
            "ga:pagePath", 
            "ga:previousPagePath", 
            "ga:sessionDurationBucket"), 
        metrics=c("ga:sessions", 
           "ga:pageviews", 
           "ga:newUsers"), 
        table.id="ga:XXX view id XXX", 
        sort="-ga:date,-ga:hour,-ga:minute", 
        max.results = 20000) 

ga.query.d <- QueryBuilder(query.coll.d) 
ga.data.coll.d <- GetReportData(ga.query.d, token, paginate_query=TRUE) 

フリー、私はタイムスタンプを(GA秒を提供しないことに注意してください)構築mは、

require(chron) 
ga.data.coll.d$datetime <- chron(ga.data.coll.d$date, paste(ga.data.coll.d$hour, 
                  ga.data.coll.d$minute, 
                  '00', 
                  sep=":"), 
           format=c("ymd","h:m:s")) 

これは私が私の関数の中、後でそれを使用することができるように、グローバル変数を使用して、独自のはuserIdを作成するための機能です。

userId <- 1 
getNewId <- function() { 
    current <- get("userId", envir = .GlobalEnv) 
    current <- current + 1 
    assign("userId", current, envir = .GlobalEnv) 
    return(current) 
} 

これは私がsessionDurationBucketは整数Iは、上記の説明しようとしたアルゴリズムに応じて、グループの結果を処理する関数であり、datetimessessionsはセッションのタイムスタンプのリストでありますグループ化する。

one_minute <- 1/(60*24) 
setUserId <- function(datetimes, sessions, sessionDurationBucket) { 
    if (length(datetimes) == 1) { 
    # just one row received 
    return(getNewId()) 
    } 
    if (sum(sessions) == 1) { 
    # just one session, all rows belong to the same user 
    return(getNewId()) 
    } 
    users <- rep(NA, length(datetimes)) 
    if (sessionDurationBucket == 0) { 
    # sessions of 1 page and length 0 => assign a user per session 
    for (i in 1:length(datetimes)) { 
     users[i] <- getNewId() 
    } 
    return(users) 
    } 
    # general case 
    minutes <- ceiling(as.numeric(sessionDurationBucket)/60) + 1 
    i <- 1 
    while(TRUE) { 
    index_lag <- (datetimes >= datetimes[i] - minutes*one_minute) & is.na(users) 
    sessions_lag <- sum(sessions[index_lag]) 
    if (sessions_lag == 1) { 
     users[index_lag] <- getNewId() 
    } else { 
     # two or more sessions mixed together 
     users[index_lag] <- 0 
    } 
    # look for remaining users (without id yet) 
    rem_users <- which(is.na(users)) 
    if (length(rem_users) == 0) { 
     break 
    } 
    i <- min(rem_users) 
    } 
    return(users) 
} 

そして、私は(あなたのケースでは、あなたがして、グループ内のdimension1代わりのsourceMediumを使用できることに注意)でグループを実行して新しい列を作成するためのdata.tableを使用しています。また、レジスタは日付によって逆順に並べ替えられているものとみなされます。これは、GAクエリで行われます。

require(data.table) 
ga.data.coll.dt <- data.table(ga.data.coll.d) 
ga.data.coll.dt[, userId:=setUserId(datetime, sessions, sessionDurationBucket), by=list(sessionDurationBucket, sourceMedium)] 

それらのために上記のコードは、セッションを解決できませんでしたので、最後に私は、0に等しいuserIdを持っているすべてのレジスタを削除します。私の場合、無視できる数です。

実際には私の謙虚なブログにいくつかの説明を含めて投稿を予定していますが、月末までにはできません。

+0

ありがとうございました、Irnzcig、 'ga:sessionDurationBucket'は行く方法のようです。私はPythonを使用していますが、私はRに最も慣れていますので、どのRコードでも大いに役立ちます。 –

+0

更新されました。希望はそれが便利です! – lrnzcig

関連する問題