ysk_son’s diary

勉強の記録

Pythonを使ったデータ分析の学習 - その5(箱ひげ図、欠損値の処理)

巷で評判の良いPythonオンライン教材、『【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門 | Udemy』を購入し、学習してみた。

前回エントリ(ヒストグラムの学習)はこちらから。

セクション3: まずデータに向き合おう(続き)

グラフを描いてみよう(箱ひげ図) - Section3_3.ipynb (教材PART3) -

早速資料に沿って学習していく。

箱ひげ図とは…
・データ分布を確認するための図
・英語ではBoxplot
・最大値、最小値、中央値、上側ヒンジ、下側ヒンジがわかる

上側ヒンジ:大きい順に並べた時の上25%にある数字
下側ヒンジ:小さい順に並べた時の下25%にある数字

早速描いていく。

# yとweekの関係を調べる為に、箱ひげ図を描く
train[["y","week"]].boxplot(by="week")

このように表示される。
f:id:ysk_son:20180216150926p:plain

Matplotlibの設定が不正だから曜日の表示がお豆腐(白いしかく)になってるが、今はスルー・

・曜日の順番はぐちゃぐちゃ
・何曜日が売れたか視覚的にわかりやすい
・月曜日には最も売れた日が含まれている


ここから実習。

# 1.trainのtemperatureの折れ線グラフを描いてみよう。タイトルとx軸、y軸にもそれぞれ名前をつけよう
#    x軸とy軸に名前を付ける為に、グラフは一旦変数axに代入しよう
#   タイトル名は「気温」、x軸は「time」、y軸は「temperature」としよう

ax = train["temperature"].plot(title="気温")
ax.set_xlabel("time")
ax.set_ylabel("temperature")

# 2.trainのkcalのヒストグラムを描いてみよう。trainのkcalの平均を表す赤線も入れよう

plt.axvline(x=train["kcal"].mean(),color="red")
train["kcal"].plot.hist()

# 3.trainのyとweatherとの関係を調べる為に、箱ひげ図を描いてみよう
#    x軸はweatherにしましょう

train[["y","weather"]].boxplot(by="weather")


それぞれこのように表示される。

1・
f:id:ysk_son:20180216151511p:plain


2・
f:id:ysk_son:20180216151532p:plain


3・
f:id:ysk_son:20180216151608p:plain

折れ線グラフ、ヒストグラム、箱ひげ図。グラフの可視化についてはここまで。

欠損値を調べてみよう

続いて欠損値を調べる。
使用するデータは例によって train.csv
気がついたのだけど、データがしっかりとCSVで保管されているのであれば、データ分析は容易なのだろう。

# おまじない

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

# データ読み込み

train = pd.read_csv("train.csv")

# trainの先頭行の確認(データ読み込みが正しいかのチェック)

train.head()

ここまではいつもどおりなので画面ショットは割愛。
ここから欠損値を取り扱う。

まず、各値が欠損値か否かを出力する。

・欠損とは、何らかの理由で、データの値が入っていない状態のこと
・データ分析において欠損がある場合の対応はとても重要である
・欠損の有無を確認する為にはisnull関数を使う
・欠損値の時、Trueと表示される

train.isnull()

f:id:ysk_son:20180216153629p:plain

このように表示される。
Trueの箇所が欠損値であることがわかる。
(欠損値の定義をしなくていいのは捗る)


しかしこれでは見づらいので、各列(カラム)にTrueが1つ以上あるかないかを確かめてみる。

・isnull関数のあとにany関数を付け加える。
・付け加える時はドット(.)で繋ぐ。
・1つ以上欠損値を含んでいる場合、Trueと表示される。

train.isnull().any()

このように表示される。
f:id:ysk_son:20180216153921p:plain


次に具体的に各列(カラム)に欠損値が幾つあるか数える。

・isnull関数のあとにsum関数を付け加える

train.isnull().sum()

このように表示される。
f:id:ysk_son:20180216154045p:plain


kcal,remarks,eventあたりは欠損値だらけであるとがわかったので、続けて欠損値の処理をする。

・欠損値の処理は別のなんらかの値を代入(補間)するか、欠損値を含む行を削除するかで対応する
・ここではまず、欠損値を0で補間する
・補間にはfillna関数を使う

train.fillna(0)

f:id:ysk_son:20180216154329p:plain
確かにさっきまで NaN だった欄に 0 が補間された。

続いて欠損値を削除してみる。

・dropna関数を使う
・ある列に欠損値があった場合のみ、その行を削除したい場合はオプションとしてsubset=[ ]を使う

train.dropna()

このように表示される。
f:id:ysk_son:20180216154545p:plain

確かにkcalに欠損値がある行が削除されている!


最後にprecipitationには本当に欠損値がないか確認する

・行の中の値がそれぞれ幾つあるかを確認したい場合は、value_counts関数を使う

train["precipitation"].value_counts()

このように表示される。
f:id:ysk_son:20180216154750p:plain

欠損値が169個あることがわかった。


欠損値についてはここまで、次回は相関関係を見ていく。

# ここまでで セッション3.39 欠損値を調べてみよう まで終わり。