Kon's DX Lab - Case Study

Day 64|集計ルールを“誰でも使えるツール”に落とし込む──Streamlitで属人化を打破する第一歩

Published on 2025-06-04

🔬 Case Study Summary
Problem

(ここに課題を記述)

Result

(ここに具体的な成果を記述)


Tech & Process

(ここに採用技術とプロセスを記述) コードを詳しく見る »

こんにちは、こんです🦊

今日は「データ集計が人によって変わってしまう」「Excelの関数や手計算に頼りきっている」──そんな現場あるあるを整理すべく、誰でも同じ集計ができるStreamlitツールを作ってみました。


🧪 背景と実験のきっかけ

現場ではこんな問題が起きがちです:

  • 「集計方法は○○さんに聞いてください」と属人化してしまっている

  • 作業者によって処理ロジックや出力結果がバラバラ

  • マスタとの突合や、件数差分チェックが抜け落ちがち

特に「ECでの当選物集計」「くじ形式の商品における当選管理」「CSVベースのデータ処理」など、業務特有の集計ロジックを共通化・自動化することは、再現性ある運用を作る上で不可欠な要素です。


🛠 作ったツール:summary.py(シンプル集計ツール)

Streamlitベースで以下のような処理を実装しました。

✅ 機能一覧

  • CSVデータのアップロード

  • 当選物の分解処理(カンマ区切りの明細化)

  • 明細単位での当選数カウント

  • 注文数・顧客数・くじ引き回数の自動算出

  • 集計結果のCSV出力(Shift-JIS/ANSI対応)


🔍 実装イメージ(一部コード)

# 当選物列をカンマで分割 → explode で明細化
detail_df = df[["会員ID", "当選物"]].copy()
detail_df["当選物"] = detail_df["当選物"].fillna("")
detail_df = detail_df.assign(当選物コード=detail_df["当選物"].str.split(",")).explode("当選物コード")
detail_df["当選物コード"] = detail_df["当選物コード"].str.strip()

# 当選数のカウント
result_df = (
    detail_df
    .groupby(["会員ID", "当選物コード"])
    .size()
    .reset_index(name="当選数")
)

これにより、「誰が何をどれだけ当てたのか」が明快なテーブルになります。

💡 活用のポイント

  • くじ形式の商品(例:5連くじ、10連くじ、15連くじなどのセット商品)でも、明細化すれば正確な分析が可能に

  • 明細ごとの集計を「注文単位」「会員単位」で展開することで、CRMや商品戦略にも応用可

  • データ作成者と分析者を分離することで、属人性を減らせる

🔽 ダウンロード機能(cp932でWMS対応)

buffer = io.BytesIO()
result_df.to_csv(buffer, index=False, encoding="cp932")
buffer.seek(0)
st.download_button("📥 当選物集計CSV (ANSI)", data=buffer, file_name="lot_summary.csv", mime="text/csv")

encoding="cp932" を使うことで、日本の業務システム(WMS等)にもスムーズにインポート可能です。

✅ このツールでできること(まとめ)


🚀 今後の展開

今回は「最も基本的な処理(summary.py)」の整理にとどめましたが、
次回は列マッピングUIやマスタ連携を追加した summary2.pyを紹介予定です。

今後さらに、

  • 商品マスタとの照合

  • 選べる当選物の補完ロジック

  • セットくじ形式への対応

といった機能を追加していく予定です。


🔚 まとめ

属人化していた集計作業をツールに落とし込むことで、「誰がやっても正しい」状態が作れました。

「集計ってこういうもの」と曖昧に処理されがちな部分こそ、こうした再現可能な仕組みで明確化していくのが、DX推進の第一歩だと実感しました。

#業務改善 #Python #Streamlit #CSV処理 #属人化対策 #DX推進 #集計ツール #データ可視化 #くじEC運用 #再現性のある仕組み化 #cp932対応