広告/統計/アニメ/映画 等に関するブログ

広告/統計/アニメ/映画 等に関するブログ

RでGoogleAdWordsのCSVを読み込む時_文字コード_区切り文字_を指定してファイル読込

近年は誰でも安価にデータ分析ができるツールを手にする時代となりましたが、実務に使ってみようと思っても教科書通りにいかない、、ということはよくある現象かと思います。

リテラシーが高い人にとっては呼吸をするように無意識的に対応できるところが、私のような初心者にとっては躓きとなります。

今回は、AdWordsのレポートをCSVファイルで取得した時に文字化けで困ったので、その対応方法についてまとめてみました。

先ずは普通に読み込んでみた

コード

hogehoge <- read.csv("hogehoge.csv")
head(hogehoge)

結果

Error in make.names(col.names, unique = TRUE) : 
invalid multibyte string at '<ff><fe><83>^JT<ec>0ン0<fc>0ネ0'
In addition: Warning messages:
 1: In read.table(file = file, header = header, sep = sep, quote = quote,  :
  line 1 appears to contain embedded nulls

エラーです

文字コードを確認する

Rではデフォルトの文字コード以外の文字コードのファイルを読み込む際には文字コードを指定して読み込む必要があります。

文字コードの確認には、nkfが便利です。 使い方やインストールはここでは詳解しませんので各自ご準備下さい。

takuya-1st.hatenablog.jp

コマンドプロンプトでファイルのある箇所まで行き、nkfで確認

C:~~ nkf -g hogehoge.csv

結果

UTF-16

ということで文字コードが「UTF-16」だと判明しました。

文字コードを指定して読込

read.tableでもread.csvでも文字コードを指定して読込ができます。「fileEncoding = "UTF-16"」を追加します。

コード

hogehoge <- read.csv("hogehoge.csv",fileEncoding = "UTF-16")
head(hogehoge)

結果

広告レポート..2016.06.15.2016.07.14.
1                         日\t広告の状態\t広告\t広告文 1\t広告文 2\t表示URL\tリンク先URL\t最終ページ URL\tモバイルの最終ページ URL\tトラッキング テンプレート\tカスタム パラメータ\tHeadline 1\tHeadline 2\t説明\tPath 1\tPath 2\tキャンペーン\t広告グループ\tステータス\tラベル\tキャンペーン タイプ\tキャンペーンのサブタイプ\tクリック数\t表示回数\tクリック率\t平均クリック単価\t費用\t平均掲載順位

文字化は解消されましたが、なんか変なデータになってしまいました。

先ずは、どうやら一行目にデータ以外の余分な行が入っているようです。人は何故データ以外の情報をCSVファイルに書いてしまうのでしょうか!!

冒頭のn行をスキップして読込

冒頭の何行かに余分な情報を入れていることはよくある話なので、スキップして読み込むという便利なオプション「skip=(行数)」があります。

コード

hogehoge <- read.csv("hogehoge.csv",fileEncoding = "UTF-16",skip=1)
head(hogehoge)

結果*1

日.広告の状態.広告.広告文.1.広告文.2.表示URL.リンク先URL.最終ページ.URL.モバイルの最終ページ.URL.トラッキング.テンプレート.カスタム.パラメータ.Headline.1.Headline.2.説明.Path.1.Path.2.キャンペーン.広告グループ.ステータス.ラベル.キャンペーン.タイプ.キャンペーンのサブタイプ.クリック数.表示回数.クリック率.平均クリック単価.費用.平均掲載順位 ...
1      2016-07-13\tアクティブ\t広告名: 320x100_hogehoge.png; 320 x 100\t\t\t\t\t\t\t\t\t\t\t\t承認済み\t --\tディスプレイ ネットワークのみ\tすべての機能

まだなんだかよくわからない長い行として認識されています。

区切り文字を指定して読込

よく見ると「\t」という文字があります。正規表現でよく見る「タブ」のことだと推測されます。 CSVってカンマ区切りって意味じゃなかったっけ?と思いながら 区切り文字をタブに指定して 読込ます。

コード

hogehoge <- read.csv("hogehoge.csv",fileEncoding = "UTF-16",skip=1,sep="\t")
head(hogehoge)

結果の前の方*2

日 広告の状態                             広告 広告文.1 広告文.2          表示URL  
1 2016-07-13 アクティブ 広告名: 320x100_hogehoge.png; 320 x 100                   URL           
2 2016-07-06 アクティブ   広告名: 468x60_hogehogec.png; 468 x 60                   URL           

後ろのほう*3

キャンペーン.タイプ キャンペーンのサブタイプ クリック数 表示回数 クリック率
1 ディスプレイ ネットワークのみ             すべての機能          10     10000      __%
2 ディスプレイ ネットワークのみ             すべての機能        300   100000     __% 

どうやら1行目がヘッダー情報で、2行目からがデータのようです。

ヘッダーを指定する

既にread.csvが勝手にヘッダーを認識してくれているようですが、通常はヘッダーがあるよと指定して読込ます。

コード

hogehoge <- read.csv("hogehoge.csv",fileEncoding = "UTF-16",skip=1,sep="\t",header=T)

空白を空白として認識させておく

データを一部消したので公開した部分にはありませんが、何も書いていない列があったりします。そういう所は、欠損していると認識させておくほうが後で便利な場合があります。

コード

hogehoge <- read.csv("hogehoge.csv",fileEncoding = "UTF-16",skip=1,sep="\t",header=T,na.strings =c("","NULL"))
heead(hogehoge)

結果の前の方*4

日 広告の状態                             広告 広告文.1 広告文.2          表示URL リンク先URL
1 2016-07-13 アクティブ 広告名: 320x100_hogehoge.png; 320 x 100     <NA>     <NA> URL       <NA>
2 2016-07-06 アクティブ   広告名: 468x60_hogehoge.png; 468 x 60     <NA>     <NA> URL        <NA>

もっとちゃんとした情報は

その他にも、文字列が「factro」として認識されて「character」と認識されずに困ることがあります。

qiita.com

自分も苦労した経験があります。もっと早く知っておけばよかったと思います。

今回は必要としなかったその他の読み込み時のトラップはまだまだあります。読み込み時のオプションの指定方法についてはこちらのサイトがよくまとまっていました。

qiita.com

*1:(一部のデータを消しました)

*2:(一部のデータを消しました)

*3:(一部のデータを消しました。数字も仮です)

*4:(一部のデータを消しました)