データ分析用前処理　テンプレート（Python）

#データ分析用　前処理　テンプレート（Python)
自分がよく使う、データの前処理を以下にテンプレート形式でまとめる。
説明は、あまりなしに、テンプレートになっている。

##データセットの読み込み
csv形式の読み込み

```python:read_data.py
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によるラベルの数値変換
ラベルを数値情報に変換する。
以下では、市の情報を、数値の情報に変換している

```python:laberlencoder.py
from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
df_all['City'] = le.fit_transform(df_all['City'])
```

###mapによる要素置換
map関数を用いて、ラベルを離散値に変換する。

```python:map.py
'''
   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()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285972/58cadfe4-2938-1048-094a-0f47f1056779.png)

###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()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285972/ef5d2882-e7d8-8dc7-0ce3-39c6e8f195b5.png)

###scatter_matrix()による散布図作成
scatter_matrix()により、散布図を描いてくれる。
全ての変数間の散布図を作成してくれる。
対角線の図は、その変数のヒストグラムを描いている。

```
pd.plotting.scatter_matrix(df)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285972/93ed49b4-28b5-5510-c037-579c19ead620.png)

###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
'''
```

ただいま、編集中です。