AdWords広告を地域単位で制御して、CPAを下げよう！【準備編】

これは [Speee Advent Calendar](http://qiita.com/advent-calendar/2016/speee) の10日目の記事です。
初めまして！サーバーサイドエンジニアの [@selmertsx](https://github.com/selmertsx) です。

地域毎に商材を扱っているプロダクトにおいて、
CPAを下げるために、商材在庫がなくなったときに地域単位で
広告を自動で止めて欲しいという要望がでることもあるでしょう。

本記事では、私が上記要望に対応するために行った、
AdWordsの市区町村データの特性や問題点の調査、
システムを実現するために行った決定について記載していきます。

## TL;DR
AdWordsで管理している、日本の市区町村情報は832。
しかしながら、総務省によると日本に存在する市区町村は、
2016年4月時点において1,718件存在します。

故に、在庫が存在する地域に広告を出稿するアプローチは取れず、
在庫が存在しなくなった地域の広告を止めるという方法を選択する必要があります。

また、AdWordsにて登録されている地域データは、誤ったデータや表記ゆれが存在するため、
実運用するためには誤ったデータを取り除き、表記ゆれを修正するなどの前処理を行い、
適切にプロダクトの地域データと紐付ける必要があります。

## やりたいこと

- 地域毎に存在する商材に関して、在庫がなくなったら広告を停止したい
- 在庫が補充されたら、広告を出稿したい

実現したいことは、上記２点でした。
これを実現するためには、プロダクトで保持している地域ごとの在庫データを、
AdWordsの保持している地域データと関連付けを行う必要があります。
故に、AdWordsの保持している地域データの特性を調べる必要がありました。
以下に、AdWordsの保持している地域データを記載していきます。

## AdWordsの持つ市区町村の情報
AdWordsが管理している市区町村データは、下記リンクから確認することが出来ます。
https://developers.google.com/adwords/api/docs/appendix/geotargeting

ここで、Country Code にJPを入力し、City情報を選択してCSVをダウンロードすると、
AdWordsで管理している日本の市区町村情報を確認することができます。

![スクリーンショット 2016-12-10 午後2.06.26.png](https://qiita-image-store.s3.amazonaws.com/0/23606/2d51f7e4-c2f5-2c60-0f2d-58fa95b479fa.png "スクリーンショット 2016-12-10 午後2.06.26.png")

### データの確認方法
CSVをダウンロードしてデータを見てみると、832件存在することがわかります。
しかしながら、 [総務省によると、日本に存在する市区町村数は1,718件](http://www.soumu.go.jp/gapei/gapei2.html) となります。
AdWordsが保持している市区町村データの特性は、ここから２つ考えられます。

- AdWordsは、日本の全ての市区町村に対応していない
- AdWordsが保持している市区町村データは、日本の幾つかの市区町村を内包している

この問題に関しては、Googleの担当者の方に問い合わせ、目視確認もしました。
AdWordsが保持している市区町村のデータについては、AdWordsの管理画面から確認
することが可能です。
キャンペーン => 設定 => 地域で見ていきましょう。
下記にテストアカウントで作成した、キャンペーン例を示します。


![スクリーンショット 2016-12-10 午後2.21.52.png](https://qiita-image-store.s3.amazonaws.com/0/23606/43ccb6c1-fe13-bc04-8fda-5d0c687581dd.png "スクリーンショット 2016-12-10 午後2.21.52.png")

上記設定画面にて、+地域ボタンを押して地域を入力すると、
AdWordsが広告対象としている市区町村データを見ることができます。
あとは気合と根性の、目視確認です。
地図を片手に、AdWordsで管理しているエリア情報と比較していきましょう。

![スクリーンショット 2016-12-10 午後2.22.57.png](https://qiita-image-store.s3.amazonaws.com/0/23606/50ef182c-aaa9-f58a-4fda-53ada4375592.png "スクリーンショット 2016-12-10 午後2.22.57.png")

確認した結果、AdWordsは、日本の全ての市区町村に対応していないことがわかりました。
どうやら市場の大きな市区町村から順番に対応している模様。

## システム実装方針の決定
先程のAdWordsの持つ市区町村データ確認で、AdWordsは日本の全ての市区町村
に対応していないことがわかりました。よって、在庫がある市区町村にのみ、
広告を出すというアプローチは取ることが出来ません。なので、システムを実装する上で
取れる手段は、 **在庫がなくなった市区町村から広告を取り下げる** 
という方法のみになりました。

googleの方に確認したところ、除外する市区町村のみを登録することが可能なようです。
具体的には、東京都に広告を配信するように設定した上で、
港区のみを除外した場合、港区以外の東京都に広告が配信されるようです。

さて、ここでやらなければならないことは、市区町村単位での在庫集計と、
プロダクトで保持している市区町村データとAdWordsのそれとの紐付けとなります。
本記事では、後者に関してのみ記載していこうと思います。

## AdWordsの地域データに関して問題のあるものを抽出・修正
紐付けを開始する前に、AdWordsが所持しているデータから、
問題があるデータを除外・修正する必要があります。
AdWordsから取得したCSVを、以下に表示します。

```
1009591,Hashimoto,"Hashimoto,Wakayama Prefecture,Japan",20653,JP,City,Active
1009592,Iwade,"Iwade,Wakayama Prefecture,Japan",20653,JP,City,Active
1009595,Kushimoto,"Kushimoto,Wakayama Prefecture,Japan",20653,JP,City,Active
```

基本的には、上記のように Criteria ID (API documentではlocationIDとして記載されます), 
ローマ字の市区町村名、県名...という形で表記されていますが、いくつか問題があるデータが存在します。
僕が把握している範囲内で、問題のあるデータは下記のとおりです。

```
1009317,Tokyo,"Tokyo,Tokyo,Japan",20636,JP,City,Active
1009596,美浜町,"美浜町,Wakayama Prefecture,Japan",20653,JP,City,Active
9053273,宜野湾市,"宜野湾市,Okinawa Prefecture,Japan",20670,JP,City,Active
9053367,長万部町,"長万部町,Hokkaido,Japan",20624,JP,City,Active
9053402,鶴ヶ島市,"鶴ヶ島市,Saitama Prefecture,Japan",20634,JP,City,Active
```

上記のように、東京市が存在したり、ローマ字でなく日本語のままのデータが含まれていたりと、
ちょっと手を加える必要のあるデータが存在します。
(この件については、googleの担当者様に報告済みです)

ここまでやれば、あとは正規表現でゴニョゴニョすれば、
プロダクトの地域データと、AdWordsの地域データを紐付けることが可能となります。
紐付ける部分については、プロダクト毎によって異なるので割愛します！

## まとめ
本記事では、AdWords広告を市区町村単位で制御するための、前処理部分について記載しました。
ここまでやって初めて、次の実装フェーズに入ることが可能となります。
忘れないように復習しておくと、AdWordsで管理している市区町村データには下記の特徴があります。

- 日本の全ての市区町村に対応していない
- 存在しない市が登録されている
- 日本語で登録されている市区町村がある。

上記の問題以外にも、AdWordsの市区町村データはアナウンスされずに、
随時追加されていきますので、そこを前提にしたシステムを構築しなければなりません。

## 最後に
以上で、実装フェーズに移るための前処理を完了しました。
次は、AdWords Scriptを用いた実装フェーズになります。

AdWords Scriptはこれまで、レポート自動化などの作業時間短縮用に利用されることが多く、
あまり事業インパクトのある機能を提供する例が存在しませんでした。
しかしながら、このような方法で直接利益に貢献できる方法も存在するので、
今後はゴリゴリ使っていければエンジニアが広告費の最適化にガッツリ関われます！夢が広がりますね！

実装フェーズのお話については、また別の機会に公開させていただきます。

## 参考資料
- [総務省による市区町村情報](http://www.soumu.go.jp/gapei/gapei2.html)
- [AdWords 市区町村除外 API](https://developers.google.com/adwords/scripts/docs/reference/adwordsapp/adwordsapp_campaign#excludeLocation_1)