データクレンジングを関数だけで行う実践ガイド

データクレンジングを関数だけで行う実践ガイド IT

第1章:なぜ“関数だけ”でデータクレンジングを行うのか?

日々、大量のデータを扱う仕事において「データクレンジング(データの整理・整形)」は避けて通れない工程です。特に、分析やレポート作成、システムでの活用の前段階として、正確で一貫性のあるデータを準備することは、もはや業務の基盤になりつつあります。

あなたが20代のITエンジニア、あるいはこれからデータ分析スキルを身に付けたいと考えているなら、この「クレンジング」という言葉にはピンと来るかもしれません。でも、初めて触れる人にとっては、手作業かスプレッドシートを使って地道にやるイメージが強いかもしれません。

しかし、本記事ではあえて“関数だけ”でクレンジングを行うというアプローチにフォーカスします。その理由としては、以下の3つが主に挙げられます。

  • 再利用性が高い:一度関数ベースで処理を書いておけば、同じような形式のデータに何度でも使い回せる
  • 保守性に優れる:どこで何をしているか明確なため、トラブル発生時も見直しやすい
  • 自動化・効率化がしやすい:バッチ処理やスクリプトに組み込みやすく、大量データにも短時間で対応可能

つまり、関数によるクレンジングは「一石三鳥」なのです。

現場では、CSVファイルに欠損値や重複データが混じっていたり、「○○株式会社」と「(株)○○」のような表記ゆれがあったり、”1000円”という文字列が混じる数値データだったり…といった、実に様々なノイズが厄介な問題になります。

こうした汚れたデータを、人力で直していくのではなく、Pythonの関数でテンプレ化して処理すれば、圧倒的なスピードとクオリティで対応できます。これは、時短と業務効率化にも直結しますし、結果として“できるエンジニア”として信頼される第一歩となるでしょう。

本ガイドでは、Pandasなどのライブラリの中でも、特に実務で利用頻度が高く、コード量も少なめで済むクレンジング関数だけを厳選して紹介していきます。それらの関数を組み合わせて処理フローを作っていくことで、日常のクレンジング作業がグッと楽になります。

💡今日から使えるTips:
自分がよく使うクレンジング処理は、Pythonの関数として共通化・保存しておくことで、どんな案件でも素早く対応できる“武器”になります。

第2章:クレンジングに使える代表的なPython関数たち

前章で、関数ベースでのデータクレンジングがいかに再利用性・保守性・効率に優れているかをお伝えしました。では実際に、Python(特にPandas)にはクレンジングに特化してどんな便利な関数があるのでしょうか?この章では、実務でよく使う4つのカテゴリに分けて、代表的な関数を紹介します。

1. 欠損値への対応:dropna(), fillna()

現場で最もよく目にするのが、データの一部に NaN(欠損値) が含まれているケースです。Pandasではこれを簡単に処理できます。

df.dropna()  # 欠損値を含む行を削除
df.fillna(0)  # 欠損値を0に置換

fillna()は数値だけでなく、文字列(例:”不明” など)にも対応可能なので、状況に応じて柔軟に使い分けましょう。

2. 重複データの処理:duplicated(), drop_duplicates()

同じレコードが複数含まれているデータも多く見かけます。特にログデータや手入力されたリストでは、こうした重複は無視できない品質劣化の要因です。

df.duplicated()  # 重複かどうか Booleanで確認
df.drop_duplicates()  # 重複行を削除

条件付きで重複を除外するには、subsetパラメータを使って列を指定できます。

3. データの変換:apply(), map(), replace()

データのフォーマットや表記を整える際に強力なのがこのカテゴリです。少し高度な処理も、関数を渡せばスマートに実行できます。

df['金額'] = df['金額'].apply(lambda x: int(str(x).replace('円', '')))
df['性別'] = df['性別'].map({'男性': 'M', '女性': 'F'})

replace()は、単純な値の置換に便利です。

df['部署'] = df['部署'].replace({'開発部': 'Dev', '営業部': 'Sales'})

まとめると、これらの関数を駆使すれば、分散した表記や意図しないデータ形式も統一感のあるクリーンな状態に整えることが可能です。

4. 抽出とフィルタリング:str.contains(), isin()

特定の条件にマッチするデータだけを取り出す際に使用されるのがこのグループです。データの部分一致や複数条件のフィルタで使う機会が多いです。

df[df['メールアドレス'].str.contains('@gmail.com')]
df[df['都道府県'].isin(['東京', '大阪', '愛知'])]

前者は文字列の部分一致、後者はリストに含まれる値とマッチするかを判定できます。データ分析前の前処理として、不要なデータを除外したり、特定の対象に絞るときに役立ちます。

💡今日から使えるTips:

  • 複数のクレンジング関数は、dfにドットチェーンでつなげて1行で書くとスッキリ。
  • 共通処理は関数化して、scripts/cleansing_utils.pyのように保存しておくと使い回ししやすい。

次章では、こうした関数をどう組み合わせれば典型的な“汚れパターン”を一掃できるかを、具体例とともにご紹介します。

第3章:よくあるデータ汚れパターンとクレンジング関数の組み合わせ

ここまでで、Python(特にPandas)に備わっている便利な関数を一通り見てきました。この章では、それらの関数をどのような「実際の汚れパターン」に対して使うのか、具体的なケーススタディ形式でご紹介していきます。業務でありがちなケースを例に、どの関数をどう組み合わせればよいかがすぐにイメージできるようにしましょう。

例1:空白・NULLの処理と関数

CSVやExcelなど、外部から取り込んだデータでよくあるのが、欠損値(NaN)や空文字列、スペースだけの値です。これらはそのままだと分析や連携時に不具合を引き起こす原因になります。


# 空文字やスペースをNaNに変換
df.replace(r'^\s*$', np.nan, regex=True, inplace=True)

# 欠損値を特定値で補完
df['年齢'] = df['年齢'].fillna(0)

replace()で空文字をNaNに、fillna()で補完するのはクレンジングの定番です。これだけでデータ精度がぐっと向上します。

例2:文字列の表記ゆれの統一

会社名や商品名など、人手で入力される可能性があるデータには、よく表記ゆれが発生します。

例えば、「株式会社ABC」「(株)ABC」「ABC株式会社」などは、同じ会社を指しているのに文字列としては別物です。これらは置換や正規表現を活用して一本化します。


# 企業名の正規化
df['会社名'] = df['会社名'].str.replace(r'\(株\)|株式会社', '', regex=True).str.strip()

str.replace()とstr.strip()を組み合わせれば、ノイズの少ない一貫性のあるデータに整形可能です。

例3:数値に文字が混在するケース

「1,000円」や「¥3,000」など、数値的に扱いたいカラムに単位や記号がついているケースもよくあります。文字列のままだと集計や比較ができないため、まずは整形してから数値型に変換します。


def parse_price(val):
    try:
        return int(str(val).replace('円', '').replace(',', '').replace('¥', ''))
    except:
        return np.nan

df['価格'] = df['価格'].apply(parse_price)

apply()に関数を渡すことで、柔軟かつ安全に文字列から数値への変換を行えます。この時、例外処理も入れておくと安定性がアップします。

例4:カテゴリの再分類

「部署」「性別」「職種」など、カテゴリ変数に細かいバリエーションがある場合も、業務ではまとめて分類したほうが便利なことがあります。


# 性別の表記統一・再分類
df['性別'] = df['性別'].replace({
    '男性': 'M',
    '女': 'F',
    '女性': 'F',
    '男': 'M'
})

replace()を使えば、表記違いを統一すると同時に再分類も簡単に行えます。BIツールや分析処理を見越して、この段階できれいにしておくことが重要です。

💡今日から使えるTips:
– よくある汚れパターン別に事前に“変換ルール表”や“マッピング辞書”を作成しておき、replace()やmap()にすぐ適用できるようにしておくと生産性が劇的に向上します。
– 特定のカラムごとにクレンジング処理の関数を定義し、pipeline的に実行するとメンテナンスしやすくなります。

このように、汚れのパターンを見抜いた上で、それに対する適切な関数を的確に選び、組み合わせて処理することが、スマートなデータクレンジングには欠かせません。

次章では、こういったクレンジング関数を連結した「実践的な処理フロー」を構築する方法について見ていきましょう。

第4章:実践編:サンプルデータで一連のクレンジング関数を組み立ててみよう

ここまでで、クレンジングに使える関数と、よくあるデータの“汚れパターン”への対処法について学んできました。そこでこの章では、実際のサンプルデータを使い、「関数だけ」で一連のクレンジング処理を組み立てていきましょう。

対象とするデータは、架空のユーザー情報を格納したCSVファイル。内容は以下のようになっています。


名前,年齢,性別,メールアドレス,会社名,価格
田中 一郎, ,男性 tanaka@example.com,株式会社ABC,"1,000円"
佐藤花子,28,女,satoh@gmail.com,(株)ABC,"¥2,500"
山田太郎,,不明,yamada@outlook.jp,ABC株式会社,3000

上記のように、いくつかのフィールドに対しては次のような問題が見受けられます:

  • 年齢に欠損値がある
  • 性別の表記ゆれ(男性 / 女 / 不明)
  • 会社名の表記ゆれ
  • 価格が文字列として扱われている、単位混在

では実際に、このようなデータに対してクレンジング関数を適用していきます。

1. 準備:ライブラリのインポートと読み込み


import pandas as pd
import numpy as np

df = pd.read_csv('sample_users.csv')

2. 年齢の欠損補完


df['年齢'] = df['年齢'].fillna(0).astype(int)

単純に0で補完していますが、場合によっては中央値や平均値を使うのも有効です。

3. 性別データの再分類


df['性別'] = df['性別'].replace({
    '男性': 'M',
    '女性': 'F',
    '女': 'F',
    '男': 'M',
    '不明': 'U'
})

表記ゆれにも対応しつつ、”不明” には “U” を割り当てています。

4. 会社名の正規化


df['会社名'] = df['会社名'].str.replace(r'\(株\)|株式会社', '', regex=True).str.strip()

表記が揺れている「株式会社」や「(株)」を削除し、トリムして統一。

5. 価格の整形 & 数値変換


def parse_price(val):
    try:
        return int(str(val).replace('円', '').replace('¥', '').replace(',', '').strip())
    except:
        return np.nan

df['価格'] = df['価格'].apply(parse_price)

apply()を使って単位・記号を取り除き、確実に数値型に変換します。例外処理つきで信頼性も高めています。

6. 処理のワンライナー化(中級テク)

これらの処理をまとめて1行で繋げることもできます。ただし、可読性とのバランスを意識するのがポイントです。


df = (
  df.assign(
      年齢 = df['年齢'].fillna(0).astype(int),
      性別 = df['性別'].replace({'男性': 'M', '女性': 'F', '女': 'F', '男': 'M', '不明': 'U'}),
      会社名 = df['会社名'].str.replace(r'\(株\)|株式会社', '', regex=True).str.strip(),
      価格 = df['価格'].apply(parse_price)
  )
)

7. スクリプト化と再利用

この一連の処理を関数やモジュールとしてまとめておけば、今後同様のデータに対して簡単に適用できます。


# cleansing_utils.py に保存する関数例
def clean_user_data(df):
    df['年齢'] = df['年齢'].fillna(0).astype(int)
    df['性別'] = df['性別'].replace({'男性': 'M', '女性': 'F', '女': 'F', '男': 'M', '不明': 'U'})
    df['会社名'] = df['会社名'].str.replace(r'\(株\)|株式会社', '', regex=True).str.strip()
    df['価格'] = df['価格'].apply(parse_price)
    return df

あとは別のスクリプトやNotebookから clean_user_data(df) を呼び出すだけでOKです。

💡今日から使えるTips:
– よく行う処理は関数化して、utils/やscripts/フォルダにまとめておきましょう。
– 恒常的なデータ取込フローがある場合は、クレンジング → 検証 → 保存という流れを1つの関数チェーンで表現すると見通しが良くなります。

次章では、このように整理されたクリーンデータが、実際の業務にどれほど好影響をもたらすのか、その背景やビジネス的価値について掘り下げていきます。

第5章:クリーンなデータが業務効率を左右する理由

ここまでの章でご紹介してきたように、「関数だけで行うデータクレンジング」は、テクニカルにはシンプルで論理的な作業です。しかしその先にある“業務インパクト”を理解しておくことも、エンジニアにとって非常に重要です。

1. 作業効率と品質の向上

まず、最も実感しやすいメリットが「作業スピードの向上」と「ミスの削減」です。汚れたデータを手作業で修正していたら、何十件、何百件というデータに対して膨大な時間がかかります。また、人が介在することでどうしてもヒューマンエラーが発生しがちです。

一方、関数ベースで処理されるデータクレンジングは、処理ルールがプログラムとして明文化されているため、精度が高く、安定した結果を出し続けることができます。データ量が増えても、関数を通す処理時間はほぼ一定で済むというのも大きな利点です。

👨‍💻 実感ポイント:「あれ?この項目、前と処理ルール違ってない?」という”手戻り”をなくすだけでも、どれほど楽になるか…想像に難くないはずです。

2. 信頼できるデータこそがビジネス判断の土台

マーケティング施策の評価、売上推移の分析、人員配置の方針決定…現代のビジネスは、すべてと言っても過言ではないほど「データによる意思決定」に支えられています。

しかし、もしそのデータの一部に表記ゆれや欠損や重複が混じっていたら?分析結果やダッシュボードが誤解を招く温床になってしまいます。つまり、「不正確なデータ」は「ビジネスリスク」に直結するのです。

一方で、クレンジングされ、整ったデータは、チーム全体で同じ認識を持てる共通資源(シングルソース・オブ・トゥルース)として活用できます。クリーンなデータが、意思決定のスピードと精度を大きく押し上げてくれるのです。

3. 自動化するからこそ得られる“プロの余裕”

特に20代のエンジニアにとっては、「作業を早く終わらせること=評価されること」と感じがちかもしれません。

しかし、より重要なのは「人でしか判断できないクリエイティブな領域」に時間を割けるかどうか。そのためには、「ルール化できる作業」を自動的かつ安定的に処理できる体制が欠かせません。

本記事で紹介してきた関数ベースのクレンジングは、その第一歩です。繰り返し処理をあらかじめコード化しておけば、今後似たような案件で処理を一瞬で完了できます。その分、あなたはデータの中身を深掘ったり、活用方法を考えたりする「付加価値の高い仕事」に注力できるのです。

💡今日から使えるTips:
面倒でも一度、よくあるデータ汚れの「処理テンプレ関数」を定義しておきましょう。それをスクリプトやライブラリとして社内共有すれば、まさに“小さな資産”として使い回せます。結果的にあなた自身の評価にも繋がるはずです。

まとめ:あなたのキャリアは、クリーンなデータから始まる

関数で効率的にクレンジングを行えるようになれば、あとは身の回りのあらゆるデータに「整理された状態で届ける」ことができるようになります。それは自分自身の仕事のみならず、チーム・会社全体の生産性と信頼性にまで波及していきます。

クレンジングは地味な作業のように思われがちですが、実は“最前線”です。そして関数という武器を使いこなせば、あなたはその最前線のプロフェッショナルとして、大きな価値を生み出すことができるのです。

コメント

NewsTowerをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む