データ分析学習の進捗【2/6】

前書き

「データ分析100本ノック」と「東京大学データサイエンティスト育成講座」を使って勉強を進めます。

melheaven.hatenadiary.jp


こちらの本の一部の問題・コードを自分なりに改変して載せています。
「全て載せてください!」という方はご購入を。おすすめです。

データ分析100本ノック2章

データ分析する前で最も重要な処理の一つが前処理である。
今回は前処理について調査していくことにした。

文字列成型

大文字・小文字の統一、スペースの削除。
文字列のばらつきは易しい教科書通りにはいかないので、その都度調べて対処していく必要がありそうだ。

uriage1['item_name'] = uriage1['item_name'].str.upper()
uriage1['item_name'] = uriage1['item_name'].str.replace(' ', '')
uriage1['item_name'] = uriage1['item_name'].str.replace(' ', '')

欠損値

'item_price'(=商品価格)データに一部欠損がみられる問題。
欠損していない同じ商品のデータから取得して、補完する必要がある。
恐ろしいのが現実問題では補完値は必ず存在している訳ではないので、注意!

重要なのはpandasのlocやilocの使い方。条件を指定して要素を抽出するlocの使い方に慣れる必要がある。

deepage.net

やっている事としては以下の通り。

  1. 'item_price'(=商品価格)データの欠損データを抽出
  2. 欠損データを含む商品名'item_name'を列挙し、一つ'item'ずつ調査
  3. 欠損していない+同じ商品'item'のデータから補完値を抽出
  4. 欠損している+同じ商品'item'を探し出し、それら全てに補完
priceNull_item_flg = uriage2['item_price'].isnull()
for item in uriage2.loc[priceNull_item_flg, 'item_name'].unique():
    price = uriage2.loc[(~priceNull_item_flg) & (uriage2['item_name'] == item), 'item_price'].unique()[0]
    uriage2.loc[(priceNull_item_flg) & (uriage2['item_name'] == item), 'item_price'] = price

日付処理のフォーマット修正

必ずしも日付データのフォーマットが統一されているという訳ではない。
今回は教科書という易しいくくりではあるが、フォーマット統一してみる。

str.isdigit()では文字列が数値で構成されているかを確認でき、該当する行を抽出している。
ここでは「4○○○○」といった4万台の5桁の数字。
これはシリアル値で日数変換した後、1900/01/01との和をとると年月日に変換できる。

chusotsu-program.com

# 格納された日付が数値のみ「4○○○○」の場合
date_format_num_flg = kokyaku_data2['登録日'].astype('str').str.isdigit()
dateNum = pd.to_timedelta(kokyaku_data2.loc[date_format_num_flg, '登録日'].astype('float'), unit='D') + pd.to_datetime('1900/01/01')

#格納された日付が年-月-日の場合、フォーマット統一
date_format_num_flg = kokyaku_data2['登録日'].astype('str').str.isdigit()
dateStr = pd.to_datetime(kokyaku_data2.loc[~date_format_num_flg, '登録日'])

kokyaku_data2['登録日'] = pd.concat([dateNum, dateStr])