『Python実践データ分析100本ノック』 ノック1〜8
今回は、『Python実践データ分析100本ノック』を読んで学んだことをアウトプットします。
unzipコマンドで日本語が文字化けした際の文字コード指定
まずは、本書のサンプル(「sample_100knocks.zip」をダウンロードしました。
zipで圧縮されているので、unzipで展開してみると…
ありゃりゃ、展開したフォルダの名前が文字化けしてちゃいました。
こちらのサイトを参考に、-Oオプションを使って再度展開してみました。
unzip -O sjis hoge.zip
文字化けすることなく、展開することができました。
尚、今回使用したオプションは、-O(大文字の「オー」)であり、-o(小文字の「オー」)ではありませんので、ご注意を!
最初、-o(小文字の「オー」)を指定してエラーになってしまいました^^;
データを結合(ユニオン)
ユニオンは、データ数を行方向に増やす(縦に結合する)ことです。
ユニオンを行うには、pandasのconcatメソッドを用います。
データを結合(ジョイン)
ジョイン(横方向に結合)する場合、しっかりと主軸になるデータを考えつつ、どの列をキーにジョインするのかを考えていきます。今回の場合、主軸に置くデータは最も粒度が細かい transaction_detail になります。
次に、①足りない(付加したい)データ列は何か? ②共通するデータ列は何か? を考えます。
ジョインは、pandasのmergeメソッドを使って行います。
join_data = pd.merge(transaction_detail, transaction[['transaction_id',
'payment_date', 'customer_id']], on='transaction_id', how='left')
主軸にするtransaction_detail、結合するtransactionデータの必要な列のみを引数に渡して、ジョインキーとしてtransaction_idを、ジョインの種類としてレフトジョインを指定しています。
今回は、transaction_detailをメインに結合しているので、レフトジョインとなります。
欠損値の状況を確認
データ分析を進めていく上で、まずは大きく2つの数字を知る必要があります。
1つ目は欠損している値の状況、2つ目は全体の数字感です。
欠損値の数を出力するには、isnull()とsum()を組み合わせます。
isnull()を用いると、欠損値をTrue/Falseで返してくれて、そのTrueの数をそれぞれの列ごとにsum()で計算します。
2つ目の全体の数字感については、describe()で各種統計量を出力します。
年月日の文字列の列をdatetime型に変換
今回加工したいデータは、payment_dateでデータ型を確認すると、object型となっています。これをdatetime型に変更するには、pandasのto_datetime()を用います。
join_data['payment_date'] = pd.to_datetime(join_data['payment_date'])
join_data['payment_month'] = join_data['payment_date'].dt.strftime('%Y%m')
pandasのdatetime型は、dtを使うことで、年のみを抽出したりするなど、様々なことが可能です。今回は、strftimeを使用し、文字列として年月を作成しました。