第3章: Pythonでデータの準備

3.1 データセットの概要

機械学習モデルを作成する際、まず必要なのが「データセット」です。データセットとは、観測されたデータや収集されたデータの集合のことで、モデルが学習に使用する材料です。通常、データセットは多次元の特徴量(フィーチャー)と、ターゲット変数(目的変数、ラベル)から構成されます。ここでは、Pythonを使ってどのようにデータセットを取り扱うのか、基本的な概念と方法について説明します。

3.1.1 データセットの種類

データセットは以下のように分類できます。

  • 構造化データ: 整理された行と列の形式を持ち、表形式で表されるデータ。CSVやSQLデータベースに保存されることが多い。
  • 非構造化データ: 明確な形式を持たないデータ。画像、テキスト、オーディオ、ビデオなどが該当する。
  • 半構造化データ: 形式がある程度決まっているが、完全には統一されていないデータ。JSONやXMLなど。

機械学習においては、主に構造化データを扱うことが多いですが、テキスト分類や画像認識では非構造化データも使用します。

3.1.2 データセットの取得方法

Pythonでは、データセットを取得するためにいくつかの方法があります。以下の方法が一般的です。

  • ローカルファイルからの読み込み: CSVやExcelなどのファイル形式から読み込む。
  • オンラインリポジトリからの取得: KaggleやUCI Machine Learning Repositoryなど、機械学習に使えるデータセットを提供しているウェブサイトからダウンロード。
  • APIからのデータ取得: Twitter APIやGoogle Maps APIなど、APIを通じてリアルタイムデータを取得。

たとえば、KaggleのAPIを使ってデータをダウンロードする例を見てみましょう。まず、Kaggleアカウントを作成し、APIトークンを取得して設定します。次に、Pythonで以下のようにデータセットをダウンロードします。

!kaggle datasets download -d uciml/iris

ダウンロードしたデータを読み込むには、Pandasライブラリを使用します。Pandasは、データ操作に特化した強力なPythonライブラリで、機械学習の前処理や分析に不可欠です。

import pandas as pd

# CSVファイルからデータを読み込む
df = pd.read_csv('iris.csv')

# データセットの概要を表示
print(df.head())

上記のコードでは、read_csv 関数を使ってCSV形式のデータを読み込み、最初の5行を表示しています。

3.1.3 データの基本構造と特徴量

データセットを取得したら、次にその基本的な構造を理解することが重要です。Pandasを使ってデータフレームの形状、列名、データ型、統計情報などを確認できます。これにより、どのようなデータが含まれているのかを把握できます。

# データの形状を確認
print(df.shape)

# データの列名を確認
print(df.columns)

# データ型を確認
print(df.dtypes)

# 基本的な統計情報を表示
print(df.describe())

describe() メソッドは、数値データに関する基本的な統計情報(平均、標準偏差、最小値、四分位範囲、最大値など)を提供します。これにより、各特徴量の値の範囲や分布を簡単に把握することができます。


3.2 データ前処理(欠損値処理、データの正規化)

データ前処理は、モデルがデータを正しく理解し、適切に学習できるようにするためのステップです。データセットには、欠損値や外れ値、異なるスケールを持つ特徴量などが含まれていることが多いため、これらを処理してデータをクリーンな状態に整える必要があります。

3.2.1 欠損値の処理

欠損値(Missing Data)は、多くのデータセットで見られる問題です。欠損値が含まれていると、モデルが正確に学習できないため、欠損値の処理はデータ前処理の重要なステップです。欠損値の処理方法としては、以下のようなものがあります。

  • 欠損値を削除する: 欠損値が含まれている行や列を削除する。
  • 欠損値を補完する: 平均値や中央値、最頻値、または他のアルゴリズムを使って欠損値を埋める。

まずは、欠損値があるかどうかを確認します。Pandasを使うと簡単に確認できます。

# 欠損値の確認
print(df.isnull().sum())

次に、欠損値を処理する方法をいくつか見ていきましょう。

行や列の削除

欠損値が多く含まれている場合、その行や列を削除することが一般的です。

# 欠損値を含む行を削除
df_dropped = df.dropna()

# 欠損値を含む列を削除
df_dropped_columns = df.dropna(axis=1)

ただし、重要な特徴量が含まれている場合には、削除はデータの損失につながるため、慎重に行う必要があります。

欠損値の補完

欠損値を削除する代わりに、他の値で補完することも可能です。補完方法としては、平均値、中央値、最頻値、または他の統計的手法があります。Pandasのfillnaメソッドを使って補完ができます。

# 平均値で補完
df_filled = df.fillna(df.mean())

# 中央値で補完
df_filled_median = df.fillna(df.median())

# 最頻値で補完
df_filled_mode = df.fillna(df.mode().iloc[0])

3.2.2 データのスケーリングと正規化

データセット内の特徴量が異なるスケールを持っている場合、モデルの学習に悪影響を与えることがあります。例えば、年齢が0から100の範囲で表され、収入が0から10,000,000の範囲で表される場合、収入の影響が年齢よりも大きくなりがちです。これを防ぐために、データのスケーリングや正規化を行います。

  • 標準化(Standardization): 平均を0、標準偏差を1にする変換。データの分布を均等にするのに役立ちます。
  • 正規化(Normalization): データを0から1の範囲にスケーリングする変換。

scikit-learn ライブラリのStandardScalerMinMaxScalerを使って、データをスケーリングできます。

標準化の例

from sklearn.preprocessing import StandardScaler

# 標準化
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)

正規化の例

from sklearn.preprocessing import MinMaxScaler

# 正規化
scaler = MinMaxScaler()
df_normalized = scaler.fit_transform(df)

スケーリングを行うことで、すべての特徴量が同じスケールに揃うため、モデルの学習におけるバイアスを防ぎます。

3.2.3 カテゴリカルデータの処理

データセットに数値データだけでなく、カテゴリカルデータ(カテゴリ値)が含まれている場合、それらを数値データに変換する必要があります。カテゴリカルデータを処理する方法としては、次のような方法があります。

  • ラベルエンコーディング: 各カテゴリに固有の整数値を割り当てる。
  • ワンホットエンコーディング: カテゴリを0と1のバイナリ値で表現する。

Pandasのget_dummiesメソッドを使うと、簡単にワンホットエンコーディングができます。

# ワンホットエンコーディング
df_encoded = pd.get_dummies(df, columns=['カテゴリ列'])

ワンホットエンコーディングを行うことで、モデルはカテゴリカルデータを数値として扱えるようになります。


3.3 データの可視化と分析

データの準備が整ったら、次に行うべきはデータの可視化です。データの可視化は、データの分布や相関関係、異常値(アウトライアー)などを直感的に理解するための強力な手段です。Pythonには、MatplotlibやSeabornなどの強力な可視化ライブラリがあり、これらを使ってデータをグラフィカルに表現できます。

3.3.1 データの分布の可視化

データの分布を理解するためには、ヒストグラムやボックスプロットなどが有効です。まず、各特徴量の分布を確認して、異常な値や偏りがないかを調べます。

import matplotlib.pyplot as plt

# ヒストグラムを作成
df.hist(bins=20, figsize=(10,10))
plt.show()

ヒストグラムは、データの値の範囲をいくつかのビン(区間)に分けて、その区間に含まれるデータの数を表示するグラフです。これにより、特徴量がどのように分布しているかを視覚的に確認できます。

3.3.2 相関関係の可視化

次に、特徴量同士の相関関係を確認します。特に線形回帰などのモデルでは、特徴量間の相関関係が強いと、多重共線性の問題が生じる可能性があります。相関行列とヒートマップを使って、データの相関を視覚化します。

import seaborn as sns

# 相関行列の計算
corr_matrix = df.corr()

# ヒートマップの作成
plt.figure(figsize=(10,8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.show()

このヒートマップでは、特徴量間の相関係数が視覚的に表現されており、どの特徴量が強い相関を持っているかを一目で確認できます。

3.3.3 外れ値の検出

外れ値(アウトライアー)は、データセット内の他のデータ点から大きく外れた値を指し、モデルの学習に悪影響を及ぼす可能性があります。ボックスプロットを使って、外れ値を視覚化して検出することができます。

# ボックスプロットの作成
plt.figure(figsize=(10,6))
sns.boxplot(data=df)
plt.show()

ボックスプロットでは、データの四分位範囲を基に外れ値が表示されます。通常、ヒゲの範囲外にあるデータ点が外れ値としてマークされます。外れ値が検出された場合、それを削除するか、適切に処理する必要があります。


初心者におすすめ!プログラミングスクールのススメ

未経験でも気軽に!サブスク型プログラミングスクール【Freeks】

プログラミングを始めたいと思っているそこのあなた、独学よりもプログラミングスクールが断然おすすめです!理由は簡単、続けやすさです。

独学の挫折率、驚きの87.5%!

独学でプログラミングを続けるのは、実はかなりハードルが高いんです。データによると、なんと87.5%もの学習者が途中で挫折しているとか。一方、各プログラミングスクールが公表しているデータによると、受講生の約95%が最後までやり抜いているとのこと。数字を見れば一目瞭然、プログラミングスクールの方が圧倒的に続けやすいんです。

有料と無料、スクールの違いは?

プログラミングスクールには有料と無料のタイプがありますが、その違いは次の通りです:

  • 受講条件が異なる
  • 学べるスキルやカリキュラム内容が異なる
  • 就職や転職のサポート内容が異なる

どちらが自分に合っているか、よく考えて選ぶのが大事です。

サブスク型プログラミングスクール『FREEKS(フリークス)』に注目!

プログラミング初心者でも学びやすいと評判の『FREEKS』、その特徴は以下の通り:

  • 未経験者向けのわかりやすいカリキュラム
  • 経験豊富なエンジニアのサポート
  • オンラインで自分のペースで学習可能

なんと、月会費のみで全カリキュラムが受け放題!Java、PHP、HTML/CSS、JavaScriptなど、多彩なプログラミング言語が学べるんです。しかも、AIが質問に自動で答えてくれるシステムも導入済み。

終了後は副業もサポート!

カリキュラムを終了した後には、Freeks経由で未経験者でも取り組める副業案件の受注が可能。実務を通じてスキルを磨き、市場価値の高いエンジニアへの道が開けます。

独学で悩むくらいなら、まずはプログラミングスクールをチェックしてみるのもアリかもしれませんよ!
 ↓ ↓ こちらをクリック ↓ ↓ 

Related Post