売上の合計が合いません
コンビニチェーンの本部で、昨日の売上を集計しました。ところが、店長会議の資料と数字が合いません。
調べると、売上が空の店がありました。店名の後ろに空白が入った行もありました。集計の前に、データを直す必要があったのです。
このレッスンのゴール
メモ
データの中の、欠けた値と間違った値を見つけて直すことができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 欠損値 | 入っているはずなのに、ない値です。 | "" |
| None | Pythonで「値がない」を表すものです。 | None |
| 異常値 | ありえない値です。 | -5000 |
| データクレンジング | 集計の前に、データを直すことです。 | |
| strip | 文字の前後の空白を取る命令です。 | " 梅田店".strip() |
学生が入力するセルは、このプレビューでは空白です。
欠けた値を先に数えます
店舗のシステムが止まると、売上が届かないことがあります。そのとき、値は空の文字 "" か、None になります。
まず、欠けた行が何件あるかを数えます。件数が分かれば、店舗に問い合わせるか、集計から外すかを決められます。
直す前に数えるのが、現場の基本です。
売上がない店を探す
# 各店舗から届いた、昨日の売上です。
rows = [
{"store": "梅田店", "sales": "84000"},
{"store": "難波店", "sales": ""},
{"store": "天王寺店", "sales": "91500"},
{"store": "京橋店", "sales": None},
]
missing = 0
for row in rows:
# 空の文字と None は、どちらも「値がない」という意味です。
if row["sales"] == "" or row["sales"] is None:
print("売上がありません:", row["store"])
missing = missing + 1
print("欠けている行:", missing, "件")
# 「本町店」の行を、売上を "" にして足してみましょう。
よくある間違い
注意
空の売上は0円にすればよい、と考える人が多いです。でも0円は「一つも売れなかった」という本当の値です。空を0円にすると、合計も平均も下がります。値がないときは、集計から外すか、店舗に確認します。
間違った値は、形を直すか確認します
値が入っていても、そのままでは使えないことがあります。
「梅田店 」のように空白があると、Pythonは「梅田店」と別の店だと考えます。strip() で空白を取ります。
"84,000" はカンマ付きの文字なので、計算できません。カンマを取って int() で数にします。
マイナスの売上は、ありえない値です。勝手に直さず、店舗に確認します。
直す前と直したあと
| 届いた値 | 問題 | 直し方 | 直したあと |
|---|---|---|---|
| "梅田店 " | 後ろに空白 | strip() | "梅田店" |
| "84,000" | カンマ付きの文字 | カンマを取り int() | 84000 |
| "-5000" | ありえない値 | 店舗に確認 | 集計から外す |
| "" | 値がない | 店舗に確認 | 集計から外す |
学生が入力するセルは、このプレビューでは空白です。
店名と売上を直す
rows = [
{"store": "梅田店 ", "sales": "84,000"},
{"store": "難波店", "sales": "-5000"},
{"store": " 天王寺店", "sales": "91500"},
]
clean = []
for row in rows:
# 前後の空白を取ります。空白があると別の店に見えるからです。
store = row["store"].strip()
# カンマを取ってから、文字を数に変えます。
sales = int(row["sales"].replace(",", ""))
if sales < 0:
print("店舗に確認します:", store, sales)
else:
clean.append({"store": store, "sales": sales})
print(clean)
# 難波店の売上を "62,300" に直して、もう一度実行しましょう。