【第3回】python データ分析 100本ノックをやってみた (ノック11-15)

Python 機械学習

Python実戦データ分析100本ノックを、データサイエンス初心者の私と一緒にやっていきませんか?

今回は第3回、ノック11〜ノック15までをやっていきたいと思います。
Python実戦データ分析100本ノックは、pandas の使い方やデータサイエンスを実戦的に学べる書籍なので
ぜひ手に取ってみてください。

Python実践データ分析100本ノック レビューでも実用的と高評価ですね。

 

ノック11:データを読み込んでみよう

import pandas as pd

 

uriage_data = pd.read_csv(“uriage.csv”)

 

uriage_data.head()

まず、今まで通りの方法で、uriageのcsvファイルを読み込みましょう。

 

ノック12:データの揺れを見てみよう

データの揺れとは、同じ内容で異なる表記がされていることや入力ミスなどで異なり表現がされていることです。

「山田太郎」を「山田 太郎」「山田たろう」「山田さん」←これが揺れです!

uriage_data[“item_name”].head()

売り上げデータの、[“item_name”]を抽出すると、

商品A,商品a,商品 A などが混在しているのがわかります。

uriage_data[“item_price”].head()

売り上げデータの、[“item_price”]を抽出すると、

欠損値NaNが多数あるのがわかります。

 

ノック13:データに揺れがあるまま集計しよう

一旦そのまま今までの方法で集計してみましょう。

uriage_data[“purchase_date”] = pd.to_datetime(uriage_data[“purchase_date”])

pd.to_datetime はノック8で出てきた、日付を年月に直す内容です。

復習してみてください。

uriage_data[“purchase_month”] = uriage_data[“purchase_date”].dt.strftime(“%Y%m”)

 

res = uriage_data.pivot_table(index=”purchase_month”, columns=”item_name”, aggfunc=”size”, fill_value=0)

 

res

pivot_table を作りましょう、 fill_value=0 はNaN を0で埋めるという意味です。

res = uriage_data.pivot_table(index=”purchase_month”, columns=”item_name”, values=”item_price”, aggfunc=”sum”, fill_value=0)

 

res

 

商品名がずらっと並んでいますね。

データの揺れが生じている事がわかります。

 

ノック14:商品名の揺れを補正しよう

まずはlen でデータ件数を調べます。 pd.unique は重複を除外した件数です。

print(len(pd.unique(uriage_data[“item_name”])))

A-Z で26種のはずが、99種になってます。

本来同じ商品が別々にカウントされている事がわかります。

下三段は揺れの解消です

1: upper で全て大文字に

2,3 : replace で全、半角スペースを無くしてます

div>uriage_data["item_name"] = uriage_data["item_name"].str.upper()

 

uriage_data[“item_name”] = uriage_data[“item_name”].str.replace(“ ”, “”)

 

uriage_data[“item_name”] = uriage_data[“item_name”].str.replace(” “, “”)

 

uriage_data.sort_values(by=[“item_name”], ascending=True)
div>print(pd.unique(uriage_data["item_name"]))

 

print(len(pd.unique(uriage_data[“item_name”])))

 

ユニークなデータ件数を調べたところ26件になりました。

これでOKです。

ノック15:金額欠損値の補完をしよう

まず、データの欠損値を確認しましょう。

isnull() 関数を使います。 (axis=0) は縦方向でという意味です。

uriage_data.isnull().any(axis=0)

 

 

 

 

flg_is_null = uriage_data[“item_price”].isnull()

 

for trg in list(uriage_data.loc[flg_is_null, “item_name”].unique()):

item_name の flg_is_null に条件付けして、list() によってリスト化する文です。

price = uriage_data.loc[(~flg_is_null) & (uriage_data[“item_name”] == trg), “item_price”].max()

(~flg_is_null) は flg_is_null==False の意味です。

uriage_data[“item_price”].loc[(flg_is_null) & (uriage_data[“item_name”]==trg)] = price

 

uriage_data.head()

uriage_data.isnull().any(axis=0)

item_price False になっていることから、

item_price の欠損値をなくすことに成功しました。

for trg in list(uriage_data[“item_name”].sort_values().unique()):

 

print(trg + “の最大額:” + str(uriage_data.loc[uriage_data[“item_name”]==trg][“item_price”].max()) + “の最小額:” + str(uriage_data.loc[uriage_data[“item_name”]==trg][“item_price”].min(skipna=False)))

 

全ての商品に対してループ処理を実施して、

結果が画面上に表示する事ができました。

ここまでで、商品名とその価格の揺れを直す事ができました。次は顧客名の揺れを補正したいと思います。
続きは【第4回】python 実戦データ分析100本ノック第2章後半のまとめでお会いしましょう!

目次に戻りたい方はこちら