派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

【第6話】続!集計と可視化:Plotlyでデータをグラフ化して傾向をとらえよう【漫画】未経験なのに、機械学習の仕事始めました

f:id:itstaffing:20210628142230j:plain

前回の続き:第5話 集計と可視化:pandasでデータの加工をしてみよう

f:id:itstaffing:20210628142233j:plain
f:id:itstaffing:20210628142236j:plain
f:id:itstaffing:20210113102532j:plain
第5話では、pandasを使ってデータを加工する方法を紹介しました。今回は、加工したデータをグラフにすることで、データの傾向をとらえてみましょう!

  今回のサンプルコード

サンプルコードは、こちらです。

  処理を単純化するために、最初におかしな値を除外する

第5話で、わかばちゃんは Quantity(購入量) にマイナス値を見つけました。その理由は、返品処理のせいでしたね。

f:id:itstaffing:20210628142203j:plain
f:id:itstaffing:20210628142206j:plain

Quantity(購入量)だけでなく、UnitPrice(単価)も原因不明のマイナス値がありました。データ加工の処理を単純化するために、Quantity(購入量)及び、UnitPrice(単価)がマイナス値のデータを事前に削除しましょう。

※今回のデータセット(サンプルデータ)では、マイナス値のQuantityは返品処理ではありましたが、データセットに記録されていない購入履歴もあるようです(詳細は省略します)

  Plotlyを使ってユーザーの購買履歴を折れ線グラフにしてみよう

Plotlyのインストール:pip install plotly
Plotlyはオープンソースのデータ可視化ライブラリで、Pythonだけでなく、R、JavaScript、MATLABなどでも使うことができます。

まずは、ユーザーの購買履歴を折れ線グラフで可視化してみましょう。データの 1 行ごとに行動が記録されており、これを追跡することでユーザーの活動を追体験することができます。

アクセスログを分析すると、どの商品を購入するか迷った形跡を追うこともできます。購買履歴からは、誰が・いつ・何を購入したかがわかります。

Plotlyでグラフを描くために、plotly.graph_objectsを読み込んでgoという名前をつけておきます。go.Figureでグラフ描画の準備、go.Scatterでグラフの作成です。

データ上では、8月30日に初めて商品を購入しており12月5日に1日当たりの購入金額が最大になっています。

Scatterにはオプションがあり、mode='lines'でデータ点をプロットせずに線のみを描画することができます。
f:id:itstaffing:20210628142208j:plain
```
import plotly.graph_objects as go
fig = go.Figure(data=go.Scatter(x=購入日時のデータ, y=購入量のデータ))
fig.show()
```

  ユーザーの居住地を円グラフにしてみよう

次に、ユーザーの居住地を円グラフで可視化してみましょう。円グラフではマイナーな項目全てを描画すると可読性が下がってしまうので「その他」でまとめるのがオススメです。

f:id:itstaffing:20210628142211j:plain

このデータセットはイギリスのECサイトであることから、約90%がイギリス国内からの購入は自然な結果ですね。約10%は他国に居住しているユーザーが購入していることが、興味深い点です。

円グラフの描画は、plotly.expressを読み込んで利用すると簡単です。
```
import plotly.express as px
fig = px.pie(データ, values='count', names='Country')
fig.show()
```

  購入実績の平均を、棒グラフで比較してみよう

前回実施したRFM分析(Recency:直近いつ、Frequency:頻度、Monetary:購入金額)における、Recencyの平均と翌月の購入実績の有無を用いて棒グラフを描いてみましょう。

翌月の購入実績があるユーザーは、Recency平均が約61日であるのに対して、翌月に購入していないユーザーのRecency平均は約110日。直近に購入しているユーザーほど、翌月にも購入している傾向があることがわかります。

棒グラフの作成には、go.Barを使います。
is_visit=Falseが購入実績のないユーザー、is_visit=Trueが購入実績のあるユーザーです。

f:id:itstaffing:20210628142213j:plain
```
fig = go.Figure(data=[ go.Bar(name='is_visit=False', x=["recency"], y=翌月の購入実績がないユーザーのRecencyの平均),
go.Bar(name='is_visit=True', x=["recency"], y=翌月の購入実績があるユーザーのRecencyの平均)
])
fig.update_layout(barmode='group')
fig.show()
```

Recency について、より詳しくデータを眺めていきましょう。

ヒストグラムを使うことで、データがどのように分布しているかを可視化することができます。分布を見ることでデータの全体像を捉えることができ、Recencyが小さいユーザー(直近に購入実績があるユーザー)が多いのか少ないのか、均等に散らばっているのか偏っているのか、ひと目でわかります。

このヒストグラムからはRecencyが小さいユーザーが多く、大きくなるに従ってユーザーが減っていくことがわかります。ロングテールな分布と呼ばれる形をしています。

ロングテールに分布するデータを平均値で集計すると、大きな値の影響を強く受けるので一般的な感覚からズレた結果になることが多いです。年収の平均値が一般的な感覚よりも高くなるのが有名な例です。描画にはpx.histgramを使います。
f:id:itstaffing:20210628142217j:plain
```
fig = px.histogram(データ, x="recency")
fig.show()
```

翌月の購入実績の有無で棒グラフを作って比較したように、ヒストグラムを2つ並べることも有用です。2つのヒストグラムを縦に並べて比較することによって、平均値で比較する棒グラフよりも細かい情報を得ることができます。

翌月に購入した青色のヒストグラムと購入していない赤色のヒストグラムを比較すると、青色の方が全体的に左側にデータが分布していて直近に商品を購入していることがわかります。

翌月に購入実績がないユーザーであっても直近30日以内に購入した人が全体の約28%もいます。直近に購入しているほど翌月も購入しやすい傾向はありますが、必ず購入するとは限らないことがわかります。

f:id:itstaffing:20210628142220j:plain

  散布図で外れ値をチェックしよう

次は散布図を描きます。px.scatterもしくはgo.Scatterを使います。px.scatterを用いる方が短いコードで描画可能です。

散布図はデータの傾向を捉えるときの基本的なグラフです。
横軸が Recency(直近いつ)、縦軸が Frequency(頻度)としています。
f:id:itstaffing:20210628142224j:plain
f:id:itstaffing:20210113102524j:plain
右端に1つだけ、ぴょこんと飛び出したデータがあるね!?Recencyは長いけど、Frequencyは高い。特殊なお客様だ。
f:id:itstaffing:20210113102532j:plain
そうですね!これは平均値では見えなかった事実ですね。一部のユーザーは高頻度で商品を購入していることがわかります。このような、他のデータとは明らかに傾向が異なるデータのことを 外れ値 と呼びます。

外れ値となるようなユーザーを細かく観測することで、サービスの珍しい使い方を発見できるかもしれません。場合によっては不適切な使い方をしているユーザーが外れ値となることもあります。

```
fig = px.scatter(x=Recencyデータ, y=Frequencyデータ)
fig.show()
```

  バブルチャートを描いてみよう

最後に、複雑なグラフを描いてみましょう。

・横軸にRecency(直近いつ)
・縦軸にFrequency(頻度)
・データ点の○の大きさでMonetary(購入金額)
・色で翌月に購入したか(翌月購入は赤色、未購入は青色)

雑なグラフになるほど、グラフが伝えるメッセージが不明瞭になりますが、データの傾向を捉えたい探索的な分析には有効です。

f:id:itstaffing:20210628142228j:plain
f:id:itstaffing:20210113102532j:plain
Plotlyを用いることで、さまざまなグラフを作成できます。より詳しい使い方を知りたい方は、https://plotly.com/python/をチェックしてくださいね。次回は、予測モデルとして有名なロジスティック回帰について学んでいきましょう!

第1話 機械学習の仕事内容って?実はコードを書くだけじゃない!
第2話 人工知能、機械学習、ディープラーニングの違いとは?
第3話 機械学習の活用事例!建設機械や回転寿司屋でも活用されている!?
第4話 機械学習したいのにデータがない!?
第5話 集計と可視化:pandasでデータの加工をしてみよう

【筆者】
早川 敦士さん
株式会社FORCASの分析チームにてリーダーを務める傍らで、株式会社ホクソエムで執行役員として従事。新卒でリクルートコミュニケーションズに入社しWeb広告やマーケティングオートメーションなどのB2Cマーケティングを経験し、FORCASではB2Bマーケティングプラットフォームのデータ分析および開発を担当している。大学在学中に『データサイエンティスト養成読本』(技術評論社刊)を共著にて執筆。その後も『機械学習のための特徴量エンジニアリング』(オライリー・ジャパン刊)や『Pythonによるはじめての機械学習プログラミング』(技術評論社刊)などで執筆活動を続けている。国内最大級のR言語コミュニティであるJapan.Rを主催。Youtubeチャンネル『データサイエンティストgepuro』で動画を投稿。
・Twitterアカウント

湊川 あいさん
フリーランスのWebデザイナー・漫画家・イラストレーター。マンガと図解で、技術をわかりやすく伝えることが好き。 著書『わかばちゃんと学ぶ Git使い方入門』『わかばちゃんと学ぶ Googleアナリティクス』『わかばちゃんと学ぶ Webサイト制作の基本』『運用ちゃんと学ぶ システム運用の基本』『わかばちゃんと学ぶ サーバー監視』が発売中のほか、マンガでわかるGit・マンガでわかるDocker・マンガでわかるRuby・マンガでわかるScrapbox・マンガでわかるLINE Clova開発・マンガでわかる衛星データ活用といった分野横断的なコンテンツを展開している。
・Amazon著者ページ
・Twitterアカウント

  わかばちゃんが登場する書籍いろいろ   

 
 
f:id:itstaffing:20210113102514j:plain  f:id:itstaffing:20210113102516j:plain
 
f:id:itstaffing:20210113102519j:plain  f:id:itstaffing:20210113102521j:plain


わかばちゃんと学ぶシリーズ(Amazonページ)