# 2026年版 データサイエンス面接の頻出質問25選 > 統計学、機械学習、特徴量エンジニアリング、ディープラーニング、システム設計に関するデータサイエンス面接の重要質問25問をPythonコード付きで詳しく解説。 - Published: 2026-04-05 - Updated: 2026-04-05 - Author: SharpSkill - Tags: data-science, interview, machine-learning, python, statistics - Reading time: 15 min --- 2026年のデータサイエンス面接は、教科書的な知識の暗記だけでは突破できない時代となっています。採用担当者は、統計理論の正確な理解はもちろん、実務での応用判断力、さらには複雑なビジネス課題を構造化して解決するエンジニアリング思考まで、多面的なスキルを評価します。本記事では、現場のデータサイエンティストが実際の面接で問われた質問25問を厳選し、Pythonコードと実践的な解説を交えて解説します。 > **面接官が実際に評価するポイント** > > 優れたデータサイエンティストの評価は、3つの次元で行われます。第1に**統計的基盤**(確率論、仮説検定、ベイズ推論の深い理解)、第2に**機械学習のメカニズム**(アルゴリズムの内部動作とトレードオフの把握)、第3に**応用判断力**(ビジネス文脈に応じた手法選択とコミュニケーション能力)です。回答においては、これら3つを意識しながら構造的に説明することが重要です。 ## 確率と統計の基礎 **Q1: コインを10回投げて8回表が出ました。このコインには偏りがあると言えますか?** 二項検定を用いて帰無仮説(コインは公平、p=0.5)を検証します。p値が有意水準(通常α=0.05)を下回る場合に帰無仮説を棄却し、偏りがあると判断します。10回中8回という結果では、p値は約0.109となり、有意水準5%では帰無仮説を棄却できません。すなわち、この結果だけでは統計的に有意な偏りがあるとは言えません。 ```python # binomial_test.py from scipy import stats # Two-sided binomial test: is the coin fair? result = stats.binomtest(k=8, n=10, p=0.5, alternative='two-sided') print(f"p-value: {result.pvalue:.4f}") # 0.1094 (two-sided) print(f"Reject H0 at alpha=0.05? {result.pvalue < 0.05}") # False ``` この質問への模範回答では、第一種の過誤(偽陽性)と第二種の過誤(偽陰性)、さらに検定力(power)への言及が評価を高めます。標本サイズが小さいほど検定力は低くなり、真の偏りを見落とすリスクが高まります。「有意差がない」は「差がない」ことを証明するわけではないという理解を明示することが重要です。 **Q2: ベイズ推定と頻度主義的推定の違いを説明してください。** 頻度主義では、パラメータは固定した真の値であり、データが繰り返しサンプリングされると考えます。95%信頼区間は「同じ手順を繰り返せば95%の区間が真の値を含む」という長期的確率の解釈です。一方ベイズ推定では、パラメータ自体が確率分布を持ち、事前分布(prior)とデータの尤度を組み合わせた事後分布(posterior)を求めます。 ```python # bayesian_vs_frequentist.py import numpy as np from scipy import stats # Frequentist: confidence interval for a mean data = np.array([23.1, 25.4, 22.8, 24.9, 23.7, 25.1, 24.3]) ci = stats.t.interval(0.95, df=len(data)-1, loc=np.mean(data), scale=stats.sem(data)) print(f"95% CI (frequentist): [{ci[0]:.2f}, {ci[1]:.2f}]") # Bayesian: posterior with conjugate prior (Normal-Normal) prior_mean, prior_var = 24.0, 4.0 # prior belief data_mean, data_var = np.mean(data), np.var(data, ddof=1) / len(data) # Posterior parameters (conjugate update) post_var = 1 / (1/prior_var + 1/data_var) post_mean = post_var * (prior_mean/prior_var + data_mean/data_var) post_ci = stats.norm.interval(0.95, loc=post_mean, scale=np.sqrt(post_var)) print(f"95% credible interval (Bayesian): [{post_ci[0]:.2f}, {post_ci[1]:.2f}]") ``` ベイズの信用区間(credible interval)は「この区間にパラメータが95%の確率で存在する」という直感的な解釈が可能です。事前知識を定量的に組み込める点が実務上の強みであり、サンプルサイズが小さい場面やドメイン知識が豊富な場合に特に有効です。 **Q3: 中心極限定理が成り立たないケースとその影響は?** 中心極限定理(CLT)は標本平均の分布が正規分布に収束することを保証しますが、分散が無限大(無限分散)の分布、例えばコーシー分布やパレート分布の重い裾(heavy tail)では成立しません。金融リターンや自然言語の単語頻度など、べき乗則に従うデータでは、外れ値の影響が支配的となり、平均値自体が安定した統計量ではなくなります。こうした場合には、中央値や分位点回帰、ロバスト推定量(Huber推定など)の使用が推奨されます。 ## 特徴量エンジニアリングとデータ準備 **Q4: 欠損値がモデル学習に与える影響と、単純な補完以外の戦略は?** 欠損パターンは3種類に分類されます。MCAR(完全にランダムな欠損)は最も良性で、平均値補完が機能します。MAR(観測変数に依存した欠損)はKNN補完や多重代入法(MICE)が適切です。最も問題なのはMNAR(欠損値自体が情報を持つ)で、単純な補完では情報が失われます。 ```python # missing_data_strategies.py import pandas as pd from sklearn.impute import KNNImputer, SimpleImputer from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputer df = pd.DataFrame({ 'age': [25, 30, None, 45, None, 38], 'income': [50000, None, 70000, 90000, 60000, None], 'score': [85, 90, 78, None, 88, 92] }) # Strategy 1: KNN imputation (preserves local structure) knn_imp = KNNImputer(n_neighbors=2) df_knn = pd.DataFrame(knn_imp.fit_transform(df), columns=df.columns) # Strategy 2: Iterative imputation (MICE-like, models each feature) iter_imp = IterativeImputer(max_iter=10, random_state=42) df_iter = pd.DataFrame(iter_imp.fit_transform(df), columns=df.columns) # Strategy 3: Add missingness indicator (preserves signal in the pattern) df['income_missing'] = df['income'].isna().astype(int) print(df_knn.round(1)) ``` 欠損インジケータ変数の追加(Strategy 3)は、欠損パターン自体が目的変数と相関する場合に特に有効です。例えば、収入の欠損が低収入と相関する場合、その情報をモデルに伝えることができます。 **Q5: ターゲットエンコーディングとは何か。ワンホットエンコーディングに対する優位性は?** ターゲットエンコーディングは、カテゴリカル変数の各カテゴリを目的変数の条件付き期待値(平均)で置き換える手法です。ワンホットエンコーディングが高カーディナリティ(カテゴリ数が多い)な特徴量に対してスパースで高次元な表現を生成するのに対し、ターゲットエンコーディングは1列で情報を凝縮できます。ただし、ナイーブな実装ではデータリーケージが発生するため、K分割交差検証による実装が必須です。 ```python # target_encoding.py import pandas as pd import numpy as np from sklearn.model_selection import KFold def target_encode_kfold(df, col, target, n_splits=5): """Target encoding with K-fold regularization to prevent leakage.""" encoded = pd.Series(index=df.index, dtype=float) global_mean = df[target].mean() kf = KFold(n_splits=n_splits, shuffle=True, random_state=42) for train_idx, val_idx in kf.split(df): # Compute means only from training fold means = df.iloc[train_idx].groupby(col)[target].mean() encoded.iloc[val_idx] = df.iloc[val_idx][col].map(means) # Fill categories unseen in training fold with global mean encoded.fillna(global_mean, inplace=True) return encoded df = pd.DataFrame({ 'city': ['Paris', 'Lyon', 'Paris', 'Marseille', 'Lyon', 'Paris', 'Marseille', 'Lyon', 'Paris', 'Marseille'], 'hired': [1, 0, 1, 0, 1, 1, 0, 0, 1, 1] }) df['city_encoded'] = target_encode_kfold(df, 'city', 'hired') print(df[['city', 'city_encoded', 'hired']]) ``` K分割を用いることで、各サンプルのエンコード値は自身を含まない学習フォールドの統計量から計算されます。これにより目的変数の情報が特徴量に直接漏れる(リーケージ)問題を防ぎ、汎化性能を維持できます。 ## 機械学習の基本概念 **Q6: バイアス-バリアンストレードオフとは何か。ツリーベースモデルでの現れ方は?** バイアスは、モデルの仮定が実際の関係性とどれだけ乖離しているかを表します(過少適合の原因)。バリアンスは、訓練データの変動にモデルがどれだけ敏感かを表します(過剰適合の原因)。ツリーベースモデルでは、木の深さがこのトレードオフを制御します。浅い木(depth=2〜3)は高バイアス・低バリアンスとなり、深い木は低バイアス・高バリアンスとなります。アンサンブル手法のバギング(ランダムフォレスト)はバリアンスを低減し、ブースティング(XGBoost)はバイアスを段階的に低減します。正則化パラメータ(min_samples_leaf、max_depth、learning_rate)の適切な調整が実務上の鍵となります。 **Q7: 不均衡データセットで正解率(accuracy)が不適切な指標である理由と代替指標は?** 95対5の不均衡データでは、すべてのサンプルを多数クラスと予測するだけで95%の正解率が得られます。この場合、少数クラス(しばしばビジネス上重要なクラス)の予測精度が全く反映されません。適切な代替指標として、適合率(Precision)、再現率(Recall)、F1スコア、ROC AUC、特に不均衡が極端な場合はPR AUC(AUPRC)が推奨されます。 ```python # imbalanced_metrics.py from sklearn.metrics import ( classification_report, precision_recall_curve, average_precision_score, roc_auc_score ) import numpy as np # Simulated predictions on imbalanced data np.random.seed(42) y_true = np.array([0]*950 + [1]*50) # 95/5 imbalance y_scores = np.random.beta(2, 5, 1000) # predicted probabilities y_scores[y_true == 1] += 0.3 # positive class scores slightly higher y_scores = np.clip(y_scores, 0, 1) y_pred = (y_scores > 0.5).astype(int) print(classification_report(y_true, y_pred, digits=3)) print(f"ROC AUC: {roc_auc_score(y_true, y_scores):.3f}") print(f"Average Precision (AUPRC): {average_precision_score(y_true, y_scores):.3f}") ``` 適合率と再現率のトレードオフは、ビジネス要件に応じて閾値を調整することで最適化できます。例えば、不正検知では再現率を重視し(見逃しのコストが高い)、スパムフィルタでは適合率を重視します(誤検知のコストが高い)。 **Q8: L1正則化とL2正則化の違いと使い分けは?** L1正則化(Lasso)は損失関数に係数の絶対値の和を加えます。スパースな解(多くの係数がゼロ)を生成するため、特徴量選択の効果があります。L2正則化(Ridge)は係数の二乗和を加え、全係数を均等に縮小しますが完全にはゼロにしません。相関の高い特徴量が多い場合はRidgeが安定します。ElasticNetはL1とL2を組み合わせ、スパース性と安定性を両立します。特徴量が多く、その多くが無関係と考えられる場合はLasso、多重共線性が懸念される場合はRidgeを選択するのが基本方針です。 **Q9: 勾配ブースティングツリー(XGBoost/LightGBM)でのカテゴリカル特徴量の処理方法の違いは?** XGBoostは従来、カテゴリカル特徴量を数値にエンコードしてから入力する必要がありました。LightGBMはネイティブなカテゴリカルサポートを持ち、最適な分割を効率的に探索できます。XGBoost 1.7以降はexperimental段階でカテゴリカルサポートが追加されています。実務では、LightGBMのネイティブ処理が高カーディナリティ特徴量に対して特に高速で、ターゲットエンコーディングとの比較実験が推奨されます。 ## モデル評価と検証 **Q10: データリーケージとは何か。最も一般的な3つの原因は?** データリーケージとは、モデルが本番環境では利用できない将来の情報や目的変数由来の情報を学習に利用してしまうことです。主な3つの原因は次の通りです。第1に**時間的リーケージ**(時系列データで未来のデータが訓練に混入)、第2に**ターゲットリーケージ**(目的変数と因果関係のある派生特徴量の使用)、第3に**前処理リーケージ**(正規化やエンコーディングをテストデータを含む全体に適用)です。 ```python # leakage_prevention.py from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.impute import SimpleImputer from sklearn.ensemble import GradientBoostingClassifier from sklearn.model_selection import cross_val_score import numpy as np X = np.random.randn(1000, 10) y = (X[:, 0] + X[:, 1] > 0).astype(int) # WRONG: fit scaler on all data, then cross-validate scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # leakage: test fold info in scaling # CORRECT: pipeline ensures preprocessing fits only on training folds pipeline = Pipeline([ ('imputer', SimpleImputer(strategy='median')), ('scaler', StandardScaler()), ('model', GradientBoostingClassifier(n_estimators=100, random_state=42)) ]) scores = cross_val_score(pipeline, X, y, cv=5, scoring='roc_auc') print(f"AUC (no leakage): {scores.mean():.3f} +/- {scores.std():.3f}") ``` scikit-learnのPipelineは、交差検証の各フォールドで前処理を訓練データのみに適合させることを保証します。これにより、スケーリング・補完・エンコーディングすべての前処理ステップでリーケージを防止できます。 **Q11: 時系列交差検証が標準のK分割交差検証より適切な場面は?** 時系列データでは、未来のデータで過去を予測するという現実にあり得ないシナリオをK分割交差検証が作り出してしまいます。TimeSeriesSplitは常に過去のデータで未来を予測するウォークフォワード検証を実装し、実際の本番環境に即した評価が可能です。また、ユーザーやグループをまたいだリーケージが懸念される場合はGroupKFold、クラス比率を保持したい場合はStratifiedKFoldが適切です。 > **面接でよくある落とし穴** > > 交差検証の手法を問われたとき、多くの候補者は反射的にK分割交差検証(K-Fold CV)と答えます。しかし、面接官が評価するのはデータの特性に応じた手法選択の判断力です。時系列データにはTimeSeriesSplit、グループデータにはGroupKFold、クラス不均衡データにはStratifiedKFoldを使い分けられることを明示的に説明できるかどうかが、中級者と上級者を分ける分岐点となります。 ## ディープラーニングとニューラルネットワーク **Q12: 深層ネットワークでシグモイドではなくReLUが使われる理由と、ReLUの限界は?** シグモイド関数は入力が大きくなると勾配がほぼゼロになる「勾配消失問題」を引き起こします。深層ネットワークでは逆伝播時に勾配が積層するため、シグモイドでは初期層がほとんど学習できなくなります。ReLU(Rectified Linear Unit)は正の領域で勾配が1となり、この問題を大幅に緩和します。ただしReLUは「Dying ReLU問題」を持ち、ニューロンへの入力が常に負になると勾配がゼロのまま回復しません。これに対しLeaky ReLU(負領域に小さな傾きを持つ)、ELU、Swishなどの変種が提案されています。 **Q13: アテンションメカニズムとTransformerがRNNに取って代わった理由は?** RNN(LSTM/GRU含む)は系列を逐次処理するため、長距離依存関係の学習が困難で、並列化もできません。Transformerのセルフアテンション機構は系列内の全トークン間の関係を一度に計算し、距離に関わらず直接的な依存関係を学習できます。さらに行列演算の並列化が可能なため、GPUクラスタでの大規模学習に適しています。 ```python # self_attention.py import torch import torch.nn.functional as F def self_attention(x, d_k): """Scaled dot-product self-attention from scratch.""" # x shape: (batch_size, seq_len, d_model) batch_size, seq_len, d_model = x.shape # Linear projections for Q, K, V W_q = torch.randn(d_model, d_k) * 0.1 W_k = torch.randn(d_model, d_k) * 0.1 W_v = torch.randn(d_model, d_k) * 0.1 Q = x @ W_q # (batch, seq_len, d_k) K = x @ W_k V = x @ W_v # Scaled dot-product attention scores = Q @ K.transpose(-2, -1) / (d_k ** 0.5) # (batch, seq_len, seq_len) weights = F.softmax(scores, dim=-1) # attention weights output = weights @ V # (batch, seq_len, d_k) return output, weights # Example: 1 batch, 4 tokens, 8-dim embeddings x = torch.randn(1, 4, 8) out, attn = self_attention(x, d_k=8) print(f"Output shape: {out.shape}") # (1, 4, 8) print(f"Attention weights:\n{attn[0].detach().numpy().round(3)}") ``` スケーリング係数(√d_k で除算)は、次元数が増えるにつれてドット積の値が大きくなり、softmaxが飽和する問題を防ぎます。この単純な数式的工夫がTransformerの安定した学習を支えています。 **Q14: ファインチューニングと転移学習の違いと使い分けは?** 転移学習は、大規模データで事前学習したモデルの特徴抽出器(ベース層)を凍結し、新たなタスク用のヘッド部分のみを学習します。ファインチューニングはベース層の一部または全部を新しいタスクのデータで再学習します。ターゲットドメインのデータが少ない場合は転移学習(凍結)が過剰適合リスクを抑えます。十分なデータがある場合は上位層からのファインチューニングが精度向上に寄与します。LLMの文脈では、LoRAやQLoRAなどパラメータ効率的なファインチューニング(PEFT)手法が2026年時点で主流です。 ## SQLとデータ操作 **Q15: ウィンドウ関数を使わずに各部署で2番目に高い給与を取得するクエリを書いてください。** ```sql -- second_highest_salary.sql -- Approach: correlated subquery counting distinct higher salaries SELECT d.department_name, e.employee_name, e.salary FROM employees e JOIN departments d ON e.department_id = d.id WHERE ( SELECT COUNT(DISTINCT e2.salary) FROM employees e2 WHERE e2.department_id = e.department_id AND e2.salary > e.salary ) = 1 ORDER BY d.department_name; ``` 相関サブクエリを用いて、各従業員の給与より高い給与の数をカウントし、それが1件のものを「2番目に高い」と特定します。DISTINCTを使うことで同一給与の重複を排除しています。面接官が更に問うた場合は、DENSE_RANK()を用いたウィンドウ関数版も説明できると高評価につながります。 **Q16: WHEREとHAVINGの違い。それぞれが評価されるタイミングは?** SQLのクエリ処理順序(論理処理順)において、WHEREはGROUP BY前に評価され、個々の行をフィルタリングします。HAVINGはGROUP BY後に評価され、集計結果(SUM、COUNT等)に対してフィルタリングを適用します。集計関数(AVG、MAX等)をフィルタ条件に使う場合は必ずHAVINGを使用し、パフォーマンスを考慮して可能な限り行の削減はWHEREで行うことが推奨されます。 ## 応用データサイエンスとシステム設計 **Q17: 新しいレコメンデーションアルゴリズムのA/Bテストをどう設計するか?** A/Bテスト設計の5つの構成要素として、次のものが挙げられます。第1に**仮説と指標の定義**(一次指標:クリック率、二次指標:セッション時間、ガードレール指標:エラー率)。第2に**サンプルサイズの計算**(効果量、有意水準α、検定力1-βに基づく)。第3に**ランダム割付けの単位**(ユーザー単位でのA/B分割でネットワーク効果を防止)。第4に**テスト期間**(週次サイクルを考慮した最低1〜2週間)。第5に**分析計画**(多重検定補正、セグメント別分析)です。 > **サンプルサイズの計算** > > A/Bテストのサンプルサイズは、効果量(検出したい最小の差分)、有意水準(通常α=0.05)、検定力(通常80〜95%)の3つのパラメータから決まります。Pythonのstatsmodels.stats.power.NormalIndPowerを使って事前計算することが推奨されます。例えば、CVRの1%改善(ベースラインCVR=10%)をα=0.05、power=0.80で検出するには片側で約16,000サンプルが必要となります。 **Q18: バリデーションでは高性能だが本番で低性能なモデルの原因トップ3は?** 第1の原因は**分布シフト(Distribution Shift)**です。本番データの統計的特性がトレーニングデータと異なる場合(コバリエートシフト、コンセプトドリフト)に発生します。第2は**特徴量スキュー(Feature Skew)**で、本番パイプラインでの特徴量計算ロジックがトレーニング時と微妙に異なる場合です。第3は**ラベルリーケージの見落とし**で、バリデーション段階では検出されなかったリーケージが本番で顕在化するケースです。モニタリング(PSI、KS検定による分布監視)と影付きモード(shadow mode)での本番テストが対策として有効です。 **Q19: CAP定理とMLフィーチャーストアへの影響は?** CAP定理は分散システムが「一貫性(Consistency)」「可用性(Availability)」「分断耐性(Partition Tolerance)」の3つを同時に満たすことはできないことを示します。MLフィーチャーストアでは、リアルタイム推論時の低レイテンシ(可用性重視)と特徴量の一貫性のトレードオフが設計上の中心課題となります。Feast、Tecton、Hopsworksなど主要なフィーチャーストアは、オフライン(バッチ、一貫性重視)とオンライン(リアルタイム、可用性重視)の二重ストアアーキテクチャでこの問題に対処しています。 **Q20: 本番MLシステムにおけるコンセプトドリフトへの対処法は?** コンセプトドリフトは、入力特徴量と目的変数の関係性が時間とともに変化する現象です。検出手法として、PSI(Population Stability Index)による入力分布監視、予測スコア分布の統計検定(KS検定)、参照ウィンドウとの比較などがあります。対処戦略としては、定期的な再学習スケジュール(週次・月次)、オンライン学習(概念の変化に適応)、アンサンブルへの新モデル追加、特徴量ドリフトのアラート設定が実務上の基本となります。 ## PythonとPandasの実践力 **Q21: Pandasのapply()、map()、transform()の違いは?** これら3つのメソッドは用途が明確に異なります。map()はSeriesの要素ごとへの変換(辞書やラムダ関数のマッピング)に使用します。apply()はSeriesまたはDataFrameに任意の関数を適用し、集計にも変換にも使える汎用メソッドです。transform()はGroupByの結果を元のDataFrameと同じ形状で返すため、グループ統計量をブロードキャストして新規列として追加する場面で特に有用です。 ```python # pandas_operations.py import pandas as pd df = pd.DataFrame({ 'team': ['A', 'A', 'B', 'B', 'A'], 'score': [10, 20, 30, 40, 50] }) # map: element-wise on Series df['team_upper'] = df['team'].map({'A': 'Alpha', 'B': 'Beta'}) # apply: arbitrary function per row df['score_label'] = df['score'].apply(lambda x: 'high' if x > 25 else 'low') # transform: group-level, same shape output (broadcasts back) df['team_mean'] = df.groupby('team')['score'].transform('mean') df['score_normalized'] = df.groupby('team')['score'].transform( lambda x: (x - x.mean()) / x.std() ) print(df) ``` **Q22: PythonのGILとデータサイエンスワークフローへの影響は?** GIL(グローバルインタープリタロック)はCPythonの仕組みで、同時に1つのスレッドしかPythonバイトコードを実行できません。しかし、NumPyやSciPyなどの数値計算ライブラリはC/Fortranで実装されておりGILを解放するため、実際のデータサイエンスワークロードへの影響は限定的です。CPUバウンドな純粋Pythonコードを並列化する場合はmultiprocessingを使用し、I/Oバウンドなタスクにはasyncioやthreadingが適切です。Python 3.13からはGIL無効化オプション(nogil)が実験的に導入されており、将来的な影響が注目されています。 ## 次元削減と教師なし学習 **Q23: PCA、t-SNE、UMAP — それぞれの適用場面は?** これら3手法の特性は次のように整理できます。 | 手法 | 線形 | 大域構造の保持 | 速度(10万点) | 用途 | |------|------|-------------|-------------|------| | PCA | はい | はい | 秒単位 | 前処理、次元削減 | | t-SNE | いいえ | いいえ | 分単位 | クラスタ可視化(小規模データ) | | UMAP | いいえ | 部分的 | 秒単位 | 可視化+前処理 | PCAは線形変換で分散を最大化する成分を抽出し、前処理や特徴量削減に広く使われます。t-SNEはローカル構造(近傍関係)の保持に優れますが大域構造は失われ、大規模データへのスケーラビリティに難があります。UMAPはt-SNEより高速で大域構造も部分的に保持するため、探索的データ分析と前処理の両用途に向いています。 **Q24: K-meansが失敗するケースと、非球形クラスタに対応する代替手法は?** K-meansは球形クラスタ、等サイズクラスタ、外れ値のないデータを前提とします。三日月形や同心円状のクラスタ、密度差のあるクラスタでは正しく機能しません。代替手法として、任意形状・ノイズ耐性のあるDBSCAN(クラスタ数不要)、ガウス混合モデル(GMM:楕円形クラスタと確率的所属度)、グラフラプラシアンを利用したスペクトラルクラスタリングが挙げられます。実務では、まずK-meansのシルエット係数とエルボー法で初期探索し、結果が不自然な場合にDBSCANやGMMへの切り替えを検討するアプローチが効率的です。 ## コミュニケーションとビジネスインパクト **Q25: 「モデルで最も重要な特徴量は何か?」とステークホルダーに聞かれた場合の回答方法は?** まず、特徴量重要度の解釈には複数のアプローチがあり、それぞれ異なるものを測定していることを明示します。ツリーモデルの組み込み重要度(分割回数・不純度削減)は迅速ですがバイアスがあります。Permutation Importanceはモデル非依存でより信頼性が高いです。SHAPはゲーム理論に基づき、各特徴量の予測への寄与を個別サンプルレベルで分解できる最も解釈性の高い手法です。 ```python # feature_importance_shap.py import shap import xgboost as xgb from sklearn.datasets import make_classification # Generate synthetic dataset X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, random_state=42) # Train XGBoost model model = xgb.XGBClassifier(n_estimators=100, random_state=42, eval_metric='logloss') model.fit(X, y) # SHAP explanation explainer = shap.TreeExplainer(model) shap_values = explainer.shap_values(X) # Global importance: mean absolute SHAP value per feature import numpy as np importance = np.abs(shap_values).mean(axis=0) for i in np.argsort(importance)[::-1]: print(f"Feature {i}: {importance[i]:.4f}") ``` ステークホルダーへの説明では、技術的な指標をビジネス用語に翻訳することが重要です。例えば「Feature_2のSHAP値が高い」ではなく、「顧客の直近30日間の購買頻度が、離脱リスク予測において最も影響力の高い要因となっています」という形で伝えると、意思決定への直接的なつながりが生まれます。また、SHAP依存プロットを用いてその特徴量の値と予測の関係を可視化すると、非技術者にも直感的に理解してもらいやすくなります。 ## まとめ 本記事でカバーしたデータサイエンス面接の重要ポイントを以下にまとめます。 - **統計的思考**: 仮説検定では、有意差がないことは差がないことの証明ではなく、検定力と標本サイズの文脈で解釈する必要があります。 - **適切な手法選択**: 評価指標(精度vs.AUPRC)、交差検証手法(K-Fold vs. TimeSeriesSplit)、エンコーディング手法(One-Hot vs. Target Encoding)は、データの特性とビジネス要件に応じて使い分けます。 - **リーケージへの警戒**: Pipelineを活用した前処理の一貫した管理が、本番性能を保証する最も確実な方法です。 - **解釈可能性**: SHAPなどのモデル解釈ツールは、単なる技術的出力ではなくビジネス意思決定との橋渡しとして活用します。 - **システム視点**: A/Bテスト設計、コンセプトドリフト対策、フィーチャーストアのアーキテクチャなど、MLシステム全体を俯瞰する設計力が2026年以降のデータサイエンティストに求められる資質です。 - **コミュニケーション**: 技術的な正確性と同時に、ステークホルダーにとって意味のある言語で結果を伝える能力が、現場での影響力を決定します。 --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/ja/blog/data-science/top-25-data-science-interview-questions-2026