GoogleAnalyticsの年間のデータをエクセルへ出力:その1「GoogleAnalyticsからデータの取得編」

RでGoogle Analytics
スポンサーリンク

GoogleAnalyticsの年間のデータをエクセルへ出力するコマンドを作成しました。

無題

出力されるエクセルは下記のイメージ画像となります。

なお、コマンドが大変長いため、記事をその1「GoogleAnalyticsからデータの取得編」とその2「エクセルデータの作成編」の2分割し紹介します。

本記事はその1「GoogleAnalyticsからデータを取得編」です。

なお、データを取得するサイトのidとトークンファイルは取得・保存している前提でコマンドを紹介します。

サイトのidとトークンファイルの取得と保存方法は「RでGoogle Analyticsの目次」から「RGoogleAnalyticsパッケージ基本的な利用方法」を確認してください。

また、解析環境が整っていない場合は「解析の準備」の項目を確認してください。初心者でも実行できるようにまとめています。

解析コマンドなどのまとめはこちらから:RでGoogle Analyticsの目次

その2「GoogleAnalyticsからデータを取得編」はこちらから。
GoogleAnalyticsの年間のデータをエクセルへ出力:その2「エクセルデータの作成編」


スポンサーリンク

GoogleAnalyticsのデータを取得するための事前準備

取得するデータ毎にコマンドを紹介します。

・まずはデータを取得する年の設定

紹介するコマンドで2014年のデータが取得できます。なお、各データを取得するコマンド末尾にエクセルでデータを出力するコマンドをコメントアウトして紹介しています。

###取得年を設定#####
year <- 2014 #取得したい年を設定
StartDate <- seq.Date(as.Date(paste(year, "-01-01", sep = "")),
                      as.Date(paste(year, "-12-31", sep = "")), by = "month")
EndDate <- as.Date(format(as.Date(format(StartDate,"%Y%m01"),"%Y%m%d") + 31, "%Y%m01"),
                   "%Y%m%d") - 1

・月毎の毎日の訪問者数のデータを取得するコマンド

未計測の期間は1日から0が2連続以上した場合と定義しています。コマンド内のコメントを確認してください。

#Dimensionsの設定
Dimensions <- "ga:date"

#アクセスデータの取得、日の設定。
MonthAnaData <- data.frame(1:31)

#12ヶ月分の処理
for(n in 1:12){
  
  #取得パラメータの設定
  query.list <- Init(start.date = as.character(StartDate[n]),
                     end.date = as.character(EndDate[n]),
                     dimensions = Dimensions,
                     metrics = "ga:users",
                     max.results = 1000,
                     table.id = TableID)
  
  #取得パラメーターを処理
  query <- QueryBuilder(query.list)
  
  #データの取得。
  AnalyticsData <- GetReportData(query, oauth_token)[, 2]
  
  #未計測、1日から0が続く回数を測定
  RleN <- rle(AnalyticsData)[[1]][1]
  
  #未計測、0が2連続以上でNAに置換
  ifelse(RleN &gt; 2,
         #未計測をNAに置換
         AnalyticsData[1:RleN] <- NA, "")
  
  #31日に長さを調整
  length(AnalyticsData) <- 31
  
  #Dataの結合
  MonthAnaData <- cbind(MonthAnaData, AnalyticsData)
}

#データ行名に日と月名を付与
colnames(MonthAnaData) <- c("日", month.name)

#行和
RSums <- apply(MonthAnaData[, 2:13], 1, function(x) sum(x, na.rm = TRUE))

#行平均
RMeans <- apply(MonthAnaData[, 2:13], 1, function(x) mean(x, na.rm = TRUE))

#行和、行平均の結合
MonthAnaData <- cbind(MonthAnaData, "合計" = RSums, "平均" = round(RMeans, 0))

#列和、未計測をNAに置換
CSums <- apply(MonthAnaData[, 2:14], 2, function(x) sum(x, na.rm = TRUE))
CSums[CSums == 0] <- NA
CSums <- c("合計", CSums)

#長さを調整
length(CSums) <- 15

#列平均
CMeans <- c("平均", round(apply(MonthAnaData[, 2:13], 2, function(x) mean(x, na.rm = TRUE)), 0),
            NA, round(mean(MonthAnaData[, 15], na.rm = TRUE), 0))

#列和、列平均の結合
MonthAnaData <- rbind(MonthAnaData, "合計" = CSums, "平均" = CMeans)

#文字行を因子、数字行を数字に変換
for(i in 1:ncol(MonthAnaData)){
  
  ifelse(is.character(MonthAnaData[, i]) == TRUE,
         MonthAnaData[, i] <- type.convert(MonthAnaData[, i]),
         NA)
  
}

#データの書き出し、保存フォルダを選択して書き出し。
# setwd(paste(as.character(tkchooseDirectory(title = "保存ディレクトリを選択"), sep = "", collapse ="")))
# writeWorksheetToFile(paste("月別の日アクセスデータ.xlsx", sep = ""), data = MonthAnaData, sheet = "アクセスデータ")

・月の曜日毎の訪問者数のデータを取得するコマンド

未計測の期間は月の合計が0と定義しています。コマンド内のコメントを確認してください。

#Dimensionsの設定
Dimensions <- "ga:dayOfWeekName, ga:date"

#曜日の並び順はここで設定
WeekDayAnaData <- data.frame(c("Sunday", "Monday", "Tuesday", "Wednesday",
                               "Thursday", "Friday", "Saturday"))

#曜日数の格納
CountDayOfWeekName <- NULL

#12ヶ月分の処理
for(n in 1:12){
  
  #取得パラメータの設定
  query.list <- Init(start.date = as.character(StartDate[n]),
                     end.date = as.character(EndDate[n]),
                     dimensions = Dimensions,
                     metrics = "ga:users",
                     max.results = 1000,
                     table.id = TableID)
  
  #取得パラメーターを処理
  query <- QueryBuilder(query.list)
  
  #データの取得。
  AnalyticsData <- GetReportData(query, oauth_token)
  
  #曜日の因子化
  AnalyticsData[, 1] <- factor(AnalyticsData[, 1],
                               levels = WeekDayAnaData[, 1])
  
  #未計測、合計が0でNAに置換
  ifelse(sum(AnalyticsData[, 3]) != 0,
         #曜日数の取得
         CountDayOfWeekName <- rbind(CountDayOfWeekName, tapply(AnalyticsData[, 1], AnalyticsData[, 1], length)),
         CountDayOfWeekName <- rbind(CountDayOfWeekName, rep(0, 7)))
  
  #曜日毎に集計。データフレーム化
  AnalyticsData <- as.data.frame(aggregate(AnalyticsData[, 3], list(AnalyticsData[, 1]), sum))
  
  #未計測、合計が0でNAに置換
  ifelse(sum(AnalyticsData[, 2]) == 0,
         #未計測をNAに置換
         AnalyticsData[, 2] <- NA, "")
  
  #曜日の並び替え
  AnalyticsData <- AnalyticsData[order(AnalyticsData[, 1]), ]
  
  #Dataの結合
  WeekDayAnaData <- cbind(WeekDayAnaData, AnalyticsData[, 2])
  
}

#データ行名に日と月名を付与
colnames(WeekDayAnaData) <- c("曜日", month.name)

#曜日数の合計取得
CountDayOfWeekName <- as.data.frame(colSums(CountDayOfWeekName))

#曜日行が因子になっているので文字列化
WeekDayAnaData[ ,1] <- as.character(WeekDayAnaData[ ,1])

#行和
RSums <- apply(WeekDayAnaData[, 2:13], 1, function(x) sum(x, na.rm = TRUE))

#行平均
RMeans <- as.numeric(unlist(RSums / CountDayOfWeekName))

#行和、行平均の結合
WeekDayAnaData <- cbind(WeekDayAnaData, "合計" = RSums, "曜日平均" = round(RMeans, 0))

#列和、未測定月はNAに置換
CSums <- apply(WeekDayAnaData[, 2:14], 2, function(x) sum(x, na.rm = TRUE))
CSums[CSums == 0] <- NA
CSums <- c("合計", CSums)

#長さを調整
length(CSums) <- 15

#列平均
CMeans <- c("平均", round(apply(WeekDayAnaData[, 2:13], 2, function(x) mean(x, na.rm = TRUE)), 0),
            NA, round(mean(WeekDayAnaData[, 15], na.rm = TRUE), 0))

#列和、列平均の結合
WeekDayAnaData <- rbind(WeekDayAnaData, "合計" = CSums, "平均" = CMeans)

#文字行を因子、数字行を数字に変換
for(i in 1:ncol(WeekDayAnaData)){
  
  ifelse(is.character(WeekDayAnaData[, i]) == TRUE,
         WeekDayAnaData[, i] <- type.convert(WeekDayAnaData[, i]),
         NA)
  
}

#データの書き出し、保存フォルダを選択して書き出し。
#setwd(paste(as.character(tkchooseDirectory(title = "保存ディレクトリを選択"), sep = "", collapse ="")))
#writeWorksheetToFile(paste("月別の曜日アクセスデータ.xlsx", sep = ""), data = WeekDayAnaData, sheet = "アクセスデータ")

・曜日毎の時間別訪問者数のデータを取得するコマンド

紹介するコマンドでは曜日の並び順を日曜日から土曜日となっています。並び順の変更はコマンド内のコメントを確認してください。

#曜日の並び順はここで設定
WeekDayName <- c("Sunday", "Monday", "Tuesday", "Wednesday",
                 "Thursday", "Friday", "Saturday")

#Dimensionsの設定
Dimensions <- "ga:dayOfWeekName, ga:hour"

#取得パラメータの設定
query.list <- Init(start.date = as.character(StartDate[1]),
                   end.date = as.character(EndDate[12]),
                   dimensions = Dimensions,
                   metrics = "ga:users",
                   max.results = 1000,
                   table.id = TableID)

#取得パラメーターを処理
query <- QueryBuilder(query.list)

#データの取得。
WeekDayHourAnaData <- GetReportData(query, oauth_token)

#曜日の因子化
WeekDayHourAnaData[, 1] <- factor(WeekDayHourAnaData[, 1],
                                  levels = WeekDayName)

#曜日の並び替え
WeekDayHourAnaData <- WeekDayHourAnaData[order(WeekDayHourAnaData[, 1]), ]

#データの整形
WeekDayHourAnaData <- reshape(WeekDayHourAnaData, timevar = "dayOfWeekName",
                              idvar = "hour", direction = "wide")

#行名の付与
colnames(WeekDayHourAnaData) <- c("時間", WeekDayName)

#行和
RSums <- apply(WeekDayHourAnaData[, 2:8], 1, function(x) sum(x, na.rm = TRUE))

#行平均
RMeans <- apply(WeekDayHourAnaData[, 2:8], 1, function(x) mean(x, na.rm = TRUE))

#行和、行平均の結合
WeekDayHourAnaData <- cbind(WeekDayHourAnaData, "合計" = RSums, "平均" = round(RMeans, 0))

#列和
CSums <- c("合計", apply(WeekDayHourAnaData[, 2:9], 2, function(x) sum(x, na.rm = TRUE)), NA)

#列平均
CMeans <- c("平均", round(apply(WeekDayHourAnaData[, 2:8], 2, function(x) mean(x, na.rm = TRUE)), 0),
            NA, round(mean(WeekDayHourAnaData[, 9], na.rm = TRUE), 0))

#列和、列平均の結合
WeekDayHourAnaData <- rbind(WeekDayHourAnaData, "合計" = CSums, "平均" = CMeans)

#文字行を因子、数字行を数字に変換
for(i in 1:ncol(WeekDayHourAnaData)){
  
  ifelse(is.character(WeekDayHourAnaData[, i]) == TRUE,
         WeekDayHourAnaData[, i] <- type.convert(WeekDayHourAnaData[, i]),
         NA)
  
}

#データの書き出し、保存フォルダを選択して書き出し。
#setwd(paste(as.character(tkchooseDirectory(title = "保存ディレクトリを選択"), sep = "", collapse ="")))
#writeWorksheetToFile(paste("曜日別時間アクセスデータ.xlsx", sep = ""), data = WeekDayHourAnaData, sheet = "アクセスデータ")

・ページ閲覧数のデータを取得するコマンド

年間のページ閲覧数を取得しページタイトルのリストを作成しています。コマンド内のコメントを確認してください。

#Dimensionsの設定
Dimensions <- "ga:pageTitle"

#期間内でアクセスのあったページタイトルを取得
query.list <- Init(start.date = as.character(StartDate[1]),
                   end.date = as.character(EndDate[12]),
                   dimensions = Dimensions,
                   metrics = "ga:users",
                   max.results = 1000,
                   table.id = TableID)

#取得パラメーターを処理
query <- QueryBuilder(query.list)

#保存データフレームの作成とページタイトルリストの取得
MTopTenAnaData <- as.data.frame(GetReportData(query, oauth_token)[, 1])
MTopTenAnaData <- as.data.frame(unique(gsub("(^ +)|( +$)", "", sapply(MTopTenAnaData[, 1], function (x) unlist(strsplit(as.vector(x), "\\|"))[1]))))

#12ヶ月分の処理
for(n in 1:12){
  
  #取得パラメータの設定
  query.list <- Init(start.date = as.character(StartDate[n]),
                     end.date = as.character(EndDate[n]),
                     dimensions = Dimensions,
                     metrics = "ga:users",
                     max.results = 1000,
                     table.id = TableID)
  
  #取得パラメーターを処理
  query <- QueryBuilder(query.list)
  
  #データの取得。エラー回避
  try(tryCatch(AnalyticsData <- GetReportData(query, oauth_token), error = AnalyticsData <- NULL),
      TRUE)
  
  #データ一時保存用のベクトルを作成
  mTopTen <- NULL
  
  #処理
  if(is.null(AnalyticsData) == TRUE){ 
    
    mTopTen <- rep(NA, length = nrow(MTopTenAnaData))
    
  }else{
    
    AnalyticsData[, 1] <- gsub("(^ +)|( +$)", "",
                               sapply(AnalyticsData[, 1],
                                      function (x) unlist(strsplit(as.vector(x), "\\|"))[1]))
    
    for(i in 1:nrow(MTopTenAnaData)){
      
      GetData <- subset(AnalyticsData[, 2], AnalyticsData[, 1] == MTopTenAnaData[i, 1])
      
      if(sum(GetData) != 0){
        
        mTopTen <- c(mTopTen, sum(GetData))
        
      }else{
        
        mTopTen <- c(mTopTen, NA)
        
      }
    }
  }
  
  MTopTenAnaData <- cbind(MTopTenAnaData, mTopTen)
  
}

#データの整形
colnames(MTopTenAnaData) <- c("ページタイトル", month.name)

#行和
RSums <- apply(MTopTenAnaData[, 2:13], 1, function(x) sum(x, na.rm = TRUE))

#行平均
RMeans <- apply(MTopTenAnaData[, 2:13], 1, function(x) mean(x, na.rm = TRUE))

#閲覧割合
Rratio <- round(RSums / sum(RSums, na.rm = TRUE) * 100, 3)

#行和、行平均の結合
MTopTenAnaData <- cbind(MTopTenAnaData, "合計" = RSums, "平均" = round(RMeans, 0), "割合" = Rratio)

#閲覧割合で降順
MTopTenAnaData <- MTopTenAnaData[order(MTopTenAnaData[, 16], decreasing = TRUE),]

#データの書き出し、保存フォルダを選択して書き出し。
# setwd(paste(as.character(tkchooseDirectory(title = "保存ディレクトリを選択"), sep = "", collapse ="")))
# writeWorksheetToFile(paste("ページアクセスデータ.xlsx", sep = ""), data = MTopTenAnaData, sheet = "アクセスデータ")

解析コマンドなどのまとめはこちらから:RでGoogle Analyticsの目次

その2「エクセルデータ作成編」はこちらから
GoogleAnalyticsの年間のデータをエクセルへ出力:その2「エクセルデータの作成編」

少しでも、あなたのウェブや実験の解析が楽になりますように!!

タイトルとURLをコピーしました