はじめに
Pythonを実務で使い初めて3年。
生成AIやネットのコードを使えば動く。
でも、コードを“理解して書く”段階に進むと、手が止まる瞬間がありました。
自動化では「動けばいい」だったのが、
機械学習やデータ分析では「なぜそう書くのか」を理解しないと応用が効きません。
この記事では、生成AIやコピペに頼っていた当時の私が、
各処理の文法とロジックをつなぎ直し、自分の言葉で説明できるようになるまでを整理します。
データ前処理の全体像
データ分析や機械学習の前処理は、下記のような流れで進みます。
- データの命名・結合
- 欠損値の確認と除去
- 特徴量の加工
- 教師データの作成
- 学習データと検証データの分割
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やコピペで動かすこと自体は悪くありません。
でも、それだけでは“理解したつもり”で止まってしまう。
小さな理解の積み重ねが、
やがて“再現できる力”を生み出していく。
その第一歩が、まさに今回の見直しなのかもしれません。
コメント