入場時刻と退出時刻のデータから時間毎の利用者数を可視化する方法

2018年5月30日の、ある施設の利用者の入場時刻(enter_time)と退出時刻(exit_time)のデータが以下のようにあるとします。

このデータからこの日(2018年5月30日)の施設利用者数を時間毎に可視化してみましょう。

日付の情報を作成

元のデータには2018年5月30日の時間を、間隔(例えば10分おき)で区切った時間区分の情報がないので、計算を作成(Mutate)を使って、新規に列を作ります。

ここでは、2018年5月30日を10分おきに区切ったデータを作ります。列ヘッダーメニューより、計算を作成(Mutate)を選択します。

list(seq(as.POSIXct("2018-05-30"), as.POSIXct("2018-05-30") + 60*60*24, by=600))

この2番目の引数で 60 * 60 *24という計算は24時間を秒に換算したものを足して、一日の終わりの日付にしています。そしてby=600では600秒毎、つまり10分毎のデータを作成しています。

ここで実行ボタンを押ます。

リストの項目を行に展開

timeという情報が作成されましたが、このままではlistという型の列に纏まった形になっています。これを行に展開しましょう。

time列のメニューからリストの項目を行に展開(Unnest) を選択します。

実行ボタンを押します。

すると1行がユーザー毎、10分単位の時間区分を表すデータになりました。

各時間区分での入場を確認

さて、これで1行の中に、入場時刻(enter_time)、退出時刻(exit_time)、時間区分(time)と3つの列ができたので、これを使って、施設利用者が各時間区分に、実際にその施設にいたのかどうかを調べましょう。

施設利用者がその時間区分にその施設にいたかどうかをしらべるには入場時刻(enter_time)と退出時刻(exit_time)からintervalというデータを作成し、各時間区分がそのintervalに収まっているかを調べます。

Intervalの計算

入場時刻(enter_time) 列ヘッダーメニューより、計算を作成(Mutate)を選択します。

intevalという関数の中に、enter_timeとexit_timeを引数として渡します。

interval(enter_time, exit_time)

実行を押します。するとtime_intervalという列が作成されました。

時間区分毎に施設利用中かを計算

最後に時間区分(time)がこのintervalに収まるかを判定します。 この判定には%within%というlubridateパッケージの演算子を使うことができます。

早速使ってみましょう。

時間区分(time_interval)の列ヘッダーメニューより計算を作成(Mutate) を選択します。

時間区分の列名 %within% インターバルの列名という順番で記述します。

time %within% time_interval

実行ボタンを押すと、is_usingという列が追加されます。

このis_using列は時間区分中にその利用者が実際に施設にいればTRUEを、いなければFALSEを保持します。

時間区分毎に施設利用中かを可視化

最後にこの計算結果を可視化してみましょう。

X軸にtime列を、Y軸にis_using列とTRUEの数を割り当てます。

すると、2018年5月30日のいち日で施設に実際利用している人数がどう推移したのかを可視化できました。