機械学習 回帰編 データ確認

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()
priceyearOfRegistrationpowerPSkilometermonthOfRegistrationnrOfPicturespostalCode
count3.715280e+05371528.000000371528.000000371528.000000371528.000000371528.0371528.00000
mean1.729514e+042004.577997115.549477125618.6882285.7344450.050820.66764
std3.587954e+0692.866598192.13957840112.3370513.7124120.025799.08247
min0.000000e+001000.0000000.0000005000.0000000.0000000.01067.00000
25%1.150000e+031999.00000070.000000125000.0000003.0000000.030459.00000
50%2.950000e+032003.000000105.000000150000.0000006.0000000.049610.00000
75%7.200000e+032008.000000150.000000150000.0000009.0000000.071546.00000
max2.147484e+099999.00000020000.000000150000.00000012.0000000.099998.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
priceyearOfRegistrationpowerPSkilometermonthOfRegistrationnrOfPicturespostalCode
0480199301500000070435
11830020111901250005066954
2980020041631250008090480
315002001751500006091074
43600200869900007060437
371523220020050200001039576
371524119920001011250003026135
371525920019961021500003087439
371526340020021001500006040764
371527289902013320500008073326
obj_data=data.select_dtypes(include='object')
obj_data
dateCrawlednamesellerofferTypeabtestvehicleTypegearboxmodelfuelTypebrandnotRepairedDamagedateCreatedlastSeen
02016-03-24 11:52:17Golf_3_1.6privatAngebottestNaNmanuellgolfbenzinvolkswagenNaN2016-03-24 00:00:002016-04-07 03:16:57
12016-03-24 10:58:45A5_Sportback_2.7_TdiprivatAngebottestcoupemanuellNaNdieselaudija2016-03-24 00:00:002016-04-07 01:46:50
22016-03-14 12:52:21Jeep_Grand_Cherokee_”Overland”privatAngebottestsuvautomatikgranddieseljeepNaN2016-03-14 00:00:002016-04-05 12:47:46
32016-03-17 16:54:04GOLF_4_1_4__3TÜRERprivatAngebottestkleinwagenmanuellgolfbenzinvolkswagennein2016-03-17 00:00:002016-03-17 17:40:17
42016-03-31 17:25:20Skoda_Fabia_1.4_TDI_PD_ClassicprivatAngebottestkleinwagenmanuellfabiadieselskodanein2016-03-31 00:00:002016-04-06 10:17:21
3715232016-03-14 17:48:27Suche_t4___vito_ab_6_sitzeprivatAngebottestNaNNaNNaNNaNsonstige_autosNaN2016-03-14 00:00:002016-04-06 00:46:52
3715242016-03-05 19:56:21Smart_smart_leistungssteigerung_100psprivatAngebottestcabrioautomatikfortwobenzinsmartnein2016-03-05 00:00:002016-03-11 18:17:12
3715252016-03-19 18:57:12Volkswagen_Multivan_T4_TDI_7DC_UY2privatAngebottestbusmanuelltransporterdieselvolkswagennein2016-03-19 00:00:002016-04-07 07:15:26
3715262016-03-20 19:41:08VW_Golf_Kombi_1_9l_TDIprivatAngebottestkombimanuellgolfdieselvolkswagenNaN2016-03-20 00:00:002016-03-24 12:45:21
3715272016-03-07 19:39:19BMW_M135i_vollausgestattet_NP_52.720____EuroprivatAngebotcontrollimousinemanuellm_reihebenzinbmwnein2016-03-07 00:00:002016-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
vehicleTypegearboxmodelfuelTypenotRepairedDamage
0NaNmanuellgolfbenzinNaN
1coupemanuellNaNdieselja
2suvautomatikgranddieselNaN
3kleinwagenmanuellgolfbenzinnein
4kleinwagenmanuellfabiadieselnein
371523NaNNaNNaNNaNNaN
371524cabrioautomatikfortwobenzinnein
371525busmanuelltransporterdieselnein
371526kombimanuellgolfdieselNaN
371527limousinemanuellm_reihebenzinnein

同様にして、欠損値の無い質的変数を集めたデータフレームも作成します。

comp_obj_data=data[complist]
comp_obj_data

dateCrawled
namesellerofferTypeabtestbranddateCreatedlastSeen
02016-03-24 11:52:17Golf_3_1.6privatAngebottestvolkswagen2016-03-24 00:00:002016-04-07 03:16:57
12016-03-24 10:58:45A5_Sportback_2.7_TdiprivatAngebottestaudi2016-03-24 00:00:002016-04-07 01:46:50
22016-03-14 12:52:21Jeep_Grand_Cherokee_”Overland”privatAngebottestjeep2016-03-14 00:00:002016-04-05 12:47:46
32016-03-17 16:54:04GOLF_4_1_4__3TÜRERprivatAngebottestvolkswagen2016-03-17 00:00:002016-03-17 17:40:17
42016-03-31 17:25:20Skoda_Fabia_1.4_TDI_PD_ClassicprivatAngebottestskoda2016-03-31 00:00:002016-04-06 10:17:21
3715232016-03-14 17:48:27Suche_t4___vito_ab_6_sitzeprivatAngebottestsonstige_autos2016-03-14 00:00:002016-04-06 00:46:52
3715242016-03-05 19:56:21Smart_smart_leistungssteigerung_100psprivatAngebottestsmart2016-03-05 00:00:002016-03-11 18:17:12
3715252016-03-19 18:57:12Volkswagen_Multivan_T4_TDI_7DC_UY2privatAngebottestvolkswagen2016-03-19 00:00:002016-04-07 07:15:26
3715262016-03-20 19:41:08VW_Golf_Kombi_1_9l_TDIprivatAngebottestvolkswagen2016-03-20 00:00:002016-03-24 12:45:21
3715272016-03-07 19:39:19BMW_M135i_vollausgestattet_NP_52.720____EuroprivatAngebotcontrolbmw2016-03-07 00:00:002016-03-22 03:17:10

コメント

タイトルとURLをコピーしました