データ分析を初歩から学ぶ連載の第10回。グラフを使って集団の特徴や外れ値を可視化します。ヒストグラムや箱ひげ図の作成方法と、ピボットテーブル/ピボットグラフによる視覚的な分析のコツを、ケーススタディを通して学びましょう。
この連載では、データをさまざまな角度から分析し、その背後にある有益な情報を取り出す方法を学びます。
データの収集方法、データの取り扱い、分析の手法などについての考え方を具体例で説明するとともに、身近に使える表計算ソフト(ExcelやGoogleスプレッドシート)を利用した作成例を紹介します。
必要に応じて、Pythonのプログラムや統計ソフトRなどでの作成例にも触れることにします。
数学などの前提知識は特に問いません。肩の力を抜いてぜひとも気楽に読み進めてください。
筆者紹介: IT系ライターの傍ら、非常勤講師として東大で情報・プログラミング関連の授業を、一橋大でAI関連の授業を担当。書道、絵画を経て、ピアノとバイオリンを独学で始めるも学習曲線は常に平坦。趣味の献血は、最近脈拍が多く99回で一旦中断。さらにリターンライダーを目指し、大型二輪免許を取得。1年かけてコツコツと貯金し、ようやくバイクを購入(またもや金欠)。
いきなりですが、読者のみなさんは「分析」という言葉の意味をじっくりと考えてみたことはあるでしょうか。「分」は、分けるということですね(刀で左右に切り離す)。「析」はちょっと難しいですが、細かく分けるという意味です(斤=「おの」で木を切る)。つまり、分析とは大きく分けたり、細かく分けたりすること……なのですが、そのためには全体像を見て、どのように分けるかを決める必要があります。というわけで、今回は可視化により全体像を見ることと、全体が何らかの特徴によってどう切り分けられるかを見ることに焦点を当てます。
具体的には、ヒストグラムと箱ひげ図を利用します。ヒストグラムは、集団の代表値を求めるお話(この連載の第3回)の中で紹介しました。また、箱ひげ図については散布度を求めるお話(この連載の第5回)の中で紹介しました。いずれも、どのようなグラフなのかをお見せしただけで、作成手順については触れていませんでした。そこで、今回はそれらのグラフの具体的な作成手順や書式の設定方法、より詳細な分析方法を見ていくことにします。
ところで、ヒストグラムや箱ひげ図を作成すると、図1のような、いびつなグラフが作られることもよくあります。データは架空のものですが、勤労者世帯の勤め先収入の平均値(月49.2万円)と一致するように作成してあります。平均値の出典は、総務省統計局の家計調査の統計表(Excelファイル)に掲載された2022年の値です。
統計学の教科書で紹介されているヒストグラムは、真ん中あたりに山があって、左右に裾が広がっている「整った」形のグラフが多いようです。ヒストグラムがどのようなものかを理解するにはいいのですが、実際には図1に示したような、いびつな形のヒストグラムになることがよくあります。しかし、整った形のグラフにはそれ以上の特徴があまりありません。むしろ、いびつな形のグラフからの方が、興味深い特徴を見つけやすいものです。
今回は集団の特徴を可視化するというテーマについて、幾つかの例を見ていきます。つまり、図1のグラフをどう切り分けて特徴を見つけていくかということです。また、データを多角的に分析するには、ピボットテーブル/ピボットグラフも便利です。ピボットテーブル/ピボットグラフに苦手意識を持つ人も多いようですが、分かりやすく説明していきます。
この記事は、データ分析の初歩から応用まで少しずつステップアップしながら学んでいく連載の第10回です。第7回の棒グラフ、第8回の折れ線グラフ、第9回の円グラフ/パレート図から、今回のヒストグラム、箱ひげ図、第11回のクロス集計表、ヒートマップ、第12回の散布図まで、1つずつ可視化の基礎を学んでいきます。これらのグラフの目的と効用などについて、特別予告編で簡単に整理していますので、事前に確認しておくとより理解が深まるでしょう。可視化シリーズを続けて読んでグラフの使い分けをマスターしたい方は、次回を見逃さないために記事冒頭のボタンからメール通知に登録するのがお勧めです。
今回は以下のようなポイントについて、分析の方法や目の付け所を見ていきます。
では、ヒストグラムの作成から見ていきましょう。まず、特に何も指定せずに図1のようなヒストグラムを作り、書式の設定を変えながら何が読み取れるかを見ていきます。では、サンプルファイルの利用についての説明の後、本編に進みましょう。
本稿では、表計算ソフトを使って手を動かしながら学んでいきます。表計算ソフトMicrosoft Excel用の.xlsxファイルをダウンロードできるようにしています。デスクトップ版のExcelが手元にない場合は、Microsoftアカウントがあれば使える無料のMicrosoft 365オンライン、もしくはGoogleアカウントがあれば使える無料のGoogleスプレッドシート(Google Sheets)をお使いください。Microsoft 365オンラインの場合は、.xlsxファイルをOneDriveにアップロードしてから開いてください。Googleスプレッドシートの場合は、.xlsxファイルをGoogleドライブにアップロードしてから開いた上で[ファイル]メニューの[Google スプレッドシートとして保存]を実行してください(Googleスプレッドシート独自の機能を使っている場合は、ファイルを共有して参照できるようにします。その場合は、該当する箇所で使い方を記します)。
最初に見た勤め先収入のデータはサンプルファイル(後述)のセルB4〜B103までに入力されています。セルB3の項目見出しを含めて、ヒストグラムを作成し、設定を変更してみましょう。図2の左側が特に何も指定せずにヒストグラムを作った例で、右側が書式を変更して適切な形式にしたものです。サンプルファイルをこちらからダウンロードし、[勤め先収入1]ワークシートを開いて取り組んでみてください。Googleスプレッドシートの場合はこちらのサンプルファイルを開いて、メニューから[ファイル]−[コピーを作成]を選択し、Googleドライブにコピーしてお使いください。
手順は図の後に箇条書きで示しておきます。ただし、タイトルなど、データ分析そのものにあまり関係のない設定については省略してあります。なお、動画でも手順を解説しているので、操作を一つ一つ追いかけたい方はぜひご視聴ください。
手順は以下の通りです。
これで上側のグラフが作成できます。左端の棒は、収入が7.3万円より大きく、127.3万円以下である人数を表しますが、かなり幅が広いですね。これではほとんどの人がこの範囲に入ってしまいます。そこで、階級の幅を5万円にして、その部分を詳しく見られるようにしましょう。また、収入が127.3万円より大きい人の数は少ないので、その部分をまとめてしまいましょう。操作を続けます。
Googleスプレッドシートの場合は、以下のように操作します
いかがでしょう。下側のグラフを見ると、全体的に山が左に寄っていますね。つまり、大半の人がこの山の中にいて、収入のかなり大きな人が少数いるということが分かります。特に、収入が30万円より大きく35万円以下の階級の人数が多いようですが、10万円より大きく15万円以下の階級にも小さな山があるようです。このことから、勤労者世帯が、少数の高収入の層、多数の人が属する30万円程度の層、一定数の低収入の層に分かれることが示唆されます。
なお、Googleスプレッドシートでは、最小値以下の階級がまとめられたり、最大値より大きな階級がまとめられるのではなく、単に最小値以下や最大値より大きな階級が表示されなくなるだけです。また、階級の幅も自動的に決められるので、このままでは、上で説明したような3つの階層に分かれるという示唆は得られません(ただし、最大値を「55」に設定して、より詳細に表示すると、図2の下側と同じようなグラフになります)。
図2から、勤め先収入の最頻値は、最も度数の大きな階級の下限と上限の平均、つまり、(35+30)÷2=32.5(万円)であることが分かります。また、空いているセルに「=AVERAGE(B4:B103)」と入力すると、平均値が49.2(万円)であることが分かり、「=MEDIAN(B4:B103)」と入力すると、中央値が31.4(万円)であることも分かります。平均値が大きくなっているのは、分布に偏りがあり、少数の大きな値に引きずられているからですね。
勤め先収入が3つの階層に分かれるのではないかということについて、さらに掘り下げていきたいところですが(後で見るのでお楽しみに!)、その前に、箱ひげ図の作成に取り組んでおきましょう。箱ひげ図を作成すると四分位範囲が可視化できます。つまり、順位を基にして、全体の25%〜75%(中央部分に位置する半数)が属する範囲が分かります。また、大きく離れた値(外れ値)も可視化できます。
では、上で見たファイルの[勤め先収入2]ワークシートを開いて、図3のように箱ひげ図を作成し、設定を変更してみましょう。データは[勤め先収入1]ワークシートと全く同じです。グラフを作成しやすいように別のワークシートにしてあるだけです。残念ながら、Googleスプレッドシートには今のところ箱ひげ図の機能がないので、サンプルファイルには含めていません。
手順は図の後に箇条書きで示しておきます。なお、動画でも手順を解説しているので、操作を一つ一つ追いかけたい方はぜひご視聴ください。
手順は以下の通りです。
これで上側のグラフが作成できます。外れ値が幾つかあることはよく分かりますが、値が集中している部分は下の方にわずかに表示されているだけです。外れ値(Excelでは特殊ポイントと呼ばれます)を表示しないようにしてみましょう。
図3の下側のグラフになり、四分位範囲がよく分かるようになりました。20万円〜40万円あたりですね。この四分位範囲はQUARTILE.EXC関数で求められる値を基に描かれています。QUARTILE.INC関数で求められる値を基にしたい場合には、上で見た[データ系列の書式設定]作業ウィンドウで[四分位数計算]の[包括的な中央値]をクリックして、設定をオンにします。
空いているセルに「=QUARTILE.EXC(B4:B103,1)」と入力すれば、第1四分位数が23.05であることが分かります。また、「=QUARTILE.EXC(B4:B103,3)」と入力すれば、第3四分位数が39.08であることが分かります。
なお、外れ値として表示されている小さな●にマウスポインタを位置付けると、その値がポップアップ表示されます。図3の左の例では、上から順に1600、200、124、68.7の4つが外れ値と見なされています。外れ値の検出には、この連載の第4回で紹介したスミルノフ・グラブス検定なども使えます。
箱ひげ図の四分位範囲は四角で表されているので、ヒストグラムのような「山」が表せません。そこで、度数を反映したような表示にできるバイオリン図(バイオリンプロット)が使われることもあります。残念ながらExcelやGoogleスプレッドシートにはバイオリン図の機能がないので、PythonやRなどを使う必要があります。
以下の例は、PythonからExcelのデータを読み込み、バイオリン図を作成したものです。このリンクをクリックすれば、ブラウザが起動し、Google Colaboratoryで以下のコードが表示されます(Googleアカウントでのログインが必要です)。[ドライブにコピー]ボタンをクリックすれば、自分のGoogleドライブにコピーできます。コード(リスト1)の部分をクリックして[Shift]+[Enter]キーを押せばグラフ(図4)が描画されます。ぜひ試してみてください。
import pandas as pd
import matplotlib.pyplot as plt
# データの読み込み
df = pd.read_excel("https://github.com/Gessys/data_analysis/raw/main/10a.xlsx",
sheet_name="勤め先収入1", usecols="A:B", skiprows=2,
index_col="サンプル")
# バイオリン図の作成
graph = plt.violinplot(df.loc[:, "勤め先収入(万円)"],
showmedians=True, showmeans=True, quantiles=[0.25, 0.75])
graph['cquantiles'].set(color="C1") # 四分位範囲をオレンジ色で表示する
graph['cmedians'].set(color="C2", linewidth=0.5, linestyle="dotted") #中央値を緑色で表示する
graph['cmeans'].set(color="C3", linewidth=0.5, linestyle="dotted") # 平均値を赤色で表示する
plt.ylim([0, 200])
plt.xticks(ticks=[1],labels=["income"])
plt.show()
実は、勤め先収入のデータは、性別や雇用形態が全て「込み」になっています。答えから先に言うと、中央値よりも左の階級に小さな山があるのは、性別や雇用形態による収入の格差が原因です。性別や雇用形態を含めたデータは図5のようなものになっています。
この例では、明らかに性別や雇用形態といった属性が分かるようになっていますが、現実には、隠された要因によるものであることもよくあります。ともあれ、性別と雇用形態別にヒストグラムを作成し、それらを比較してみましょう。
これまでの方法で、男性だけのヒストグラム、女性だけのヒストグラム……のようにグラフを作成してもいいのですが、かなり面倒ですね。そこで、ピボットテーブル/ピボットグラフを使いましょう。ピボットグラフを使えば直接グラフが作成できます。
手順は以下の通りです。ステップごとに図を示しておくので、操作が細かくなるので、丁寧に進めてください(といっても、いくらでもやり直しはできます)。動画でも手順を解説しているので、手順を確認しながら進めるのが苦手な方や、ステップごとに操作を追いかけたい方は、ぜひ動画をご視聴ください。
では、手順です。サンプルファイルをこちらからダウンロードし、[勤め先収入3]ワークシートを開いて取り組んでみてください。Googleスプレッドシートではピボットテーブルの作成とグラフ作成の機能が別になっているので、Excelでの操作の後にまとめて手順を掲載します(Microsoft 365オンラインでは、後述の[グループ化]ができないため、説明を割愛します)。
これで、空のピボットテーブルと空のピボットグラフが作成されます。画面は図6のようになります。
まず、勤め先収入ごと、性別ごとに人数を集計しましょう。
この段階では、勤め先収入の値(F列)に対する人数が、1つずつ表示されています。たとえば、7.3万円の女性が1人、7.9万円の女性が1人といったぐあいです(図7)。
これではヒストグラムにならないので、勤め先収入を階級に区切って人数が集計されるようにしましょう。
これで、勤め先収入が階級に区切られ、性別ごとのヒストグラムが作成できました(図8)。
このままでも分布の特徴は分かりますが、ヒストグラムらしくするために、棒の間隔を「0」にしておきましょう。
グラフは以下のようになります(図9)。
性別によるヒストグラムを見ると、明らかに男女間で収入の格差があることが分かります。特に、女性で10万円〜15万円のところに山ができていることも分かりますね。もちろん、このデータは架空のデータなので、実態を表しているわけではありませんが、実態としては、2021年の男性の収入を100とすると、女性の収入は75.2となっています(内閣府男女共同参画局の「男女間賃金格差(我が国の現状)」による。一般労働者の給与水準)。ちなみに、サンプルデータの中央値は男性が34.9万円、女性が25.9万円で、ほぼその割合(34.9/25.9=0.74)になるようにしてあります。
ピボットテーブル/ピボットグラフでは、項目(フィールド)や集計項目をドラッグ操作で自由に入れ替えられるので、さまざまな方向からの分析ができます。以下に、幾つかの例を示しておきます(図10、図11)。[データ系列の書式設定]ウィンドウの右上に表示されている[×]ボタンをクリックすれば、[データ系列の書式設定]ウィンドウが閉じられ、[ピボットグラフのフィールド]ウィンドウが表示されます。ぜひ、試してみてください。
Googleスプレッドシートでの操作は以下の通りです。こちらのサンプルファイルを開いて、メニューから[ファイル]−[コピーを作成]を選択し、Googleドライブにコピーしてお使いください。[勤め先収入3]ワークシートにデータが入力されています。
これで、空のピボットテーブルが作成されます。画面の右側にピボットテーブルエディタが表示されるので、以下のように操作しましょう。
集計が行われますが、図7で見たような勤め先収入に対する人数(F列)が、1つずつ表示された表になります。そこで、勤め先収入の階級を設定します。
これで、図8で見たようなピボットテーブルが作成されます。後は縦棒グラフを作成するだけです。
ピボットテーブルエディタで項目を入れ替えると、グラフも自動的に表示し直されるので、雇用形態別のヒストグラムなども簡単に作成できます。ただし、図11と同様の、男女ごと、雇用形態ごとのヒストグラムにするには、以下のような操作を行います。なお、ピボットテーブルエディタが表示されていない場合には、セルF3〜H18に作成されているピボットテーブルの左下にマウスポインタを位置付け、[編集]ボタン(鉛筆のアイコンのボタン)をクリックしてください。
ただし、この段階では、女性だけのヒストグラムしか表示されないので、グラフエディタで系列を追加する必要があります。
ピボットテーブルエディタでの設定とグラフエディタでの設定が正しくできれば、図12のようなグラフになります。
今回は、ヒストグラムや箱ひげ図により、集団の特徴を可視化する方法を見てきました。まず、全体像を見た上で、データを切り分けていくことにより、外れ値を発見したり、集団の中に含まれる幾つかの特徴や「層」を見いだしたりする流れを紹介しました。
次回は、クロス集計表を作成したり、ヒートマップを作成することにより、複数の項目同士がどう関係しているか、その関係の中からどのような特徴が見いだせるかを、ケーススタディーを通して追いかけていきます。次回もどうぞお楽しみに!
Copyright© Digital Advantage Corp. All Rights Reserved.