1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python実践データ分析100本ノック(11~20本目)の振り返りと学び

Last updated at Posted at 2025-04-29

はじめに

本記事では、『Python実践データ分析100本ノック』
(参考: https://www.shuwasystem.co.jp/book/9784798067278.html)
を用いて僕が第11問~第20問に挑戦した過程での失敗談気づきをまとめます。
Qiita初心者の立場から、意味がわからなかったポイント理解に苦しんだ処理
遭遇したエラー、そして僕の感想を記載しています。

感想:データには人間のミスが意外と多く潜んでいることを痛感しました。
半角・全角の混在や大文字小文字の揺れ、欠損値など、前処理を怠るとその後の集計が歪んでしまいます。


目次

  1. 意味がわからなかったもの
  2. 理解に苦しんだ処理
  3. 発生したエラーと対処法
  4. 僕の気づきと感想
  5. 次のステップ

1. 意味がわからなかったもの

.loc と条件抽出

filtered = df.loc[df['列名'] == '']
  • 解説loc[行条件, 列名] で DataFrame を絞り込みます。df['列名'] == '値'True の行だけを取得できます。

.unique()

values = df['item_name'].unique()
  • 解説:Series から重複を除いた一意な値を抽出し、NumPy 配列として返します。

論理否定の ~

mask = ~df['フラグ']
  • 解説True/False を反転します。df['フラグ']False の行を選びたいときに用います。

Excelシリアル値のバグ補正

Excelは1900年2月29日という実在しない日を誤ってカウントします。そのため、シリアル値を日付に変換するときには2日分の補正(- 2)が必要です。

serial_dates = (
    pd.to_timedelta(serial_number.astype(float) - 2, unit='D')
    + pd.to_datetime('1900-01-01')
)

2. 理解に苦しんだ処理

astype('str').str.isdigit()

mask = df['登録日'].astype('str').str.isdigit()
  • 目的:文字列がすべて数字のみで構成されているか判定し、Excelシリアル値を識別します。`

pd.concat による結合

df['登録日'] = pd.concat([serial_dates, parsed_dates])
  • 目的:シリアル変換した日付と、既存の日付文字列を日付型に変換した結果を1列に統合し、元の DataFrame を更新します。

pd.merge(..., how='left') によるジョイン

joined = pd.merge(
    uriage_data,
    kokyaku_data,
    left_on='customer_name',
    right_on='顧客名',
    how='left'
)
  • 目的:売上データと顧客マスタを左結合し、一致しない顧客は NaN のまま残します。

3. 発生したエラーと対処法

エラー内容 原因 対処法
AttributeError: 'StringMethods' object has no attribute 'uppper' str.uppper() のタイポ str.upper() に修正
AttributeError: module 'pandas' has no attribute 'to_datetiime' pd.to_datetiime() のタイプミス pd.to_datetime() に修正
欠損値処理で比較マッチしない NaN== で比較すると必ず False になる isnull()~ を併用してフィルタリング

4. 僕の気づきと感想

  • ヒアリングの重要性:表記揺れ(半角⇔全角、同義語など)はプログラムだけでは完全に解消できないことを知りました。面倒ではありますが担当者への確認とヒアリングが必要です。

  • 前処理の徹底:欠損値補完、文字列クレンジング、データ型統一が不足すると、後続処理が破綻します。isnull()fillna() or dropna() のワークフローを明文化しましょう。

  • テストデータの用意:予期しない入力に備えて、エッジケースを網羅するテストケースを用意する習慣が必要です。


5. 次のステップ

次回は第21問~30問に取り組み、同様に失敗と学びを記録します。また、処理の自動化やテスト駆動開発(TDD)の導入についても検討したいと考えています。

参考:第1~10問の振り返り → https://qiita.com/do-raku/items/e1b18214fb9b59111066

ではまたー

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?