59,834
Access events in the extended extract used for the main pattern analysis, covering a 6 month period in 2024.
Data Analyst Apprenticeship EPA
An anonymised analytics case study showing how access-control event data can reveal demand concentration, recurring usage patterns, and the strengths and limits of short-term forecasting for shared facilities.
59,834
Access events in the extended extract used for the main pattern analysis, covering a 6 month period in 2024.
32.4%
Of all events fell between 05:00 and 09:00, making the early-shift window the clearest operational pressure point.
371.8
Average Tuesday daily events in the extended extract, the highest weekday average in the source data.
ARIMA
Delivered lower MAE and RMSE than the tested SARIMA configuration in the saved Python model outputs.
This analysis explored whether access-control events from shared locker room areas could be used as a practical indicator for operational demand. The goal was not to infer occupancy minute by minute, but to show where access was clustered, how patterns repeated through the week, and whether forecasting daily volumes could support planning decisions.
The source files cover two iterations of the analysis: an initial combined extract with 12,858 events from a single month, and a later combined extract with 59,834 events from a 6 month period. All data on this page is based upon the extended extract for the main access-pattern visuals.
The analysis uses a simple, maintainable Python workflow built around event cleaning, time aggregation, exploratory plotting, and hold-out forecasting tests on daily totals.
Core environment for cleaning, aggregation, exploratory plotting, and time-series modelling.
Used in the Python workflow for column cleaning, date parsing, concatenation, and daily resampling.
Used for histograms, weekday counts, box plots, daily trend charts, and model-output plots.
Applied as the initial baseline model with an order of (5,1,0) on daily activity counts.
Compared against ARIMA with weekly seasonality using a seasonal order of (1,1,0,7) to check whether recurring weekly rhythm improved fit.
Explored as an alternative model, with forecast and component plots saved but no matching MAE or RMSE output.
Daily event counts were split chronologically into training and test windows using an 80:20 approach.
Event files were combined, parsed, checked for validity flags, and prepared for repeatable descriptive analysis.
Raw access times were rounded into 10-minute blocks to make pattern concentration easier to compare.
The charts below are redrawn from the original aggregates in the workbook extracts and the saved metrics. They preserve the analytical shape of the work without publishing room labels, names, card references, or raw event trails.
The combined extract shows a clear twin-peak profile, with the strongest concentration around 07:00 to 08:00 and a second surge around 19:00 to 20:00. Midday use was active, but materially lower than the shift-edge peaks.
Tuesday and Wednesday are the busiest average days in the extended extract. Weekend volumes are lower, but still substantial enough to matter for shared-facility planning.
The saved Python model outputs provide comparable error metrics for ARIMA and SARIMA. In both the shorter and longer extracts, the simpler ARIMA baseline produced lower MAE and RMSE than the tested SARIMA configuration. Prophet was fitted and plotted, but the saved output does not include matching error metrics, so it is treated here as exploratory rather than scored.
Average daily activity increased materially from spring into late summer and early autumn. October remains high, although the source extract only runs to 14 October.
Access events are not the same as occupancy, unique users, or dwell time. A person can scan multiple times in a day, and the source files only describe entry events for two rooms rather than end-to-end facility flow. The Python analysis also models daily counts without linked rota, holiday, or closure variables, so the forecasts should be treated as directional rather than operationally complete.
The Python workflow converts the event stream into daily totals and holds back the final 20% of observations as a test window. ARIMA and SARIMA are both fitted on the training segment and evaluated against the hold-out period with MAE, RMSE, and MSE. Prophet is then fitted for an additional trend and seasonality view, but the saved output does not publish equivalent error scores.
The source material supports a cautious but clear forecasting story. Although the access data showed recurring weekly and time-of-day patterns, the tested SARIMA configuration did not improve accuracy over the simpler ARIMA baseline. This suggests that seasonality was present descriptively, but not strong or stable enough in the daily-count model to justify the added complexity without further feature engineering.
On the extended extract, ARIMA recorded MAE 52.5 and RMSE 71.4. On the earlier shorter extract, it recorded MAE 25.6 and RMSE 33.7.
Supported directly by saved Python output.
The weekly seasonal specification underperformed in both saved runs, with MAE 89.7 and RMSE 106.3 on the extended extract, and MAE 30.1 and RMSE 39.6 on the shorter extract.
Seasonality was visible in the patterns, but this configuration did not capture it better than ARIMA.
The Python analysis fits a Prophet model and saves both forecast and component plots. Because no matching MAE or RMSE is printed, this page treats Prophet as explored rather than ranked.
Flagged explicitly to avoid overstating the evidence.
The case study suggests practical uses for access data beyond simple reporting, especially where a shared facility has repeatable surge periods and linked operational dependencies.
The strongest demand sits around early-shift and evening windows, which gives a clearer basis for staffing, support cover, or cleaning availability.
Tuesdays and Wednesdays appear consistently heavier, so those days are the natural starting point for capacity checks or local timetable review.
The rise from spring into late summer suggests that static assumptions about facility pressure would miss real operational change.
Even a simple daily model can provide an early warning baseline for unusual spikes when paired with local operational context.
Linked rota, calendar, or closure data would make it easier to move from descriptive analysis into more decision-ready forecasting.
The raw workbook extracts contain personal names, card-validation messages, room labels, workgroup labels, and card-related identifiers. None of that detail is reproduced here. This page removes or generalises personal and site-specific fields, combines the two source rooms into a shared anonymised view, and redraws charts from aggregated counts so the analytical structure remains representative without exposing sensitive operational detail.