最近、AIが進展し現場での活用推進が始まっている。
製造現場では、毎日大量の製造データができる。現場が自主的に分析できたら強みになる。
AIに指示したら使えるプログラムを作ってくれるという。
しかし、無料AIには、現場の機密データを提供するなと。
有償AIならば、機密保持ができるが、無料AIならば全世界にデータを公開するのと同義だ。
そこで、使える手法としては、列名を抽象的なものとして、AIにプログラム作成を依頼したら、機密は漏れない。
データそのものは提供しないから。
例えば、AIへの依頼内容を下記にする。
製造日、品種、製造数、不良1,不良2、不良3・・・、などと記述し、それを集計し不良率を計算し、不良率高い順に並べるプログラムを作って。
データ例は、サンプルデータを作るプログラムを作れとAIに依頼すればよい。即座に作ってくれる。
このように依頼して、実際のデータの列名を上記に変更すれば、使えるプログラムを手に入れることができる。動作結果も確認できる。
使う場合は、ユーザーは、見出し行の列名を入れ替えるだけでよい。
事例紹介
エクセルデータを分析するプログラムをAI(Copilot)に作ってと依頼したら、とんでもなく長いコードを提示してきたという。
システム担当は、支援を拒否した。メンテナンス不能だから現場の責任で利用してほしいと。
コードをみたら、VBで作っていた。膨大な行数だった。やることは単純なはずなのに、エクセルのファイルでVBで作ったためだ。
特定のエクセルだけに通用する膨大なVBのプログラムの解読やメンテナンスは、専門家でも不可能だ。
目的を聞いたら、製造日報のエクセル元資料、ロットごとに、製造数・不良原因別不良数 のデータの集計と不良率高いものを調べたいと。
これに対して、AIのGeminiにPolarsを使ったプログラムを書いてと依頼した結果を下記紹介する。
データは、製造日、品名、製造数、不良1~不良5 という形式のCSVとした。
できたプログラムでは、不良項目数の制限はない。「不良+数」の項目を全て取り込んでくれる。
Geminiが提示したプログラムは、無修正で動作し、瞬時にファイルを読み込み、計算し、画面に表示した。
また、結果は、必要に応じてファイルに書き出すことも可能だ。
なによりも、短く、説明付きなので、読んで意味が解読できる。
元データを読み込み、各行の不良の数全部集計し、縦方向で品名毎に製造数と不良数の総計計算し、それで総計表を作り、不良率高い順に並べる。
そして、このプログラムならば、システム部門はメンテナンスや、アドバイスにも応じてくれるだろうし、AIに改善や異なる内容への対応も依頼しやすく、できたものの理解もしやすいだろう。
重要: Polarsは、文字コードは UTF-8だけ。エクセルでShift-JIS利用の場合は、 コード変換(回避策あるが)。
エクセル > ファイル > 名前を付けて保存 > ファイルの種類 > CSV UTF-8 (コンマ区切り) (*.csv) を選択
結果は、これ。品名はテストデータで自動作成したもの。
実際のデータを入れたら、品名は製造品名になります。

コードです。そのまま、貼り付けると動作します。
Polars 不良集計し・不良率・不良高い順表示プログラム
import datetimeimport polars as pl# ==========================================# STEP Polarsによるデータ集計・分析# ==========================================def analyze_production_data(filename="production_data.csv"): #関数宣言 # 1. CSVデータの読み込み df = pl.read_csv(filename) # 2. 各行の不良数合計(不良1〜5)を計算し、新しい列「総不良数」を追加 # pl.sum_horizontal を使うことで、行方向の計算を高速に行えます df_with_total_defects = df.with_columns( pl.sum_horizontal(pl.col(r"^不良\d+$")).alias("総不良数")
#各行で「不良+数」の列全て合計し「総不良数」列を作れ ) # 3. 品名ごとにグループ化して、製造数と総不良数を合計 summary_df = df_with_total_defects.group_by("品名").agg( pl.col("製造数").sum().alias("総製造数"), pl.col("総不良数").sum().alias("総不良数") ) # 4. 不良率の計算とソート # 不良率 = 総不良数 / 総製造数 result_df = summary_df.with_columns( (pl.col("総不良数") / pl.col("総製造数")).alias("不良率") ).sort("不良率", descending=True) # descending=True で高い順(降順) # 5. 結果の表示(不良率はパーセント表記で見やすくするためにフォーマットを適用することも可能ですが、ここでは生値) print("--- 不良率が高い順の集計結果 ---") print(result_df) # 必要に応じてCSVやExcelに書き出し可能 # result_df.write_csv("summary_result.csv")if __name__ == "__main__": #関数実行するぞ # 事前に pip install polars が必要です analyze_production_data()
なお、サンプルプログラム(元データ)を作ってと依頼したのが下記のPolars プログラム
import datetimeimport randomimport polars as pl# ==========================================# STEP サンプルCSVデータの生成# ==========================================def create_sample_csv(filename="production_data.csv"): #関数宣言 products = ["製品A", "製品B", "製品C", "製品D", "製品E"] start_date = datetime.date(2026, 7, 1) # CSVのヘッダー headers = ["製造年月日", "品名", "製造数", "不良1", "不良2", "不良3", "不良4", "不良5"] data_rows = [] # 5品種 × 10日間 = 50行のデータを生成 for day in range(10): current_date = start_date + datetime.timedelta(days=day) for prod in products: # 製造数は10から100のランダム make_count = random.randint(10, 100) # 不良数は製造数を超えないように、かつ現実的な範囲(各0〜3個程度)でランダム生成 defect1 = random.randint(0, min(3, make_count // 5)) defect2 = random.randint(0, min(3, make_count // 5)) defect3 = random.randint(0, min(3, make_count // 5)) defect4 = random.randint(0, min(3, make_count // 5)) defect5 = random.randint(0, min(3, make_count // 5)) row = [ current_date.strftime("%Y-%m-%d"), prod, make_count, defect1, defect2, defect3, defect4, defect5 ] data_rows.append(row) # ファイル書き込み with open(filename, "w", encoding="utf-8") as f: f.write(",".join(headers) + "\n") for row in data_rows: f.write(",".join(map(str, row)) + "\n") print(f"サンプルデータを作成しました: {filename}\n")if __name__ == "__main__": #関数実行するぞ # 事前に pip install polars が必要です create_sample_csv()
