Google Analytics > Pandas dataframe > sqlite という流れでデータの変換ができることがわかったので、
Googel Analytics から、地域データを取得して Superset でグラフ描画してみます。

[TOC]


前提

以下の環境で、作業は実施しました。

  • 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     
    


作業の流れ

以下の流れで作業は実施しました。

  1. Google Analytics のデータを、pandas を使って、RDB に登録する。
  2. Apache のアクセスログを、RDB に登録する。
  3. Superset で、1.2.データを使い、グラフを描画する。

1. Google Analytics のデータを、pandas を使って、RDB に登録する。

取得するデータセットについて

以下の、データセットを取得します。指定しているディメンションの値は以下を参考にしました。
GoogleアナリティクスAPIリファレンス 日本語対応表 スプレッドシートのアドオンやAnalytics Edgeでも使えるよ! - テストのブログ

データセットには、カスタムディメンションとして設定している ClientID も含めています。
これは、Superset 上で、データを、クライアント ID で結合する目的で取得しています。

  • 地域名称データセット

    • ディメンション
    日本語名称英語名称GAディメンション名
    クライアントIDclientIDga:dimension8
    タイムスタンプtimestampga:dimension10
    大陸Continentga:continent
    亜大陸Sub Continentga:subContinent
    国/地域Countryga:country
    地域Regionga:region
    大都市圏Metroga:metro
    市区町村Cityga:city
    • メトリクス
    日本語名称英語名称GA メトリクス名
    ユーザー数Usersga:users
    直帰率Bounce Ratega:bounceRate
  • 緯度、経度データセット

    • ディメンション
    日本語名称英語名称GAディメンション名
    クライアントIDclientIDga:dimension8
    タイムスタンプtimestampga:dimension10
    緯度Latitudega:latitude
    経度Longitudega:longitude
    • メトリクス
    日本語名称英語名称GA メトリクス名
    ユーザー数Usersga:users
    直帰率Bounce Ratega:bounceRate
  • ネットワーク関連データセット

    • ディメンション
    日本語名称英語名称GAディメンション名
    クライアントIDclientIDga:dimension8
    タイムスタンプtimestampga:dimension10
    ネットワーク ドメインNetwork Domainga:networkDomain
    サービス プロバイダService Providerga:networkLocation
    • メトリクス
    日本語名称英語名称GA メトリクス名
    ユーザー数Usersga:users
    直帰率Bounce Ratega:bounceRate
  • 地域コードデータセット

    • ディメンション
    日本語名称英語名称GA ディメンション名
    クライアントIDclientIDga:dimension8
    タイムスタンプtimestampga:dimension10
    市区町村 IDCity IDga:cityId
    大陸 IDContinent IDga:continentId
    ISO 国コードCountry ISO Codega:countryIsoCode
    大都市圏 IDMetro Idga:metroId
    地域 IDRegion IDga:regionId
    地域 ISO コードRegion ISO Codega:regionIsoCode
    亜大陸コードSub Continent Codega:subContinentCode
    • メトリクス
    日本語名称英語名称GA メトリクス名
    ユーザー数Usersga:users
    直帰率Bounce Ratega:bounceRate

作成したスクリプト

Django コマンド を作成して、gist に UPしました。
Google Analytics の地域データを、pandas 経由で RDBに登録する Django コマンド一式


2. Apache のアクセスログを、RDB に登録する。

  1. に続いて、Apache の アクセスログを、RDB に登録します。

取得するデータセットについて

取得するデータセットの内容は以下の通りです。

  • アクセスログのフォーマット
    以下フォーマットで定義しています。

    "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{track}C\" \"%{_ga}C\""
    

  • 取得項目

取得カラムindex日本語名称カラム名
0IPアドレスip
3タイムスタンプtimestamp
4タイムゾーンtimezone
5リクエスト情報request
6ステータスstatus
7送信バイト数size
8リファラーreferer
9ユーザーエージェントuser_agent
10usertrack の tracking iduser_id
11Google Analytics の clientidclientid

作成したスクリプト

Django コマンド を作成して、gist に UPしました。
Apache アクセスログを、pandas 経由 で RDB に登録する


3. Superset で、1.2.データを使い、グラフを描画する。

12登録したデータを使い、グラフを描画します。
前提で、データベース、テーブル作成が必要なので、その説明と、その後に、作成した Charts について説明します。

Superset にデータベース、テーブルの作成を作成する

  • データベースの作成
    データベースの<wbr>作成SQLAlchemy URIローカルの sqlite のパスを設定します。
    Cache Timeout はなんとなく 30 に設定しました。

  • テーブルの作成
    テーブルの<wbr>作成
    データベースの作成に続き、テーブル作成を実施します。
    データベース名を選択、テーブル名を入力し、保存します。
    List Columns
    この設定せずに、Chart を編集し始めたせいで、Group By 項目が選択できず悩んでしまいました。
    Group BY に使用する項目は、グルプ分け可能に、チェックを入れる必要があります。
    Google Analytics の ディメンションに該当する項目には、基本的にチェックが必要かと思います。
    List Columns の編集は、一度テーブルを保存してから、編集しないと設定ができませんでした。

Charts の作成

テーブルの作成が完了したら、Charts を作成します。
各 Charts の設定に個人的に少し癖があるように感じました。手順がうまく説明できないので、作成したもののスクリーンショットを貼り付けます。

  • Apache のアクセスログ / Calender Heatmap
    Calender Heatmap
    Apache のアクセスログ を元に、時系列のアクセス数を Calender Heatmap で描画しました。
    スクリーンショットはなんだかよくわからない感じになっていますが、Calender Heatmap の 設定 Style から、Color や、Heatmap の大きさ、値の表示、非表示等のコントロールが可能です。

  • 緯度、経度データセット / Deck.gl Screen grid
    Deck.gl Screen grid
    経度、緯度データセット を元に、Deck.gl Screen grid を使って、時系列でのアクセスユーザの地域の移り変わりを描画できます。
    再生のループ設定や、描画する期間等もコントロールが可能です。
    Superset は、Mapbox を使った地図が多く描画できますが、経度、緯度データセットを用いる地図が一番多いので、経度、緯度情報になんらかの指標を組み合わせて描画することが多くなるかと思いました。

  • 地域名称データセット / TreeMap
    TreeMap
    地域名称データセットを元に、TreeMap を描画しました。
    Group BY 項目を 3項目設定できるのですが、このブログは、日本からのアクセスがほとんどで、3項目設定しても、TreeMap の項目を選択した際に、詳細が表示されませんでした。
    大分類、中分類、小分類 的に、分かれるデータセットだと、いい感じに可視化されそうに思いました。

  • ネットワーク関連データセット/ Directed Force Layout
    Directed Force Layout
    ネットワーク関連データセットを元に、力指向アルゴリズムによるグラフを描画しました。
    描画結果が、どういう意味なのかわからず、Table View で、件数カウントを取ってやっとグラフの意味が理解できました。
    これは個人的に良い感じで可視化できたのかと思います。
    設定可能な、Group By 項目は2つです。


参考

以下、プログラム、Chart 作成時に参照した記事のリンクです。
* EU司法裁判所がIPアドレスは個人情報と判断!日本の個人情報保護法はどうなっているの? | IT法務や仮想通貨、ICO、AIの法律に詳しい弁護士|中野秀俊


まとめ

以下、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ごとの制約、可視化するデータの向き不向き等を理解しておくと、グラフ描画ツールは学習が早くなるのかと思うのですが、近道となる学習方法や、書籍が思い浮かばず、どなたか教えてくださいという思いがあります。
    統計関連の書籍とかにそれっぽいことは記載があったりするので、そういった書籍を読んでいこうかなと思います。

以上です。

コメント