import numpy as np
import pandas as pd
import pandas_profiling as pdp
import matplotlib as plt
%matplotlib inline
form mpl_toolkits.mplot3d import Axes3D
import seaborn as sns
import pickle
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import LabelEncoder
import xgboost as xgb
import lightgbm as lgb
import warnings
warnings.simplefilter("ignore")
with open("imp_data.csv", mode="rb") as f*
imp_data=pickle.load(f)
欠損値の確認
imp_data.isnull().sum()
欠損値の取り扱い
- リストワイズ削除:欠損値のある行はすべて削除して、残りのデータで分析する
- 統計量代入法:平均値や最頻値、中央値などの統計量を代入して補完する
- 欠損カテゴリー法:欠損そのものをカテゴリーとして扱う(質的変数のみ可能)
リストワイズ削除を行うと、約7万個のデータを捨てることになり、データ資源が無駄になります。また、今回は欠損値が全て質的変数なので、統計量代入法では最頻値を代入することしかできません。そこで今回は、欠損カテゴリー法を使い、欠損を1つのカテゴリーとして考えましょう。例えば故障の有無が不明な車だったら、多くの人は「大丈夫なの?」と思って購入を控えるでしょう。「情報が無い」ということ自体が購入者の動機に影響して、価格にも影響すると考えられます。
欠損値の補充
欠損値を補完するには.fillna()を使います。
第1引数に置き換えたいオブジェクトを入力します。
今回は欠損値を”NA”という情報不明を表すカテゴリー名に置き換えます。
imp_data["vehicleType"].fillna("NA", inplace= True)
imp_data["gearbox"].fillna("NA", inplace=True)
imp_data["model"].fillna("NA", inplace=True)
.isnull.sum()で確認すると、欠損値が無くなっていることが分かります。
imp_data.isnull().sum()
各変数の0が出る
質的変数の数値化
Label Encoderを利用した数値化
出力はデータフレームでなくarray配列である点に注意しましょう。
【補足】関数.get_dummys()との違い
.get_dummys():k個のカテゴリーを持つ変数は、k個のダミー変数に変換される。→変換後の変数の数が増える
LabelEncoder:k個のカテゴリーに順番に数値を割り振る→変換後の変数の数は増えない
from sklearn.preprocessing import Label Encoder
le = LabelEncoder()
X=imp_data["fuelType"]
Y=le.fit_transform(imp_data["fuelType"])
pd.DataFrame({'fuelType':X, 'encode':Y})
fuelType | encode | |
---|---|---|
0 | benzin | 2 |
1 | diesel | 4 |
2 | diesel | 4 |
3 | benzin | 2 |
4 | diesel | 4 |
… | … | … |
371523 | NA | 0 |
371524 | benzin | 2 |
371525 | diesel | 4 |
371526 | diesel | 4 |
371527 | benzin | 2 |
以上の処理により、欠損値が無くなり、全てのデータが量的変数に変換されました。
imp_data
price | abtest | vehicleType | yearOfRegistration | gearbox | powerPS | model | kilometer | monthOfRegistration | fuelType | brand | notRepairedDamage | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 480 | 1 | 0 | 1993 | 2 | 0 | 118 | 150000 | 0 | 2 | 38 | 0 |
1 | 18300 | 1 | 4 | 2011 | 2 | 190 | 26 | 125000 | 5 | 4 | 1 | 1 |
2 | 9800 | 1 | 8 | 2004 | 1 | 163 | 119 | 125000 | 8 | 4 | 14 | 0 |
3 | 1500 | 1 | 5 | 2001 | 2 | 75 | 118 | 150000 | 6 | 2 | 38 | 2 |
4 | 3600 | 1 | 5 | 2008 | 2 | 69 | 103 | 90000 | 7 | 4 | 31 | 2 |
… | … | … | … | … | … | … | … | … | … | … | … | … |
371523 | 2200 | 1 | 0 | 2005 | 0 | 0 | 26 | 20000 | 1 | 0 | 33 | 0 |
371524 | 1199 | 1 | 3 | 2000 | 1 | 101 | 108 | 125000 | 3 | 2 | 32 | 2 |
371525 | 9200 | 1 | 2 | 1996 | 2 | 102 | 225 | 150000 | 3 | 4 | 38 | 2 |
371526 | 3400 | 1 | 6 | 2002 | 2 | 100 | 118 | 150000 | 6 | 4 | 38 | 0 |
371527 | 28990 | 0 | 7 | 2013 | 2 | 320 | 148 | 50000 | 8 | 2 | 2 | 2 |
with open('imp_data.csv', mode='wb') as f:
pickle.dump(imp_data, f)
コメント