Google Analytics > Pandas dataframe > sqlite という流れでデータの変換ができることがわかったので、
Googel Analytics から、地域データを取得して Superset でグラフ描画してみます。
前提
以下の環境で、作業は実施しました。
-
OS
ProductName: Mac OS X ProductVersion: 10.13.4 BuildVersion: 17E199
-
Python の version
Python 3.6.5
-
Djangoの version
Django 1.11.11
-
Superset の version
superset 0.25.2
作業の流れ
以下の流れで作業は実施しました。
- Google Analytics のデータを、pandas を使って、RDB に登録する。
- Apache のアクセスログを、RDB に登録する。
- Superset で、
1.
、2.
のデータを使い、グラフを描画する。
1. Google Analytics のデータを、pandas を使って、RDB に登録する。
取得するデータセットについて
以下の、データセットを取得します。指定しているディメンションの値は以下を参考にしました。
GoogleアナリティクスAPIリファレンス 日本語対応表 スプレッドシートのアドオンやAnalytics Edgeでも使えるよ! - テストのブログ
データセットには、カスタムディメンションとして設定している ClientID も含めています。
これは、Superset 上で、データを、クライアント ID で結合する目的で取得しています。
-
地域名称データセット
- ディメンション
日本語名称 英語名称 GAディメンション名 クライアントID clientID ga:dimension8 タイムスタンプ timestamp ga:dimension10 大陸 Continent ga:continent 亜大陸 Sub Continent ga:subContinent 国/地域 Country ga:country 地域 Region ga:region 大都市圏 Metro ga:metro 市区町村 City ga:city - メトリクス
日本語名称 英語名称 GA メトリクス名 ユーザー数 Users ga:users 直帰率 Bounce Rate ga:bounceRate -
緯度、経度データセット
- ディメンション
日本語名称 英語名称 GAディメンション名 クライアントID clientID ga:dimension8 タイムスタンプ timestamp ga:dimension10 緯度 Latitude ga:latitude 経度 Longitude ga:longitude - メトリクス
日本語名称 英語名称 GA メトリクス名 ユーザー数 Users ga:users 直帰率 Bounce Rate ga:bounceRate -
ネットワーク関連データセット
- ディメンション
日本語名称 英語名称 GAディメンション名 クライアントID clientID ga:dimension8 タイムスタンプ timestamp ga:dimension10 ネットワーク ドメイン Network Domain ga:networkDomain サービス プロバイダ Service Provider ga:networkLocation - メトリクス
日本語名称 英語名称 GA メトリクス名 ユーザー数 Users ga:users 直帰率 Bounce Rate ga:bounceRate -
地域コードデータセット
- ディメンション
日本語名称 英語名称 GA ディメンション名 クライアントID clientID ga:dimension8 タイムスタンプ timestamp ga:dimension10 市区町村 ID City ID ga:cityId 大陸 ID Continent ID ga:continentId ISO 国コード Country ISO Code ga:countryIsoCode 大都市圏 ID Metro Id ga:metroId 地域 ID Region ID ga:regionId 地域 ISO コード Region ISO Code ga:regionIsoCode 亜大陸コード Sub Continent Code ga:subContinentCode - メトリクス
日本語名称 英語名称 GA メトリクス名 ユーザー数 Users ga:users 直帰率 Bounce Rate ga:bounceRate
作成したスクリプト
Django コマンド を作成して、gist に UPしました。
Google Analytics の地域データを、pandas 経由で RDBに登録する Django コマンド一式
2. Apache のアクセスログを、RDB に登録する。
- に続いて、Apache の アクセスログを、RDB に登録します。
取得するデータセットについて
取得するデータセットの内容は以下の通りです。
-
アクセスログのフォーマット
以下フォーマットで定義しています。
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{track}C\" \"%{_ga}C\""
-
取得項目
取得カラムindex | 日本語名称 | カラム名 |
---|---|---|
0 | IPアドレス | ip |
3 | タイムスタンプ | timestamp |
4 | タイムゾーン | timezone |
5 | リクエスト情報 | request |
6 | ステータス | status |
7 | 送信バイト数 | size |
8 | リファラー | referer |
9 | ユーザーエージェント | user_agent |
10 | usertrack の tracking id | user_id |
11 | Google Analytics の clientid | clientid |
作成したスクリプト
Django コマンド を作成して、gist に UPしました。
Apache アクセスログを、pandas 経由 で RDB に登録する
3. Superset で、1.
、2.
のデータを使い、グラフを描画する。
1
、2
で登録したデータを使い、グラフを描画します。
前提で、データベース、テーブル作成が必要なので、その説明と、その後に、作成した Charts について説明します。
Superset にデータベース、テーブルの作成を作成する
-
データベースの作成
SQLAlchemy URI
にローカルの sqlite のパスを設定します。
Cache Timeout はなんとなく 30 に設定しました。 -
テーブルの作成
データベースの作成に続き、テーブル作成を実施します。
データベース名を選択、テーブル名を入力し、保存します。
この設定せずに、Chart を編集し始めたせいで、Group By 項目が選択できず悩んでしまいました。
Group BY に使用する項目は、グルプ分け可能に、チェックを入れる必要があります。
Google Analytics の ディメンションに該当する項目には、基本的にチェックが必要かと思います。
List Columns の編集は、一度テーブルを保存してから、編集しないと設定ができませんでした。
Charts の作成
テーブルの作成が完了したら、Charts を作成します。
各 Charts の設定に個人的に少し癖があるように感じました。手順がうまく説明できないので、作成したもののスクリーンショットを貼り付けます。
-
Apache のアクセスログ / Calender Heatmap
Apache のアクセスログ を元に、時系列のアクセス数を Calender Heatmap で描画しました。
スクリーンショットはなんだかよくわからない感じになっていますが、Calender Heatmap の 設定 Style から、Color や、Heatmap の大きさ、値の表示、非表示等のコントロールが可能です。 -
緯度、経度データセット / Deck.gl Screen grid
経度、緯度データセット を元に、Deck.gl Screen grid を使って、時系列でのアクセスユーザの地域の移り変わりを描画できます。
再生のループ設定や、描画する期間等もコントロールが可能です。
Superset は、Mapbox を使った地図が多く描画できますが、経度、緯度データセットを用いる地図が一番多いので、経度、緯度情報になんらかの指標を組み合わせて描画することが多くなるかと思いました。 -
地域名称データセット / TreeMap
地域名称データセットを元に、TreeMap を描画しました。
Group BY 項目を 3項目設定できるのですが、このブログは、日本からのアクセスがほとんどで、3項目設定しても、TreeMap の項目を選択した際に、詳細が表示されませんでした。
大分類、中分類、小分類 的に、分かれるデータセットだと、いい感じに可視化されそうに思いました。 -
ネットワーク関連データセット/ Directed Force Layout
ネットワーク関連データセットを元に、力指向アルゴリズムによるグラフを描画しました。
描画結果が、どういう意味なのかわからず、Table View で、件数カウントを取ってやっとグラフの意味が理解できました。
これは個人的に良い感じで可視化できたのかと思います。
設定可能な、Group By 項目は2つです。
参考
以下、プログラム、Chart 作成時に参照した記事のリンクです。
* EU司法裁判所がIPアドレスは個人情報と判断!日本の個人情報保護法はどうなっているの? | IT法務や仮想通貨、ICO、AIの法律に詳しい弁護士|中野秀俊
-
panalysis/Google2Pandas: Query Google Analytics and get the results as a pandas.DataFrame
-
[力学モデル (グラフ描画アルゴリズム) - Wikipedia](https://ja.wikipedia.org/wiki/%E5%8A%9B%E5%AD%A6%E3%83%A2%E3%83%87%E3%83%AB_(%E3%82%B0%E3%83%A9%E3%83%95%E6%8F%8F%E7%94%BB%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)
まとめ
以下、Charts 作成時の感想等をまとめます。
-
SUM をするとエラーになるグラフがある。
COUNT(*)
の結果ではなく、ユーザー数の合計を指標としたい場合があったのですが、unhashable type: 'dict'
というエラーが発生し、グラフが描画できませんでした。 -
覚えるための学習コストはそれなりにかかる。
Charts ごとに、設定できる項目が異なり、それぞれ制約があります。
テーブル側の設定含めて、それなりに学習コストはかかるかと思いました。 -
データ変換用ツールとして、pandasは便利
使い方として、邪道なのかもしれませんが、テキストファイルや、WebAPI から、RDB へのデータ変換ツールとして、pandas が非常に便利に使えます。
ただ、Upsert ができないため、基本的に Replace となり、データ量が膨大になると登録ができない等の問題が起こりそうに思いました。
以下、ライブラリがあったのですが、試しに使ってみてはいません。
ryanbaumann/Pandas-to_sql-upsert: Extend pandas to_sql function to perform multi-threaded, concurrent “insert or update” command in memory
pandas で Table 作成後に、django の inspectdb コマンド で Model を生成して、upsert 処理を自前実装とかするかもしれません。 -
グラフリテラシーはどうやって身につける?
個人的に、手段と目的が逆になってしまっている感があるのですが、Chartsごとの制約、可視化するデータの向き不向き等を理解しておくと、グラフ描画ツールは学習が早くなるのかと思うのですが、近道となる学習方法や、書籍が思い浮かばず、どなたか教えてくださいという思いがあります。
統計関連の書籍とかにそれっぽいことは記載があったりするので、そういった書籍を読んでいこうかなと思います。
以上です。
コメント