◯この章の目的 ・ある企業のECサイトでの商品の注文数の推移を分析することによって、売上改善の方向性を探っていく ・ECサイトデータはウェブから得られるデータであることから、比較的「綺麗」なデータであることが多く、導入の練習問題として適している |
ノック1:データを読み込んでみよう |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
◯ポイント ・データ分析業務を行う際、「まず何をするのか」のイメージをつかむ ・実際の現場では、データをかき集めるところから始まり、データの概要を捉え、分析に適した形に加工することから始めることが多い ・どんな目的であろうと、データの全体像を把握することが重要。そのためなるべくデータの粒度が細かいデータに合わせてデータを作成 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ノック2:データを結合(ユニオン)してみよう |
◯ポイント ・pd.concatは、列名をキーにして縦方向に結合する ・ignore_index=Trueは、結合した後にインデックス番号を振り直す |
|
5000 1786 6786 |
ノック3:売上データ同士を結合(ジョイン)そしみよう |
||||||||||||||||||||||||||||||||||||||||||
◯ポイント ・pd.mergeで、ジョインを行っている ・主軸になるデータを考えつつ、どの列をキーにジョインするかを考える ・onでジョインキー、howでジョインの種類を指定 |
||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
|
ノック4:マスターデータを結合(ジョイン)してみよう |
|
detail_id | transaction_id | item_id | quantity | payment_date | customer_id | customer_name | registration_date | customer_name_kana | gender | age | birth | pref | item_name | item_price | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | T0000000113 | S005 | 1 | 2019-02-01 01:36:57 | PL563502 | 井本 芳正 | 2019-01-07 14:34:35 | いもと よしまさ | imoto_yoshimasa@example.com | M | 30 | 1989/7/15 | 熊本県 | PC-E | 210000 |
1 | 1 | T0000000114 | S001 | 1 | 2019-02-01 01:37:23 | HD678019 | 三船 六郎 | 2019-01-27 18:00:11 | みふね ろくろう | mifune_rokurou@example.com | M | 73 | 1945/11/29 | 京都府 | PC-A | 50000 |
2 | 2 | T0000000115 | S003 | 1 | 2019-02-01 02:34:19 | HD298120 | 山根 小雁 | 2019-01-11 08:16:02 | やまね こがん | yamane_kogan@example.com | M | 42 | 1977/5/17 | 茨城県 | PC-C | 120000 |
3 | 3 | T0000000116 | S005 | 1 | 2019-02-01 02:47:23 | IK452215 | 池田 菜摘 | 2019-01-10 05:07:38 | いけだ なつみ | ikeda_natsumi@example.com | F | 47 | 1972/3/17 | 兵庫県 | PC-E | 210000 |
4 | 4 | T0000000117 | S002 | 2 | 2019-02-01 04:33:46 | PL542865 | 栗田 憲一 | 2019-01-25 06:46:05 | くりた けんいち | kurita_kenichi@example.com | M | 74 | 1944/12/17 | 長崎県 | PC-B | 85000 |
ノック5:必要なデータ列を作ろう(売上列の作成) |
||||||||||||||||||||||||
◯ポイント ・データフレーム型の計算では、行ごとに計算が実行される ・データで語るデータサイエンティストが誤ったデータを出すというのは顧客からの信頼を失う。件数の確認等を行う事を心がける ・また、なるべくデータの検算(計算をしたあとで、間違いがないかどうか確かめるため、もう一度計算してみること)を行う |
||||||||||||||||||||||||
|
||||||||||||||||||||||||
|
ノック6:データ検算をしよう(列の合計) |
◯ポイント ・データ加工前のpriceの合計と、データ加工後に計算したpriceの合計は同じ値になるはず ・'=='でTrue/Falseで確認してもよい |
|
971135000 971135000
True |
ノック7:各種統計量を把握しよう |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
◯ポイント ・データ分析を進めていく上で、まずは大きく2つの数値を知る必要がある ・欠損している値の状況(欠損があったら除去や補完が必要)⇒ isnull( ).sum( )で行なう ・全体の数値感 ⇒ describe( )で行う ・isnull( ).sum( )は、isnull( )でTrue(欠損値)/Falseを返し、sum( )でそのTrueの数をそれぞれ列毎に集計する |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
◯ポイント ・describe( )は、全体感を把握するため各種統計量を出力。デフォルトでは数値の列のみ選択される データ件数(count) 平均値(mean) 標準偏差(std) 最小値(min) 四分位数(25%、75%) 中央値(50%) 最大値(max) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ノック8:月別でデータを集計してみよう |
||||||||||||||||||
◯ポイント ・半年程度なら影響ないが過去数年となるとビジネスモデルの変化等により一纏めに分析すると見誤るケースがある ・その場合、データ範囲を絞るケースもある |
||||||||||||||||||
|
||||||||||||||||||
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 |
||||||||||||||||||
◯ポイント
・全体的に売上が伸びているのか否か把握するのは分析の第一歩。まずは月別で集計して一覧表示してみる |
||||||||||||||||||
|
||||||||||||||||||
|
||||||||||||||||||
◯ポイント ・groupbyは、まとめたい列(payment_month)、集計方法(sum)、集計する列(price)を指定する |
||||||||||||||||||
|
||||||||||||||||||
payment_month 201902 160185000 201903 160370000 201904 160510000 201905 155420000 201906 164030000 201907 170620000 Name: price, dtype: int64 |
ノック9:月別、商品別でデータを集計(売上、数量)しよう |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
◯ポイント ・groupbyする列が複数ある場合、リスト型で指定する |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
◯ポイント ・pivot_tableは、行(index)と列(columns)を指定することができる。valuesでは集計したい数値列、aggfuncには集計方法を指定する ・groupbyよりpivot_tableの方が月別、商品別の推移が把握しやすい |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ノック10:商品別の売上推移を可視化(グラフ)してみよう |
||||||||||||||||||||||||||||||||||||||||||
◯ポイント ・payment_monthはデータフレーム型のindexとして、商品名は列として作成 ・グラフを作成する際には、横軸にpayment_monthを、縦軸にgraph_dataの該当商品名を渡すことで描画が可能になる ・Matplotlib(マットプロットリブ) Matplotlib は、Pythonのグラフ描画のためのライブラリ pyplotは、matplotlibパッケージ内のモジュールで、欲しいプロットを作るために暗黙的かつ自動的に図形や軸を作成するインターフェース プロットは、データを座標内の点として配置すること %matplotlib inlineを実行してプロットを作成すると、アウトプット行に図が出力される plt.plot(x,y)は、折れ線グラフ。第一引数はx軸(payment_monthを指定)に対応し、第二引数がy軸(priceを指定)にあたる
・参考先 Matplotlib :【初心者向け】Matplotlib入門 | Pythonを使ってデータを可視化してみよう!サイト |
||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
|
◯この章の目的 ・小売店の売上履歴と顧客台帳データを用いて、データの分析や予測を行うための重要なノウハウである「データ加工」を習得する ・本章を通して、より現場に近い「汚い」データを処理する経験を積むことで、ビジネス現場ならではの種々雑多な状況に対処できる力を身につける |
ノック11:データを読み込んでみよう |
||||||||||||||||||||||||||||||||||||
◯ポイント ・データ等で顕在する入力ミスや表記方法の違い等が混在し、不整合を起こしている状態を「データの揺れ」という |
||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
|
ノック12:データの揺れを見てみよう |
◯ポイント データの揺れのパターン ・文字列内にスペースが含まれていたり ・アルファベットが大文字/小文字で統一されていない ・欠損値「NaN」が存在する |
|
ノック13:データに揺れがあるまま集計してみよう |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
◯ポイント ・pivot_tableのaggfunc="size"は、行(purchase_month)・列(item_name)毎の重複件数を集計する ・fill_vakue=0は初期値。欠損値を補完する値を指定する |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ノック14:商品名の揺れを補正しよう |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
◯ポイント ・upper()は、小文字を大文字に変換 ・replace()は、全角/半角のスペースを除外(置換) ・unique()は、重複を除外したユニーク件数 ・sort_valuesは、byで指定されてたカラム「item_name」で昇順にソートし画面表示する。ascending=Falseで降順になる ・単一列のデータフレームの場合はsort_values()で問題ない 例:uriage_data["item_name"].sort_values() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2999 rows × 5 columns |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
26 |
ノック15:金額欠損値の補完をしよう |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
◯ポイント ・isnull()は、欠損値の有無を確認。欠損値を含むカラムはTrue、含まない場合はFalseが出力される |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
purchase_date False item_name False item_price True customer_name False purchase_month False dtype: bool
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
◯ポイント flg_is_null = uriage_data["item_price"].isnull() ・item_priceの中で欠損値のある箇所を特定。flg_is_null変数にどの行に欠損値が存在するかが保存される |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
list(uriage_data.loc[flg_is_null, "item_name"].unique()) ・flg_is_nullによりデータが欠損している商品名の一覧を作成する処理になっている。以下に分解して説明 ・list()は、変数の値をリスト形式に変換 ・loc()は、条件を付与し、それに合致するデータを抽出する。ここでは「金額が欠損している行のitem_name列」の値を取得している ・unique()は、重複をなくす |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
price = uriage_data.loc[(~flg_is_null) & (uriage_data["item_name"] == trg), "item_price"].max() ・ループ変数:trg(欠損値がある商品名)を用いて、同じ商品で金額が正しく記載されている行をloc()で探し、その金額を取得している ・~flg_is_nullは、否定演算子。flg_is_null == Falseと同義 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uriage_data["item_price"].loc[(flg_is_null) & (uriage_data["item_name"] == trg)] = price ・売上履歴のitem_price列に対してloc()を行い欠損を起こしている対象データを抽出し、取得したpriceを欠損値に代入 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
・loc()は行ラベルだけを指定することも、条件式だけを指定することも可能 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
◯ポイント ・ループの中で商品に設定されている金額の最大値と最小値を出力 ・min(skipna=False)におけるskipnaは、NaNデータを無視するかの設定。Falseの場合はNaNが存在する場合、最小値はNaNと表示される |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
商品Aの最大額:100.0の最小額:100.0 商品Bの最大額:200.0の最小額:200.0 商品Cの最大額:300.0の最小額:300.0 (以下省略) |
ノック16:顧客名の揺れを補正しよう |
◯ポイント ノック14と同様 |
|
ノック17:日付の揺れを補正しよう |
||||||||||||||||||||||||||||||||||||||||||||||||
◯ポイント ・Excelデータを取り扱う際、注意すべき点として「書式が違うデータが混在する」事が挙げられる 2018/01/04 2017年2月16日 ・astype("str")で、str型に変化 ・str.isdigit( )で、顧客台帳の登録日が数値かどうかを判定している。すべての文字が数字ならTrue、そうでないならFalseを返す ・astype("str").str.isdigit()で一組 ・sum()で数値(True)として取り込まれている件数を取得 |
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
22 | ||||||||||||||||||||||||||||||||||||||||||||||||
◯ポイント ・pd.to_timedelta( )は、数値(シリアル値)から日付に変換する。unitは、単位を表し「D」は日単位 ・シリアル値は、Excelで日時を計算するための数値 ・pd.to_datetime("1900/01/01")で、基準になる日付('1900-01-01')と足し合わせている ・「- 2」は、Excelの日付シリアル値を単純にPythonで計算すると2日ずれるので2を引く |
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
1 2017-02-16 3 2017-05-17 4 2018-01-27 (以下省略) |
||||||||||||||||||||||||||||||||||||||||||||||||
◯ポイント ・日付として取り込まれているデータも、書式統一する。これでdatetime64型(標準フォーマと:yyyy-mm-dd)に変換される |
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
0 2018-01-04 2 2018-01-07 5 2017-06-20 (以下省略) |
||||||||||||||||||||||||||||||||||||||||||||||||
◯ポイント ・pd.concatで、数値から日付に変換されたデータと、書式を変換したデータを統合して、元の「登録日」に代入 |
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
(以下省略) |
||||||||||||||||||||||||||||||||||||||||||||||||
◯ポイント ・年月単位での集計結果を足し算すると、顧客台帳の総データ件数と一致するので、日付の補正が正しく行われた事が確認できる |
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
登録年月 201701 15 201702 11 201703 14 201704 15 201705 13 201706 14 201707 17 201801 13 201802 15 201803 17 201804 5 201805 19 201806 13 201807 17 201904 2 Name: 顧客名, dtype: int64 200 |
ノック18:顧客名をキーに2つのデータを結合(ジョイン)しよう |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
◯ポイント ・left_on、right_onで、結合するキーとなるデータを指定 ・howは、結合方法で「left」を指定した場合はleft側を主として、right側を副として結合することを意味する ・データの加工により、分析に適したデータの形にすることをクレンジングと呼ぶ |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
(以下省略) |
ノック19:クレンジングしたデータをダンプしよう |
||||||||||||||||||||||||||||||
◯ポイント ・クレンジングしたデータをファイル出力(ダンプ)し、分析する際は出力ファイルから読み込む事でクレジングのやり直しを省略する事ができる ・ファイル出力する際は、列の配置を調整(整形)して直感的に分かりやすくする |
||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
(以下省略) |
||||||||||||||||||||||||||||||
◯ポイント ・to_csv( )は、整形したdump_dataをファイル出力する。実行すると、同じ階層に出力される ・index=Falseは、行名無しを意味する |
||||||||||||||||||||||||||||||
|
ノック20:データを集計しよう |
||||||||||||||||||||||||
◯ポイント ・ノック13と同様 ・1行目:ダンプデータを読み込む ・2行目:purchase_monthを縦軸に、商品毎の集計(重複件数) ・3行目:purchase_monthを縦軸に、売上金額の集計(合計) |
||||||||||||||||||||||||
|
||||||||||||||||||||||||
◯ポイント ・顧客台帳を主体に結合。集計期間内に購買を行っていない顧客は「購買日」等がNaNで結合される ・away_data["purchase_date"].isnull()では、True(NaNである)/False(NaNでない)の結果を全行出力される ・away_data[away_data["purchase_date"].isnull()]では、True(NaNである=購買してない)の行だけ出力する |
||||||||||||||||||||||||
|
||||||||||||||||||||||||
|
||||||||||||||||||||||||
◯ポイント ・購買日がNaNの行を列名を指定して出力 |
||||||||||||||||||||||||
|
||||||||||||||||||||||||
|