LibreOfficeで箱ひげ図(外れ値付き)
統計で、データのばらつき方を見る「箱ひげ図」。MS Office2016つまりExcel2016ではグラフ機能で描くことができますが、LibreOfficeでは対応していません。
そこで、Calcの散布図を使って、擬似的に箱ひげ図を作成してみました。
記述統計量を求める
シートを追加して、[data]と名前を付けて元のデータを貼り付けます。
A列には番号、B列に「変数1」という名前をつけてデータを入れてあります。
[sheet1]に戻り、必要な数値を順に求めていきます。
まず、代表的な記述統計量を求めます。図の①の部分です。
ここではQUARTILE関数を使っています。例えば、一番上の最大値であれば、
=QUARTILE($data.B2:B100001,4)
と入力します。最後の引数は何番目の四分位数かを表しており、「4」は第4四分位なので最大値を表しています。最小値はこれが「0」となります。つまり、
最大値 =QUARTILE($data.B2:B100001,4)
第3四分位 =QUARTILE($data.B2:B100001,3)
中央値 =QUARTILE($data.B2:B100001,2)
第1四分位 =QUARTILE($data.B2:B100001,1)
最小値 =QUARTILE($data.B2:B100001,0)
となります。
※PSPPでは、四分位には「テューキーのヒンジ」を用いているので、このQUARTILE関数の値とは異なることがある。
箱ひげの範囲を求める
次に、四分位範囲を求めます。第3四分位数から第1四分位数を引けばいいので、[C10]セルには、
=C5-C7
と入っています。
外れ値は、四分位範囲の1.5倍の外側になるので、その境目になる値も求めておきます。[C11]セルに、
=C10*1.5
と入力します。
第3四分位数に四分位範囲の1.5倍を加えた値と最大値を比べて、前者が大きいければ、その値は意味を持ちませんので、どちらの値を用いるかを判定しておきます。
最大値の方が大きい場合は第3四分位数に四分位範囲の1.5倍を加えた値が上限となり、最大値の方が小さければ、最大値をとりますので、[C12]セルには、
=IF((C5+C11)>C4,C4,C5+C11)
と入力します。
最小値と第1四分位数に四分位範囲の1.5倍を加えた値との関係も同様ですので、[C13]セルに、
=IF((C7-C11)<C8,C8,C7-C11)
と入力し、下限を決定します。
上限下限を求めた下に以下のような表を作成します。
ここでは、先ほど求めた上限下限の値から、その範囲に実際に存在する値を探します。それをここでは「上限実測値」「下限実測値」としておきます。
[C15]、[C18]は、
=data.b1
として、[data]シートから変数名を取っています。
[C16]セルに入力されているのは、「上限以下」という条件です。先ほど求めた上限の数値に「<=」という文字列を付け加えています。
[C17]セルでは、
=DMAX(data.A1:B100001,data.B1,C15:C16)
として、DMAX関数を用い、条件(「C15:C16」)を元に、上限(ここでは18.5)以下で最大の値をデータ(「data.A1:B100001」の範囲)の「変数1」(「data.b1」で指定)から探しています。
同じように、[C19]セルに入力されているのは、「下限以上」という条件です。先ほど求めた下限の数値に「>=」という文字列を付け加えています。
[C20]セルでは、
=DMIN(data.B1:B100001,data.B1,C18:C19)
として、DMIN関数を用い、条件(「C18:C19」)を元に、下限(ここでは6.5)以上で最小の値をデータ(「data.A1:B100001」の範囲)の「変数1」(「data.b1」で指定)から探しています。
この2つが、箱ひげ図のひげの両端の数値になります。
グラフ用にまとめる
これで、外れ値以外の箱ひげ図に必要な値は出揃いましたので、グラフ用に整理しておきます。
それぞれの数値は直接入力してもかまいませんが、ここでは、それぞれ先に求めたセルを参照しています。
B列のそれぞれの数字の行に「1」と入力されていますが、これは箱ひげ図をつくる際に、X軸の値として用いるためのものです。
外れ値を探す
最後に外れ値をピックアップします。
[outlier]というシートを作成し、そこに外れ値だけが表示されるようにします。このシートの[B2]セルには、
=IF($data.B2="","",IF($data.B2>$Sheet1.C$12,$data.B2,IF($data.B2<$Sheet1.C$13,$data.B2,"")))
と入力し、下のセルにはそれをコピーしていきます。先ほど求めた上限と下限のセルの参照は「$」をつけて固定(絶対参照)にしておきます。
これで、外れ値だけが表示されます。
さらに、[outlier2]というシートを作成し、外れ値に順番を付けていきます。[outlier2]シートの[B2]セルには、
=IF($outlier.B2="","",COUNT($outlier.B$2:$outlier.B2))
と入力し、下のセルにはそれをコピーしていきます。
これで、[outlier2]シートでは、外れ値が上から順に上り順で番号が振られます。
最後に[sheet1]のグラフ用数値の下に、外れ値をピックアップしていきます。
[C33]に[outlier]シート上の外れ値の数を数える式を入れておきます。
=COUNT($outlier.B2:B100001)
A列に連番を入力しておき、これを用いて[outlier2]シートで該当する行数をMATCH関数で取得し、それに基づいて、[outlier]シートから実際の数値をINDEX関数で取得します。
[C34]セルには、以下のように入力されています。
=IF($A34>C$33,NA(),INDEX($outlier.B$2:B$100001,MATCH($A34,$outlier2.B$2:B$100001)))
外れ値の個数を超えた場合はNA関数でエラーを返すようにIF文を構成してありますが、これは外れ値の入っていないセルを数値と認識させないためです。これは、ここで範囲を100001行まで取っているためで、実際にはデータのある範囲を指定しておき、[C33]セルで取得した外れ値の個数分だけ数式をコピーするのであれば、このIF構文は必要ありません。
ここでは、汎用性を持たせるために、このような範囲指定とIF構文を用いています。
なお、B列の「1」は上で説明したのと同じで、X軸の値として用いるためのものです。
上のシートでは、実際には後で再利用が簡単なように外れ値を500個取得するようにしました。
グラフの作成
これで、中央値、第3四分位数、第1四分位数、ひげの上下の終端、外れ値という、箱ひげ図を書くために必要な数値が出揃いました。
いよいよ、グラフを作成する段階に進みます。
ここでは、散布図を用いて作成します。
・メニューから[挿入]→[グラフ]を選択し、グラフウィザードを起動します。
・[グラフの種類を選択]で[散布図]を選択します。
まず、中央値を取ります。
・[データ系列]に進み、[追加]ボタンを押す。
・[データ範囲]で[名前]を選択し、[名前の範囲]に「中央値」と入力するか、[A26]セルを選択する(右のボタンを押すと、シート上で選択できるようになる)。
・[データ範囲]で[X軸]を選択し、[X軸の範囲]に[B26]セルを選択する。
・同様に[データ範囲]で[Y軸]を選択し、[Y軸の範囲]に[C26]セルを選択する。
続けて、箱を描くために、第3四分位数と第1四分位数を取ります。
・[追加]ボタンを押す。
・[データ範囲]で[名前]を選択し、[名前の範囲]に「箱」と入力する。
・[データ範囲]で[X軸]を選択し、[X軸の範囲]に[B23]から[B24]セルを範囲選択する。
・同様に[データ範囲]で[Y軸]を選択し、[Y軸の範囲]に[C23]から[C24]セルを範囲選択する。
さらに続けて、ひげの上下の終端の値をとります。
・[追加]ボタンを押す。
・[データ範囲]で[名前]を選択し、[名前の範囲]に「ひげ」と入力する。
・[データ範囲]で[X軸]を選択し、[X軸の範囲]に[B28]から[B29]セルを範囲選択する。
・同様に[データ範囲]で[Y軸]を選択し、[Y軸の範囲]に[C28]から[C29]セルを範囲選択する。
最後に外れ値を追加します。
・[追加]ボタンを押す。
・[データ範囲]で[名前]を選択し、[名前の範囲]に「外れ値」と入力する。
・[データ範囲]で[X軸]を選択し、[X軸の範囲]に[B34]から外れ値が入っている行までを範囲選択する。ここでは[B37]セルまでにしている。
・同様に[データ範囲]で[Y軸]を選択し、[Y軸の範囲]に[C28]から外れ値が入っているセルを範囲選択する。
ここでは、外れ値が取得されているセルまでを範囲指定しますが、汎用性を持たせるのであれば、もっと大きく範囲して置いてもかまいません。実際のシート上では500個まで外れ値を取得するように作成していますので、[X軸の範囲][Y軸の範囲]ともに533行まで範囲しました。
[完了]を押して、グラフウィザードを一旦閉じます。この段階では、下のようなグラフになっています。
これを箱ひげ図の体裁に整えていきます。
まずは、中央値からです。
・グラフを編集状態にして、中央値のマーカーを選択して右クリックメニューを表示する。
・[データ系列の書式]を選択する。
・[線の属性]で[スタイル]は[なし]、[色]は[白]を選択。
・[アイコン]で[シンボル]の中の「-」(下から2つ目)を選択。
・[アイコン]の[縦横比を固定する]のチェックをはずす。
・[アイコン]の[幅]を0.90cm、[高さ]を0.05cmにする。
次に、箱の部分を描きます。
・グラフを編集状態にして、箱のマーカーを選択して右クリックメニューを表示する。
・[データ系列の書式]を選択する。
・[線の属性]で[スタイル]は[実線]、[色]は[灰色7]を選択する。
・[線の属性]の[幅]を1.00cmする。
・[アイコン]で[シンボルなし]を選択。
続けて、ひげを設定します。
・グラフを編集状態にして、ひげのマーカーを選択して右クリックメニューを表示する。
・[データ系列の書式]を選択する。
・[線の属性]で[スタイル]は[実線]、[色]は[灰色7]を選択。
・[線の属性]の[幅]を0.60cmする。
・[アイコン]で[シンボル]の中の「-」(下から2つ目)を選択。
・[アイコン]の[縦横比を固定する]のチェックをはずす。
・[アイコン]の[幅]を0.60cm、[高さ]を0.00cmにする。
最後に外れ値の設定をします。
・グラフを編集状態にして、外れ値のマーカーを選択して右クリックメニューを表示する。
・[データ系列の書式]を選択する。
・[線の属性]で[スタイル]は[なし]、[色]は[灰色7]を選択。
・[アイコン]で[シンボル]の中の「●」(上から9つ目)を選択。
・[アイコン]の[幅]を0.15cm、[高さ]を0.15cmにする。
この段階で、次のようなグラフになります。
後は、好みに合わせて調整をします。ここで用いた色や線・アイコンの数値はとりあえずのものですから、変えても問題はありません。たとえば、本来外れ値は白丸(○)なので、画像を用意して、[アイコン]で[ファイルから…]を選択して、その画像ファイルを読み込んでもかまいません。
そのように調整したのが次の図です。
また、複数の箱ひげ図を描く場合は、同じように計算する列を作成し、グラフウィザードで追加してしていきます。たとえば、3つの箱ひげ図を描く場合には、[sheet1]は下の右のようになります。
かなり面倒ですが、外れ値つきの箱ひげ図を作成することができました。
ただ、先にも記したとおり、ここで用いているQUARTILE関数の戻り値と、PSPPで箱ひげ図に用いている「テューキーのヒンジ」の値は、ずれる場合があります。
その点を考えると、この方法を単体で用いるというよりは、フリーの統計ソフトPSPPのグラフ機能の弱さ(あとからグラフを編集できない)を補う形で用いる方がいいかもしれません。
つまり、記述統計量はPSPPで求めておいて、①の部分の数式の変わりに直接その数値を入力し、それ以降の処理だけをCalcで行うという方法です。その方法で作成した場合に、PSPPで描いたグラフと同様の内容になることは確認済みです。
またここではLibreOfficeを使用していますが、OpenOfficeでも同様にできるはずです。Excel2016はグラフの設定がかなり異なるので、この方法をそのまま用いることはできません。