本ブログでは、より実践的な内容を提供できるよう、テストデータを用意しています。いずれも架空のデータではありますが、私が今までに経験した業務に基づいているため、それらしいデータになっていると思います。
本記事は、テストデータの具体的な内容について紹介するものです。
テストデータのダウンロードURL
まずはテストデータのダウンロードURLを掲載しておきます。
TestData.zip という圧縮ファイルがダウンロードできます。
圧縮ファイルには、次の6ファイルが格納されています。
ファイル名 | 内容 |
---|---|
AnomalyDetectionSample1.csv | 9個のセンサーデータ(SensorA~SensorI) が1000行分格納されている。 主に異常検知を評価するためのダミーデータであり、数か所異常値を含んでいる。 |
AnomalyDetectionSample2.csv | 9個のセンサーデータ(SensorA~SensorI) が1000行分格納されている。 主に可視化を行うためのダミーデータ。様々な周期性を持つデータを含んでいる。 |
画面遷移.csv | 架空の画面遷移のダミーデータ。 |
機械データ.csv | 機械(仮想のクレーン)を意識した稼働データで、センサーデータと操作データを含んでいる。 |
生産データ.csv | 3工場の注入工程における生産実績のダミーデータ。 |
設備データ.csv | 架空のライン設備のセンサーデータ。スイッチ操作や警報、エラーの状況、その時の作業者で構成されている。 |
テストデータの内容
参考として、テストデータにおいて、データ型カラムをグラフ化した画像と、先頭6件分のデータを掲載しておきます。
AnomalyDetectionSample1.csv
9種類のセンサーによる時系列データです。Sensor_Aのグラフにおいて、3か所だけ大きく値が下がっている箇所があり、Sensor_Fにも同じタイミングでノイズが発生しています。
このデータは、予兆検知や異常予測の説明用として作成しました。

SensorA | SensorB | SensorC | SensorD | SensorE | SensorF | SensorG | SensorH | SensorI | |
---|---|---|---|---|---|---|---|---|---|
500 | 0.30431658784842563 | -0.08224 | 0 | -0.07621 | -0.12857 | -0.09382 | -0.08224 | 0 | |
500 | -0.07424 | 0.5186912940064622 | 0 | 0.4108984420485081 | 0.072024 | 0.6911682078529606 | 0.5186912940064622 | 0.3090169943749474 | |
500 | -1.76926 | 0.9332861165369337 | 0 | 0.8232048894777195 | 0.042458312413483315 | 1.2072011569488592 | 0.9332861165369337 | 0.5877852522924731 | |
500 | -0.69797 | 1.445206393980982 | 98 | 0.8721761118066114 | 0.2628463983321603 | 0.8379184262139806 | 1.445206393980982 | 0.8090169943749475 | |
500 | 0.6312108032259265 | 1.6388546392892365 | 98 | 1.1788965344342328 | 0.15611160804189111 | 0.5369377669884254 | 1.6388546392892365 | 0.9510565162951535 | |
500 | -0.70025 | 2.0650100189860265 | 98 | 1.532094909877289 | 0.3252606577963151 | -0.13073 | 2.0650100189860265 | 1 |
AnomalyDetectionSample2.csv
こちらも9種類のセンサーで構成されており、後述するセンサーデータ生成プログラムで作成したデータです。センサーIの値にのみ異常値が存在します。

Sensor_A | Sensor_B | Sensor_C | Sensor_D | Sensor_E | Sensor_F | Sensor_G | Sensor_H | Sensor_I |
---|---|---|---|---|---|---|---|---|
-0.56317 | -2.09389 | 1.0240796084119783 | -3.40983 | 0.7661173866567665 | -1.92976 | 0.2988359255100189 | -1.32818 | 0.2427805020585266 |
0.6831819312214855 | -1.83292 | -0.03277 | -0.55116 | 0.8182673038386633 | -1.8339 | 0.17088211402631293 | -1.07961 | 0.3222160935288285 |
-0.45015 | -1.73 | -0.78516 | -3.3499 | -2.96969 | -1.81309 | 0.3264686420164822 | -1.72527 | 1.4929370048546085 |
0.081587 | -1.38734 | -0.88678 | -6.05037 | -0.659 | -1.97333 | 0.32596326838514145 | 0.5209825586462258 | 0.9410154565035618 |
0.1455294840174653 | -1.2846 | -0.40473 | -1.81919 | -2.06884 | -2.02337 | 0.33507091032063685 | -1.67136 | -0.24307 |
0.5697490688846225 | -1.11812 | 0.31869582272322794 | 3.2298744187154633 | 0.4522452789926181 | 2.4995784112938115 | 0.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 | ジャッキSW | PTOスイッチ | エアコンスイッチ | リミットスイッチ | 自動復帰スイッチ |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
A0001 | 2024/6/1 10:00:01 | アーム水平 | 0 | 0 | 0 | 0 | 0.1 | 30 | 1000 | 1 | 10 | 20 | 20 | 1200 | 1 | 0 | 1 | 0 | 0 | 0 |
A0001 | 2024/6/1 10:00:02 | アーム水平 | 0 | 0 | 0 | 0 | 0.1 | 31 | 1000 | 1 | 10 | 20 | 20 | 1200 | 1 | 0 | 1 | 0 | 0 | 0 |
A0001 | 2024/6/1 10:00:03 | 掘削作業 | 100 | 0 | 0 | 0 | 0.4 | 30 | 150000 | 1 | 10 | 90 | 90 | 2500 | 1 | 0 | 1 | 0 | 0 | 0 |
A0001 | 2024/6/1 10:00:04 | 掘削作業 | 500 | 0 | 0 | 0 | 0.5 | 29 | 100000 | 1 | 10 | 90 | 90 | 2400 | 1 | 0 | 1 | 0 | 0 | 0 |
A0001 | 2024/6/1 10:00:05 | 掘削作業 | 1000 | 0 | 0 | 0 | 0.3 | 31 | 80000 | 1 | 10 | 90 | 90 | 2300 | 1 | 0 | 1 | 0 | 0 | 0 |
A0001 | 2024/6/1 10:00:06 | アーム上昇 | 1500 | 0 | 0 | 0 | 0.1 | 30 | 1000 | 1 | 10 | 20 | 20 | 1200 | 1 | 0 | 1 | 0 | 0 | 0 |
生産データ.csv
薬液を充填・凝固させるラインにおいて、生産個数の実績、不良個数、不良内容と、その時のセンサー値が記録されています。
3つの工場の生産データで構成されており、「不良の原因特定」や「工場ごとの特徴の発見」に用いるアルゴリズムの説明に利用できます。

工場コード | 工程コード | ラインコード | ライン名称 | ロットNo | 生産日時 | 薬液A温度 | 薬液B温度 | 薬液C温度 | 中経路温度 | 混合炉内温度 | 冷却炉内温度 | 出口温度 | 計画生産個数 | 実績個数 | 不良個数 | 不良内容 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
20 | 006 | A015 | 注入ライン | 2021 | 2024/4/1 00:00 | 71.9 | 68.9 | 70.4 | 72.1 | 126.5 | 44.3 | 42.3 | 1000 | 891 | 10 | 凝固不十分 |
20 | 006 | A015 | 注入ライン | 2021 | 2024/4/1 00:10 | 72.1 | 69.1 | 70.6 | 72.1 | 123.8 | 43.3 | 41.3 | 1000 | 862 | 3 | 凝固不十分 |
20 | 006 | A015 | 注入ライン | 2021 | 2024/4/1 00:20 | 72.1 | 69.1 | 70.6 | 72 | 125 | 40.5 | 38.5 | 1000 | 864 | 3 | 凝固不十分 |
20 | 006 | A015 | 注入ライン | 2021 | 2024/4/1 00:30 | 72.1 | 69.1 | 70.6 | 72.2 | 125.8 | 41.3 | 39.3 | 1000 | 860 | 9 | 凝固不十分 |
20 | 006 | A015 | 注入ライン | 2021 | 2024/4/1 00:40 | 72.2 | 69.2 | 70.7 | 71.9 | 124.4 | 42.1 | 40.1 | 1000 | 898 | 5 | 凝固不十分 |
20 | 006 | A015 | 注入ライン | 2021 | 2024/4/1 00:50 | 72.2 | 69.2 | 70.7 | 72 | 124.8 | 41.8 | 39.8 | 1000 | 884 | 6 | 凝固不十分 |
設備データ.csv
製造ラインの設備に関するダミーデータです。コンベアに関するセンサーデータ、操作パネルのスイッチ状態、エラーや警告の発生有無、作業者のデータで構成されています。
例えば、作業者ごとの操作の違いや生産性、作業者ごとのエラーや警告の特徴などを分析するアルゴリズムの説明に利用できます。

時刻 | 速度調整VR(mV) | コンベア速度(cm/秒) | 回転数(rpm) | 重量センサー(kg) | 負荷率(kW/h) | 温度センサー(℃) | 制御SW1 | 制御SW2 | 制御SW3 | 制御SW4 | エラー | 負荷警報 | 重量オーバー警報 | 作業者 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2024/04/01 10:00:00 | 0 | 0 | 500 | 0 | 1000 | 31 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 山田 |
2024/04/01 10:01:00 | 0 | 0 | 500 | 0 | 1000 | 31 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 山田 |
2024/04/01 10:02:00 | 10 | 20 | 1000 | 0 | 2000 | 32 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 山田 |
2024/04/01 10:03:00 | 15 | 30 | 1250 | 0 | 2500 | 32 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 山田 |
2024/04/01 10:04:00 | 20 | 40 | 1500 | 50 | 3250 | 38 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 山田 |
2024/04/01 10:05:00 | 20 | 40 | 1500 | 50 | 3250 | 38 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 山田 |
2024/04/01 10:06:00 | 20 | 40 | 1500 | 50 | 3250 | 38 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 山田 |
センサーデータ生成プログラム
今回のテストデータを用意する際、ダミーのセンサーデータを生成するプログラムを作成したので紹介しておきます。下記はセンサーデータ生成用の関数です。
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()
まとめ
今回は本ブログで用いる説明用のテストデータ(ダミーデータ)について、種類と内容について解説しました。
ウェブ上には、データ分析の解説記事が山ほど存在しますが、いずれも製造業のデータ分析とは全く関係のないデータ(タイタニック、アヤメ、ボストン住宅価格、ワインの品質評価など)を使ったものがほとんどです。
これでは、具体的な説明ができないので、テストデータを作成することにしました。
全てのデータは架空のものですが、実際のデータに近くなるように工夫しています。本記事で紹介するテストデータを使って、より実践的なデータ分析に役立てていただければ光栄です。
コメント