Python実践データ分析100本ノック

pythonを学習して基本はだいぶ理解してきました。

より実践に近づける為に「Python実践データ分析100本ノック」を購入

初心者が初歩レベルの学習を終了した人でも理解できるのか。

学習メモとします。

学習環境

Jupyter Notebook での学習が奨励されているようですが、私は使い慣れたpycharm で学習をしていきます。

必要になったらJupyter Notebook で学習します。

第1章 ウエブからの注文数を分析する10本ノック

まずは必要なCSVデータを出版社からダウンロードしてpycharmのフォルダに保存します。

pycharmを起動してmain.pyに書き進めます。

1,データを読み込む

まずは1行目でpandasをインポートしてpdと別名をつけます。

CSVファイルの読み込み pandasでcsvファイルを読み込みます。head()で上から5行を出力

2,縦方向へデータを結合する

pd.concatでユニオンを実施、縦方向へtransaction_1とtransaction_2を結合しています。

ignore_index=True と記述する事でインデックスを0から振り直しています。

(ignoreの英訳は無視するという意味です。)

3,横方向への結合

pd.mergeで横方向へ連結、結合の種類でleftとしています。transaction_detailをメインにしているため

4,マスターデータを結合

共通するIDで紐づけする。ここではcostomer_id,item_id

5,必要なデータ列を作る

売り上げ列を作成する。quantity(数量)とitem_priceの掛け算

上記が5行出力した結果。

6,データを検算する

それぞれのprice列の合計を比較する。又、True/Falseで確認

7,各種統計量を把握する

欠損している値の状況

全体のを把握

上記数字を把握することが重要

print(join_data.isnull().sum())

detail_id 0
transaction_id 0
item_id 0
quantity 0
payment_date 0
customer_id 0
customer_name 0
registration_date 0
customer_name_kana 0
email 0
gender 0
age 0
birth 0
pref 0
item_name 0
item_price 0
price 0
dtype: int64

上記isnull()で欠損値を返してくれる。それを列ごとに合計している。

print(join_data.describe())
    detail_id     quantity          age     item_price          price
count  7144.000000  7144.000000  7144.000000    7144.000000    7144.000000
mean   3571.500000     1.199888    50.265677  121698.628219  135937.150056
std    2062.439494     0.513647    17.190314   64571.311830   68511.453297
min       0.000000     1.000000    20.000000   50000.000000   50000.000000
25%    1785.750000     1.000000    36.000000   50000.000000   85000.000000
50%    3571.500000     1.000000    50.000000  102500.000000  120000.000000
75%    5357.250000     1.000000    65.000000  187500.000000  210000.000000
max    7143.000000     4.000000    80.000000  210000.000000  420000.000000

describ()で各種統計量を表示

print(join_data["payment_date"].min())
print(join_data["payment_date"].max())

2019-02-01 01:36:57
2019-07-31 23:41:38

データの期間範囲も確認

8,月別でデータを集計する

print(join_data.dtypes)

各項目のデータタイプを確認

detail_id int64
transaction_id object
item_id object
quantity int64
payment_date object
customer_id object
customer_name object
registration_date object
customer_name_kana object
email object
gender object
age int64
birth object
pref object
item_name object
item_price int64
price int64
dtype: object

object型からdatetime型へ変更

join_data["payment_date"] = pd.to_datetime(join_data["payment_date"])
join_data["payment_month"] = join_data["payment_date"].dt.strftime("%Y%m")
print(join_data[["payment_date","payment_month"]].head())

0 2019-02-01 01:36:57 201902
1 2019-02-01 01:37:23 201902
2 2019-02-01 02:34:19 201902
3 2019-02-01 02:47:23 201902
4 2019-02-01 04:33:46 201902

2行目でdtを使い年月単位で出力。文字列として返している(strftime)

print(join_data.groupby("payment_month").sum()["price"])

payment_month
201902 160185000
201903 160370000
201904 160510000
201905 155420000
201906 164030000
201907 170620000
Name: price, dtype: int64

実行することで月別の売り上げが表示される

groupbyでまとめたい列と集計方法を記述する

9,月別、商品別でデータを集計

print(join_data.groupby(["payment_month","item_name"]).sum()[["price","quantity"]])

payment_month item_name
201902 PC-A 24150000 483
PC-B 25245000 297
PC-C 19800000 165
PC-D 31140000 173
PC-E 59850000 285
201903 PC-A 26000000 520
PC-B 25500000 300
PC-C 19080000 159
PC-D 25740000 143
PC-E 64050000 305
201904 PC-A 25900000 518
PC-B 23460000 276
PC-C 21960000 183
PC-D 24300000 135
PC-E 64890000 309
201905 PC-A 24850000 497
PC-B 25330000 298
PC-C 20520000 171
PC-D 25920000 144
PC-E 58800000 280
201906 PC-A 26000000 520
PC-B 23970000 282
PC-C 21840000 182
PC-D 28800000 160
PC-E 63420000 302
201907 PC-A 25250000 505
PC-B 28220000 332
PC-C 19440000 162
PC-D 26100000 145
PC-E 71610000 341

月別、商品別に価格、数量で集計できます。

groupbyでリスト型で指定する

print(pd.pivot_table(join_data, index='item_name', columns='payment_month',values=['price','quantity'],aggfunc='sum'))

ピポットテーブルでくくります。

item_nameで月ごとの、price,quantityを合計してます。

aggfuncで集計方法を指定しています。

payment_month 201902 201903 201904 … 201905 201906 201907
item_name …
PC-A 24150000 26000000 25900000 … 497 520 505
PC-B 25245000 25500000 23460000 … 298 282 332
PC-C 19800000 19080000 21960000 … 171 182 162
PC-D 31140000 25740000 24300000 … 144 160 145
PC-E 59850000 64050000 64890000 … 280 302 341

10,商品別の売上推移を可視化

graph_data= pd.pivot_table(join_data, index='payment_month', columns='item_name',values='price',aggfunc='sum')
print(graph_data.head())

item_name PC-A PC-B PC-C PC-D PC-E
payment_month
201902 24150000 25245000 19800000 31140000 59850000
201903 26000000 25500000 19080000 25740000 64050000
201904 25900000 23460000 21960000 24300000 64890000
201905 24850000 25330000 20520000 25920000 58800000
201906 26000000 23970000 21840000 28800000 63420000

グラフ用に行と列を入れ替え

import matplotlib.pyplot as plt
#matplotlib inline
plt.plot(list(graph_data.index),graph_data["PC-A"],label='PC-A')
plt.plot(list(graph_data.index),graph_data["PC-B"],label='PC-B')
plt.plot(list(graph_data.index),graph_data["PC-C"],label='PC-C')
plt.plot(list(graph_data.index),graph_data["PC-D"],label='PC-D')
plt.plot(list(graph_data.index),graph_data["PC-E"],label='PC-E')
plt.legend()
plt.show()

matplotlibで描画 

#matplotlib inline

pychamなので2行目をコメントアウトしている

3から7行目で商品ごとのグラフ描画

8行目で凡例(legend)を表示

月別、アイテム別の販売推移が描画できる。

以上で1章は終了です。

データを連結して集計する。今まではExcelで実施していた事がpythonでできました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ABOUT US

投資を始めて12年経過した兼業投資家。 主な手法は ● トラリピを利用した「くるくるワイド」 ● 毎週積立をしてS&P500連動ETFを購入 他にFXスキャルピングやポイント投資も。 投機ではない「コツコツ投資」を紹介。 才能がなくても「あきらめず、日々継続」がモットーです。