学園祭におけるライブステージの人流への影響を解析しようとしてみた

2024/12/16に公開1

模擬店PoSデータから見る学園祭の人流

ゆるめのお話

大盛況でした2024年の筑波大学の学園祭(雙峰祭)、みなさんは楽しまれましたかね?
私たちの模擬店にもたくさんのお客様がいらしてくださったのが記憶にのこっています。

模擬店

そんな雙峰祭ですが、模擬店の出店企画もあり、「珈琲・俺」もこの模擬店企画のひとつです。
そこには内製した店舗オペレーション基幹システムが導入されており、付帯してPoSデータも収集していました。

このシステムについてはとりさんの
https://zenn.dev/toririm/articles/bea457a6765990
に詳しく記載されています。

ライブステージ

ここ数年は雙峰祭のステージ企画にて学外のアーティストさんをお呼びしてのライブステージが企画されるのが恒例となっているようです。
2024年にはTOOBOEさんにお越しいただきました。

このライブ、雙峰祭の中でも指折りの主要イベントでして、かなりの人数がそちらへ向かわれたようです。
筆者が模擬店店頭に立っていても客足が遠のくのを実感したほどでした。

ということで、本記事の主題、学園祭のライブステージがいかに人流に影響を与えたかについて、模擬店PoSデータから観察していきます。

結果

人流の変化をみるには

学園祭は2日間開催されるので、1日目のデータを比較対象として2日目(ライブステージのあった日)のデータとの差異を分析していきます。
下図を参照ください。
1日目のデータを赤、2日目のデータを青で示してあります。
2本の緑色の縦線は1本目がライブステージ開場(チケット購入者はこの時間までに来るようアナウンスされていた)、2本目は開演となります。

1日目の赤色のデータ点は一定の値を保つように推移していることが見られます。
一方で、2日目のデータ点は時系列で大きく変化しており、
特に開場直前(1本目の緑線前)で、誤差範囲[1]外の急峻な落ち込み(人が減った)を見ることができます。(図の矢印部分)

つまり?

ライブステージ入場の時間帯は、模擬店への来客数が少なそうです。

煮え切らない結論ですが、TOOBOEさんの人気ってすごいね!ということでライトな部分のお話は締めさせていただきます。
ここまで読んでいただきありがとうございました!

ちょっとだけ真面目なお話

  • 具体的な解析手法
  • 来客数は本当に少ないのか
  • 来客数が少ないのはライブステージが要因といえるか

これらの項目は後の項目で詳しく検討していきます。

人流の指標となる統計量の作成

今回の解析では模擬店PoSデータを対象としていますので、そのデータに含まれているものである必要があります。
理想的には模擬店への単位時間あたり来客数、注文待ち行列の長さなどが理想的ですが、そのようなデータは収集されていません。

そこで今回は人流の多寡を示す指標として、店舗オペレーションの混み具合を採用しました。
今回使用した観測量は、

  • 注文のタイムスタンプ
  • 注文内容(コーヒー類の杯数)

となります。
実際のPoSデータファイルはjson形式で、注文の内容や金額などのデータも含まれています。

注文頻度をあらわす統計量の作成

人流を再現する統計量として、模擬店への単位時間当たり来客数が考えられます。ただし、レジより上流工程に関するデータはとられていないため、直接そのような統計量を作成することはできません。

そこで、今回は単位時間当たりの注文杯数によってこの統計量を代替します。
そのために、まず注文がはいる間隔を計算し、

タイムスタンプの間隔を計算
function(time){
    duration <- sapply(2:length(time),function(x){difftime(time[x],time[x-1], units = "sec")})
    duration[duration > 5000 ] <- NA #日付を跨ぐときの間隔を欠損値に
    return(c(NA,duration))           #前の注文との時間差なので最初の値に欠損値を入れておく
}

その注文に含まれる合計杯数を間隔の逆数に掛けて、単位時間当たりの注文杯数としました。
注文間隔には

  • 注文内容の複雑さ
  • レジ担当者の作業練度
  • レジでのお釣り発生の有無
  • オペレーション混雑緩和目的の一時的オーダーストップ など
    多くの要因があり、かなりばらついたデータとなります。

これを緩和するために、以下の手順でデータを加工しています。

  • 時間方向でのbinning
  • 矩形窓での移動平均

binningは10分刻みで注文間隔をまとめ、移動平均では3データでの平均としています。(1binあたりの
エントリー数は平均8エントリー程度)
この結果として、ある時刻での単位時間当たり注文杯数は前後30分を参照して平滑化されています。

時間方向のbinning
function(data,timeseries,size_window){
    time_split <- function(timeseries,size_window){
        (trunc( as.numeric(timeseries - timeseries[1]) / (size_window*60) ) + 1)*size_window*60 +  timeseries[1]
    }
    data.frame(
        time_index =  unique(time_split(timeseries,size_window)),
        mean       =  sapply(split(data,time_split(timeseries,size_window)),mean,simplify = TRUE),
        entry      =  sapply(split(data,time_split(timeseries,size_window)),length,simplify = TRUE),
        sd         =  sapply(split(data,time_split(timeseries,size_window)),function(x){sqrt(var(x))},simplify = TRUE),
        error      =  sapply(split(data,time_split(timeseries,size_window)),function(x){sqrt(var(x))},simplify = TRUE)/sqrt(sapply(split(data,t      ime_split(timeseries,size_window)),length,simplify = TRUE))
    )
}
矩形窓の移動平均
function(data,timeseries,size_window){
    half_len <- (size_window-1)/2 #窓の幅は奇数を仮定
    data_internal <- filter(x = data, filter = rep(1/size_window,size_window))
    time_index    <- filter(x = timeseries, filter = c(rep(0,half_len),1,rep(0,half_len)))
    data.frame(
        time =as.POSIXlt(as.numeric(time_index), tz = "JST"),
        mean = as.numeric(data_internal))
}

店舗オペレーションの混雑ぐあいの指標作成

来客数に紐づけられる指標として、店舗の混雑ぐあいがあげられます。
混雑具合、つまるところオペレーション逼迫の程度についてですが、未提供のままスタックした杯数が候補として挙げられます。
この統計量は提供時間と強い相関があることがわかっており[2]、計算の煩雑さなどから、提供時間で代用するのが簡便です。

そこで、店舗オペレーションの混雑ぐあいの指標として、今回は提供までにかかった時間を統計量として使用します。
具体的には、ある注文の提供時刻-注文時刻となるような値をとります。

提供時間
function(TimeREADY,TimeIN){
    sapply(1:length(TimeIN),function(x){difftime(TimeREADY[x],TimeIN[x], units = "min")})
}

こちらについても、注文頻度をあらわす統計量の作成
と同様にbinning、移動平均処理を行いました。

結果(2)

ゆるめのお話で記載した結果と同じ様式でプロットしています。

提供時間の方では、注文杯数頻度でみられたような急峻な落ち込みが見られません。
これはオペレーションの都合から、提供時間は6分程度を下限として飽和することから、注文杯数頻度への応答が鈍ったものとして説明できます。

また、提供時間表示の1日目で観測された昼過ぎにかけてのピーク[3]が2日目では消失していることから、
「14時前に存在すると考えられるカフェ行の人流」はライブステージ他へ散逸したと推察できます。

以上これらのことから、

  • 来客数は本当に少ないのか
  • 来客数が少ないのはライブステージが要因といえるか

についてですが、
来客数に相関を持つことが期待される統計量が、誤差の範囲を超えて低下していることから、来客数の減少自体は事実として検討に値すると考えます。

来客数の減少原因については、学園祭ライブステージの他イベントとの比較や、気温等の環境的要因、基本的な客行動モデルとの対比などがなされていない以上、示唆を与えるにとどまっていると考えます。

結びに

長い間お読みいただきありがとうございました。
拙い部分も多々ありますなか、この記事を楽しんでお読みいただけましたら幸甚に存じます。
雙峰祭におこしいただいたみなさま、このような学園祭の場を提供していただいた学園祭実行委員会のみなさま、執筆の機会をくださったアドベントカレンダー主催者さま、最後に、この記事を読んでいただいたみなさまに感謝申し上げます。

脚注
  1. 誤差として(標準偏差)÷(エントリー数の平方根)を採用しています。移動平均のほうには誤差伝搬の式に基づいて反映されています。 ↩︎

  2. こちらの内容については来年度雙峰祭のお楽しみということで…(提供時間を予測することも?) ↩︎

  3. 1日目のピーク当該時刻近辺では店舗内備品のケトルが不調だったという事実を考慮する必要はありますが…こちらの影響評価はまたの機会に ↩︎

Discussion

210on210on

どんどん客入りが増えていった時間とか、カップ統合が上手かった時間とか、提供が速かった時間が見えてくる👀