#データ分析用 前処理 テンプレート(Python)
自分がよく使う、データの前処理を以下にテンプレート形式でまとめる。
説明は、あまりなしに、テンプレートになっている。
##データセットの読み込み
csv形式の読み込み
trainval_filename = './train.csv'
test_filename = './test.csv'
df_trainval = pd.read_csv(trainval_filename)
df_test = pd.read_csv(test_filename)
##concatによるデータフレームの結合
トレーニングデータと、テストデータ一斉にデータの前処理をやる場合に便利。
あとは、普通にデータを結合したい時に使う。
df_all = pd.concat([df_trainval,df_test],axis=0)
#axis=0 : 下方向に繋がる
#axis=1 : 右方向に繋がる
##簡単な変数の変換
###to_datatimeによる日時情報の処理
日時情報をTimestamp型に変換、年・月・日付・曜日に変換
'''
#変換前
Date
0 1999-07-17
1 2008-02-14
2 2013-03-09
3 2012-02-02
4 2009-05-09
'''
df_all['Date'] = pd.to_datetime(df_all["Date"])
'''
#処理後
0 1999-07-17
1 2008-02-14
2 2013-03-09
3 2012-02-02
4 2009-05-09
'''
###applyによる年月日、曜日に情報変換
同じようなことは、mapを用いてもできる。
df_all['Year'] = df_all['Date'].apply(lambda x:x.year)
df_all['Month'] = df_all['Date'].apply(lambda x:x.month)
df_all['Day'] = df_all['Date'].apply(lambda x:x.day)
df_all['Weekday_name'] = df_all['Date'].apply(lambda x:x.weekday_name)
'''
#変換後
Year Month Day Weekday_name
0 1999 7 17 Saturday
1 2008 2 14 Thursday
2 2013 3 9 Saturday
3 2012 2 2 Thursday
4 2009 5 9 Saturday
'''
###LabelEncoderによるラベルの数値変換
ラベルを数値情報に変換する。
以下では、市の情報を、数値の情報に変換している
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df_all['City'] = le.fit_transform(df_all['City'])
###mapによる要素置換
map関数を用いて、ラベルを離散値に変換する。
'''
City Group Type
0 Big Cities IL
1 Big Cities FC
2 Other IL
3 Other IL
4 Other IL #変換前
'''
df_all['City Group'] = df_all['City Group'].map({'Other':0,'Big Cities':1}) #There are only 'Other' or 'Big city'
df_all["Type"] = df_all["Type"].map({"FC":0, "IL":1, "DT":2, "MB":3}) #There are only 'FC' or 'IL' or 'DT' or 'MB'
'''
City Group Type
0 1 1
1 1 0
2 0 1
3 0 1
4 0 1 変換後
'''
##pandasの機能を用いたデータ情報の取得
###info()を使った列情報取得
列の数、列の長さ、データの型などが取得できる。非常に便利
df.info()
'''<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId 891 non-null int64
Survived 891 non-null int64
Pclass 891 non-null int64
Name 891 non-null object
Sex 891 non-null object
Age 714 non-null float64
SibSp 891 non-null int64
Parch 891 non-null int64
Ticket 891 non-null object
Fare 891 non-null float64
Cabin 204 non-null object
Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB
None
'''
###describe()
各カラムのデータ数、平均、分散、四分位数など、様々な情報が取れる。
df.describe()
###NaNの集計
df.isnull().sum()
'''
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
Family_size 0
'''
###NaNを埋める
いろいろな埋め方があります。個人的には、平均・中央値あたりばかり使っている。
他に良い方法が合ったら、教えて欲しい。
df['Age'].fillna(dataset['Age'].median()) #中央値バージョン
df['Age'].fillna(dataset['Age'].median()) #平均値バージョン
df = df.dropna(how='all',axis=0) #全ての値が欠損地である列が削除される,axis=1にすると行。
df = df2.dropna(how='any',axis=0) #'any'にするとNaNが一つでも含まれる行が削除される。(デフォルト)
###corr()による相関係数
corr()を用いるだけで、全変数間の相関係数を算出することができる。
非常に便利。
print(df.corr())
'''
PassengerId Pclass Age SibSp Parch Fare
PassengerId 1.000000 -0.026751 -0.034102 0.003818 0.043080 0.008211
Pclass -0.026751 1.000000 -0.492143 0.001087 0.018721 -0.577147
Age -0.034102 -0.492143 1.000000 -0.091587 -0.061249 0.337932
SibSp 0.003818 0.001087 -0.091587 1.000000 0.306895 0.171539
Parch 0.043080 0.018721 -0.061249 0.306895 1.000000 0.230046
Fare 0.008211 -0.577147 0.337932 0.171539 0.230046 1.000000
###hist()によるヒストグラム作成
hist()を用いるだけで、ヒストグラムを描いてくれる。
これも非常に便意。
df.hist()
###scatter_matrix()による散布図作成
scatter_matrix()により、散布図を描いてくれる。
全ての変数間の散布図を作成してくれる。
対角線の図は、その変数のヒストグラムを描いている。
pd.plotting.scatter_matrix(df)
###groupbyによるグループ分け
groupby関数は、ラベル変数に適応可能。
'Sex'は、female, maleしかないので、この二つに分けてくれる
この後ろに、mean()とかを付ければ、各グループごとに平均を出してくれる。
print(df[['Sex', 'Survival']].groupby('Sex', as_index=False).mean())
'''
Sex Survived
0 female 0.742038
1 male 0.188908
'''
ただいま、編集中です。