2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

データ分析用前処理 テンプレート(Python)

Last updated at Posted at 2020-02-14

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

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

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

laberlencoder.py
from sklearn.preprocessing import LabelEncoder

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

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

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

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

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

pd.plotting.scatter_matrix(df)

image.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
'''

ただいま、編集中です。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?