Keen IOでユーザー行動ログの収集

## Keen IOとは

- [公式サイト](https://keen.io/)
- ユーザー行動ログの収集ができるサービス

## Streams

- クリックや購入といったイベントの記録

### 単一のイベント

```json
{
  "item": "Fancy turtleneck with deer on it",
  "price": 469.50,
  "on_sale": true,
  "payment_method": "Bank Simple VISA",
  "customer": {
    "name": "Francis Woodbury",
    "age": 28,
    "address": {
      "city": "San Francisco",
      "country": "USA"
    }
  },
  "keen": {
    "timestamp": "2015-05-27T22:44:50.722Z"
  }
}
```

- リクエストボディは単一のJSONオブジェクト
- オブジェクトの配列には分析とフィルタリング機能がない
  - 詳しくは[データモデリングガイド](https://keen.io/docs/streams/data-modeling-guide/)
- オブジェクトのネストは問題なし
- `keen.timestamp`は手動で上書き可能

### 複数のイベント

```json
{
  "purchases": [
    {
      "item": "Golden gadget",
      "price": 25.50,
      "transaction_id": "f029342"
    },
    {
      "item": "Different gadget",
      "price": 17.75,
      "transaction_id": "f029342"
    }
  ],
  "transactions": [
    {
      "id": "f029342",
      "items": 2,
      "total": 43.25
    }
  ]
}
```

- リクエストボディは単一のJSONオブジェクト
- 最上位レベルのキーは各イベントコレクションに対して命名されて、記録されるイベントのリストに対応する

## Compute

### Analysis Types

- Count：特定のコレクション内で見つかったイベントの総数
- Count Unique：与えられたプロパティのユニークな値の数
- Sum：特定のプロパティのすべての数値の合計
- Average：特定のプロパティのすべての数値の平均
- Maximum：特定のプロパティのすべての数値の最大値
- Minimum：特定のプロパティのすべての数値の最小値
- Median：特定のプロパティのすべての数値の中央値
- Percentile：特定のプロパティのすべての数値のパーセンタイル
- Select Unique：特定のプロパティで見つかったすべての一位の値のリスト
- Standard Deviation：特定のプロパティのすべての数値の標準偏差

標準偏差の例

```javascript
// リクエスト
import KeenAnalysis from 'keen-analysis';

const client = new KeenAnalysis({
  projectId: 'PROJECT_ID',
  readKey: 'READ_KEY'
});

client
  .query('standard_deviation', {
    event_collection: 'purchases',
    target_property: 'price',
    timeframe: 'this_7_days'
  })
  .then(res => {
    // Handle results
  })
  .catch(err => {
    // Handle errors
  });

// レスポンス
{
  "result": 6.75
}
```

### Funnels

一連の手順で成功した(or失敗した)ユニークアクターの数を返す(ユニークアクターとはユーザーやデバイスなど)

アクターは各段階で低下するため、ファンネル分析により多くユーザーを失うフローがわかる

ステップの例としては以下のようなものがある

- アプリ内のチュートリアルが正常に完了した
- アプリ内のコンテンツの作成
- 他のユーザーとのコンテンツの共有

```javascript
// リクエスト
import KeenAnalysis from 'keen-analysis';

const client = new KeenAnalysis({
  projectId: 'PROJECT_ID',
  readKey: 'READ_KEY'
});

client
  .query('funnel', {
    steps: [
      {
        event_collection: 'signed up',
        actor_property: 'visitor.guid',
        timeframe: 'this_7_days'
      },
      {
        event_collection: 'completed profile',
        actor_property: 'user.guid', // = visitor.guid from the step above
        timeframe: 'this_7_days'
      },
      {
        event_collection: 'referred user',
        actor_property: 'user.guid',
        timeframe: 'this_7_days'
      }
    ]
  })
  .then(res => {
    // Handle results
  })
  .catch(err => {
    // Handle errors
  });

// レスポンス
{
  "result": [
    3,
    1,
    0
  ],
  "steps": [
    {
      "actor_property": "visitor.guid",
      "event_collection": "signed up",
      "timeframe": "this_7_days"
    },
    {
      "actor_property": "user.guid",
      "event_collection": "completed profile",
      "timeframe": "this_7_days"
    },
    {
      "actor_property": "user.guid",
      "event_collection": "referred user",
      "timeframe": "this_7_days"
    }
  ]
}
一連の手順で成功した（または失敗した）ユニークアクターの数を返します。「アクター」とは、ユーザー、デバイス、またはあなたにとって意味のある他の識別子を意味します。
```

### Query Parameters

- Timeframe：分析を実行する期間の絶対期間または相対期間を指定
- Interval：毎日、毎月など一定の時間内に結果を返す
- Groups：プロパティでグループ化
- Filters：プロパティに基づいて分析に含めるイベントの範囲を絞り込む
- Caching：結果を先にキャッシュすることで後続のクエリ応答時間を短縮

## RBAC

- Role-based access control
- カスタマイズ可能なパーミッション層を使用して、各ユーザーが必要なデータBのみを閲覧できる事を保証
- プログラムでAPIキーを生成、取り消し、変更

```json
EXAMPLE ACCESS KEY

{
  "name": "This is my human_readable string name!",
  "is_active": true,
  "permitted": ["writes", "queries", "saved_queries", "cached_queries", "datasets", "schema"],
  "options": {
    "writes": {
      "autofill": {
        "customer": {
          "id": "93iskds39kd93id",
          "name": "Ada Corp."
        }
      }
    },
    "queries": {
      "filters": [{
        "property_name": "customer.id",
        "operator": "eq",
        "property_value": "93iskds39kd93id"
      }]
    },
    "saved_queries": {
      "allowed": ["my_saved_query", "my_other_one"],
      "blocked": ["my_sensitive_query"],
      "filters": [{
        "property_name": "customer.id",
        "operator": "eq",
        "property_value": "93iskds39kd93id"
      }]
    },
    "cached_queries": {
      "allowed": ["my_cached_query", "my_other_one"],
      "blocked": ["my_sensitive_query"]
    },
    "datasets": {
      "operations": ["read", "list", "retrieve"],
      "allowed": {
        "my_single_index_dataset": {
          "index_by": {
            "customer.id": ["93iskds39kd93id"]
          }
        },
        "my_other_dataset_unlimited_access": {}
      },
      "blocked": ["my_sensitive_dataset"]
    }
  }
}
```



## Visualize
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196629/a75d9760-81fa-4183-0648-a92ef7451a7a.png)


- データを送信してすぐに埋め込み可能なチャートやダッシュボードを作成可能
- すぐに使用可能な視覚化は面グラフ、折れ線グラフ、棒グラフ、円グラフ、表
- カスタムデータの視覚化の構築には以下のライブラリを使用
  - https://github.com/keen/keen-dataviz.js
  - https://github.com/keen/keen-analysis.js
- C3.js、Chart.js、Highcharts.js、Plotly.jsなどと互換性がある
- ダッシュボードの例：http://keen.github.io/dashboards/examples/

Geo-Explorer
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196629/4a5fddf4-b22b-8cd8-aaef-e5ce53ab7cbc.png)
Starter Kit
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196629/5f15bf50-7a6f-be76-73e0-57c51880eb65.png)
Connected Devices
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196629/d97e267f-c327-7d32-4171-9440b3e7413e.png)
SFMTA Parking
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196629/c052a20e-e1ac-e4e8-c55e-7649fdc0f87c.png)

- レイアウトの例：http://keen.github.io/dashboards/layouts/

##  SDKs

### Official SDKs

![image.png](https://qiita-image-store.s3.amazonaws.com/0/196629/242f0fdf-752f-5908-f952-bff93a7cfcfe.png)


### Community SDKs
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196629/8a89caa3-ea7f-ba3d-660f-6ca1ae4aa688.png)

## Integrations

- AMP：AMPのページにイベント記録
- Tessel：Tessel対応ハードウェアからのイベントデータの記録
- Postman：APIベースの計算とS3バックアップのためにMonitor結果をKeen Streamsにプッシュ
- Amazon S3：着信イベントデータをS3パケットにストリーミング
- heroku：Herokuアプリにイベントを記録
- GitHub：GitHubアクティビティの保存、分析、視覚化、レポート作成
- Segment：SegmentからKeenにイベントデータ送信
- Particle：Particle Web Hookを介してIoTイベントデータを記録
- OpenShift：OpenShiftアプリからイベントデータを記録
- Runscope：APIテストイベントデータを記録
- SendGrid：Eメールイベントデータの保存、分析、視覚化、レポート分析
- Twilio：Twilio TaskRouterイベントデータの保存、分析、視覚化、レポート分析
- Stripe：Stripe Webhookを介して支払いイベントデータを記録
- Electric Imp：任意のデバイスからイベントデータ記録
- Reekoh：カスタムIoTプラットフォームの構築および拡張