Python実践データ分析100本ノック作業記録【第一章~第二章】


はじめに

第一章の残りだけで終わらせようと思ったら、大半が写経になったから第二章までやることにしました。

最近、チーム内でデータ解析を行うことが増えたのでこの経験を活かせるのがちょっと嬉しい。

第一章続き(抜粋)

ノック8

試しに年齢で振り分けて消費金額の年代別の差を見たい場合、
次のようにすれば良い。
numpy由来ののブロードキャストのおかげで楽にかけて良いね。

joined_dataframe["age_div10"] = joined_dataframe["age"] // 10

print(joined_dataframe.groupby("age_div10")["price"].mean())

ノック10

matplotlibもまともに扱ったことがなかったので、試しにコンソールにユーザーガイドのを書き込んでみたら、import後にこんな表記が出た。

Backend TkAgg is interactive backend. Turning interactive mode on.

下記ソースをコンソールに流し込んだら勝手にグラフが出てきたけど、同じ内容のpyファイルを作ってそれを実行させたらグラフが出てこず、axes.show()をしなければグラフが出てこなかった。
インタラクティブモードってそういうことか。

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()  # Create a figure containing a single axes.
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])  # Plot some data on the axes.

ある程度は写経をしていたが、python自体はそれなりに触っているため、
最後のplotの部分は体が受け付けず、下記のような作りに書き換えた。


month_axis = list(graph_data.index)
item_type_list = list(graph_data.columns)

for data_name in item_type_list:
    plt.plot(month_axis, graph_data[data_name], label=data_name)

plt.legend()
plt.show()

第二章

ノック11

第一章のときのライブラリ構造に追加し、openpyxlとxlrdを追加。
例外のメッセージにに従って順番にインストールしていたので、xlrdはいらなかったかも。
xls形式のデータを読むときは必須だったはずだけど。

ノック15

複雑そうな処理だけど、まずは自分の頭で考えてみたかったから考えてみた。
第一章のような商品マスタを作ることを意識して結合すればいけると思う。

まずは各商品ごとに値段候補を書き出してみる。

import pandas as pd

customer_data = pd.read_excel("kokyaku_daicho.xlsx")
sell_report = pd.read_csv("uriage.csv")

sell_report["purchase_dt"] = pd.to_datetime(sell_report["purchase_date"])
sell_report["purchase_month"] = sell_report["purchase_dt"].dt.strftime("%Y%m")

sell_report["item_name"] = sell_report["item_name"].str.upper()
sell_report["item_name"] = sell_report["item_name"].str.replace(" ", "")
sell_report["item_name"] = sell_report["item_name"].str.replace(" ", "")

item_price_table = sell_report[["item_name", "item_price"]]

for name in sell_report["item_name"].unique():
    price_list = item_price_table[item_price_table["item_name"] == name]["item_price"].unique()
    print(name, price_list, end=" / ")

下のような出力を意図通りに得られた。NaNではない方を抽出して商品名と価格のDataFrameを作って結合すれば良さそうだ。

商品A [100. nan] / 商品S [ nan 1900.] / 商品Z [2600.] / 商品V [2200. nan]

つまり、for文以下はこうなる。


for name in sell_report["item_name"].unique():
    price_list = all_sell_item_price_table[all_sell_item_price_table["item_name"] == name]["item_price"].unique()
    item_price_table = item_price_table.append({"item_name": name,
                                                "item_price": [price for price in price_list if not math.isnan(price)][0]},
                                               ignore_index=True)

sell_report = pd.merge(sell_report.drop(columns="item_price"), item_price_table, on="item_name")

本の方ではlocプロパティが使われていた。そっちのほうが上のソースに相当する処理が1.5倍早かった。

第二章の残りは本とコードと変わらないので省略。

次回、第三章から。
もうそろそろ毎回printするのが面倒になってきたからJupyter Notebookを使うかな。