【機械学習前処理編】生成AIとコピペで“わかった気になっていた”コード集

目次

はじめに

Pythonを実務で使い初めて3年。

生成AIやネットのコードを使えば動く。
でも、コードを“理解して書く”段階に進むと、手が止まる瞬間がありました。

自動化では「動けばいい」だったのが、
機械学習やデータ分析では「なぜそう書くのか」を理解しないと応用が効きません。

この記事では、生成AIやコピペに頼っていた当時の私が、
各処理の文法とロジックをつなぎ直し、自分の言葉で説明できるようになるまでを整理します。

データ前処理の全体像

データ分析や機械学習の前処理は、下記のような流れで進みます。

  1. データの命名・結合
  2. 欠損値の確認と除去
  3. 特徴量の加工
  4. 教師データの作成
  5. 学習データと検証データの分割

1-1. DataFrameの列名を変更する

文法構文

# 列名の一括変更
rename_dict = {col: col + "_A" for col in df.columns[1:]}
df = df.rename(columns=rename_dict)

解説(ロジック)

• rename():列名変更の基本関数
• columns=辞書:旧名→新名の対応関係を定義
• 辞書内包表記:複数列を一括処理

💡 ポイント

データを結合する前に「どの列がどのデータ由来か」を明確にしておくと、
後の工程で混乱を防げます。

1-2. データの結合(merge)

文法構文

merged = df_A.merge(df_B, on="date")

解説(ロジック)

• merge() は SQL の JOIN に相当 • on=”date”:共通のキー列を指定して結合 • デフォルトは内部結合(how=”inner”)

💡 ポイント

「共通の主キー(ID・日付)」を軸にデータを統合するのが基本です。

2. 欠損値処理(isnull・dropna)

文法構文

# 欠損行の確認
df[df.isnull().any(axis=1)]

# 欠損行の削除
df.dropna(inplace=True)

解説(ロジック)

  • .isnull():欠損セルをTrueで判定
  • .any(axis=1):行方向に「どれか1つでもTrue」
  • .dropna():欠損を削除または補完

💡 ポイント

機械学習モデルはNaNを扱えません。
そのため、削除 or 補完 のいずれかの処理が必須です。

3-1. 特徴量の加工(列同士の演算)

文法構文

# 複数列の演算で新しい特徴量を作成
df["max_val"] = df[["col_A", "col_B"]].max(axis=1)
df["sum_val"] = df[["val_A", "val_B"]].sum(axis=1)

解説(ロジック)

  • .max(axis=1):行ごとに最大値を取得
  • .sum(axis=1):行ごとの合計を算出

💡 ポイント

機械学習では、単なる数値の変換ではなく、
ドメイン知識を反映した特徴量設計 が重要です。

3-2. 特定列の抽出(リスト内包表記)

文法構文

# 不要列を除外し、必要列のみを残す
valid_col = [col for col in df.columns if "A" not in col and "B" not in col]
df = df[valid_col]

解説(ロジック)

  • リスト内包表記で柔軟な条件抽出
  • df[valid_col] で列の再構築

💡 ポイント

学習対象外の列を除外することで、
ノイズを減らし、精度を高める ことができます。

4. 教師データ(目的変数)の作成

文法構文

# 条件を満たすかどうかでラベル化
y = (df["target1"] - df["target2"] > 0).astype(int)

# 1行ずらして「未来予測」構造に
df["y"] = list(y[1:]) + [np.nan]
df = df.dropna()

解説(ロジック)

  • (条件).astype(int):True→1, False→0
  • y[1:] + [np.nan]:1行シフトで「翌日を予測」構造に

💡 ポイント

「今日のデータから明日を予測」するために、
目的変数を1行ずらす のが基本的な発想です。

5. 学習データと検証データの分割

文法構文

threshold = int(len(df) * 0.8)

X = df[["col1", "col2", "col3", "col4"]]
Y = df[["y"]]

X_train, y_train = X.iloc[:threshold, :].values, Y.iloc[:threshold, :].values.flatten()
X_test, y_test = X.iloc[threshold:, :].values, Y.iloc[threshold:, :].values.flatten()

解説(ロジック)

  • iloc[:threshold]:行数の比率で分割
  • .values:NumPy配列に変換(Scikit-learnで使用可)
  • .flatten():1次元ベクトルに変換

💡 ポイント

モデル評価では「訓練データで学び、テストデータで汎化性能を測る」ことが重要です。

文法とロジック対応表

ステップ主な構文意図するロジック
列名変更rename()データ識別を明確にする
結合merge()共通キーで統合する
欠損処理isnull() / dropna()NaNを除去または補完
特徴量生成.max() / .sum()新しい情報を作る
列抽出リスト内包表記不要データを除く
教師データ作成.astype(int)ラベルを数値化
データ分割.iloc[], .flatten()学習と検証を分ける

まとめ

AIが助けてくれる時代に、
改めて「自分の手で考える」ことの大切さを感じています。

生成AIやコピペで動かすこと自体は悪くありません。
でも、それだけでは“理解したつもり”で止まってしまう。

小さな理解の積み重ねが、
やがて“再現できる力”を生み出していく。

その第一歩が、まさに今回の見直しなのかもしれません。

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

この記事を書いた人

コメント

コメントする

CAPTCHA


目次