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     
    


作業の流れ

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

  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ディメンション名
    クライアント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 に登録する。

  1. に続いて、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. のデータを使い、グラフを描画する。

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

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

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

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

以上です。

コメント