#11 欠損値の見つけ方・削除方法

>100 Views

September 07, 23

スライド概要

データサイエンス体験動画「データサイエンス チュートリアル 猫のタロー編」の第11回目は、Section 9「欠損値の見つけ方・削除方法」です。

データには、カラムに何も要素の無い「欠損値」が存在することがあります。欠損値があると、機械学習のプログラムにはエラーになってしまうものがあるため、欠損値を見つけ、欠損値を含む行、列を除去する必要があります

⑲ データ名.iloc[行番号 : ]
⑳ データ名.isna().sum()
㉑ データ名.dropna()

同時に、開始位置と終了位置などを指定する「スライス」に関して、便利な使い方がありますので、参考資料をブログに掲載しておきます!

■この動画のブログ

データサイエンス チュートリアル
https://tutorial4datascience.blogspot.com/

profile-image

すべてのビジネスパーソンが意思決定プロセスにデータを活用する思考を身につけ、ブルシットジョブをこの世からなくしていきましょう!

Docswellを使いましょう

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

1 1st STEP ビッグデータの 読み込みとデータの確認 Section 9 欠損値の見つけ方・削除方法 ⑲ データ名.iloc[行番号 : ] ⑳ データ名.isna().sum() ㉑ データ名.dropna() 1

2.

2 Section 9 欠損値の見つけ方・削除方法 1.ソートで欠損値を見つける データには、カラムに何も要素がない「欠損値」が存在することがあります。欠損値は、 Pythonでデータを読み込んだ時に、「NaN」と表示されます。「Not a Number」の略で す。欠損値があると、機械学習のプログラムがエラーになってしまうものがあるため、欠損 値の存在を検知することが必要となってきます。 ⑰ データ名.sort_values(“列名”,ascending=False)を使って、欠損値があるかどうかを 見てみましょう。「sort_values」は、文字列でも使えます。 「sort_values」を使うと、欠損値(NaN)は、デフォルトでは末尾に並べられます。 ただし、数値と文字列が混在している列や、数字(の文字列)とアルファベットが混在し ている列、記号が使われている列は、ソートできません。 → 「id_pos3」の場合、「InvoiceNo」、「StockCode」、「Description」などは ソートができません。

3.

3 Section 9 欠損値の見つけ方・削除方法 2.「行番号」でデータを抽出 「iloc」を使うと、「行番号」、「列番号」(インデックス)で指定し、特定の値を抽出でき ます。「行番号」のみの指定もできます。 0行目から、5行目までを指定する場合は、「:」を使って、「0 : 5」と[ ]内に記載します。 この場合、「0」が開始位置、「5」が終了位置となっています。このように「:」を使って選択 範囲を指定する方法を「スライス」と呼びます。 「:」の次に何も記載しないと(終了位置を指定しないと)、開始位置から最後まで指 定することができます。わかりやすいように、半角スペースを入れても大丈夫です。 ⑲ データ名.iloc[行番号 : ] →データの指定する行番号以降のデータを抽出することができます。

4.

4 Section 9 欠損値の見つけ方・削除方法 参考:スライス スライスは、範囲を指定するもので、[開始 : 終了]で指定することができます。 開始、および終了には、 「行番号」の他に、「”行ラベル”」も使用することができます。 記入しない場合は、開始は0(すなわち先頭)、終了は末尾となります。例えば、 [0 : 3]とすれば、最初の行から始まって、4番目の行までを指定することになります。 前から数える場合は0始まりますが、後ろから数える場合は-1始まりとなります。例えば、 [0 : -3]とすれば、最初の行から始まって、最後の行から数えて3番目までを指定すること になります。 また、 「:」を続けて[開始 : 終了 : ステップ]とすることもできます。 ステップでは、いくつずつ要素を取得していくかを指定することができます。例えば「3」と 記入すれば、「〇, ×, ×, 〇, ×, ×, … 」のように2つ飛ばしで要素を取得します。記入 しない場合は、1となります(飛ばさないで指定)。

5.

5 Section 9 欠損値の見つけ方・削除方法 3.欠損値のカウント 行の要素に欠損値があるかどうかを検出するには、「isna()」と「sum()」を組み合わせ て行います。 ⑳ データ名.isna().sum() →「isna()」は、各要素に対して判定を行い、欠損値NaNであればTrue、欠損 値でなければFalseを表示します。 行・列ごとに欠損値の個数をカウントするには、「isna()」にコロンで続けてsum() を用います。 sum()は、本来、合計値を求める関数ですが、True=1, False=0と して処理されるため、合計値が欠損値の個数となります。 Section 7の⑭でも解説したように、sum(axis=0)は列名、すなわち縦に見て、 欠損値の個数をカウントします。sum(axis=1)は行、すなわち横に見て欠損値の 個数をカウントします。 sumは「axis=0」がデフォルトのため、sum()でも構いま せん。

6.

6 Section 9 欠損値の見つけ方・削除方法 4.欠損値を含む行の削除 分析する際は、欠損値を含むデータを削除することがよくあります。欠損値を含む行を削 除するには、㉑を使います。 ㉑ データ名.dropna() →欠損値を1つでも含む行を削除します。デフォルトで「axis=0」となっていますので、 ()内は空欄で構いません。ここで、dropna(axis=1)とすると、欠損値を1つでも含む 列を削除します。 →また、()内に「how=’all’」と記入するとすべてが欠損値(すなわち、要素が ない)の行、または列を削除します。 →この処理を行っても、元のデータは変更されません。 ()内に「inplace=True」とすれば、元のデータを変更することができます。 元のデータを残しておきたい場合は、⑱で行ったように別のデータ名を宣言してお きましょう。

7.

7 Section 11 dropna()を使った欠損値を含む行の削除 参考: dropna()の応用 「dropna()」の()内に下記ような記入を行うと、様々なパターンで欠損値を含む行、 列を削除できます。 ●「axis=1」を記入すると、一つでも欠損値を含む列を削除 【書き方】 dropna(axis=1) ●「how=“all”」を記入すると、すべてが欠損値である行を削除します。 【書き方】 dropna(how=“all”) ●「subset=[“列名1”, “列名2”]」を記入すると、「”列名1”」と「“列名2”」 に一つでも欠損値がある行を削除します。 【書き方】 dropna(subset=[“列名1”, “列名2”])

8.

8 Section 9 欠損値の見つけ方・削除方法 ⑰ データ名.sort_values(“列名”,ascending=False) id_pos3の列「CustomerID」が、文字列(object)であることが確認できましたが、 「⑰ データ名.sort_values(“列名”,ascending=False)」で、 「CustomerID」をソート (並び替え)してみましょう。 「NaN」は、「Not a Number」 の略で、入力された数字がない時 などに表示されるものです。 どうやら、「CustomerID」が未記 入、すなわちエラーが含まれている ようです。

9.

9 Section 9 欠損値の見つけ方・削除方法 ⑲ データ名.iloc[行番号 : ] どうやら、列「CustomerID」には、欠損値が存在するようです。 ⑲を使って、「541536」以降の行を確認してみましょう。 インデックス「541536」以降の要 素でも、欠損値とそうでないものが 混在しているようです。

10.

10 Section 9 欠損値の見つけ方・削除方法 ⑳ データ名.isna().sum() それでは、⑳を使って、「id_pos3」の欠損値の列ごとの個数を調べてみましょう。 どうやら、列「CustomerID」の他にも、列「Description」にも欠損値が存在するようです。

11.

11 Section 9 欠損値の見つけ方・削除方法 ㉑ データ名.dropna() ㉑を用いて、欠損値の無い新たなデータを作成しましょう。 「id_pos」は541909行でしたから、135,080行が削除されました。これは、「CustomerID」の 欠損値数と一致します。結構、欠損値の多いいわゆる「汚いデータ」ですね。

12.

12 Section 9 欠損値の見つけ方・削除方法 ⑳ データ名.isna().sum() 再び⑳を用いて、「id_pos4」の欠損値の列ごとの個数を調べてみましょう。 「id_pos4」の欠損値はなくなりました。「CustomerID」と「Description 」が同時に欠損値を 持っている行のみが存在していたことがわかります。

13.

13 Section 9 欠損値の見つけ方・削除方法 ⑳ データ名.isna().sum() id_pos3 541,909行 CustomerIDに欠損値がある行 135,080行 id_pos4(欠損値の無い行) 541,909行 - 135,080行 =406,829行 Descriptionに欠損値がある行 1,454行 CustomerIDに欠損値がある行 and(⋂) Descriptionに欠損値がある行 1,454行