*目次 [#w2313090]
#contents
*はじめに [#h99a2c8f]
pandasはデータ分析支援ライブラリーです。
Pythonでデータ分析をするときに、機械学習の部分はscikit-learnでやりますが、機械学習のための前処理をするときに、pandasを使うととても便利です。
参考書としては、次の本がオススメです。
#html{{
<iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="https://rcm-fe.amazon-adsystem.com/e/cm?ref=qf_sp_asin_til&t=tohgorohmatsu-22&m=amazon&o=9&p=8&l=as1&IS2=1&detail=1&asins=4873116554&linkId=6d4c9121f7d09fe9aa24fea76158e69c&bc1=ffffff<1=_blank&fc1=444b4c&lc1=444b4c&bg1=ffffff&f=ifr"></iframe>
}}
*ライブラリーの読み込み [#qf3d2bba]
pandasのライブラリー名は ''pandas'' です。
ここでは、以後、pd とします。
#geshi(python){{
import pandas as pd
}}
*シリーズとデータフレーム [#maa26223]
pandasの基本は、''シリーズ'' (Series) と''データフレーム'' (DataFrame) と呼ばれるデータ構造です。
''シリーズ''は、(一次元)配列にインデックスが付いたもので、''pandas.Seriesクラス''のオブジェクトとして表されます。
''データフレーム''は、二次元配列の行と列にインデックスが付いたもので、''pandas.DataFrameクラス''のオブジェクトとして表されます。
データフレームの列をシリーズとして取り出すことができますので、シリーズも使わないことはありませんが、データ分析するためにはデータフレームを理解することが重要です。
*CSVファイルからデータフレームを作る [#f2f3a3c6]
データ分析をするときはデータをファイルから読み込むことになりますが、pandasには、''read_csv関数''というCSVファイルを読み込んでデータフレームを作ってくれる関数があります。
例えば、次のような data.csv という名前のCSVファイルを考えてみましょう。
#geshi(csv){{
,X1,X2,X3,Y
1,t,1.0,1.2,+
2,t,0.9,0.8,-
3,f,0.9,1.1,+
4,f,0.8,1.0,-
}}
これを読み込んでデータフレームを作るには、次のようにread_csv関数を使います。
#geshi(python){{
df = pd.read_csv('data.csv', index_col=0)
}}
index_colオプションは、行(データ)のインデックスを表す列番号を指定します。
すると、見出し(インデックス)付きの表の形になります。
#geshi(python){{
df
}}
||X1|X2|X3|Y|h
|~1|t|1.0|1.2|+|
|~2|t|0.9|0.8|-|
|~3|f|0.9|1.1|+|
|~4|f|0.8|1.0|-|
*変数の型を調べる [#pc20372f]
変数の型は、データフレーム・オブジェクトのdtypes属性に格納されています。
#geshi(python){{
df.dtypes
}}
#geshi(txt){{
X1 object
X2 float64
X3 float64
Y object
dtype: object
}}
*変数の型を変換する [#idab6062]
scikit-learnはnumpy.ndarrayでデータを扱いますが、numpy.ndarrayは配列なので、要素の型が全て同じでなければなりません。
これに対し、pandasでは、説明変数ごとに型推定を行い、それぞれの変数を適当な型で表現します。
特に、文字列を含む型はobject型になります。
scikit-learnを使うには、pandasにおいて説明変数を取り出す前に、astype関数を用いて、変数を同じ型にしておく必要があります。
**カテゴリーを表す文字列をカテゴリー番号に変換する [#ff1aa7a9]
カテゴリーを表す文字列が格納されている列の型をカテゴリー番号に変換するには、まず、astype関数に 'category' を指定して変数をカテゴリー型に変換し、そのcat属性のcodes属性を取得します。
#geshi(python){{
df.X1.astype('category').cat.codes
}}
#geshi(txt){{
1 0
2 0
3 1
4 1
dtype: int8
}}
そこで、データフレームをコピーし、カテゴリーを表す変数を置き換えます。
#geshi(python){{
df_categories = df
df_categories.X1 = df.X1.astype('category').cat.codes
df_categories.dtypes
df_cat = df
df_cat.X1 = df.X1.astype('category').cat.codes
df_cat.dtypes
}}
#geshi(txt){{
X1 int8
X2 float64
X3 float64
Y object
dtype: object
}}
**カテゴリーを表す文字列をダミー変数に変換する [#qbccb273]
カテゴリーを表す文字列が格納されている列の型をダミー変数に変換するには、pandas.get_dummies関数を使います。
#geshi(python){{
df_dummies = pd.get_dummies(df)
df_dummies
df_dum = pd.get_dummies(df)
df_dum
}}
||X1_t|X1_t|X2|X3|Y|h
|~1|1|0|1.0|1.2|+|
|~2|1|0|0.9|0.8|-|
|~3|0|1|0.9|1.1|+|
|~4|0|1|0.8|1.0|-|
このように、カテゴリーごとにダミー変数が用意され、そのカテゴリーに属するときは値が 1、そうでないときは値が 0 になります。
*データフレームから説明変数を取り出す [#m3afbb81]
データフレームから説明変数を取り出すには、データフレームの''drop関数''を使って目的変数を取り除きます。
説明変数はscikit-learnにnumpy.ndarrayで渡しますので、''values''属性に格納されている配列を取り出します。
#geshi(python){{
X = df.drop('Y', axis=1).values
}}
drop関数は、行と列、どちらを取り除くのにも使えるので、列を取り除く時には''axis''オプションを 1 に指定します。
*データフレームから目的変数を取り出す [#qa35591d]
データフレームから目的変数を取り出すには、目的変数の列のインデックスを指定します。
目的変数もscikit-learnにnumpy.ndarrayで渡しますので、''values''属性に格納されている配列を取り出します。
#geshi(python){{
y = df['Y'].values
}}