散布図とは?

散布図は2つの量的変数の関係を分析するために使うグラフです。

散布図では、グラフの縦軸と横軸に量的変数をとり、一つ一つのデータを点で表します。点がどのように分布しているか、何か特徴的な傾向はないかなど確認していきます。

散布図の例

上にあげた散布図の例は、会社従業員の年齢と勤続年数の関係を表したグラフになります。年齢が高いほど勤続年数も高くなっていることがわかります。このように、2つの量的変数の大きさが連動しているような関係を相関関係と呼びます。

また、こちらの散布図を見ると、中央下部に全体から外れた点が存在していることもわかります。これも大切な情報で、「これらの外れたデータは何を意味するのだろう?」と考えてみると、様々な発見につながることがあります。

Pythonで散布図を描く

この記事で掲載している散布図は、当サイトで提供している人事トイデータ(拡張版)を使用したものです。また、ツールとしてPythonのSeabornを用いて作図しました。具体的なPythonコードは以下のようになります。

まずは初期設定とデータの読み込みから。

# ライブラリの読み込みと初期設定
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
import seaborn as sns
sns.set()
plt.rcParams["figure.figsize"] = (5, 5)
japanize_matplotlib.japanize()

# データの読み込み
df_hr = pd.read_csv('./hr-toydata-basic-600.csv')

データが読み込めたのでデータサンプルを確認します。データから年齢と勤続年数を取り出して、先頭10行を表示してみました。

df_hr[['年齢','勤続年数']].head(10)
データのサンプル

次に、冒頭に示した散布図を描いてみましょう。特にデータを加工することなく、一行で作図することができます。横軸(x)と縦軸(y)に対して列名を指定すればOKです。

sns.scatterplot(data=df_hr, x='年齢', y='勤続年数')
散布図(年齢と勤続年数)

点の重なりを考慮した散布図

今回使用した人事トイデータ(拡張版)は、全体で600件のデータとなっています。それと比較すると、この散布図に含まれる点の数は少ないような気がします。点が重なっているのかもしれません。このようなときには、点の色に対して透過設定をしてみるとよいでしょう。

sns.scatterplot(data=df_hr, x='年齢', y='勤続年数', alpha=.1)
散布図(透過)

上の透過設定のされた図を見ると、点が薄いところと濃いところがあることがわかります。色が濃いところは複数の点が重なっているわけです。今回の例でいうと、同じ年齢で同じ金属年数の従業員が複数存在しているということになります。

さて、色の濃淡だけでは分かりにくいという場合には、各点にランダムノイズ(ジッター)を付与してプロットすると分かりやすい場合があります。

sns.regplot(data=df_hr, x='年齢', y='勤続年数', fit_reg=False, x_jitter=.5, y_jitter=.5, scatter_kws={'alpha':.1})
散布図(ジッター付き)

散布図を深掘りする

散布図は横軸と縦軸の関係性を見るだけではなく、特徴的な傾向やグループを発見するためにも利用できます。今回取り上げた例では、中央下部に全体から外れたデータが存在していて、少し気になるかと思います。このような場合は、他の情報を使って色分けしながら深掘りしていきます。

例として、採用区分を使って色分けした散布図を次に示します。

sns.scatterplot(data=df_hr, x='年齢', y='勤続年数', hue='採用種別', alpha=.1)
散布図(色分け)

上の散布図を見ると、中央下部のクラスターは中途採用者のグループであることがわかりました。年齢と勤続年数の関係を考察するのであれば、採用種別で分けて考える必要があるといえますね。

なお、色分けだけでは分かりにくいという場合は、点の形を変えることも有効です。

sns.scatterplot(data=df_hr, x='年齢', y='勤続年数', hue='採用種別', style='採用種別', alpha=.1)
散布図(色・記号分け)

回帰直線をフィットさせて傾向を見る

散布図の横軸と縦軸の関係を分析するために、回帰直線をフィットさせてみるのも有効です。今回のデータ全体に対してフィットさせてみると次のようになります。

sns.lmplot(data=df_hr, x='年齢', y='勤続年数', scatter_kws={'alpha':.1})
散布図(回帰直線付き)

次に、先ほど知見を使って採用種別で分けてフィットさせてみると、次のようになりました。関係性がより明確になりました。

sns.lmplot(data=df_hr, x='年齢', y='勤続年数', hue='採用種別', scatter_kws={'alpha':.1})
散布図(グループ別に回帰直線をフィット)

一目で関係性がわからない散布図もある

ここまでは、年齢と勤続年数の関係ということで、比較的分かりやすいデータを使って散布図を見てきました。その一方で、実際にデータ分析をやっていると、散布図を一目見ただけでは傾向や関係が分からない場合も多々あります。

例えば、人事トイデータの中で時間外とエンゲージメントの散布図を描いてみると次のようになります。

sns.scatterplot(data=df_hr, x='時間外時間数_月平均', y='エンゲージメント', alpha=.6)
散布図の例2

こうした散布図を目にしたときには急いで結論を出さず、注意深く分析を進めていく必要があるでしょう。

この記事で使ったデータ

以下のページでデータを配布しています。

人事トイデータの公開
こちらのページでは、クニラボで作成した人事トイデータを公開しています。 トイデータとは? トイデータ(Toy Data)とは、演習用に使えるリアルでないデータのことをいいます。データ分析や機械学習のライブラリに附属する場合もあり、手元にデータがなくてもそのライブラリをすぐに試せるのが利点です。 人事データ分析の演習にご活用ください ピープルアナリティクスを学んでみたいが手元に良いデータがない、という方も多いのではないでしょうか。人事データは個人情報を含むため、ピープルアナリティクスプロジェクトの正式なメンバーでないと触ることができません。 そこで、演習用にデータを自作しGoogleドライブより公開しています。これまでも代表のnote記事の中でリンクを張っていたのですが、複数の記事で利用するためこのページを作りました。 * 2023/11/29追記 「HRトイデータ_人事情報_拡張版.csv 」を追加しました。 * 2024/3/23追記 「HRトイデータ_月別時間外.csv 」を追加しました。 * 2024/11/18追記 「HRトイデータ_エンゲージメントスコア