Pythonスクリプト1本で業務を8時間短縮した話
先月、仕事でPythonスクリプトを1本書いて、毎月8時間かかっていた作業を20分に短縮した。その話を書いておく。
自動化する前の状況
私が担当していた業務のひとつに「月次レポートのデータ集計・整形」があった。
具体的にはこういう作業だ。
1. 複数のCSVファイルをダウンロードする(6〜8ファイル)
2. ExcelでCSVを開き、不要なカラムを削除する
3. 各ファイルのデータを一つのシートに統合する
4. 統合したデータを特定のフォーマットに整える
5. グラフを作成して体裁を整える
6. 完成したExcelファイルをSlackで送信する
毎月第1営業日にやる作業で、慣れても半日(6〜8時間)かかっていた。
「これ自動化できるな」とずっと思っていたが、業務が忙しいとついつい後回しにしていた。
スクリプトを書いた日の経緯
ある月曜日、月次レポート作業の途中でCSVファイルの形式が突然変わっていることに気づいた。カラム名が変更されていて、いつもの手順が使えない。
確認のためにデータ提供元に問い合わせたり、新しいカラム名を把握したりしているうちに「もう、Pythonで書き直した方が早い」という気分になった。
残り半分の作業を止めて、スクリプトを書き始めた。
実装に使ったのは pandas だけ
import pandas as pd
import glob
import os
# CSVファイルを一括読み込み
csv_files = glob.glob("./data/*.csv")
dfs = []
for file in csv_files:
df = pd.read_csv(file, encoding="shift-jis")
# 必要なカラムだけ残す
df = df[["日付", "商品名", "数量", "売上金額", "担当者"]]
dfs.append(df)
# 全ファイルを結合
combined = pd.concat(dfs, ignore_index=True)
# 集計
monthly_summary = combined.groupby("商品名").agg(
合計数量=("数量", "sum"),
合計売上=("売上金額", "sum")
).reset_index()
# 担当者別サマリー
rep_summary = combined.groupby("担当者").agg(
合計売上=("売上金額", "sum")
).reset_index().sort_values("合計売上", ascending=False)
# Excelに書き出し
with pd.ExcelWriter("月次レポート.xlsx", engine="openpyxl") as writer:
monthly_summary.to_excel(writer, sheet_name="商品別", index=False)
rep_summary.to_excel(writer, sheet_name="担当者別", index=False)
実際のスクリプトはもう少し複雑だが、本質的にはこれだけだ。pandasをある程度使えれば難しいことはない。
実行時間は20分
スクリプトを書くのに2時間かかった。初めての構造だったので試行錯誤しながら書いた。
完成したスクリプトを実行してみると、20分かかっていた手作業が30秒で終わった。
30秒でできることに半日かけていたことに、改めて呆れた。
「なぜもっと早く作らなかったのか」問題
スクリプト完成後、上司に共有したら「これ、去年から作れたんじゃないの?」と言われた。
正論だ。返す言葉がなかった。
自動化の投資回収を考えると、スクリプト作成に2時間かけた時点で、翌月以降は毎月7時間40分の節約になる。1ヶ月で元が取れる計算だ。
後回しにしていた理由は「忙しかったから」だが、本当は「今の作業を止めてスクリプトを書く時間を捻出するのが億劫だった」というのが正直なところだと思う。
自動化できるかどうかの判断基準
今は「同じ手順を3回以上繰り返したら自動化を検討する」をルールにしている。
3回目まではパターンを把握するため、4回目からはスクリプトで回す。このくらいのタイミングが、学習コストと自動化の効果が釣り合う気がしている。
特に以下の特徴がある作業は自動化しやすい。
逆に判断や確認が必要な作業は自動化が難しい。
おまけ:妻に報告したら
夜ご飯のときに「今日、仕事で8時間の作業を20分に短縮した」と話した。
妻は「へえ、すごいね。で、空いた時間で何したの?」と返してきた。
「他の仕事をした」と答えたら「なんか損してる気がする」と言われた。
確かに、節約した時間を余暇に使えればよかった。でも仕事なのでそうはいかない。自動化のご褒美は「同じ給料で成果を出せる」という達成感だ。それで満足しておくことにした。