Skip to content

CTR(問い合わせレコード)を分析してより詳細なヒストリカルデータを取得する

promotion image
  • 運用

📅 2020-04-18

Amazon Connectは通話を問い合わせという単位で記録し、CTR(Contact Trace Records)という形式で保存します。問い合わせの検索画面で確認できるデータですね。標準でもヒストリカルレポートから色々な情報を見て分析を行うことはできますが、CTRの生データを解析することでさらに多くの情報を得ることができます。

分析を行うサンプルスクリプトも紹介します。

CTRを保存する

インスタンス設定からCTRストリームを保存する

デフォルトではCTRは外部に保存されません。CTRを保存するためには、インスタンスの設定画面から「データストリーミング」のタブを開き、以下の設定にします。

  • データストリーミングの有効化にチェックを入れる
  • 問い合わせ追跡レコードをKinesis Firehoseへ渡すように設定をする

setting ctr stream

作成したKinesis Firehoseでは、受け取ったストリームをS3へ保存するように設定をします。

Kinesis Firehoseを使用する

Kinesis Firehoseはストリーミングデータを簡単にS3を始めとしたデータ保存、分析サービスへロードすることができるサービスです。リアルタイムなストリーミングデータ解析を行いたい場合にはKinesis Data Streamsを使用したほうが良いですが、CTRはヒストリカルな分析に使うものだと思うので、設定も簡単なFirehoseを使っていきましょう。

Firehoseでの設定は簡単で、ストリーミングデータ保存先のS3バケットを指定するだけです。

setting kf

ここまで完了したら、通話終了後にCTRが指定のS3に保存されるようになります!

CTRの分析準備

分析方式パターン

CTRをヒストリカル分析する時に、色々なアプローチがあります。大きく3つに分けると、

  1. ガッツリAWSサービスを活用する
  2. 自前のデータベースにロードして分析アプリケーションを作成する
  3. CTRファイルをプログラムから直接分析する

1. ガッツリAWSサービスを活用する

1についてはAWSのドキュメントがあります。
Amazon Athena、AWS Glue、Amazon QuickSight を使って Amazon Connect のレコードを分析する

1_architecture

S3へCTRデータがPUTされたことをトリガーにファイルをフラットなプレフィックスストラクチャS3へ移動、AWS Glueを使いさらにデータを整形して別S3へ移動。Amazon Athenaを使用してデータをクエリし、QuickSightで可視化します。マネージドサービスで完結できるところがいいですね!

2. 自前のデータベースにロードして分析アプリケーションを作成する

1の手法でAWSマネージドなサービスで行っていた部分を独自に行うという方式になります。リレーショナルなデータベースにCTRを登録することで、既存システムの拡張としてCTR分析をつけたりすることができます。一番とっつきやすい方式なんじゃないでしょうか。

3. CTRファイルをスクリプトから直接分析する

S3に保存された生のCTRデータを直接スクリプトで分析する方法です。1日1回のバッチ処理で決まった情報だけほしいというような場合には一番コストがかかりません。

今回はこちらのサンプルコードを紹介します。

S3からダウンロードする

S3に保存されているファイルをLambdaやEC2から直接ロードして分析してもいいのですが、楽さ重視でローカル上で行います。以下のAWS CLIで特定のプレフィックス(ディレクトリ)以下のファイルをすべてダウンロードします。

aws --profile [プロファイルを指定] s3 cp --region ap-northeast-1 ¥
s3://[バケット名を指定]/2020/04/15/* ./20200415/ --recursive

※一点注意です!
Firehoseから保存されるCTRデータはタイムゾーンがUTCで保存されているため、JSTから時間が9時間ずれいています。

タイムゾーンのズレを修正してS3へ保存を行うか、分析時に対象とするディレクトリを調整する必要があります。

ショートアバンダン(短い放棄呼)を分析する

ショートアバンダンとは

放棄呼を英語では"Abandoned call"と呼びます。お客さんがコールセンターに通話をかけ、オペレーターと通話を行う前に離脱をした呼を指します。ショートアバンダンは離脱するまでの秒数が短い呼のことです。

コールセンターのKPIの一つとして、応答率を重視していることは多いと思います。放棄呼率が高いということは応答率が低くなるということですが、お客さんがあまりに早く通話を切断してしまう場合(リンギングした瞬間に切ってしまうなど)はどうしようもないのに応答率が下がってしまいます。

そこで放棄呼の秒数にしきい値を設定して、1日にどれくらいのショートアバンダンがあるかを調べてみようというのが今回の分析の趣旨です。

Amazon Connectの標準のヒストリカルレポートでは15秒までのショートアバンダンは調べることができますが、さらに短いしきい値を設けたい場合には別途分析を行う必要があります。

サンプルコード

#coding utf-8

from glob import glob
import json

## 変数設定
target_dir = "20200415jst"
directory_path = "./ctr-analyze"
threshold = 10

# 結果
tot_ctr = 0
tot_queued = 0
tot_called = 0
tot_ab = 0
tot_sa = 0

# CTRを分析
def analyze_ctr(ctr, threshold):
  global tot_ctr
  global tot_queued
  global tot_called
  global tot_ab
  global tot_sa

  if ctr['InitiationMethod'] == "INBOUND":
    tot_ctr += 1
    if ctr['Queue'] is not None:
      tot_queued += 1
      if ctr['Agent'] is not None:
        tot_called += 1
      else:
        tot_ab += 1
        if ctr['Queue']['Duration'] <= threshold:
          if tot_sa == 0:
            print("ショートアバンダンの問い合わせID")
          tot_sa += 1
          print(ctr['Queue']['EnqueueTimestamp'] + " : " + ctr['ContactId'])
  return

# fileからCTRをパース
def parse_file(file):
  with open(file, 'r') as f:
    stream = f.read()
    stream_list = stream.split('}{')

    for record in stream_list:
      if 'AWSContactTraceRecordFormatVersion' in record:
        if record == stream_list[0]:
          record = record + '}'
        elif record == stream_list[-1]:
          record = '{' + record
        else:
          record = '{' + record + '}'

        #print(record)
        ctr = json.loads(record)
        analyze_ctr(ctr, threshold)
  return

def main():
  print("ショートアバンダンのしきい値は" + str(threshold) + "秒です")
  print("\nしばらくおまちください...\n")
  for file in glob(directory_path + '/' + target_dir + '/*/*'):
    parse_file(file)

  print("\nインバウンドCTRレコード数: " + str(tot_ctr))
  print("キューに入った呼数: " + str(tot_queued))
  print("エージェントに接続した呼数: " + str(tot_called))
  print("放棄呼数: " + str(tot_ab))
  print(str(threshold) + "秒以下のショートアバンダン数: " + str(tot_sa))

if __name__ == "__main__":
  main()

スクリプトを実行してみる

上記のサンプルコードではショートアバンダンのしきい値は10秒になっています。

threshold = 10

とあるコールセンターの4月15日のCTRを分析してみた結果は以下になります。

ippeis-iMac:Desktop ippei$ python3 analyze_ctr.py 
ショートアバンダンのしきい値は10秒です

しばらくおまちください...

ショートアバンダンの問い合わせID
2020-04-15T03:58:59Z : 5a23a234-ee7d-4725-9dc6-1a3079a39f23
2020-04-15T03:57:47Z : a908ba72-ccfe-4138-a086-cdb74feb4425
2020-04-15T04:58:41Z : cc4b2d07-f47e-44c1-90d1-8c978b8b08fd
2020-04-15T04:12:49Z : e041b4f7-f8af-490e-85e5-1386c5a33583
2020-04-15T04:03:27Z : a805add6-f253-44b5-a25a-d999bc06cf1d
2020-04-15T05:08:10Z : 6646adfc-20a2-4695-b06f-a8c857859fb7
2020-04-15T02:09:36Z : 6c5f820b-1bd5-42bc-b90e-30bb8cf39b11
2020-04-15T02:56:51Z : 93e946ac-aa31-4b66-b3bc-49be51796c9b
2020-04-15T02:27:14Z : de1a3f39-91c0-46df-a585-60bd808e0e99
2020-04-15T02:12:03Z : f11ec672-e1b2-4745-9178-247612caa4f8
2020-04-15T10:15:08Z : 95236874-10d0-4f25-9132-20e6aaac9939
2020-04-15T07:54:12Z : 60a05461-6ccb-42d5-b9f0-e554cc17dcdd
2020-04-15T07:26:54Z : 5de5c076-3520-4021-98af-4014b8dedbec
2020-04-15T07:15:49Z : 0b35d045-83a6-446a-b5fb-51fed132b473
2020-04-15T00:12:46Z : 6748b5d7-1f06-470b-bd92-91b31786faf7
2020-04-15T00:26:19Z : 4b5121c9-13c5-4fc4-b14a-891369f01ecb
2020-04-15T01:13:41Z : 96bd4236-7d52-441c-954d-f83eac6aab1c
2020-04-15T01:43:14Z : a092ebf4-1e43-4eb2-a97d-2607a40d0f1e
2020-04-15T06:24:21Z : 80420ed8-b556-4129-ace1-c31e9c402362
2020-04-15T06:39:06Z : c7d39390-e08f-4e67-9a7c-7e1e2eae28ec
2020-04-15T06:31:04Z : 14b6c3a3-a3c5-4787-ad23-0dd29134225e
2020-04-15T06:06:24Z : cdab5b62-435a-4ac8-a049-188f4e96d64a
2020-04-15T06:23:29Z : 511c42ab-7aa3-4d96-b9a5-7a6a4b98712e

インバウンドCTRレコード数: 2043
キューに入った呼数: 1875
エージェントに接続した呼数: 1728
放棄呼数: 147
10秒以下のショートアバンダン数: 23
ippeis-iMac:Desktop ippei$

このことから放棄呼の約15.6%(23/147)はショートアバンダンであることがわかります。

まとめ

CTRを分析することで標準のヒストリカルレポートよりも詳細なデータを取得することができます。今回はスクリプトからCTRデータの直接分析を行いましたが、より多くのデータから様々なデータを出す場合には、AWSサービスを活用したりDBを別途用意することをおすすめします。

CTRデータ自体には色々な情報が入っているので、見てみると面白いですよ!
問い合わせ追跡レコードデータモデル

← PrevNext →
  • produced by GeekFeed
  • produced by GeekFeed