歩行加速度、MRI 形状特徴量、遺伝子発現、センサーデータでは、1 症例が数十〜数千の特徴量を持ちます。次元削減は、その高次元データを少数の軸へ写し、構造を見たり、前処理として扱いやすくしたりする方法です。ただし、2 次元に見えた群が、そのまま臨床サブタイプを意味するわけではありません。
本記事では、PCA・t-SNE・UMAP を比較します。PCA は解釈しやすい線形変換、t-SNE と UMAP は可視化に強い一方でパラメータ依存性があります。医療研究では、探索的可視化と予測モデルの評価を分けて考えます。「見える」ことと「検証された」ことを混同しない姿勢が重要です。前処理として PCA を使う場合の CV 内 fit については 09·02 データリーケージ と 14·02 交差検証デモ もあわせて参照してください。
// 01 · LEARN OUTCOMESこの記事で学ぶこと
- PCA・t-SNE・UMAP の目的と違いを説明できるようになる。
- 次元削減を「可視化」と「前処理」に分けて使えるようになる。
- t-SNE / UMAP の散布図を過剰に解釈しない視点を学ぶ。
- Pipeline 内で PCA を fit し、リーケージを避ける実装を確認する。
// 02 · CONCLUSIONまず結論
次元削減を使う目的は、大きく 2 つあります。1 つはデータを見て仮説を作ること、もう 1 つは予測モデルの前処理として次元を減らすこと。前者では散布図の見え方を説明しすぎないこと、後者では標準化や PCA を学習 fold 内で行うことが重要です。
リハ研究では、症例数が 100〜1,000 程度でも、歩行特徴量や画像特徴量が 100 個を超えることがあります。このとき、特徴量数が症例数に近づき、距離や相関が不安定になり、過学習も起きやすくなります。次元削減は、その問題を緩和する候補になりますが、情報を捨てる操作でもあります。
// 03 · FIGURE図で見る次元削減
図1では、PCA がデータのばらつきが大きい方向を第 1 主成分として選ぶ様子を示します。第 2 主成分は、第 1 主成分と直交する方向のうち、次に分散が大きい軸です。そのため PCA の軸は元の特徴量との関係を比較的たどりやすく、たとえば PC1 が「全体的な運動能力」に近い軸になることもあれば、「施設差」や「測定機器差」を表すこともあります。
図2では、同じ高次元データを t-SNE と UMAP で 2 次元化した例を想定します。t-SNE は近い症例を近く置く見せ方が得意で、UMAP は近傍構造を保ちながら大規模データでも扱いやすい場面があります。どちらも軸そのものに臨床的な意味は置きにくく、2 つの点の距離が近いからといって病態が近いとは限りません。
図の役割も分けて考えます。PCA の図は分散構造と軸の解釈を見せる図、t-SNE / UMAP の図は近傍構造を探索する図です。どちらも、分類モデルの汎化性能を示す図ではありません。予測性能は、交差検証や外部検証で別に評価します(14·02 交差検証デモ も参考)。
// 04 · CLINICALリハ研究での使いどころ
10m 歩行・TUG・加速度センサーから、周波数特徴量や左右差指標を多数作ることがあります。PCA や UMAP で可視化すると、脳卒中群と健常群の重なりを直感的に見られます。ただし、散布図の分離は分類性能ではありません。ROC AUC や外部検証とは別に扱います。
さらに、歩行速度や年齢で色を変えると、群の違いに見えた構造が別の要因で説明できる場合があります。たとえば脳卒中群と健常群が分かれて見えても、実際には歩行速度の差が主に反映されていることがあります。可視化は、そのような交絡の候補を探すためにも使えます。
遺伝子発現やオミクスデータでは、症例数より特徴量数が多くなります。PCA は全体の分散構造を把握する入口になり、群の違いだけでなく、バッチ差や施設差の混入も確認できます。予測モデルに使う場合は、CV の train fold 内で PCA を fit します。
PCA の loading を確認すると、どの特徴量が主成分に寄与したかを見られます。ただし loading は因果効果ではなく、「この遺伝子が病態を決める」とは読めません。あくまでデータ内の分散に対する寄与として扱います。
海馬体積・皮質厚・白質病変量などをまとめると、MRI 形状特徴量は高次元になります。UMAP で 2 次元化すると、認知症の病期や MMSE の分布を重ねて見られます。ただし、近くにある点が同じ病態を表すとは限りません。年齢・撮像条件・施設差も一緒に確認します。
MRI ではスキャナ・撮像プロトコル・前処理ソフトの差が出ます。UMAP の塊が施設ごとに分かれている場合、それは疾患分類ではなく測定条件の違いかもしれません。可視化の段階で施設ラベルを重ねると、後のモデル解釈が安全になります。
k 近傍法 や SVM は、特徴量空間での距離や境界に影響を受けます。特徴量が多いと、距離の意味が薄れやすくなります。PCA で次元を減らすとノイズを抑えられる場合がありますが、重要な臨床情報を失うこともあります。PCA あり・なしを同じ CV 設計で比較します。
たとえば歩行特徴量 120 個から歩行自立を予測する研究では、PCA で 10〜20 成分に圧縮する案があります。しかし、左右差や変動係数のような少数の特徴が重要な場合、PCA で薄まる可能性があります。予測性能だけでなく、臨床的に説明しやすいかも確認します。
// 05 · THEORY仕組みの要点
PCA: 分散が大きい方向を探す
PCA(Principal Component Analysis) は、元の特徴量を線形結合し、新しい軸を作る方法です。第 1 主成分はデータの分散が最大になる方向、第 2 主成分は第 1 主成分と直交し、次に分散が大きい方向です。Pearson の古典的な研究に由来する手法です[1]。
X: standardized data matrix
S = cov(X)
S v_j = lambda_j v_j
v_j : direction of principal component j
lambda_j : variance explained by component j
score_j = X v_j
PCA では寄与率を確認します。たとえば第 1〜第 5 主成分で大半の分散を説明できる場合、元の多数の特徴量を少数の成分に圧縮できます。ただし、分散が大きい方向が予測に重要とは限りません。アウトカムと無関係な施設差が、大きな分散を持つ場合もあります。
PCA では標準化が大きな意味を持ちます。FIM・TUG・歩行速度・加速度 RMS は単位が異なり、標準化しないと数値のスケールが大きい特徴量が主成分を支配します。距離や分散を扱う手法では、前処理の影響を強く受けます。そのため、PCA の前には StandardScaler を置きます。
t-SNE: 近い点を近く見せる
t-SNE は、高次元で近い症例同士を、低次元でも近く置くように最適化します[2]。局所構造を見せる力がありますが、軸の向き・クラスタ間距離・塊の大きさは、そのまま臨床的な距離として読めません。
High-dimensional similarity: p_ij
Low-dimensional similarity : q_ij
KL(P||Q) = sum_i sum_j p_ij * log(p_ij / q_ij)
Goal:
make q_ij close to p_ij
t-SNE では perplexity が重要です。perplexity は近傍の広さを決める感覚に近く、小さくすると局所的な塊が出やすくなり、大きくすると全体構造を見やすくなる場合があります。1 つの設定だけで結論を出さず、複数設定で安定性を見ます。
t-SNE は可視化のための手法として扱う方が自然です。新しい症例を同じ座標系へ安定して投影する用途には向きにくく、同じデータでも random_state や初期化で配置が変わります。論文図として使う場合は、パラメータと乱数 seed を記録します。
UMAP: 近傍グラフを低次元へ写す
UMAP は、高次元データの近傍関係をグラフとして捉え、低次元でも似た関係になるように配置します[3]。t-SNE と同様に可視化に使えますが、大きなデータでも扱いやすい場面があります。n_neighbors と min_dist が見た目に影響します。
n_neighbors:
local structure vs broader structure
min_dist:
compact clusters vs spread embedding
metric:
euclidean, cosine, correlation, etc.
n_neighbors が小さいと局所的なまとまりが強く出ます。大きいと、より広い構造を反映しやすくなります。min_dist が小さいと点が詰まりやすく、大きいと点が広がって表示されます。これらの設定により、同じデータでも印象が変わります。
UMAP はクラスタリング前の可視化にも使われます。しかし UMAP 上で見える塊をそのまま「病型」と読むのは危険です。別データで再現するか、元特徴量に戻って臨床的な説明を確認します。可視化・クラスタリング・予測評価は、別の解析として整理します。
目的別の使い分け
分散構造を理解したい場合は PCA が扱いやすく、主成分負荷量を見ればどの特徴量が軸に関係したかを確認できます。症例の局所的な近さを図にしたい場合は t-SNE、症例数が多く探索的に全体像も見たい場合は UMAP が候補です。
もう 1 つの実務的な注意は、教師なし手法でも「研究目的」は必要という点です。ラベルを使わない解析でも、どの特徴量を入れるか、どの症例を含めるかで結果は変わります。退院時アウトカムを見た後に特徴量を選ぶと、探索的解析でも解釈が偏ります。まず解析計画として、可視化する特徴量群・除外基準・パラメータ候補を決め、結果を「仮説生成」として提示します[4]。
予測モデルの前処理としては、まず PCA を検討します。t-SNE / UMAP は主に可視化として使います。UMAP を特徴量変換として使う実装もありますが、その場合も学習データで fit し、評価データへ transform する設計が必要です。本記事では、臨床研究で説明しやすい PCA を前処理の中心に置きます。
// 06 · IMPLEMENTATION · PYTHONPython 実装例
以下は教育用の仮想データです。実データでは、個人情報保護・倫理審査・施設ルール・データ利用規約を確認します。可視化目的の t-SNE / UMAP と、予測モデル評価を混同しない設計にします。PCA を前処理として使う場合は Pipeline 内に入れます。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.compose import ColumnTransformer
from sklearn.decomposition import PCA
from sklearn.impute import SimpleImputer
from sklearn.manifold import TSNE
from sklearn.model_selection import GroupKFold, cross_validate
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.linear_model import LogisticRegression
try:
import umap
except ImportError:
umap = None
RANDOM_STATE = 42
df = pd.read_csv("example_rehab_dataset.csv")
target = "walking_independent_discharge"
group_col = "hospital_id"
numeric_features = [
"age", "days_from_onset", "fim_motor_admission",
"fim_cognition_admission", "tug_seconds", "gait_speed",
"step_time_cv", "trunk_acc_rms", "left_right_asymmetry",
]
categorical_features = ["sex", "stroke_type", "assistive_device"]
X = df[numeric_features + categorical_features]
y = df[target].astype(int)
groups = df[group_col]
numeric_pipe = Pipeline([
("imputer", SimpleImputer(strategy="median")),
("scaler", StandardScaler()),
])
categorical_pipe = Pipeline([
("imputer", SimpleImputer(strategy="most_frequent")),
("onehot", OneHotEncoder(handle_unknown="ignore")),
])
preprocess = ColumnTransformer([
("num", numeric_pipe, numeric_features),
("cat", categorical_pipe, categorical_features),
])
# PCA for prediction: PCA is fitted inside each training fold.
pca_logistic = Pipeline([
("preprocess", preprocess),
("pca", PCA(n_components=0.90, random_state=RANDOM_STATE)),
("clf", LogisticRegression(
penalty="l2", solver="liblinear",
class_weight="balanced", max_iter=2000,
random_state=RANDOM_STATE,
)),
])
cv = GroupKFold(n_splits=5)
scores = cross_validate(
pca_logistic, X, y, groups=groups, cv=cv,
scoring={"auc": "roc_auc", "brier": "neg_brier_score"},
)
print("AUC:", scores["test_auc"].mean(), scores["test_auc"].std())
print("Brier:", -scores["test_brier"].mean())
# Exploratory visualization (NOT model validation).
X_vis = preprocess.fit_transform(X)
X_vis_dense = X_vis.toarray() if hasattr(X_vis, "toarray") else X_vis
pca_2d = PCA(n_components=2, random_state=RANDOM_STATE)
Z_pca = pca_2d.fit_transform(X_vis_dense)
print("Explained variance ratio:", pca_2d.explained_variance_ratio_)
plt.figure(figsize=(7, 5))
plt.scatter(Z_pca[:, 0], Z_pca[:, 1], c=y, s=25, alpha=0.75)
plt.xlabel("PC1"); plt.ylabel("PC2")
plt.title("Exploratory PCA plot")
plt.tight_layout(); plt.show()
tsne = TSNE(
n_components=2, perplexity=30,
learning_rate="auto", init="pca",
random_state=RANDOM_STATE,
)
Z_tsne = tsne.fit_transform(X_vis_dense)
plt.figure(figsize=(7, 5))
plt.scatter(Z_tsne[:, 0], Z_tsne[:, 1], c=y, s=25, alpha=0.75)
plt.xlabel("t-SNE 1"); plt.ylabel("t-SNE 2")
plt.title("Exploratory t-SNE plot")
plt.tight_layout(); plt.show()
if umap is not None:
reducer = umap.UMAP(
n_components=2, n_neighbors=30, min_dist=0.1,
metric="euclidean", random_state=RANDOM_STATE,
)
Z_umap = reducer.fit_transform(X_vis_dense)
plt.figure(figsize=(7, 5))
plt.scatter(Z_umap[:, 0], Z_umap[:, 1], c=y, s=25, alpha=0.75)
plt.xlabel("UMAP 1"); plt.ylabel("UMAP 2")
plt.title("Exploratory UMAP plot")
plt.tight_layout(); plt.show()
重要なのは、PCA を全データで fit してから CV に入れないことです。これは前処理の情報が評価 fold に漏れるためで、データリーケージ の典型例です。論文の図として全体構造を示す探索的可視化なら、その目的を明記して使い、予測性能の根拠としては扱いません。
実装を読むときは、fit_transform がどこで使われているかを確認します。予測モデルの評価では、学習データにだけ fit し、評価データには学習済みの変換を transform します。scikit-learn の Pipeline を使うと、この手順を fold ごとに保ちやすくなります[5]。
// 07 · MYTHSよくある誤解
- 誤解: t-SNE のクラスタは本物
- t-SNE は局所的な近さを見せる可視化です。perplexity や初期値で見た目が変わります。見えた塊は仮説であり、臨床的サブタイプの証明ではありません。
- 誤解: PCA は線形なので古い方法
- PCA は解釈性と再現性が高い基本手法です。寄与率・主成分負荷量・再現性を説明しやすく、医療研究では可視化だけでなく前処理にも使えます。
- 誤解: UMAP は t-SNE の上位互換
- UMAP と t-SNE は得意な見せ方が異なります。UMAP は大規模データで扱いやすい場合がありますが、
n_neighborsやmin_distに依存します。 - 誤解: 次元削減を入れると性能は上がる
- 情報が圧縮されてノイズが減る場合がある一方、予測に必要な情報を失う場合もあります。PCA あり・なしを同じ CV 設計で比較します。
// 08 · WRITING論文 Methods に書くこと
次元削減は、図として見せるだけでも解析結果の印象を強く左右します。そのため Methods では目的を明確に書き、「探索的可視化」なのか「予測モデルの前処理」なのかを分けます。
- 次元削減を行った目的を記載。
- 対象特徴量と標準化方法を記載。
- PCA の主成分数または寄与率基準を記載。
- t-SNE の perplexity・learning rate・初期化を記載。
- UMAP の n_neighbors・min_dist・metric を記載。
- 可視化結果を予測性能として扱っていないことを明記。
- PCA を予測モデルに使う場合、CV 内 fit としたことを記載。
- 施設差・バッチ差・年齢分布の重なりを確認した。
査読では、t-SNE / UMAP の図だけで群分けを主張していないかが見られます。また、PCA を全データで fit してから交差検証していないかも重要です。TRIPOD+AI は予測モデルの報告を整理する枠組みです[6]。PROBAST+AI の観点でも、前処理と評価の分離はリスク評価に関わります[7]。
「UMAP で 3 群に見えたため 3 サブタイプとした」という書き方は、根拠が弱く見えます。「探索的に 3 つの集まりが観察されたため、元特徴量と外部データで再現性を検討した」という流れにすると、主張の強さが整います。
Results では可視化図の説明も慎重にします。「明確に分離した」と書くより、「一部の症例が近接して配置された」と書く方が安全です。そのうえで、年齢・FIM・施設・病期などで色分けした補足図を示すと、読者が解釈しやすくなります。
Discussion では次元削減の限界を書きます。t-SNE / UMAP はパラメータに依存し、PCA は線形構造に限定されます。どの手法も臨床的なサブタイプを自動的に定義するものではなく、次の研究で再現性を確認するという位置づけが自然です。読者には図を「結果」ではなく「結果を考える入口」として配置し、元特徴量・臨床指標・検証データで確認する流れを示すと、可視化の役割が過剰になりません。
// 09 · CHECKLIST実装前チェックリスト
- 01PCA / t-SNE / UMAP の目的を分けた
- 02標準化を行った
- 03PCA を CV の外で fit していない
- 04t-SNE / UMAP のパラメータを記録した
- 05散布図の軸を臨床的な軸として説明していない
- 06色分けにアウトカムや施設差を重ねて確認した
- 07可視化結果と予測性能を分けて報告した
- 08見えたクラスタを別データで確認する計画がある
// 10 · QUIZ理解度チェック
-
Q1100 次元の歩行特徴量を、解釈しやすい少数軸にまとめたい場合の第一候補はどれですか。
- PCA
- t-SNE
- UMAP
- DBSCAN
SHOW ANSWER
A. PCA は線形変換で、寄与率や負荷量を確認できます。 -
Q2t-SNE / UMAP の散布図を読むときの注意として適切なのはどれですか。
- 軸の向きに臨床的意味がある
- 塊の数が疾患サブタイプ数を示す
- 探索的可視化として扱う
- CV の代わりに使える
SHOW ANSWER
C. 可視化は仮説生成であり、性能評価やサブタイプ証明とは分けます。 -
Q3PCA を予測モデルの前処理に使う場合、避ける実装はどれですか。
- Pipeline に PCA を入れる
- train fold 内で PCA を fit する
- 全データで PCA を fit してから CV する
- PCA あり・なしを比較する
SHOW ANSWER
C. 評価 fold の情報が前処理に漏れるため、リーケージになります。 -
Q4UMAP の見た目に影響する代表的なパラメータはどれですか。
- n_neighbors と min_dist
- C と gamma
- max_depth と min_samples_leaf
- alpha と l1_ratio
SHOW ANSWER
A. 近傍の広さと点の詰まり方に関係します。
// 11 · FAQよくある質問
- PCA・t-SNE・UMAP はどう使い分けますか?
- 分散構造を解釈しつつ前処理にも使いたいなら PCA、局所的な近さを可視化したいなら t-SNE、症例数が多く広い構造も同時に見たいなら UMAP が候補です。ただし t-SNE と UMAP は軸そのものに臨床的意味を置きにくく、可視化用途として扱うのが安全です。
- PCA を予測モデルに使うときの注意点は?
- 全データで PCA を fit してから交差検証すると、評価 fold の情報が前処理に漏れます。Pipeline 内に PCA を入れ、各訓練 fold で fit してテスト fold には transform のみ適用します。これが リーケージ を防ぐ基本パターンです。
- t-SNE / UMAP の散布図で見えた塊はサブタイプですか?
- そのままではサブタイプの証明になりません。perplexity・n_neighbors・min_dist・乱数 seed で見え方が変わるため、複数設定で再現するか、元特徴量や別データに戻って臨床的な意味を確認します。可視化はあくまで仮説生成です。
// REF参考文献
- Pearson K. On lines and planes of closest fit to systems of points in space. Philosophical Magazine 1901;2(11):559-572.
- van der Maaten L, Hinton G. Visualizing data using t-SNE. Journal of Machine Learning Research 2008;9:2579-2605.
- McInnes L, Healy J, Saul N, Großberger L. UMAP: Uniform manifold approximation and projection. Journal of Open Source Software 2018;3(29):861.
- Hastie T, Tibshirani R, Friedman J. The Elements of Statistical Learning. 2nd ed. Springer; 2009.
- Pedregosa F, Varoquaux G, Gramfort A, et al. Scikit-learn: Machine learning in Python. Journal of Machine Learning Research 2011;12:2825-2830.
- Collins GS, Moons KGM, Dhiman P, et al. TRIPOD+AI statement: updated guidance for reporting clinical prediction models that use regression or machine learning methods. BMJ 2024;385:e078378.
- Moons KGM, Wolff RF, Riley RD, et al. PROBAST+AI: an updated quality, risk of bias, and applicability assessment tool for diagnostic and prognostic prediction model studies using artificial intelligence. BMJ 2025;388:e082505.