Pythonでデータの取り込みや加工・集計、分析処理に利用できるライブラリの一つにPandasがあり、これを利用するとCSVファイルの読み込みや加工が簡単に行える。
また、カテゴリデータ(例:性別)を機械学習で利用できるようにするには、文字列(例:男、女)を数値(例:1、0)に変換する必要があるが、その変換も、Pandasを利用すれば簡単に行える。
今回は、Pandasを利用してCSVファイルの読み込み・カテゴリデータの数値変換を行ってみたので、そのサンプルプログラムを共有する。
前提条件
今回サンプルプログラムで利用するCSVファイルは、以下の内容とする。
このCSVファイルは、以下のサイトに記載の表を、CSVファイルに書き込んだものとなる。
https://note.com/morichannel2000/n/nb994e30bb1df
また、下記記事のAnacondaをインストールしJupyter Notebookを利用できること。
さらに、下記記事の「Jupyter NotebookへのCSVファイルアップロード」に記載した手順に従って、今回利用するCSVファイル(user_data.csv)をアップロード済であること。
やってみたこと
CSVファイルの読み込みとデータ抽出
Pandasを利用して、CSVファイルを読み込みNumPy配列に変換するサンプルプログラムと実行結果は、以下の通り。
1 2 3 4 5 6 7 8 | import pandas as pd # CSVファイル(user_data.csv)を読み込む dataset = pd.read_csv('user_data.csv') # 読み込んだデータをNumPy配列に変換し出力 dataset_ndarray = dataset.values print(dataset_ndarray) |
LabelEncoderを利用した変換
PandasのLabelEncoderクラスを利用すると、カテゴリデータを、(同一カテゴリで同じ)数値に変換することができる。そのサンプルプログラムと実行結果は、以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import pandas as pd from sklearn.preprocessing import LabelEncoder # CSVファイル(user_data.csv)を読み込む dataset = pd.read_csv('user_data.csv') # 読み込んだデータをNumPy配列に変換 dataset_ndarray = dataset.values # LabelEncoderを利用して、性別を数値型に変換 le = LabelEncoder() encoded_data = le.fit_transform(dataset_ndarray[:, 2]) print("*** 変換前の性別 ***") print(dataset_ndarray[:, 2]) print("*** 変換後の性別 ***") print(encoded_data) print() # 性別を数値型に変換した後の結果を設定 dataset_ndarray[:, 2] = encoded_data print("*** 読み込んだデータ(性別変換後) ***") print(dataset_ndarray) |
ColumnTransformerとOneHotEncoderを利用した変換
PandasのColumnTransformerクラスとOneHotEncoderをクラス利用すると、別行に、カテゴリデータを数値に変換することができる。そのサンプルプログラムと実行結果は、以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import pandas as pd import numpy as np from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder # CSVファイル(user_data.csv)を読み込む dataset = pd.read_csv('user_data.csv') # 読み込んだデータをNumPy配列に変換 dataset_ndarray = dataset.values print("*** 読み込んだデータ(変換前) ***") print(dataset_ndarray) print() # LabelEncoderを利用して、職業/勤務先を別行に数値型に変換 # ColumnTransformerのtransformersの第三引数に、数値型に変換対象の列をインデックスで指定 # ColumnTransformerのremainder='passthrough'を指定することで、変換しないデータを残すようにする ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [4])] , remainder='passthrough') dataset_ndarray = ct.fit_transform(dataset_ndarray) print("*** 読み込んだデータ(変換後) ***") print("*** 1列目~4列目は、職業/勤務先を変換した値を示す ***") print() print("*** 1列目:職業/勤務先=フリーターの場合1,それ以外は0 ***") print("*** 2列目:職業/勤務先=プログラマーの場合1,それ以外は0 ***") print("*** 3列目:職業/勤務先=事務職の場合1,それ以外は0 ***") print("*** 4列目:職業/勤務先=商社の場合1,それ以外は0 ***") print() print(dataset_ndarray) |
要点まとめ
- 機械学習でカテゴリデータ(例:性別)を利用できるようにするには、文字列(例:男、女)を数値(例:1、0)に変換する必要がある。
- Pandasを利用すると、カテゴリデータの数値変換を簡単に行うことができる。