時間帯ごとに通話データを集計するアルゴリズムを作成しましょう
はじめに
今回は、弊社が運営している課金通話プラットフォーム「Port」の可視化分析の一つ、「時間帯ごとの合計通話時間」の計算方法について紹介させていただきます。
通話プラットフォームとして、ユーザーがどの時間帯に通話するかを把握できれば、より良いサービスの提供や、サーバ負荷などの技術的な設定を適切に調整することが可能です。そのため、通話がどの時間帯にどれだけ行われたかを視覚的に理解できるように、下図のような通話時間の可視化を作成しました。
では早速、今回の記事でここに表示される時間帯ごとの通話データの計算方法についてご説明いたします。
課題
目的:
通話ログの開始時刻と終了時刻を使用して、時間帯ごとの合計通話時間(秒)を計算すること。
ログ例:
… | startAt | endAt | … |
… | 2024-08-19 11:15:15 | 2024-08-19 14:35:35 | … |
… | 2024-08-19 12:12:12 | 2024-08-19 13:13:13 | … |
… | 2024-08-19 23:23:23 | 2024-08-20 01:01:01 | … |
結果例:
[3600, 61, 0, … 0, 2685, 6468, 4393, 2135, 0, … 0, 2197]
0時 | 1時 | … | 11時 | 12時 | 13時 | 14時 | … | 23時 |
3600秒 | 61秒 | … | 2685秒 | 6468秒 | 4393秒 | 2135秒 | … | 2197秒 |
解決
ステップ1:一つのログを使用して目標を確認する
ここでは、最初のログ例を用いて下図を作成いたしました。時間帯ごとの通話時間が秒単位で分かれており、それぞれ対応するインデックスに配列として保存しています。
ステップ2:数字を変数に置き換える
他のデータにも対応できるように、具体的な数字を抽象的な変数に置き換えました。重複する操作は、同じ変数名を使って異なるループで対応できるでしょう。
ステップ3:擬似コードを抽出する
では、変数を整理して、擬似コードを一緒に作成していきましょう。
最終的に得られるのはhourData[]です。これは配列で、時間帯ごとの通話時間の合計を記録する役割を持っています。
通話ログごとにstartAt、endAt、nextHour、overlapを使用して、startAtがendAtよりも遅くなるまで時間帯ごとにループ処理を行います。
startAt:ループの開始時点を表します。初期値は通話ログの開始時刻で、その後、次の正時(nextHour)に更新されます。
endAt:通話ログの終了時刻を示します。ループ内ではこの値は変更されません。
nextHour:ループごとに更新される値で、startAtの次の正時を表します。
overlap:ループごとに更新される値で、nextHourとendAtのうち早い方の時刻とstartAtの差、すなわちある時間帯で通話した秒数を表します。この値を計算したら、hourData[]に加算します。
この擬似コードを見ることで、コーディングが簡単になったと思いますが、念のため、参考用のPythonコードも下に表示しておきます。
hourData = [0] * 24 def get_next_hour(time): return (time + timedelta(hours=1)).replace(minute=0, second=0, microsecond=0) def process_call_logs(calls): for call in calls: startAt = call['startAt'] endAt = call['endAt'] while startAt < endAt: nextHour = get_next_hour(startAt) overlap = (min(nextHour, endAt) - startAt).total_seconds() hourData[startAt.hour] += overlap startAt = nextHour return hourData
最後に
ある問題に対して数字の計算やアルゴリズムの作成は、一見難しくてつまらないと感じるかもしれませんが、エンジニアにとっては不可欠なスキルだと思っています。お時間を割いてご興味を持っていただき、誠にありがとうございます。これからも一緒に頑張りましょう!
(本文の作成にはChatGPTを使用したことがあります。)