見出し画像

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はグラフの設定がかなり異なるので、この方法をそのまま用いることはできません。

いいなと思ったら応援しよう!