製造DXを最速で実現!Python×生成AIでデータセット構築を効率化する方法

DX

製造業でのDX(デジタルトランスフォーメーション)を成功させる鍵は、「効率的なデータセット作り」にあります。製造現場では生産とともに大量のデータが生み出されていますが、生み出されるデータを有効活用できていない企業が多いのが実際です。DXを成功させるには、データを整理し、分析可能な形に整形する( = データセットを構築する)ことが必要です。

本記事では、Python生成AIを活用し、初心者でも取り組みやすい方法を徹底解説。製造現場の課題を解消し、成果をスピーディに実現するためのステップを紹介します。

造DXのゴールとは?工数削減と歩留まり改善を実現する方法

製造業のDX推進において最も重要なのは、以下の2つの目標を達成することです。

  1. 工数削減
  2. 歩留まり改善

これらは製造原価の削減に直結し、具体的な効果を数値で示しやすいため、経営層や現場スタッフからの賛同を得やすいという特徴があります。特に初期段階では、具体的な成果を迅速に示すことでプロジェクト全体の成功率が向上します。

製造DXを成功させる基盤:「データセット」の重要性と課題

製造DXの第一歩は、高品質なデータセットを構築することです。データセットとは、原因と結果が明確に対応付けられた表形式のデータを指します。データセットがあるとデータ分析が効率化し、適切な改善策を素早く講じることが可能になります。また、問題点を定量的に把握でき、対策の優先順位を決めやすくなります。

しかし、現場ではデータセットの形式でデータが保存されていることは稀で、初期整備が必要になることが多いです。筆者が製造現場でDXを進めた際、データ整理に半年以上を費やした経験があります。時間がかかっていた主な理由は以下の通りです。

  • プログラミングスキルの不足:
    1番の原因。そもそもプログラミングに慣れていなかったため、試行錯誤を繰り返した。
  • フォーマットの統一欠如:
    Excelファイルのセル結合や不要な記号が原因で、データ処理が非効率に。
  • 入力エラー:
    手作業での誤字が頻発し、データを取り込んで処理しても分析でエラーが起こった。

当時はうまい処理の仕方が分からず、かなり苦戦しました。結局手作業で直す場合も多くあったため分析前のデータセット作りで時間をかけていました。しかし、今は生成AIに処理の仕方を聞けば多くを解決出来るようになっています。

Pythonと生成AIで効率化!データセット構築の具体的手順と実例

以前はプログラミング学習に多大な時間が必要でした。筆者も習得に1年以上かかっています。しかし現在では生成AIの力を借りることで、コード作成の効率を大幅に向上させることができます。生成AIを使うことで、従来は1週間かかっていたコードの作成・修正作業が、わずか数時間で完了しました。また、プログラミング初心者でも、AIがコードの問題点を指摘・修正してくれるため、学習コストが劇的に低下します。

前回のブログで生成AIによるデータセット作成用のコードの紹介を行ったので、今回は作成したコードの修正を生成AIに行ってもらうことにしました。

実例: AIにプログラム修正を依頼する

以下は、生成AIを活用してデータセット作成プログラムを最適化した例です。プロンプトもコピペ可能にしているので、活用ください。

以下のプログラムに問題点があれば修正をお願いできますでしょうか?
修正箇所と修正理由についても解説をお願いします。

#プログラム
import os
import pandas as pd

def construct_dataset(folder1, folder2, folder3, output_file):
    # 1種目のファイル処理
    data1_list = []
    for file in os.listdir(folder1):
        if file.endswith('.csv'):
            filepath = os.path.join(folder1, file)
            df = pd.read_csv(filepath, header=None)
            data1_list.append(df.iloc[2, 2:6])

    data1 = pd.DataFrame(data1_list)

    # 2種目のファイル処理
    data2_list = []
    for file in os.listdir(folder2):
        if file.endswith('.csv'):
            filepath = os.path.join(folder2, file)
            df = pd.read_csv(filepath, header=None)
            data2_list.append(df.iloc[9, 31:33])

    data2 = pd.DataFrame(data2_list)

    # 3種目のファイル処理
    data3_list = []
    for file in os.listdir(folder3):
        if file.endswith('.csv'):
            filepath = os.path.join(folder3, file)
            df = pd.read_csv(filepath, header=None)
            data3_list.append(df.iloc[9, 2:22])

    data3 = pd.DataFrame(data3_list)

    # データを結合する
    combined_data = pd.concat([data1, data2, data3], axis=1)

    # 結果をCSVに保存
    combined_data.to_csv(output_file, index=False)

そして、以下が回答になります。修正点とその理由について丁寧に説明されています。プロトタイプ的に作ったコードなので、提示された修正は必要ないと考えられますが、生成AIを使って容易にプログラムの修正が可能なことがわかります。

以下にプログラムの問題点と修正内容を解説します。

---

## 問題点

### 1. **データの欠損チェック不足**
   各CSVファイルに期待されるデータ構造が存在しない場合(行数が不足している、特定の列が空など)、`df.iloc[...]`でエラーが発生します。

   **修正案**: データの欠損チェックを追加し、問題があるファイルをスキップするロジックを導入します。

---

### 2. **データ型やデータ整合性のチェック不足**
   `df.iloc[...]`で取得したデータが適切な型(数値、文字列など)でない場合、`pd.DataFrame`の操作や後続の処理で問題が発生する可能性があります。

   **修正案**: 必要に応じて型変換やデータクリーニングを実施します。

---

### 3. **フォルダやファイルの存在確認不足**
   指定されたフォルダや出力先ファイルに対する存在確認がありません。存在しない場合、`os.listdir`や`to_csv`がエラーを引き起こします。

   **修正案**: フォルダとファイルの存在確認を追加します。

---

### 4. **エラーハンドリング不足**
   CSVの読み込み時に問題が発生した場合、プログラム全体が停止してしまいます。

   **修正案**: CSVファイルの読み込み時に例外処理を追加し、問題が発生した場合でも他のファイル処理を続行できるようにします。

---

### 5. **コードの可読性と柔軟性の向上**
   各種目の処理が似たコードの繰り返しになっています。これにより、保守性が低下し、新たな種目を追加する際に冗長になります。

   **修正案**: 処理を関数化してコードを簡潔にします。

---

## 修正後のコード

以下が修正版のコードです。

```python
import os
import pandas as pd

def process_files(folder, row_idx, col_range):
    """特定フォルダ内のCSVファイルからデータを抽出する関数"""
    data_list = []
    if not os.path.exists(folder):
        print(f"フォルダが存在しません: {folder}")
        return pd.DataFrame()  # 空のDataFrameを返す

    for file in os.listdir(folder):
        if file.endswith('.csv'):
            filepath = os.path.join(folder, file)
            try:
                df = pd.read_csv(filepath, header=None)
                # 行列の範囲チェックを追加
                if len(df) > row_idx and max(col_range) < len(df.columns):
                    data_list.append(df.iloc[row_idx, col_range].values)
                else:
                    print(f"データが不足しています: {filepath}")
            except Exception as e:
                print(f"エラーが発生しました: {filepath} - {e}")
    
    return pd.DataFrame(data_list)

def construct_dataset(folder1, folder2, folder3, output_file):
    # 各フォルダのデータ処理
    data1 = process_files(folder1, 2, range(2, 6))   # 1種目
    data2 = process_files(folder2, 9, range(31, 33)) # 2種目
    data3 = process_files(folder3, 9, range(2, 22))  # 3種目

    # データを結合する
    combined_data = pd.concat([data1, data2, data3], axis=1)

    # 結果をCSVに保存
    try:
        combined_data.to_csv(output_file, index=False)
        print(f"データを保存しました: {output_file}")
    except Exception as e:
        print(f"CSVの保存中にエラーが発生しました: {e}")

# 使用例
# construct_dataset('folder1_path', 'folder2_path', 'folder3_path', 'output.csv')
```

---

## 修正内容と理由のまとめ

1. **データの欠損チェック**: 
   - `len(df)`や`len(df.columns)`で行・列の存在確認を実施。
   - 不足がある場合はスキップしてエラーメッセージを出力。

2. **フォルダの存在確認**: 
   - フォルダが存在しない場合に空のDataFrameを返す処理を追加。

3. **エラーハンドリング**:
   - CSVの読み込みやファイル保存時に例外処理を追加。

4. **コードの簡潔化**:
   - `process_files`関数を導入し、重複する処理を共通化。

---

この修正版では、エラー発生時の影響を最小限に抑えつつ、柔軟かつ堅牢なコード構造を提供しています。

まとめ:Python×生成AIでDXに踏み出そう!

製造DXの第一歩として、データセット構築は避けて通れない重要なステップです。本記事で紹介したPython×生成AIの活用法を実践することで、効率的にDXの成果を上げることができます。

「難しそう」「手間がかかりそう」と感じる方も、生成AIを活用すれば驚くほど簡単に進められるはずです。まずはPandasを使った簡単なデータ分析から始めてみませんか?本記事のコード例をコピーし、自社のデータに適用してみるだけでも、新たな発見があるかもしれません。

コメント

タイトルとURLをコピーしました