連載
» 2023年12月07日 05時00分 公開

[データ分析]散布図を徹底活用して「関係」を可視化 〜 関係と規模を一度に見るやさしいデータ分析

データ分析の初歩から応用まで少しずつステップアップしながら学んでいく連載の第12回。グラフを利用して項目同士の関係や、その中での値の大きさを可視化します。散布図やバブルチャートの詳細な取り扱いと視覚的な分析について、ケーススタディを通して学びましょう。

[羽山博]
「やさしいデータ分析」のインデックス

連載目次

連載:

『社会人1年生から学ぶ、やさしいデータ分析』

社会人1年生から学ぶ、やさしいデータ分析

 この連載では、データをさまざまな角度から分析し、その背後にある有益な情報を取り出す方法を学びます。
 データの収集方法、データの取り扱い、分析の手法などについての考え方を具体例で説明するとともに、身近に使える表計算ソフト(ExcelやGoogleスプレッドシート)を利用した作成例を紹介します。
 必要に応じて、Pythonのプログラムや統計ソフトRなどでの作成例にも触れることにします。
 数学などの前提知識は特に問いません。肩の力を抜いてぜひとも気楽に読み進めてください。

羽山博 羽山博

筆者紹介: IT系ライターの傍ら、非常勤講師として東大で情報・プログラミング関連の授業を、一橋大でAI関連の授業を担当。書道、絵画を経て、ピアノとバイオリンを独学で始めるも学習曲線は常に平坦。趣味の献血は、最近脈拍が多く99回で一旦中断。さらにリターンライダーを目指し、大型二輪免許を取得。1年かけてコツコツと貯金し、ようやくバイクを購入(またもや金欠)。


 前回はピボットテーブルによるクロス集計表の作成とヒートマップを利用して分布を可視化しました。今回は、散布図とバブルチャートによって分布を可視化します。

 いずれも項目間の関係や分布を可視化するのに便利ですが、ヒートマップは変数が名義尺度や順序尺度である場合、または、階級に分けられている間隔尺度の場合に便利です。前回見たワインの価格は間隔尺度ですが、それを階級に分けて利用しました。評価はそもそも順序尺度ですが、便宜的に間隔尺度として取り扱い、得られた平均値によって階級を分けていました。ちなみに尺度については第2回で説明しています。

 今回取り扱う散布図は、主として変数が間隔尺度の場合に使われます。そこで、前回のデータをそのまま(階級に分けずに)散布図を作成してみます。今回は、売上金額を含めた表を基に、価格と評価、そして売上金額の関係を散布図やバブルチャートで分析していくことにします(図1)。前回同様、データは架空のものです。

散布図とバブルチャート 図1 散布図による分布の可視化+規模の可視化=バブルチャート!
ワインの価格と評価の関係に対する、売上金額の大きさを可視化したい。散布図だと、2つの変数(価格と評価)の関係しか分からない。しかしバブルチャートなら、2つの変数の関係だけでなく、もう1つの変数(売上金額)の大きさも可視化できる。

 今回のテーマは、散布図を利用した2つの変数の関係の可視化することです。さらにバブルチャートを利用して2つの変数の関係だけでなくもう1つの変数の規模(大きさ)も可視化します。後半のコラムでは、散布図を色分けしてグループを可視化する方法と、数多くの項目について散布図をまとめて作る方法についても紹介します。


 この記事は、データ分析の初歩から応用まで少しずつステップアップしながら学んでいく連載の第12回です。特に、第7回から今回の散布図/バブルチャートまでは「可視化シリーズ」として、グラフの使い方と分析の観点について解説しています。第7回の棒グラフ第8回の折れ線グラフ第9回の円グラフ/パレート図第10回のヒストグラム/箱ひげ図第11回のクロス集計表/ヒートマップも併せてご参照ください。これらのグラフの目的と効用などについて、特別予告編で簡単に整理しています。事前に確認しておくとより理解が深まるでしょう。

この記事で学べること

 今回は以下のようなポイントについて、分析の方法や目の付けどころを見ていきます。

  • 散布図による分布の可視化 …… 間隔尺度のデータの関係を可視化する
  • バブルチャートによる分布と規模の可視化 …… 散布図の中で値の大きさを可視化する
  • 散布図やバブルチャートの活用 …… 複数の散布図を一度に作ったり、グループにより色分けしたりする

 では、基本の基本である散布図の作成から見ていきます。サンプルファイルの利用についての説明の後、本編に進みましょう。

サンプルファイルの利用について

 本稿では、表計算ソフトを使って手を動かしながら学んでいきます。表計算ソフトMicrosoft Excel用の.xlsxファイルをダウンロードできるようにしています。デスクトップ版のExcelが手元にない場合は、Microsoftアカウントがあれば使える無料のMicrosoft 365オンライン、もしくはGoogleアカウントがあれば使える無料のGoogleスプレッドシート(Google Sheets)をお使いください。Microsoft 365オンラインの場合は、.xlsxファイルをOneDriveにアップロードしてから開いてください。Googleスプレッドシートの場合は、.xlsxファイルをGoogleドライブにアップロードしてから開いた上で[ファイル]メニューの[Google スプレッドシートとして保存]を実行してください(Googleスプレッドシート独自の機能を使っている場合は、ファイルを共有して参照できるようにします。その場合は、該当する箇所で使い方を記します)。

散布図を作成して関係を可視化する 〜 外れ値や項目の特徴も見つけよう

 では、さっそく散布図を作成してみましょう。サンプルファイルをこちらからダウンロードし、[ワインの売り上げ(1)]ワークシートを開いて取り組んでみてください。Googleスプレッドシートの場合はこちらのサンプルファイルも利用できます。メニューから[ファイル]−[コピーを作成]を選択し、Googleドライブにコピーしてお使いください。

 手順は図の後に箇条書きで示しておきます。ただし、タイトルやグラフの表示位置、サイズなど、データ分析そのものにあまり関係のない設定については省略してあります。なお、動画でも手順を解説しているので、操作を一つ一つ追いかけたい方はぜひご視聴ください。

動画1 Excelでの散布図の作り方


ワインの価格と評価の散布図 図2 ワインの価格と評価の散布図(完成イメージ)
前回は、価格と評価をグループ化し、階級に分けてヒートマップを作成したが、価格は間隔尺度であり、評価も便宜的に間隔尺度として扱うので、素直に散布図として表してみよう。

 以下の手順で進めていきましょう。

Excelでの操作手順

  • セルC3D1003を選択する
  • [挿入]タブを開き、[散布図(X, Y)またはバブルチャートの挿入]ボタンをクリックする
  • [散布図]を選択する

Googleスプレッドシートでの操作手順

  • セルC3D1003を選択する
  • メニューバーから[挿入]−[グラフ]を選択する
  • [グラフエディタ]作業ウインドウで[グラフの種類]リストから[散布図]を選択する

 セルC3D1003を選択するにはドラッグ操作よりも[名前]ボックスに「C3:D1003」と入力する方が簡単です。これで図3のような散布図が作成されます。

ワインの価格と評価の散布図(作成途中) 図3 ワインの価格と評価の散布図(外れ値の発見)
価格を横軸(X軸)、評価を縦軸(Y軸)とした散布図が作成された。一見して65万円近くに外れ値(高価なワイン)があることが分かる。価格と評価はおおむね比例しているようだが、低価格のワインほど評価のばらつきが大きいようにも見える。

 図3から、65万円(実際の値は64万5000円)のワインが外れ値として存在することが分かります。そこで、高価なワインは除外し、値が密集している部分を詳細に見るために、横軸の最大値を変更してみましょう。ここでは、最大値を20000とします。

Excelでの操作手順

  • 横軸の目盛を右クリックし[軸の書式設定]を選択する
  • [軸の書式設定]作業ウインドウで[最大値]に「20000」と入力する
    • [最大値]という項目が表示されていない場合は、[軸のオプション]ボタンをクリックし、[>軸のオプション]という項目をクリックすれば、[最大値]が入力できるようになる

Googleスプレッドシートでの操作手順

  • グラフを右クリックし[軸]−[横軸]を選択する
  • [グラフエディタ]作業ウインドウの[カスタマイズ]タブで[最大値]に「20000」と入力する

 これで、図2(完成イメージ)のような散布図が作成されます。前回見た通り、2,000円から3,000円で、評価が3.5から4.5あたりの商品が多いことが分かりますね。さらに、グラフからもう一つ重要なことが読み取れます。それは、評価が5.0で頭打ちになっているということです。そもそも、2,000円から3,000円あたりの5.0という評価と、20,000円あるいはそれ以上の価格のワインの5.0は同じ価値を持つ評価でしょうか。品質の良い高価なワインであれば「☆5つではなく☆100個を付けたい」というように、もっと高い評価を付けたい人も多いのではないでしょうか。ネットショッピングの口コミは5段階評価が多いので、図2のようなグラフになってしまいますが、より繊細かつ厳密に評価するのであれば、100点満点にした方がよさそうだということも分かりますね。


AI博士

 ワインの評価としては、パーカーポイントと呼ばれる評価が有名です。パーカーポイントでは、色や風味、質などを基に、100点満点で値が与えられます。詳細については、サッポロビールのワインに関するページなどをご参照ください。


バブルチャートを作成して規模も可視化する 〜 売り上げに貢献しているクラスを見つける

 図2や図3を見ると、ある価格のワインがどのような評価を得ているかが分かりますが、そのワインの売り上げがどの程度であるかは分かりません。手頃に購入できるワインは、単価は安くても売上数量が多いので、合計の売上金額も大きいと考えられそうです。一方、高価なワインは、単価が高いので、売上数量が少なくても合計の売上金額は大きいかもしれません。そこで、散布図に売上金額のような「規模」(大きさ)を表す値を反映させるためにバブルチャートを作ってみましょう。

 作成の方法は簡単です。横軸に対応する項目と縦軸に対応する項目、規模に対応する項目を指定してグラフを作成するだけです。

 では、散布図の作成に利用したファイルの[ワインの売り上げ(2)]ワークシートを開いて取り組んでみてください。[ワインの売り上げ(1)]と同じデータですが、作業しやすいように別のワークシートにしておきました。箇条書きにした以下の手順でバブルチャートを作成してみましょう。これについても、動画での解説も用意してあるので、操作を一つ一つ追いかけたい方はぜひご視聴ください。なお、現在のところ、Microsotf 365オンラインにはバブルチャートの機能がありません。

動画2 Excelでのバブルチャート作り方


Excelでの操作手順

  • セルC3D1003とセルF3F1003を選択する
  • [挿入]タブを開き、[散布図(X, Y)またはバブルチャートの挿入]ボタンをクリックする
  • [バブル]を選択する

Googleスプレッドシートでの操作手順

  • セルC3D1003とセルF3F1003を選択する
  • メニューバーから[挿入]−[グラフ]を選択する
  • [グラフエディタ]作業ウインドウで[グラフの種類]リストから[バブルチャート]を選択する
  • [サイズ]ボックスで「売上金額」を選択する

 グラフ化するセルの範囲を選択するには、ドラッグ操作と[Ctrl]+ドラッグ操作で離れた範囲を選択するよりも[名前]ボックスに「C3:D1003,F3:F1003」と入力する方が簡単です。ただし、Googleスプレッドシートでは、この指定ができないので、[名前]ボックスに「C3:D1003」と入力した後、[Ctrl]キーを押しながらセルF3F1003をドラッグする必要があります。別の方法としては、E列の見出しをクリックし[列を非表示]を選択した後、[名前]ボックスに「C3:F1003」と入力するのが簡単です。

 この段階では、図4のようなグラフになっています。

ワインのバブルチャート(作成途中) 図4 ワインの価格、評価、売り上げのバブルチャート(作成途中)
取りあえず作成されたバブルチャート。約65万円の高価なワインはかなり売り上げが大きいことが分かる。手頃な価格のワインに関してはバブル(円)が重なっているのでよく分からない。横軸の最小値と最大値、バブルのサイズを調整しよう。

 続けて、以下の手順で最小値と最大値の設定やバブルサイズの変更を行っておきましょう。ただし、Googleスプレッドシートではバブルサイズが自動的に決められ、変更ができないようなので、その操作は省略します。

Excelでの操作手順

  • 横軸の目盛を右クリックし[軸の書式設定]を選択する
  • [軸の書式設定]作業ウインドウで[最大値]に「0」と入力する
  • [軸の書式設定]作業ウインドウで[最小値]に「20000」と入力する
    • [最大値]という項目が表示されていない場合は、[軸のオプション]ボタンをクリックし、[>軸のオプション]という項目をクリックすれば、[最大値]が入力できるようになる
  • データ系列(バブルの部分ならどこでもよい)をクリックして作業ウインドウの表示を[系列の書式設定]作業ウインドウに切り替える
    • 作業ウインドウが表示されていない場合は、データ系列を右クリックし[データ系列の書式設定]を選択するとよい
  • [バブルサイズの調整]ボックスに「15」と入力する

Googleスプレッドシートでの操作手順

  • グラフを右クリックし[軸]−[横軸]を選択する
  • [グラフエディタ]作業ウインドウの[カスタマイズ]タブで[最大値]に「20000」と入力する

 これで、図5のようなバブルチャートになります。

ワインのバブルチャート 図5 ワインの価格、評価、売り上げのバブルチャート(完成例)
2,000円以下の安価なワインや評価の低いワインはバブルのサイズが小さいことからから概して売上金額も小さいことが分かる。その一方で、価格が高くなっても、合計の売上金額は手頃に入手できるワインとそれほど変わらないことも分かる。

 価格の高いワインはそれほど売上数量が大きいわけではありませんが、売上金額はお手頃なワインとそれほど変わりません。数量が少なくても売り上げが上がるということは、在庫のためのスペースが少なくて済むということですね。これは大きなメリットです(同時に、保管方法に特別な配慮が必要になったり、盗難に遭った際のリスクが大きくなったりしますが)。なお、バブルチャートでは系列のデータ数が多いとバブルが重なり過ぎて、見づらくなることがあります。その場合はバブルのサイズを小さくするとある程度見やすくなります。例えば、バブルサイズを「5」に変更すると、図5の値が集中している箇所が見やすくなります。

コラム バブルチャートをグループごとに色分けする

 前回のコラムでk-means法を利用したクラスタリングの例と、それをヒートマップとして表示する方法を紹介しました。散布図やバブルチャートでも同様にグループによる色分けができれば、より多角的な可視化ができますね。残念ながら、Excelではかなり難しいので、Pythonでのプログラムで作成した例を紹介します(図6)。

ワインのバブルチャート(色分け) 図6 ワインの価格、評価、売り上げのバブルチャート(グループごとの色分け)
赤と緑、青と紫など、色分けが見づらい部分があるので、マーカーの形でも区別できるようにした。マーカーのサイズが比較しづらくはなるが、グループ分けされていることはよく分かる。

 図6から、●で表されている0番のグループは価格がお手頃で評価は中ぐらいといったこと、×で表されている1番のグループが低価格または低評価のグループであり、売り上げがそう大きくないことが分かります。また、2番のグループが価格を問わず高評価であり、売り上げも比較的大きいことも分かります。ただ、それ以上のことは少し分かりにくいですね。

 ワインのデータを使って、k-means法により6つのグループを作るコードは以下の通りです。これは前回紹介したコードとほとんど同じです。このリンクをクリックすれば、ブラウザが起動し、Google Colaboratoryで以下のコードが表示されます(Googleアカウントでのログインが必要です)。[ドライブにコピー]ボタンをクリックすれば、自分のGoogleドライブにコピーできます。コードの部分をクリックして[Shift]+[Enter]キーを押せば、プログラムが実行され、クラスタリングを行った結果がdfresultという名前のデータフレームとして作成されます。

 コードの詳細についてはこの記事の範囲を大きく逸脱するので割愛しますが、コード中のコメントと説明を参照していただければだいたいの意味は分かると思います。なお、上記のリンクにはグループごとに平均値を求めるためのコードや、その値を基にヒートマップを作成するためのコードも含めてあります。さらなる分析に活用できるので、ぜひご参照ください。

import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import MinMaxScaler

# データの読み込み
df = pd.read_excel("https://github.com/Gessys/data_analysis/raw/main/12a.xlsx"
                   sheet_name="ワインの売り上げ(1)", skiprows=2, usecols="A:F")
data = df.loc[:, ["価格", "評価", "売上金額"]]

# データをスケーリングする(値の大きさが異なるので、0〜1になるように調整する)
sc = MinMaxScaler()
data_sc = sc.fit_transform(data)

# k-means法によるクラスタリング
model = KMeans(n_clusters=6, random_state=0, n_init="auto")
model.fit(data_sc)

# 元のデータにクラスタ番号を追加する
cluster_no = pd.DataFrame(model.labels_, columns=["グループ"])
dfresult = pd.concat([df, cluster_no], axis=1)

リスト1 k-means法によるクラスタリングを行うコード
sklearn.clusterモジュールのKMeans関数によりk-means法のモデルを用意し、MinMaxScalerにより最小値を0、最大値を1に調整(スケーリング)したデータdata_scに当てはめる。前回のコードではStandardScalerを使って標準化を行ったが、今回はバブルチャートのマーカーのサイズを指定する必要があるので、売上金額をスケーリングした結果が負の値にならないように、MinMaxScalerを使っている。クラスタリングされた結果はmodel.labels_で取得できるので、元のデータdfと、取得したクラスタ番号をつないでdfresultという名前のデータフレームにする。

 リスト1の結果を基に、価格を横軸に、評価を縦軸に、売上金額をバブルのサイズにし、さらにグループによる色分けを行うコードは以下の通りです。散布図やバブルチャートはmatplotlib.pyplotモジュールのscatter関数やデータを簡単に可視化するのに便利なseabornモジュールのscatterplot関数で作成できます。ここではscatterplot関数を使っています。

!pip install japanize_matplotlib  # これは最初に1回実行しておけばよい

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import seaborn as sns
import japanize_matplotlib

# 20000未満のデータだけを取り出す
dfbubble = dfresult.loc[dfresult.価格 < 20000]
dfsize = data_sc[dfresult.価格 < 20000, 2] * 200  # マーカーのサイズを計算

# バブルチャートを表示する
plt.figure(figsize=(12, 8))
kwargs = {"linewidth": 0# 枠線を表示しない
sns.scatterplot(x=dfbubble.価格, y=dfbubble.評価, 
            c=cm.tab10(dfbubble.グループ),  # マーカーの色の指定
            s=dfsize,  # マーカーのサイズの指定
            style=dfbubble.グループ,  # マーカーの形の指定
            **kwargs)
plt.show()

リスト2 グループによって色分けしたバブルチャートを作成するコード
項目名には「価格」「評価」などの日本語文字が含まれているが、Google Colaboratoryでは、そのままだとグラフのタイトルなどに日本語文字が表示できない。そのため、!pipコマンドによりjapanize_matplotlibモジュールをインストールし、それをimportしておく。scatterplot関数の引数cに指定したcm.tab10は、10色のカラーテーブルを表す。グループは6つあるので、10色のうちの6色が割り当てられる。引数styleにはマーカーの形を指定する。これも6つのグループに対応する形を割り当てる(図6の左下に表示されている凡例を参照)。


コラム 多数の項目同士の散布図を一度に作成する

 今回利用したワインのデータでは、項目(列)の数はそれほど多くありませんでした。しかし、項目が多くなると、項目同士の組み合わせも多くなるので、手作業で散布図を作るのはかなり面倒です。そのような場合はプログラムによって散布図をまとめて描画するのが得策です。

 図10は、seabornモジュールのpairplot関数を使って、数多くの項目同士の散布図を作成した例です。利用するデータはscikit-learnのデータセットとして用意されている糖尿病関係のサンプルデータで、age(年齢)、sex(性別)、bmi(体格指数)、bp(血圧)、s1(総コレステロール値)、s2(悪玉コレステロール値)、s3(善玉コレステロール値)、s4(=s1/s3)、s5(中性脂肪の対数)、s6(血糖値)、target(1年後の糖尿病の進行度)という項目が含まれています。

多数の散布図 図7 多数の項目同士の散布図を一気に作成した例
age〜s6までの項目同士の散布図。対角線上にある自分自身(ageとageなど)のグラフはヒストグラムとなっている。また、性別により色分けしてある。糖尿病の進行度と正の相関がありそうな項目はbmi、bp、s4、s5あたり。糖尿病の進行度とs3(善玉コレステロール値)には負の相関があるように見える。

 コードはこのリンクから参照できます。リンクをクリックすれば、ブラウザが起動し、Google Colaboratoryで以下のコードが表示されます(Googleアカウントでのログインが必要です)。このリンクには、相関行列を求めてヒートマップを作成するためのコードも含めてあります。併せてご参照ください。

from sklearn.datasets import load_diabetes  # 糖尿病に関するデータ
import seaborn as sns

df_diabetes = load_diabetes(as_frame=True).frame  # サンプルデータを読み込む
sns.pairplot(df_diabetes,  # 利用するデータ
             hue="sex"# 性別による色分けを行う
             diag_kind="hist"# 対角線上はヒストグラムとする
             palette = "Set1"# 配色はSet1を使う

リスト3 多くの項目同士の散布図を一気に作成するためのコード
複数の項目同士の散布図はseabornモジュールのpiarplot関数にデータを指定するだけでできる。ただし、データ数と組み合わせが多いので、実行にはかなりの時間がかかることに注意。



 今回は、散布図を利用して間隔尺度の項目間の関係を可視化しました。バブルチャートを利用すれば、それらの関係に加えて、規模を可視化し、さらなる分析に役立てることができます。バブルチャートの色分けや多数の散布図の作成などについては、コラムでPythonのプログラムを紹介しました。今回で「可視化シリーズ」はひと区切りです。

 次回は関係の強さを数値で表すために、相関係数を計算するとともに、その仕組みについても見ていきます。それ以降の回帰分析による予測へとつながっていくお話です。次回もどうぞお楽しみに!

「やさしいデータ分析」のインデックス

やさしいデータ分析

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。