はじめに
テレワークやフレックス勤務の普及により、社員の労働時間を正しく把握することがますます重要になっています。
勤怠管理システムを導入していない場合でも、社内システムやVPNのアクセスログを活用すれば、ある程度の勤務実態を分析できます。
本記事では、Pythonを使ってアクセスログを解析し、残業時間を可視化する方法を解説します。
アクセスログを利用した残業時間の把握とは?
- 社内システムやVPNには、通常「ログイン・ログアウト」の記録があります。
- 最初のログイン時間を「出社時刻」、最後のログアウト時間を「退社時刻」として扱えば、勤務時間の推定が可能です。
- 特に「定時以降の利用時間」を集計すれば、残業時間の見える化につながります。
サンプルデータの準備
今回は、以下のようなCSV形式のアクセスログを想定します。
user_id,timestamp,action
A001,2025-08-01 08:55:12,login
A001,2025-08-01 19:45:30,logout
A002,2025-08-01 09:05:47,login
A002,2025-08-01 18:10:22,logout
user_id
:社員IDtimestamp
:アクセス日時action
:login または logout
Pythonでログ解析するコード
import pandas as pd
import matplotlib.pyplot as plt
# CSV読み込み
df = pd.read_csv("access_log.csv", parse_dates=["timestamp"])
# 日付列を追加
df["date"] = df["timestamp"].dt.date
df["time"] = df["timestamp"].dt.time
# 出社時刻(最初のlogin)、退社時刻(最後のlogout)を取得
work_time = df.groupby(["user_id", "date"]).agg(
start_time=("timestamp", "min"),
end_time=("timestamp", "max")
).reset_index()
# 勤務時間(時間数)を計算
work_time["work_hours"] = (work_time["end_time"] - work_time["start_time"]).dt.total_seconds() / 3600
# 残業時間(例:定時を9:00〜18:00とする)
def calc_overtime(row):
end_of_regular = pd.Timestamp(str(row["date"]) + " 18:00:00")
overtime = (row["end_time"] - end_of_regular).total_seconds() / 3600
return max(overtime, 0)
work_time["overtime_hours"] = work_time.apply(calc_overtime, axis=1)
print(work_time)
# 可視化(棒グラフ)
plt.figure(figsize=(8,4))
work_time.groupby("user_id")["overtime_hours"].mean().plot(kind="bar")
plt.ylabel("Average Overtime Hours")
plt.title("Average Overtime per Employee")
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
実行結果のイメージ
- 各社員ごとの「平均残業時間」を棒グラフで表示
- 日別に推移を折れ線グラフで可視化することも可能
応用アイデア
- 部署単位での残業傾向を集計
- 曜日別の残業時間を分析して「月曜に長く働きがち」などの傾向を把握
- ダッシュボード化(StreamlitやPlotly Dashを利用)して経営層にレポート
まとめ
- アクセスログを利用すれば、勤怠システムがなくてもおおよその勤務時間が把握できる
- Python(Pandas + Matplotlib)で簡単に集計&可視化が可能
- 応用すれば、組織全体の労働時間の見える化 → 業務改善・働き方改革につながる