Python
numpy
matplotlib
pandas
seaborn

【厳選】Python実務データ分析でよく使う手法(データ集計・可視化編)

はじめに

  • データ分析実務で頻繁に利用するPythonのデータ分析手法まとめです
  • 前処理編の続きです
  • ここでいう「実務」とは機械学習やソリューション開発ではなく、アドホックなデータ分析や機械学習の適用に向けた検証(いわゆるPoC)を指します
  • 領域によっては頻繁に使う手法は異なるかと思うので、自分と近しい領域のデータ分析をしている方の参考になればと思います
  • 今回はデータ集計&可視化の際によく使うコードをまとめました

データ集計&可視化

カテゴリデータの集計&可視化:Dataframe.value_counts()&plot.bar() or sns.countplot()

  • 2つの方法があります
1. value_countsで集計してから、plot.barで可視化
  • value_countsで集計すると件数が多い順にソートされる
data['n_interval'].value_counts().plot.bar(figsize=(15, 3), color='darkblue')

image.png

  • 集計結果をデータとして保持しているので、関連処理が容易にできる
  • よくあるパータンとして、累積構成比率のグラフとセットで見せる
fig, ax1 = plt.subplots()
data['n_interval'].value_counts().plot.bar(figsize=(15, 3), color='darkblue', ax=ax1)
ax2 = ax1.twinx()
ratio = data['n_interval'].value_counts()/ data['n_interval'].value_counts().sum()
ratio.cumsum().plot(figsize=(15, 3), color='lightblue', ax=ax2)

image.png

[補足]2軸プロット
  • ax1.twinx()を使うことで、2軸プロットが作成できる
  • 冒頭でfig, ax1 = plt.subplots()を指定しておくことで、Dataframe.plot()の結果がfig, ax1に格納される
  • x軸をシェアしたいので、ax1.twinx()で共有する軸を生成して、ax2に格納する
  • 2つ目のDataframe.plot()の軸を明示的にax=ax2とすることで2軸プロットの完成
2. seabornのcountplotで可視化
  • seaboarnにはデータフレーム投げるだけで集計&可視化がされる
  • 方法1との違いとして、ラベルの順番がカテゴリデータの順番を受け継ぐ
  • カテゴリデータでない場合は1と同様に件数が多い順で出力される
plt.figure(figsize=(15, 3))
sns.countplot(data['n_interval'], color='darkblue')

image.png

時系列データの集計:pd.resample()

  • 時系列データを任意の単位に集計する
  • resampleの引数に以下のキーワードを入れると集計単位を指定できる
  • resample('kw')以降に集計関数を指定できる(sum, count等)
Key word 集計単位
W Weekly
M Monthly (Month end)
MS Monthly (Month start)
A Annually (Year end)
AS Annually (Year start)
H Hourly
S Secondly
data = data.set_index('Month')# resampleを使うために、DataframeのIndexにdatetime型のデータをセット
data['n'].resample('M').sum().plot(figsize=(15, 3), lw=.7)

image.png

複数のグラフを並べて表示する:plt.subplot()

  • 可視化した結果を並べて比較する
  • plt.subplot(abc)でグラフの配置を指定する
    • a = 行数、b = 列数、a = 配置順番
    • for文と組合せることでグラフの自動配置も可
  • plt.subplotで可視化するとグラフが重なってしまうときは、plt.subplots_adjustで配置の幅を調整する
    • wspaceがグフラ間の横幅を示し、hspaceがグラフ間の縦幅を示す
    • デフォルトはwspace=0.2, hspace=0.2
d1 = data['n'].resample('M').sum()
# 適当なデータを生成する
import statsmodels.api as sm
res = sm.tsa.seasonal_decompose(d1)
d2 = res.trend
d3 = res.seasonal
d4 = res.resid
plt.figure(figsize=(15, 5))
plt.subplots_adjust(wspace=0.1, hspace=0.2)
plt.subplot(221)
plt.plot(d1)
plt.subplot(222)
plt.plot(d2)
plt.subplot(223)
plt.plot(d3)
plt.subplot(224)
plt.plot(d4)

image.png

グラフの凡例の位置調整:plt.legend(loc, bbox_to_anchor)

  • 分析結果を資料にまとめる際、凡例の位置がチャートに重なってしまうことがある
  • データ分析上はどうでもいいのですが、偉い人達はとても気にします
  • plt.legendの引数locで場所を指定できる
    • "upper left"=左上、"upper right"=左上、"lower left"=左下、"lower right"=左下
  • plt.legendの引数bbox_to_anchorを調整することで、凡例をグラフ外に表示することも可能(凡例の数が大きい場合に効果的)
    • bbox_to_anchorにタプルでデータを渡す
    • 図全体の左下を(0, 0), 右上を(1, 1)として相対値で場所を指定
#デフォルト
data.plot(figsize=(15, 3), lw=.7)
#凡例の場所を指定
data.plot(figsize=(15, 3), lw=.7)
plt.legend(loc="lower right")
#凡例の場所を指定
data.plot(figsize=(15, 3), lw=.7)
plt.legend(bbox_to_anchor=(1.01,1))

image.png

image.png

image.png

相関マトリックスをヒートマップで表示:Dataframe.corrとsns.heatmap

  • 各変数間の関係性を可視化する際に、相関マトリックスを生成して、比較することがよくある
  • Dataframe.corr()を利用することで相関係数を算出することができる
  • Methodを指定することで相関係数の種類も指定できる
    • 'pearson': ピアソンの積率相関係数(デフォルト)
    • 'kendall': ケンドールの順位相関係数
    • 'spearman': スピアマンの順位相関係数
  • Dataframe.corr()をsns.heatmapに渡すことで相関マトリックスがヒートマップで可視化される
  • 相関マトリックスをヒートマップで可視化する際によく使うオプションは以下の通り
    • annot=True:相関係数を数値として表示する(デフォルトはFalseで非表示)
    • lw=0.7:セル間の線幅(追加したが方が見やすい)
    • cmap= "Blues":heatmapのカラー指定(個人的に好きなの色は"Blues", "YlGnBu", "Greens")
# 相関マトリックスを計算方法を変えて3つ生成
cor1 = data.corr(method='pearson')
cor2 = data.corr(method='kendall')
cor3 = data.corr(method='spearman')

# ヒートマップで可視化
plt.figure(figsize=(15, 10))
plt.subplots_adjust(wspace=0.1, hspace=0.3)
plt.subplot(311)
sns.heatmap(cor1, annot=True, lw=0.7, cmap='Blues')
plt.title('pearson')

plt.subplot(312)
sns.heatmap(cor2, annot=True, lw=0.7, cmap='YlGnBu')
plt.title('kendall')

plt.subplot(313)
sns.heatmap(cor3, annot=True, lw=0.7, cmap='Greens')
plt.title('spearman')

image.png

最後に

  • 実際のビジネスでデータ分析をす際によく使う手法をまとめてみました
  • 今後、頻出するコードがあれば随時アップデートします
  • 次はよく使う分析手法編でもまとめてみようかと思います