import numpy as np
import pandas as pd
import pandas_profiling as pdp
import matplotlib.pyplot as plt
%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D
import seaborn as sns
import pickle
form sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.ensemble import RandomForestRegressor
import xgboost as xgb
import lightgbm as lgb
import warnings
warmings.simplefilter('ignore')
データの確認
以下のパス指定はこの.ipynb
ファイルとautos.csv
ファイルが同一ディレクトリ(フォルダ)内に存在する場合の指定方法
任意のディレクトリ(フォルダ)
├ autos.csv
├ 回帰編X.ipynb ※Xには本講座で使用するファイルの数字が入ります
csvDataPath = 'auts.csv'
.read_csv()
の引数でencoding
を指定することで、使っている環境とは別の環境下で作成されたファイルの読み込みエラーを回避できます。- 文字コードが判別できない場合は、
chardet
というパッケージを使うことで文字コードを特定できます。
import chardet
with open('autos.csv', 'rb') as f:バイナリモードで開く必要があるので、open関数のモードを"rb"にする
print('auto.csv')
print(chardet.detect(f.read()))#判別したいファイルを読み込んだ結果をdetect関数に入力
autos.csv {'encoding': 'Windows-1252', 'confidence': 0.73, 'language': ''}
data= pd.read_csv(csvDataPath, encoding='Windows-1252')
データの形状確認
data.shape
(371528, 20)
data.columns
Index(['dateCrawled', 'name', 'seller', 'offerType', 'price', 'abtest', 'vehicleType', 'yearOfRegistration', 'gearbox', 'powerPS', 'model', 'kilometer', 'monthOfRegistration', 'fuelType', 'brand', 'notRepairedDamage', 'dateCreated', 'nrOfPictures', 'postalCode', 'lastSeen'], dtype='object')
data.dtypes
dateCrawled object name object seller object offerType object price int64 abtest object vehicleType object yearOfRegistration int64 gearbox object powerPS int64 model object kilometer int64 monthOfRegistration int64 fuelType object brand object notRepairedDamage object dateCreated object nrOfPictures int64 postalCode int64 lastSeen object dtype: object
data.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 371528 entries, 0 to 371527 Data columns (total 20 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 dateCrawled 371528 non-null object 1 name 371528 non-null object 2 seller 371528 non-null object 3 offerType 371528 non-null object 4 price 371528 non-null int64 5 abtest 371528 non-null object 6 vehicleType 333659 non-null object 7 yearOfRegistration 371528 non-null int64 8 gearbox 351319 non-null object 9 powerPS 371528 non-null int64 10 model 351044 non-null object 11 kilometer 371528 non-null int64 12 monthOfRegistration 371528 non-null int64 13 fuelType 338142 non-null object 14 brand 371528 non-null object 15 notRepairedDamage 299468 non-null object 16 dateCreated 371528 non-null object 17 nrOfPictures 371528 non-null int64 18 postalCode 371528 non-null int64 19 lastSeen 371528 non-null object dtypes: int64(7), object(13) memory usage: 56.7+ MB
data['offerType'].value_counts()
Angebot 371516 Gesuch 12 Name: offerType, dtype: int64
data['name'].value_counts()
Ford_Fiesta 657 BMW_318i 627 Opel_Corsa 622 Volkswagen_Golf_1.4 603 BMW_316i 523 ... Audi_A4_Avant_Klima_Gruene_Plakette_TÜV_&AU_NEU_XENON 1 Renault_clio_in_gold_450VB_!! 1 Fiat_Doblo_1.6_Multijet 1 Renault_Laguna_1 1 BMW_M135i_vollausgestattet_NP_52.720____Euro 1 Name: name, Length: 233531, dtype: int64
data.head()と.tail()でとりあえずさっと見
データの基礎集計・可視化
data.describe()
price | yearOfRegistration | powerPS | kilometer | monthOfRegistration | nrOfPictures | postalCode | |
---|---|---|---|---|---|---|---|
count | 3.715280e+05 | 371528.000000 | 371528.000000 | 371528.000000 | 371528.000000 | 371528.0 | 371528.00000 |
mean | 1.729514e+04 | 2004.577997 | 115.549477 | 125618.688228 | 5.734445 | 0.0 | 50820.66764 |
std | 3.587954e+06 | 92.866598 | 192.139578 | 40112.337051 | 3.712412 | 0.0 | 25799.08247 |
min | 0.000000e+00 | 1000.000000 | 0.000000 | 5000.000000 | 0.000000 | 0.0 | 1067.00000 |
25% | 1.150000e+03 | 1999.000000 | 70.000000 | 125000.000000 | 3.000000 | 0.0 | 30459.00000 |
50% | 2.950000e+03 | 2003.000000 | 105.000000 | 150000.000000 | 6.000000 | 0.0 | 49610.00000 |
75% | 7.200000e+03 | 2008.000000 | 150.000000 | 150000.000000 | 9.000000 | 0.0 | 71546.00000 |
max | 2.147484e+09 | 9999.000000 | 20000.000000 | 150000.000000 | 12.000000 | 0.0 | 99998.00000 |
ヒストグラムの作成
plt.hist(data["price"])
このような偏った表示になる場合は、外れ値が存在していることが多いです。
外れ値の削除は後々説明するので、今回は範囲を絞ってヒストグラム化しましょう。
plt.hist()
の各種オプション
plt.hist()
は、数値の列を入力すれば、たいていのものはヒストグラム化してくれます。たとえば、X=data["A"].quantile(0.99)
を使って条件指定し、範囲を絞ったデータでも入力できます。X=data["A"].quantile(0.99)
は「変数Aの値がXより小さいサンプル数は、全体のサンプル数の99%である」という分位点を表します。
また、plt.hist()
には他にも様々なオプションがあります。
bins
:ヒストグラムの棒の本数。デフォルトは10で、必要に応じて細かくできます。range
:棒の表す数値の最大・最小を指定。デフォルト値はデータの最大値と最小値。color
:グラフの色を指定。
これらを利用して、price
のヒストグラムをもう一度書いてみます。
X=data["price"].quantile(0.99) 99分位点を計算
plt.hist(data["price"][data["price"]<X], bins=20, color="blue")
plt.title("price")
ヒストグラムの複数作成
plt.figure()
で全体の描画スペースを作り、figsize
で大きさを指定.add_subplot()
で描画位置を指定(指定方法は下記の注釈を参照).hist()
でデータとオプションを入力し、ヒストグラムを作成.set_title()
でタイトルを付ける
※.add_subplot(1,2,1)
と書くと「1行2列の行列で、左上から数えて1番目に描画する」という意味になります。
fig=plt.figure(figsize=(12,4))
ax1=fig.add_subplot(1,2,1)
ax1.hist(data.yearOfRegistration, color="red")
ax1.set_title('yearOfRegistration')
ax2=fig.add_subplot(1,2,2)
ax2.hist(data.monthOfRegistration)
ax2.set_title('manthOfRegistiration')
plt.show()
fig=plt.figure(figsize=(16,8))
ax1=fig.add_subplot(2,2,1)
ax1=hist(data.powerPS, color="red")
ax1.set_title('powerPS')
ax2=fig.add_subplot(2,2,2)
ax2.hist(data.kilometer)
ax2.set_title("kilometer")
ax3=fig.add_subplot(2,2,3)
ax3.hist(data.nrOfPicture, color="red")
ax3.set_title('nrOfPictures')
ax4=fig.add_subplot(2,2,4)
ax4.hist(data.postalCode)
ax.set_subtitle("postalCode")
データの整理
num_data=data.select_dtypes(include='int64')
num_data
price | yearOfRegistration | powerPS | kilometer | monthOfRegistration | nrOfPictures | postalCode | |
---|---|---|---|---|---|---|---|
0 | 480 | 1993 | 0 | 150000 | 0 | 0 | 70435 |
1 | 18300 | 2011 | 190 | 125000 | 5 | 0 | 66954 |
2 | 9800 | 2004 | 163 | 125000 | 8 | 0 | 90480 |
3 | 1500 | 2001 | 75 | 150000 | 6 | 0 | 91074 |
4 | 3600 | 2008 | 69 | 90000 | 7 | 0 | 60437 |
… | … | … | … | … | … | … | … |
371523 | 2200 | 2005 | 0 | 20000 | 1 | 0 | 39576 |
371524 | 1199 | 2000 | 101 | 125000 | 3 | 0 | 26135 |
371525 | 9200 | 1996 | 102 | 150000 | 3 | 0 | 87439 |
371526 | 3400 | 2002 | 100 | 150000 | 6 | 0 | 40764 |
371527 | 28990 | 2013 | 320 | 50000 | 8 | 0 | 73326 |
obj_data=data.select_dtypes(include='object')
obj_data
dateCrawled | name | seller | offerType | abtest | vehicleType | gearbox | model | fuelType | brand | notRepairedDamage | dateCreated | lastSeen | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2016-03-24 11:52:17 | Golf_3_1.6 | privat | Angebot | test | NaN | manuell | golf | benzin | volkswagen | NaN | 2016-03-24 00:00:00 | 2016-04-07 03:16:57 |
1 | 2016-03-24 10:58:45 | A5_Sportback_2.7_Tdi | privat | Angebot | test | coupe | manuell | NaN | diesel | audi | ja | 2016-03-24 00:00:00 | 2016-04-07 01:46:50 |
2 | 2016-03-14 12:52:21 | Jeep_Grand_Cherokee_”Overland” | privat | Angebot | test | suv | automatik | grand | diesel | jeep | NaN | 2016-03-14 00:00:00 | 2016-04-05 12:47:46 |
3 | 2016-03-17 16:54:04 | GOLF_4_1_4__3TÜRER | privat | Angebot | test | kleinwagen | manuell | golf | benzin | volkswagen | nein | 2016-03-17 00:00:00 | 2016-03-17 17:40:17 |
4 | 2016-03-31 17:25:20 | Skoda_Fabia_1.4_TDI_PD_Classic | privat | Angebot | test | kleinwagen | manuell | fabia | diesel | skoda | nein | 2016-03-31 00:00:00 | 2016-04-06 10:17:21 |
… | … | … | … | … | … | … | … | … | … | … | … | … | … |
371523 | 2016-03-14 17:48:27 | Suche_t4___vito_ab_6_sitze | privat | Angebot | test | NaN | NaN | NaN | NaN | sonstige_autos | NaN | 2016-03-14 00:00:00 | 2016-04-06 00:46:52 |
371524 | 2016-03-05 19:56:21 | Smart_smart_leistungssteigerung_100ps | privat | Angebot | test | cabrio | automatik | fortwo | benzin | smart | nein | 2016-03-05 00:00:00 | 2016-03-11 18:17:12 |
371525 | 2016-03-19 18:57:12 | Volkswagen_Multivan_T4_TDI_7DC_UY2 | privat | Angebot | test | bus | manuell | transporter | diesel | volkswagen | nein | 2016-03-19 00:00:00 | 2016-04-07 07:15:26 |
371526 | 2016-03-20 19:41:08 | VW_Golf_Kombi_1_9l_TDI | privat | Angebot | test | kombi | manuell | golf | diesel | volkswagen | NaN | 2016-03-20 00:00:00 | 2016-03-24 12:45:21 |
371527 | 2016-03-07 19:39:19 | BMW_M135i_vollausgestattet_NP_52.720____Euro | privat | Angebot | control | limousine | manuell | m_reihe | benzin | bmw | nein | 2016-03-07 00:00:00 | 2016-03-22 03:17:10 |
欠損値の有無による分類
num_data.isnull().sum()
price 0 yearOfRegistration 0 powerPS 0 kilometer 0 monthOfRegistration 0 nrOfPictures 0 postalCode 0 dtype: int64
num_data
には欠損値が存在しなかったので、特別な処理をする必要はありません。
次に、質的変数obj_data
に対しても同様に操作します。
obj_data.isnull().sum()
dateCrawled 0 name 0 seller 0 offerType 0 abtest 0 vehicleType 37869 gearbox 20209 model 20484 fuelType 33386 brand 0 notRepairedDamage 72060 dateCreated 0 lastSeen 0 dtype: int64
obj_data
には欠損値が存在しました。では、欠損値が存在する変数だけを抜き出してみましょう。.columns()
で取得した変数リストの中から、.isnull().sum()
の値が0でないものを条件として抽出します。
lostlist = obj_data.columns[obj_data.isnumm().sum()!=0]
lostlist
Index(['vehicleType', 'gearbox', 'model', 'fuelType', 'notRepairedDamage'], dtype='object')
分離のために、.isnull().sum()
の値が0である変数のリストも作成します。
complist = obj_data.columns[obj_data.isnumm().sum()=0]
complist
Index(['dateCrawled', 'name', 'seller', 'offerType', 'abtest', 'brand', 'dateCreated', 'lastSeen'], dtype='object')
この変数リストをデータフレームの末尾に[ ]で入力することで、欠損値のある質的変数のみを集めたデータフレームを作成できます。
lost_obj_data=data[lostlist]
lost_obj_data
vehicleType | gearbox | model | fuelType | notRepairedDamage | |
---|---|---|---|---|---|
0 | NaN | manuell | golf | benzin | NaN |
1 | coupe | manuell | NaN | diesel | ja |
2 | suv | automatik | grand | diesel | NaN |
3 | kleinwagen | manuell | golf | benzin | nein |
4 | kleinwagen | manuell | fabia | diesel | nein |
… | … | … | … | … | … |
371523 | NaN | NaN | NaN | NaN | NaN |
371524 | cabrio | automatik | fortwo | benzin | nein |
371525 | bus | manuell | transporter | diesel | nein |
371526 | kombi | manuell | golf | diesel | NaN |
371527 | limousine | manuell | m_reihe | benzin | nein |
同様にして、欠損値の無い質的変数を集めたデータフレームも作成します。
comp_obj_data=data[complist]
comp_obj_data
dateCrawled | name | seller | offerType | abtest | brand | dateCreated | lastSeen | |
---|---|---|---|---|---|---|---|---|
0 | 2016-03-24 11:52:17 | Golf_3_1.6 | privat | Angebot | test | volkswagen | 2016-03-24 00:00:00 | 2016-04-07 03:16:57 |
1 | 2016-03-24 10:58:45 | A5_Sportback_2.7_Tdi | privat | Angebot | test | audi | 2016-03-24 00:00:00 | 2016-04-07 01:46:50 |
2 | 2016-03-14 12:52:21 | Jeep_Grand_Cherokee_”Overland” | privat | Angebot | test | jeep | 2016-03-14 00:00:00 | 2016-04-05 12:47:46 |
3 | 2016-03-17 16:54:04 | GOLF_4_1_4__3TÜRER | privat | Angebot | test | volkswagen | 2016-03-17 00:00:00 | 2016-03-17 17:40:17 |
4 | 2016-03-31 17:25:20 | Skoda_Fabia_1.4_TDI_PD_Classic | privat | Angebot | test | skoda | 2016-03-31 00:00:00 | 2016-04-06 10:17:21 |
… | … | … | … | … | … | … | … | … |
371523 | 2016-03-14 17:48:27 | Suche_t4___vito_ab_6_sitze | privat | Angebot | test | sonstige_autos | 2016-03-14 00:00:00 | 2016-04-06 00:46:52 |
371524 | 2016-03-05 19:56:21 | Smart_smart_leistungssteigerung_100ps | privat | Angebot | test | smart | 2016-03-05 00:00:00 | 2016-03-11 18:17:12 |
371525 | 2016-03-19 18:57:12 | Volkswagen_Multivan_T4_TDI_7DC_UY2 | privat | Angebot | test | volkswagen | 2016-03-19 00:00:00 | 2016-04-07 07:15:26 |
371526 | 2016-03-20 19:41:08 | VW_Golf_Kombi_1_9l_TDI | privat | Angebot | test | volkswagen | 2016-03-20 00:00:00 | 2016-03-24 12:45:21 |
371527 | 2016-03-07 19:39:19 | BMW_M135i_vollausgestattet_NP_52.720____Euro | privat | Angebot | control | bmw | 2016-03-07 00:00:00 | 2016-03-22 03:17:10 |
コメント