NASA C-MAPSS - Turbofan Degradation

20,631 cycles / 100 enginesengineeringpredictive-maintenancecosine

A TMAP of 20,631 operating cycles from 100 simulated turbofan engines in the NASA C-MAPSS FD001 dataset, built from 15 z-scored sensor readings per cycle (cosine metric). The tree organizes cycles by sensor signature rather than by engine or time, so the mean remaining-useful-life (RUL) delta across tree edges is 42.9 cycles (204 edges exceed the 99th percentile at 289+ cycles). Lifecycle phases (healthy, degrading, failing) show moderate tree coherence (64.8% same-phase edges, mean subtree purity 0.599), with clear degrading-to-healthy transitions dominating (10,254 edges) over sudden degrading-to-failing jumps (3,748 edges). Failing cycles across all 100 engines cluster tightly together (concentration ratio 0.74, versus 1.0 for the whole map), and individual engine degradation paths - e.g. Engine 1's 89-hop, 10-transition path from RUL 191 to failure - can be traced directly on the tree alongside the underlying sensor drift (sensor s14 drops 27.7 units, s4 rises 26.6).

NASA C-MAPSS - Turbofan DegradationOpen full page
Loading interactive demo…

How it was made

generate.pypython
import numpy as np
from tmap import TMAP
from tmap.graph.analysis import subtree_purity

# 15 sensors, dropped near-constant ones, z-scored per column
X = zscore_normalize(sensor_matrix[:, kept_sensor_cols])

model = TMAP(metric="cosine", n_neighbors=20, seed=42).fit(X)

# RUL gradient across tree edges
edges = model.tree_.edges
rul_delta = np.abs(rul[edges[:, 0]] - rul[edges[:, 1]])
print(f"Mean RUL gradient: {rul_delta.mean():.1f} cycles")

viz = model.to_tmapviz()
viz.add_color_layout("RUL", rul.tolist(), color="viridis")
viz.add_color_layout("lifecycle phase", phase_labels, categorical=True, color="Set1")
viz.write_html("turbofan_cmapss.html")