MENU

【実践データ】本記事で使うテストデータのダウンロードについて

本ブログでは、より実践的な内容を提供できるよう、テストデータを用意しています。いずれも架空のデータではありますが、私が今までに経験した業務に基づいているため、それらしいデータになっていると思います。

本記事は、テストデータの具体的な内容について紹介するものです。

目次

テストデータのダウンロードURL

まずはテストデータのダウンロードURLを掲載しておきます。
TestData.zip という圧縮ファイルがダウンロードできます。

圧縮ファイルには、次の6ファイルが格納されています。

ファイル名内容
AnomalyDetectionSample1.csv9個のセンサーデータ(SensorA~SensorI) が1000行分格納されている。
主に異常検知を評価するためのダミーデータであり、数か所異常値を含んでいる。
AnomalyDetectionSample2.csv9個のセンサーデータ(SensorA~SensorI) が1000行分格納されている。
主に可視化を行うためのダミーデータ。様々な周期性を持つデータを含んでいる。
画面遷移.csv架空の画面遷移のダミーデータ。
機械データ.csv機械(仮想のクレーン)を意識した稼働データで、センサーデータと操作データを含んでいる。
生産データ.csv3工場の注入工程における生産実績のダミーデータ。
設備データ.csv架空のライン設備のセンサーデータ。スイッチ操作や警報、エラーの状況、その時の作業者で構成されている。

テストデータの内容

参考として、テストデータにおいて、データ型カラムをグラフ化した画像と、先頭6件分のデータを掲載しておきます。

AnomalyDetectionSample1.csv

9種類のセンサーによる時系列データです。Sensor_Aのグラフにおいて、3か所だけ大きく値が下がっている箇所があり、Sensor_Fにも同じタイミングでノイズが発生しています。
このデータは、予兆検知や異常予測の説明用として作成しました。

スクロールできます
SensorASensorBSensorCSensorDSensorESensorFSensorGSensorHSensorI
5000.30431658784842563-0.082240-0.07621-0.12857-0.09382-0.082240
500-0.074240.518691294006462200.41089844204850810.0720240.69116820785296060.51869129400646220.3090169943749474
500-1.769260.933286116536933700.82320488947771950.0424583124134833151.20720115694885920.93328611653693370.5877852522924731
500-0.697971.445206393980982980.87217611180661140.26284639833216030.83791842621398061.4452063939809820.8090169943749475
5000.63121080322592651.6388546392892365981.17889653443423280.156111608041891110.53693776698842541.63885463928923650.9510565162951535
500-0.700252.0650100189860265981.5320949098772890.3252606577963151-0.130732.06501001898602651

AnomalyDetectionSample2.csv

こちらも9種類のセンサーで構成されており、後述するセンサーデータ生成プログラムで作成したデータです。センサーIの値にのみ異常値が存在します。

スクロールできます
Sensor_ASensor_BSensor_CSensor_DSensor_ESensor_FSensor_GSensor_HSensor_I
-0.56317-2.093891.0240796084119783-3.409830.7661173866567665-1.929760.2988359255100189-1.328180.2427805020585266
0.6831819312214855-1.83292-0.03277-0.551160.8182673038386633-1.83390.17088211402631293-1.079610.3222160935288285
-0.45015-1.73-0.78516-3.3499-2.96969-1.813090.3264686420164822-1.725271.4929370048546085
0.081587-1.38734-0.88678-6.05037-0.659-1.973330.325963268385141450.52098255864622580.9410154565035618
0.1455294840174653-1.2846-0.40473-1.81919-2.06884-2.023370.33507091032063685-1.67136-0.24307
0.5697490688846225-1.118120.318695822723227943.22987441871546330.45224527899261812.49957841129381150.16158173198091758-2.98831-0.6259

画面遷移.csv

架空システムにおける画面遷移のログデータで、アクセス日時と遷移先画面名が時系列で並んでいます。

ユーザーログアウト,ユーザーログイン,ユーザー登録,メインメニュー,チャット,パスワードリセット,
バッチ処理起動,プロジェクト一覧,プロジェクト詳細,プロジェクト追加,画像サムネイル表示,会場一覧,
会場削除,会場編集,会場編集予約解除,会場予約登録,商品検索,商品削除,商品詳細,設備削除,設備登録,設備編集,
注文削除注文,注文登録,注文内容削除,注文内容追加,注文内容表示,注文内容編集,分析結果一覧,
報告書検索,報告書削除,報告書照会,報告書追加,報告書表示,報告書編集,報告書編集WorkState,作業項目編集,

アクセス日時画面名
2014-06-04 20:23:19.662ユーザーログイン
2014-06-04 20:23:27.466メインメニュー
2014-06-04 20:23:28.302チャット
2014-06-04 20:27:54.363会場編集
2014-06-04 20:27:57.694チャット
2014-06-05 15:56:53.184会場編集

機械データ.csv

クレーンの掘削作業で発生する稼働データを模倣したものです。
「正面の土を掘削」⇒「クレーンを上昇」⇒「クレーンを右90度旋回」⇒「右にあるダンプカーの荷台に土を下す」⇒「クレーンを左90度回転」⇒「クレーンを下降」という動作を5回繰り返しています。
クレーンは3台あり、それぞれ一部のデータが異なっています。

スクロールできます
車両ID時間 (秒)ステップ荷重センサー (kg)位置センサー (m)角度センサー (度)速度センサー (m/s)加速度センサー (m/s^2)温度センサー (°C)圧力センサー (Pa)距離センサー (m)傾斜センサースロットル位置センサーエンジン負荷センサーエンジン回転数センサーアウトトリガーSWジャッキSWPTOスイッチエアコンスイッチリミットスイッチ自動復帰スイッチ
A00012024/6/1 10:00:01アーム水平00000.130100011020201200101000
A00012024/6/1 10:00:02アーム水平00000.131100011020201200101000
A00012024/6/1 10:00:03掘削作業1000000.43015000011090902500101000
A00012024/6/1 10:00:04掘削作業5000000.52910000011090902400101000
A00012024/6/1 10:00:05掘削作業10000000.3318000011090902300101000
A00012024/6/1 10:00:06アーム上昇15000000.130100011020201200101000

生産データ.csv

薬液を充填・凝固させるラインにおいて、生産個数の実績、不良個数、不良内容と、その時のセンサー値が記録されています。
3つの工場の生産データで構成されており、「不良の原因特定」や「工場ごとの特徴の発見」に用いるアルゴリズムの説明に利用できます。

スクロールできます
工場コード工程コードラインコードライン名称ロットNo生産日時薬液A温度薬液B温度薬液C温度中経路温度混合炉内温度冷却炉内温度出口温度計画生産個数実績個数不良個数不良内容
20006A015注入ライン20212024/4/1 00:0071.968.970.472.1126.544.342.3100089110凝固不十分
20006A015注入ライン20212024/4/1 00:1072.169.170.672.1123.843.341.310008623凝固不十分
20006A015注入ライン20212024/4/1 00:2072.169.170.67212540.538.510008643凝固不十分
20006A015注入ライン20212024/4/1 00:3072.169.170.672.2125.841.339.310008609凝固不十分
20006A015注入ライン20212024/4/1 00:4072.269.270.771.9124.442.140.110008985凝固不十分
20006A015注入ライン20212024/4/1 00:5072.269.270.772124.841.839.810008846凝固不十分

設備データ.csv

製造ラインの設備に関するダミーデータです。コンベアに関するセンサーデータ、操作パネルのスイッチ状態、エラーや警告の発生有無、作業者のデータで構成されています。
例えば、作業者ごとの操作の違いや生産性、作業者ごとのエラーや警告の特徴などを分析するアルゴリズムの説明に利用できます。

スクロールできます
時刻速度調整VR(mV)コンベア速度(cm/秒)回転数(rpm)重量センサー(kg)負荷率(kW/h)温度センサー(℃)制御SW1制御SW2制御SW3制御SW4エラー負荷警報重量オーバー警報作業者
2024/04/01 10:00:000050001000310000000山田
2024/04/01 10:01:000050001000310011000山田
2024/04/01 10:02:001020100002000320011000山田
2024/04/01 10:03:001530125002500320011000山田
2024/04/01 10:04:0020401500503250380011000山田
2024/04/01 10:05:0020401500503250380011000山田
2024/04/01 10:06:0020401500503250380011000山田

センサーデータ生成プログラム

今回のテストデータを用意する際、ダミーのセンサーデータを生成するプログラムを作成したので紹介しておきます。下記はセンサーデータ生成用の関数です。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.signal import sawtooth, square

def generate_sensor_data(t, waveform='sin', amplitude=1, phase=0, frequency=1, noise_level=0, noise_frequency=0):
    """
    指定されたパラメータに基づいてセンサーデータを生成する関数
    Parameters:
    t (numpy array): 時間データ
    waveform (str): 波形の種類 ('sin', 'cos', 'sawtooth', 'square')
    amplitude (float): 波形の高さ
    phase (float): 波形の位相
    frequency (float): 波形の周波数
    noise_level (float): ノイズの標準偏差
    noise_frequency (float): ノイズの周波数
    Returns:
    numpy array: 生成されたセンサーデータ
    """
    if waveform == 'sin':
        data = amplitude * np.sin(2 * np.pi * frequency * t + phase)
    elif waveform == 'cos':
        data = amplitude * np.cos(2 * np.pi * frequency * t + phase)
    elif waveform == 'sawtooth':
        data = amplitude * sawtooth(2 * np.pi * frequency * t + phase)
    elif waveform == 'square':
        data = amplitude * square(2 * np.pi * frequency * t + phase)
    else:
        raise ValueError("Unsupported waveform type. Use 'sin', 'cos', 'sawtooth', or 'square'.")
    if noise_frequency > 0:
        noise = noise_level * np.sin(2 * np.pi * noise_frequency * t) + np.random.normal(0, noise_level, len(t))
    else:
        noise = np.random.normal(0, noise_level, len(t))
    return data + noise

下記はセンサーデータ生成関数を使ったサンプルです。このプログラムを使って AnomalyDetectionSample2.csv のダミーデータを生成しました。

# 使用例
# サンプル数
num_samples = 1000
t = np.linspace(0, 10, num_samples)
# センサーA: sinカーブ
sensor_A = generate_sensor_data(t, waveform='sin', amplitude=1, phase=0, frequency=1, noise_level=0.4, noise_frequency=0.5)
# センサーB: 0~10を2倍の周期で繰り返すのこぎり刃 + ノイズ
sensor_B = generate_sensor_data(t, waveform='sawtooth', amplitude=2, phase=0, frequency=5, noise_level=0.1, noise_frequency=0.2)
# センサーC: センサーAの3分の1の周期で、少し位相がずれたcos波
sensor_C = generate_sensor_data(t, waveform='cos', amplitude=1, phase=0.5, frequency=15, noise_level=0.1, noise_frequency=0.1)
# センサーD: 5秒ごとに0と1+ランダム値0~2のsquare波 + ノイズ
sensor_D = generate_sensor_data(t, waveform='sin', amplitude=1, phase=0, frequency=1/2, noise_level=2, noise_frequency=0.1) \
           + generate_sensor_data(t, waveform='sawtooth', amplitude=1, phase=10, frequency=1/5, noise_level=1, noise_frequency=0.4)

sensor_E = generate_sensor_data(t, waveform='cos', amplitude=1, phase=0, frequency=1/3, noise_level=1, noise_frequency=0.4) \
           + generate_sensor_data(t, waveform='square', amplitude=1, phase=10, frequency=1/5, noise_level=1, noise_frequency=0.4)

sensor_F = generate_sensor_data(t, waveform='square', amplitude=2, phase=50, frequency=1, noise_level=0.1, noise_frequency=0.1) \
          + generate_sensor_data(t, waveform='sawtooth', amplitude=1, phase=10, frequency=1/5, noise_level=0.1, noise_frequency=0.1)

sensor_G = generate_sensor_data(t, waveform='sin', amplitude=1, phase=20, frequency=1/3, noise_level=0.1, noise_frequency=5) \
         + generate_sensor_data(t, waveform='sin', amplitude=1, phase=5, frequency=1/4, noise_level=0.1, noise_frequency=12) \
         + generate_sensor_data(t, waveform='sin', amplitude=1, phase=0, frequency=1/5, noise_level=0.1, noise_frequency=3)

sensor_H = generate_sensor_data(t, waveform='sin', amplitude=1, phase=0, frequency=1/5, noise_level=1, noise_frequency=0.2) \
         + generate_sensor_data(t, waveform='sin', amplitude=1, phase=10, frequency=1/2, noise_level=1, noise_frequency=0.3)

sensor_I = generate_sensor_data(t, waveform='sin', amplitude=1, phase=0, frequency=12, noise_level=0.5, noise_frequency=0.2) \

# センサーIの値に異常値を追加(センサーA、E、Gが指定した値を超えた場合、センサーIに異常値(15)を設定
for i in range(num_samples):
    if sensor_A[i] >= 1.5 and sensor_E[i] < 0 and sensor_G[i] < 0:
        sensor_I[i] = 15

# データフレームにまとめる
data = pd.DataFrame({
    'Sensor_A': sensor_A,
    'Sensor_B': sensor_B,
    'Sensor_C': sensor_C,
    'Sensor_D': sensor_D,
    'Sensor_E': sensor_E,
    'Sensor_F': sensor_F,
    'Sensor_G': sensor_G,
    'Sensor_H': sensor_H,
    'Sensor_I': sensor_I
})


data.to_csv("d:/AnomalyDetectionSample2.csv",encoding="shift-jis",index=None)
fig = GridFig(5, 2, figsize=(15, 9))
fig.add(0, 0, data,data.columns)
fig.show()

まとめ

今回は本ブログで用いる説明用のテストデータ(ダミーデータ)について、種類と内容について解説しました。

ウェブ上には、データ分析の解説記事が山ほど存在しますが、いずれも製造業のデータ分析とは全く関係のないデータ(タイタニック、アヤメ、ボストン住宅価格、ワインの品質評価など)を使ったものがほとんどです。

これでは、具体的な説明ができないので、テストデータを作成することにしました。

全てのデータは架空のものですが、実際のデータに近くなるように工夫しています。本記事で紹介するテストデータを使って、より実践的なデータ分析に役立てていただければ光栄です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次