機械学習のためのデータ前処理の最初の一歩:データの読み込みと確認方法【Pandas入門】
機械学習モデルを構築する際、データ前処理は非常に重要な工程です。しかし、生データがそのままモデルに使えることは稀です。多くの場合、欠損値があったり、データ型が不適切だったり、分析に適さない形式になっていたりします。
このようなデータをモデルに投入しても、期待通りの性能は得られません。むしろ、誤った分析結果や予測につながる可能性もあります。そのため、モデル構築に取りかかる前に、データを適切に「前処理」する必要があります。
データ前処理はいくつかのステップから構成されますが、その中でも最初に行うべき最も基本的なステップが、データの「読み込み」と「確認」です。この最初のステップでデータの全体像を把握し、どのような前処理が必要かを判断します。この過程を丁寧に行うことが、その後の前処理全体の効率とモデルの精度を大きく左右します。
この記事では、機械学習のためのデータ前処理の最初の一歩として、データの読み込みと基本的な確認方法について、Pythonのデータ分析ライブラリであるpandasを中心に解説します。プログラミング初心者の方でも理解できるよう、具体的なコード例を交えながら進めます。
データの読み込み
まず、分析に使用するデータをプログラムに読み込む必要があります。データは様々な形式で保存されていますが、ここではビジネスシーンでよく利用されるCSVファイルやExcelファイルを例に挙げます。
Pythonでデータを読み込む際には、一般的にpandasライブラリを使用します。pandasは、表形式のデータを効率的に扱うための強力なツールを提供します。
pandasをインポートし、データファイルを読み込む基本的なコードは以下のようになります。
import pandas as pd
# CSVファイルの読み込み
# 'data.csv' は実際のファイル名に置き換えてください
try:
df_csv = pd.read_csv('data.csv')
print("CSVファイルを読み込みました。")
except FileNotFoundError:
print("エラー: data.csv が見つかりません。")
# Excelファイルの読み込み
# 'data.xlsx' は実際のファイル名に置き換えてください
# Excelファイルを読み込むには、xlrdやopenpyxlといったライブラリが別途必要になる場合があります
try:
df_excel = pd.read_excel('data.xlsx')
print("Excelファイルを読み込みました。")
except FileNotFoundError:
print("エラー: data.xlsx が見つかりません。")
except ImportError:
print("エラー: Excelファイルを読み込むためのライブラリ(例: openpyxl)が見つかりません。")
pd.read_csv()
や pd.read_excel()
関数を使うことで、指定したファイルをpandasのDataFrameという形式で読み込むことができます。DataFrameは、行と列を持つスプレッドシートやデータベースのテーブルのようなものをイメージしてください。読み込まれたデータは、このDataFrameオブジェクトとしてプログラム内で扱えるようになります。
読み込んだデータの基本的な確認
データをDataFrameとして読み込んだら、すぐに中身を確認することが重要です。この確認作業によって、データが正しく読み込めているか、どのような構造をしているか、欠損値や異常値の可能性はどれくらいあるか、といった初期的な情報を把握できます。
ここでは、データ確認のためによく使われるいくつかの便利なメソッドを紹介します。
1. データの最初の数行を表示する (.head()
)
データがどのように読み込まれているか、列名や各列の値がどのようなものか、最初にざっと確認したい場合に便利です。デフォルトでは最初の5行を表示します。括弧の中に数字を指定することで、表示する行数を変更できます。
# 例として読み込んだCSVデータ (df_csv) を使用
print("--- データの最初の5行 ---")
print(df_csv.head())
head()
と対照的に、.tail()
メソッドを使うとデータの最後の数行を表示できます。これは、データの最後に特定の情報が付加されている場合などに役立ちます。
2. データフレームの基本情報を表示する (.info()
)
.info()
メソッドは、DataFrameの全体像を把握する上で非常に重要です。以下の情報を確認できます。
- インデックス(行)の範囲: データの件数
- 列の数: 特徴量の数
- 各列の名前: 特徴量の名前
- 各列の非欠損値数 (Non-Null Count): その列に値が入っている(欠損していない)データの数。データの総数と比較することで、欠損値の有無が分かります。
- 各列のデータ型 (Dtype): 数値型(int, float)、文字列型(object)、日付時刻型(datetime)など。データ型が適切でない場合(例えば、数値として扱いたい列が文字列になっているなど)、後続の処理に影響します。
- メモリ使用量: データフレームが占有しているメモリサイズ
print("\n--- データフレームの基本情報 ---")
df_csv.info()
この情報を見ることで、例えば「この列は非欠損値数が少ないから、欠損値処理が必要だな」「この日付の列が文字列になっているから、日付型に変換しないと」といった、具体的な前処理の方向性を判断できます。
3. データフレームの形状を確認する (.shape
)
.shape
属性は、DataFrameの行数と列数をタプル形式で返します。データサイズを簡単に把握できます。
print("\n--- データフレームの形状 (行数, 列数) ---")
print(df_csv.shape)
出力例: (1000, 10)
これは、データが1000行、10列であることを示します。
4. 各数値列の統計情報を表示する (.describe()
)
.describe()
メソッドは、数値型の列について、要約統計量(平均、標準偏差、最小値、最大値、四分位数など)を計算して表示します。データの分布や範囲、外れ値の可能性などを把握するのに役立ちます。
数値型以外の列(文字列や日付など)に対しても.describe(include='all')
とすることで、ユニーク数、最頻値、その出現回数などの情報を表示できます。
print("\n--- 数値列の統計情報 ---")
print(df_csv.describe())
print("\n--- 全ての列の統計情報 ---")
print(df_csv.describe(include='all'))
出力される統計量を確認することで、「平均と中央値が大きく離れているから分布が偏っているかも」「最大値が異常に大きいから外れ値があるかもしれない」といった仮説を立てることができます。
5. 各列の一意な値の数を確認する (.nunique()
)
.nunique()
メソッドは、各列に含まれる一意な値(重複しない値)の数を計算します。特にカテゴリ変数(性別、地域など、いくつかのカテゴリに分類されるデータ)の列で、カテゴリの種類数がどれくらいあるかを確認するのに便利です。
print("\n--- 各列の一意な値の数 ---")
print(df_csv.nunique())
例えば、「性別」列でnunique()
の結果が2であれば、「男性」と「女性」の2種類が含まれていると推測できます。もし非常に大きな数が出た場合は、その列がカテゴリ変数ではなく、ユニークなIDのようなものである可能性を示唆します。
6. 特定の列の値とその出現頻度を確認する (.value_counts()
)
.value_counts()
メソッドは、特定の列に含まれる各値がそれぞれどれくらいの頻度で出現するかを計算します。カテゴリ変数の各カテゴリの分布を確認したり、数値データで特定の値に偏りがないかを見たりするのに役立ちます。
# 例として 'カテゴリ列名' の出現頻度を確認
# 'カテゴリ列名' は実際の列名に置き換えてください
if 'カテゴリ列名' in df_csv.columns:
print("\n--- 'カテゴリ列名' の値の出現頻度 ---")
print(df_csv['カテゴリ列名'].value_counts())
else:
print("\nエラー: 'カテゴリ列名' という列は存在しません。")
# 例えば、性別列の出現頻度を確認する場合
# if '性別' in df_csv.columns:
# print("\n--- '性別' の値の出現頻度 ---")
# print(df_csv['性別'].value_counts())
この結果を見ることで、例えば「特定のカテゴリにデータが集中している」「カテゴリ間のデータ数に大きな偏りがある(不均衡データ)」といった、その後の前処理やモデル選択に影響する重要な情報を得られます。
なぜこれらの確認が必要なのか
これらの基本的な確認ステップは、単にデータを眺めるだけでなく、その後のデータ前処理の計画を立てる上で不可欠な情報を提供します。
.info()
で欠損値の有無やデータ型を確認し、欠損値補完やデータ型変換が必要かを判断します。.describe()
で数値データの分布や外れ値の可能性を探り、スケーリングや外れ値処理が必要かを検討します。.nunique()
や.value_counts()
でカテゴリデータの種類数や分布を確認し、カテゴリエンコーディングの方法や不均衡データへの対応を検討します。
このように、最初の確認を丁寧に行うことで、闇雲に前処理手法を適用するのではなく、データの特徴に基づいた適切な手法を選択し、効率的に前処理を進めることができるようになります。
まとめ
この記事では、機械学習のためのデータ前処理の出発点として、データの読み込みと基本的な確認方法について解説しました。
- データをpandasのDataFrameとして読み込むことで、その後の分析や前処理が容易になります。
.head()
、.info()
、.shape()
、.describe()
、.nunique()
、.value_counts()
といったメソッドを活用することで、データの全体像、構造、データ型、欠損値、分布などを効率的に把握できます。- これらの確認ステップで得られた情報は、その後の具体的な前処理(欠損値処理、データ型変換、カテゴリエンコーディング、スケーリング、外れ値処理など)の必要性を判断し、計画を立てる上で非常に重要です。
データ前処理は機械学習モデルの成功を大きく左右する工程です。まずはこの記事で紹介した基本的な確認方法をマスターし、お手元のデータがどのような状態にあるのかをしっかりと把握することから始めてください。
次のステップとしては、今回確認したデータの特徴に基づいて、具体的な欠損値の対処法やデータ型の変換方法などを学んでいくことになります。本サイトの他の記事も参考にしながら、データ前処理のスキルを体系的に習得していきましょう。