データ分析の初めの一歩目、データの様子見&前処理(今回は様子見メイン)
kaggleの勉強用コンペであるHouse Prices: Advanced Regression Techniquesのデータを用いる。
家のデータあれこれから価格予想してねってお題。
House Prices: Advanced Regression Techniques
データの中身チェック
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
どんなデータが入ってるかチェック
!ls ../input/house-prices-advanced-regression-techniques
↓↓↓
data_description.txt sample_submission.csv test.csv train.csv
train.csv
が訓練用データ
test.csv
がテスト用のデータ
sample_submission.csv
がこんな感じで答えを提出してねっていう例示
data_description.txt
が各カラムの説明
次に pd.read_csv
で各csvファイルをpandas.DataFrame
として読み込み
TEST_PATH = "../input/house-prices-advanced-regression-techniques/test.csv"
TRAIN_PATH = "../input/house-prices-advanced-regression-techniques/train.csv"
SUBMISSION_PATH = "../input/house-prices-advanced-regression-techniques/sample_submission.csv"
test_data = pd.read_csv(TEST_PATH)
train_data = pd.read_csv(TRAIN_PATH)
sample_submission = pd.read_csv(SUBMISSION_PATH)
訓練データの中身を試しに見てみよう。
テーブル先頭5件を以下で表示
train_data.head()
↓↓↓
Id MSSubClass MSZoning LotFrontage LotArea Street Alley LotShape ... MiscFeature MiscVal MoSold YrSold SaleType SaleCondition SalePrice
0 1 60 RL 65.0 8450 Pave NaN Reg ... NaN 0 2 2008 WD Normal 208500
1 2 20 RL 80.0 9600 Pave NaN Reg ... NaN 0 5 2007 WD Normal 181500
2 3 60 RL 68.0 11250 Pave NaN IR1 ... NaN 0 9 2008 WD Normal 223500
3 4 70 RL 60.0 9550 Pave NaN IR1 ... NaN 0 2 2006 WD Abnorml 140000
4 5 60 RL 84.0 14260 Pave NaN IR1 ... NaN 0 12 2008 WD Normal 250000
5 rows × 81 columns
81カラムもあるようです。いっぱい。
因みにテストデータにはSalePriceが抜けています。SalePriceを予想してねってお題ですから。
さて、先頭5件だけ確認しましたが、全部でどれだけあるのでしょうか。
print(len(train_data), len(test_data))
1460 1459
なるほど、1460行と81列で訓練データは構成されているのだなと分かるわけです。
欠損値の確認
これでデータ数の把握が出来ました。先ほどのテーブルを見ると、なにやら欠損値(NaNや空白)が散見されます。全体の欠損値が合計どれだけあるのか確認でもしてみましょう。
isnull()
で欠損値があるかどうかを判定し(bool型で返す、つまりTrue False
)、
sum()
でTrue=1``False=0
として欠損値の合計個数を算出、
count()
で欠損値でないものを数える処理を意味しています。
total = train_data.isnull().sum().sort_values(ascending=False)
percent = (train_data.isnull().sum()/train_data.isnull().count()).sort_values(ascending=False)
missing_data = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])
missing_data.head(20)
↓↓↓
Total Percent
PoolQC 1453 0.995205
MiscFeature 1406 0.963014
Alley 1369 0.937671
Fence 1179 0.807534
FireplaceQu 690 0.472603
LotFrontage 259 0.177397
GarageCond 81 0.055479
GarageType 81 0.055479
GarageYrBlt 81 0.055479
GarageFinish 81 0.055479
GarageQual 81 0.055479
BsmtExposure 38 0.026027
BsmtFinType2 38 0.026027
BsmtFinType1 37 0.025342
BsmtCond 37 0.025342
BsmtQual 37 0.025342
MasVnrArea 8 0.005479
MasVnrType 8 0.005479
Electrical 1 0.000685
Utilities 0 0.000000
さて、欠損値に対して考えられる処理は、欠損値を何か違う値で埋め込むor欠損値を含む行または列を削除してしまうことです。例えば、一番上のPoolQC
の行を見てみれば欠損値の割合がなんと99%なので、以下のようにして列を消してしまいましょう。
train_data = train_data.drop('PoolQC',axis=1)
本当に消えているか、先ほどのようにして欠損値のチェックすると
Total Percent
MiscFeature 1406 0.963014
Alley 1369 0.937671
Fence 1179 0.807534
FireplaceQu 690 0.472603
LotFrontage 259 0.177397
GarageCond 81 0.055479
GarageType 81 0.055479
GarageYrBlt 81 0.055479
GarageFinish 81 0.055479
GarageQual 81 0.055479
BsmtExposure 38 0.026027
BsmtFinType2 38 0.026027
BsmtFinType1 37 0.025342
BsmtCond 37 0.025342
BsmtQual 37 0.025342
MasVnrArea 8 0.005479
MasVnrType 8 0.005479
Electrical 1 0.000685
Utilities 0 0.000000
確かに一番上の行が消えてますね。
さて、データフレームばかりでなく、今度はグラフを使って様子を見てみましょう。
(そのためにmatplotlib.pyplotとseabornをインポートしてました。)
長くなったので次回に!