【第4回】pythonデータ分析100本ノックをやってみた (ノック16-20)
Python実戦データ分析100本ノックを、データサイエンス初心者の私と一緒にやっていきませんか?
今回は第4回、ノック16〜ノック20までをやっていきたいと思います。
Python実戦データ分析100本ノックは、pandas の使い方やデータサイエンスを実戦的に学べる書籍なのでぜひ手に取ってみてください。
↓Python実践データ分析100本ノック
レビューでも実用的と高評価ですね。
リンク
kokyaku_data[“顧客名”].head()
uriage_data[“customer_name”].head()
まず、そのまま表示させてみましょう。
顧客台帳はスペースが含まれるが、売り上げ履歴の顧客名には
スペースが含まれていません。
kokyaku_data[“顧客名”] = kokyaku_data[“顧客名”].str.replace(“ ”, “”)
kokyaku_data[“顧客名”] = kokyaku_data[“顧客名”].str.replace(” “, “”)
kokyaku_data[“顧客名”].head()
ノック14 でやったように、半角、全角スペースを除去します。
まず、日付の形式と数値の形式が混在しているので、数値のものを抽出します。
str.isdigit()
: 全ての文字が数字なら真、そうでなければ偽。
2行目:flg.is_serial.sum() は数値として書いてある行数を数えています。
flg_is_serial = kokyaku_data[“登録日”].astype(“str”).str.isdigit()
flg_is_serial.sum()
次に数値やスラッシュ区切りで取り込まれている数値を日付表記に変えます。
fromSerial = pd.to_timedelta(kokyaku_data.loc[flg_is_serial, “登録日”].astype(“float”), unit=”D”) + pd.to_datetime(“1900/01/01”)
fromSerial
fromString = pd.to_datetime(kokyaku_data.loc[~flg_is_serial, “登録日”])
fromString
kokyaku_data["登録日"] = pd.concat([fromSerial, fromString])
kokyaku_data
いい感じですね。
次は、登録年月と顧客数をgroupby で並べて集計しましょう。
そして、データ数も len でカウントします。
kokyaku_data[“登録年月”] = kokyaku_data[“登録日”].dt.strftime(“%Y%m”)
rslt = kokyaku_data.groupby(“登録年月”).count()[“顧客名”]
print(rslt)
print(len(kokyaku_data))
登録日に数値データが残っていないか確認しましょう。
flg_is_serial.sum() が 0になっていればOKです。
flg_is_serial = kokyaku_data[“登録日”].astype(“str”).str.isdigit()
flg_is_serial.sum()
ノック3でやった内容を思い出して、マージさせてみましょう。
customer_name は消しましょう。
join_data = pd.merge(uriage_data, kokyaku_data, left_on=”customer_name”, right_on=”顧客名”, how=”left”)
join_data = join_data.drop(“customer_name”, axis=1)
join_data
ファイル出力するまえにデータ列を再配置しましょう。
dump_data = join_data[[“purchase_date”, “purchase_month”, “item_name”, “item_price”, “顧客名”, “かな”, “地域”, “メールアドレス”, “登録日”]]
dump_data
dump_data.to_csv(“dump_data.csv”, index=False)
import_data = pd.read_csv(“dump_data.csv”) import_data
購入年月ー商品
購入年月ー売り上げ金額
購入年月ー各顧客への販売数
購入年月ー地域での販売数
byItem = import_data.pivot_table(index=”purchase_month”, columns=”item_name”, aggfunc=”size”, fill_value=0) byItem
byPrice = import_data.pivot_table(index=”purchase_month”, columns=”item_name”, values=”item_price”, aggfunc=”sum”, fill_value=0) byPrice
byCustomer = import_data.pivot_table(index=”purchase_month”, columns=”顧客名”, aggfunc=”size”, fill_value=0) byCustomer
byRegion = import_data.pivot_table(index=”purchase_month”, columns=”地域”, aggfunc=”size”, fill_value=0) byRegion
最後に集計期間で購入してないユーザーのチェックをします。
away_data = pd.merge(uriage_data, kokyaku_data, left_on=”customer_name”, right_on=”顧客名”, how=”right”)
away_data[away_data[“purchase_date”].isnull()][[“顧客名”, “メールアドレス”, “登録日”]]
お疲れ様でした。これで2章は終了です。
続きは【第5回】python 実戦データ分析100本ノック第3章前半のまとめでお会いしましょう!
目次に戻りたい方はこちら
リンク
この記事を書いた人
元薬局薬剤師。今は一般会社で働き、副業ライター(月5-6桁)しつつ自由に暮らす30代男性。英語学習(TOEIC920点)やライティング、マーケティング、メンタル術など、社会で必要とされつつ、個人で稼げるために必要なスキルを磨いて、その様子を発信しています。
コメント