6-3.Athena でのデータ分析

ラボの概要

このラボでは、Amazon Connect の CTR、エージェントイベントを Amazon S3 にストリーミング出力し、Amazon Athena を使用してクエリする方法を確認します。このソリューションは利用状況の可視化、分析ソリューションとの連携を行います。

ラボの準備

このラボでは AWS CloudFormation を使い、環境のデプロイを行います。 こちらから yaml ファイルをダウンロードしてください。

ソリューションの詳細

このデプロイメントには、次のコンポーネントとアーキテクチャが含まれます(図の点線内が今回のデプロイ対象です)。 201.png

  1. Amazon Kinesis Stream
    • Agent Event レコード
  2. Amazon Kinesis Firehose x2
    • Agent Eventを Amazon S3 に送信
    • CTR レコードを Amazon S3 に送信
  3. Athena / Glue データベース
  4. Athena 保存クエリ x4
    • CTR テーブルの作成用
    • Agent Event テーブルの作成用
    • API Logt テーブルの作成用
  5. S3 Lambda Trigger
  6. Lambda 関数 x4
    • Log File Processing (Optional: Needs extension by the configurator)
    • Whisper Flow Publisher to SQS
    • Lambda Consumer / API Call Logging
    • Firehose Transform Function to separate Agent Event records
  7. SQS 標準キュー

セットアップ手順

  1. AWS コンソールから CloudForamtion を開き、スタックの作成テンプレートの準備完了テンプレートファイルのアップロード を選択し、ファイルの選択で先ほどダウンロードした CloudFormation テンプレートをアップロードします。 209.png
  2. CloudFormation テンプレートをデプロイする際は、必要となる情報を以下の手順で準備します。
  3. スタック名
    • 作成するスタックに任意の名称を付与します(ctranalytics等)。
  4. Amazon Connect エイリアス名
    • Amazon Connect 管理画面左上の Amazon Connect > [インスタンスエイリアス名]から取得することができます。
  5. Amazon Connect インスタンス ID
    • Amazon Connect 管理画面の Amazon Connect >[インスタンスエイリアス名]の概要ページのInstance ARN の末尾文字列から取得することができます。
  6. 結果を格納するための Amazon S3 バケット名
    • Amazon Connect 管理画面の Amazon Connect > [インスタンスエイリアス名]のデータストレージページからエクスポートされたレポートの先頭文字列に記載されている S3 バケット名を指定します。
  7. AWS Glue データベースの名前
    • 一意なデータベース名を小文字英数字で設定してください(ctr等)。

210.png

  1. スタックオプションの設定 画面は、デフォルトのまま次へ を選択します。
  2. レビュー 画面で下までスクロールし、AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。 にチェックし、スタックを作成するを選択します。問題なければ3分程度で作成が完了します。
  3. スタック作成後、出力タブに移動します。このタブにはデプロイされたすべてのリソースのリストが表示されます。describeUserWhisperLambda の値をメモしておいてください。

211.png

  1. AWS コンソールの Amazon Connect のインスタンス設定画面に戻り、Amazon Connect > [インスタンスエイリアス] > データストリーミング で以下の設定を行い、保存を押下します。

    • データストリーミングの有効化チェックボックスをオンにします。
    • 問い合わせ追跡レコードで、 Kinesis Firehose を選択し、CloudFormation テンプレートによってデプロイされた CTR Kinesis Firehoseを選択します。リストが表示されない場合はページをリロードしてください。
    • エージェントイベントで、CloudFormation テンプレートによってデプロイされた Kinesis ストリームを選択します。リストに表示されない場合はページをリロードしてください。
    • 設定が完了したら保存をクリックします。 202.png
  2. CloudFormation テンプレートによってデプロイされた Lambda 関数を、Amazon Connect のコンタクトフローから実行可能なリストに追加するため、以下の手順を実行します。

    • CloudFormation スタックの出力タブから、[describeUserWhisperLambda] キーの値を確認します。
    • Amazon Connect > [インスタンスエイリアス名] > 問い合わせフロー > AWS Lambda で、CloudForamtion の出力で確認した Lambda 関数を選択し、+Add Lambda Function をクリックします。 212.png
  3. エージェントがコールに応答した時に、顧客ウィスパーフロー上で Lambda 関数を実行するために、以下の手順を実行します。

    • Amazon Connect の管理画面から問い合わせフローDefault cusotmer whisper フローを開きます。
    • コンタクトフローに AWS Lambda 関数を呼び出すボックスを追加します。上記で追加した Lambda 関数を指定し、次の4つのパラメータを追加します。
      • [属性を使用する]、宛先キー:AgentArn、タイプ:[エージェント]、属性:[ARN]
      • [属性を使用する]、宛先キー:InstanceCer、タイプ:[システム]、属性:[インスタンス ARN]
      • [属性を使用する]、宛先キー:contactID、タイプ:[システム]、属性:[初回のコンタクト ID]
      • [テキストの使用]、宛先キー:stepID、値:DefaultCustomerWhisper
    • コネクタを下記のように接続し直し、Default cusotmer whisperフローを保存して公開します。 208.png 207.png
  4. 分析データ生成のため、Amazon Connect で取得した電話番号に対し、いくつかのインバウンド/アウトバウンドコールを行います。

    • Amazon Connect の管理画面をログアウトし、準備手順で作成したユーザで再度ログインします。
    • CCP を起動します。以下の各操作を最低1度実行します。
      • エージェントを Offline のまま Amazon Connect の電話番号にコール、キューの音楽を聴いて切断
      • エージェントを Available にして Amazon Connect の電話番号にコール、エージェントで受電して切断
      • エージェントから Amazon Connect で取得した番号にコール、キューの音楽を聴いて切断
  5. AWS コンソールから Amazon Athena に移動します。クエリエディタを詳しく確認するをクリックします。

  6. Athena のクエリ結果を保存する Amazon S3 バケットを指定します。Amazon Connect の初期設定時に作成したバケットを使用します。 213.png

  7. Athena の保存したクエリから以下のクエリを実行してスキーマを作成します。これらは1度だけ実行します。

    • API ログクエリ (例:ctranalytics-apilogs)
    • エージェントイベントクエリ (例:ctranalytics-ae)
    • CTR クエリ (例:ctranalytics-ctr) 214.png
  8. 通話時間のクエリ(例:ctranalytics-ReconciliationReport)を実行すると、電話の使用状況のスナップショットとともに S3 バケットに出力します。実行時にエラーとなる場合は、クエリの56,57行を以下のように修正してください。

    FROM "amazonconnect_ctr" ctr
    LEFT JOIN "amazonconnect_apilogs" api 
    

クエリのサンプル

データ分析と確認を行うため、Athena でいくつかのサンプルクエリを実行してください。


平均ホールド時間

SELECT ctr.queue.name as "Queue Name",  
  AVG(ctr.queue.duration) as "Average Hold Duration"  
FROM "amazonconnect_ctr" ctr WHERE ctr.agent is null  
  AND ctr.queue is not null 
  AND ctr.queue.dequeuetimestamp = ctr.disconnectTimestamp 
  AND initiationmethod = 'INBOUND' GROUP BY ctr.queue.name; 

顧客電話番号ごとのインバウンド/アウトバウンド通話回数

SELECT
	ctr.customerendpoint.address as "Customer Endpoint", 
	count(CASE WHEN ctr.initiationmethod = 'CALLBACK' THEN 1 END) as "Count of Callbacks", 
	count(CASE WHEN ctr.initiationmethod = 'CALLBACK' and ctr.agent is not NULL THEN 1 END) as "Count of Connected Callbacks", 
	count(CASE WHEN ctr.initiationmethod = 'OUTBOUND' THEN 1 END) as "Count of Outbound Contacts", 
	count(CASE WHEN ctr.initiationmethod = 'OUTBOUND' AND ctr.connectedtosystemtimestamp is not NULL THEN 1 END) as "Count of Connected Outbound Contacts", 
	count(CASE WHEN ctr.initiationmethod = 'INBOUND' THEN 1 END) as "Count of Inbound Contacts",   
	count(CASE WHEN ctr.initiationmethod = 'INBOUND' AND (ctr.agent is not NULL or ctr.transfercompletedtimestamp is not NULL) THEN 1 END) as "Count of Connected or Transferred Inbound Contacts", 
	count(CASE WHEN ctr.initiationmethod = 'API' THEN 1 END) as "Count of API Contacts",   
	count(ctr.customerendpoint.address) as "Total Contacts" 
FROM "amazonconnect_ctr" ctr 
WHERE ctr.customerendpoint.address is not null 
  AND ctr.customerendpoint.address <> '' GROUP BY ctr.customerendpoint.address; 

顧客電話番号ごとの通話時間

SELECT 
	ctr.customerendpoint.address as "Customer Endpoint", 
	ctr.initiationmethod as CallInitiationMethod, 
	ctr.ContactId, 
	ctr.InitiationTimestamp as CallInitiationTimestamp, 
	ctr.Agent.ConnectedToAgentTimestamp as ConnectedToAgentTimestamp, 
	ctr.DisconnectTimestamp as DisconnectTimestamp, 
	ctr.ConnectedToSystemTimestamp as ConnectedToSystemTimestamp,
	ctr.queue.enqueuetimestamp as EnqueuedTimestamp, 
	ctr.queue.dequeuetimestamp as DequeuedTimestamp, 
	ctr.transfercompletedtimestamp as ExternalTransferTimestamp, 
	CAST(to_unixtime(from_iso8601_timestamp(ctr.DisconnectTimestamp)) as 
INTEGER)-CAST(to_unixtime(from_iso8601_timestamp(ctr.ConnectedToSystemTimestamp)) as 
INTEGER) as CustomerCallLength_inSeconds 
 FROM "amazonconnect_ctr" ctr 
 ORDER BY ctr.InitiationTimestamp DESC 

キュー毎の放棄呼, IVR 対応, エージェント対応回数

SELECT *, CAST((HandleRate.IVRHandleCount+HandleRate.AgentHandleCount) as 
DECIMAL(16,2))/CAST(HandleRate.ContactCount as DECIMAL(16,2)) as 
CaseHandleRate 
FROM (   SELECT 
  ctr.queue.name as "QueueName",  
  SUM(CASE WHEN  
	  (ctr.agent is null 
	  AND ctr.agentconnectionattempts = 0 
	  AND ctr.queue.dequeuetimestamp = ctr.disconnectTimestamp 
	  AND ctr.attributes NOT LIKE '%"testattribute":"true"%')  
	THEN 1 ELSE 0 END) as "AbandonedCallCount", 
  SUM(CASE WHEN  
	  (ctr.agent is null  
	  AND ctr.queue.dequeuetimestamp = ctr.disconnectTimestamp 
	  AND ctr.agentconnectionattempts > 0 
	  AND ctr.attributes NOT LIKE '%"testattribute":"true"%')      
	THEN 1 ELSE 0 END) as "AbandonedCall-NoAgentAvailable-Count", 
  SUM( CASE WHEN  
	  (ctr.agent is null  
	  AND ctr.attributes LIKE '%"testattribute":"true"%')  
	 -- Change this attribute to something in your flow that signifies the customer inquiry has been successfully closed    
	THEN 1 ELSE 0 END) as "IVRHandleCount", 
  SUM(CASE WHEN  
	  (ctr.agent is not null) 
	THEN 1 ELSE 0 END) as "AgentHandleCount", 
  COUNT(ctr.contactId) as "ContactCount" 
FROM "amazonconnect_ctr" ctr 
WHERE initiationmethod = 'INBOUND' 
GROUP BY ctr.queue.name ) as "HandleRate"; 

まとめ

このラボでは、Amazon Connect の CTR、エージェントイベントをストリーミング出力する方法を確認しました。Amazon Athena のテーブルを Amazon Quicksight などの BI ソリューションで分析することで、より柔軟にコンタクトセンターの稼働状況を可視化することが可能になります。