====== 【データリテラシー】第4回 度数分布表とヒストグラム ======
===== データとは =====
__**データ**__とは何らかの実験・観測・調査を行って得られる観測値の集合である。
実験を行って記録したデータやアンケート調査で得られたデータで、集計などの加工を行う前のデータを__**生データ**__という。
データには全ての観測値がそろっている__**完全データ**__と、所々の観測値が欠けている__**不完全データ**__がある。
観測値が欠けているところを__**欠損値(欠測値)**__といい、その原因としては観測できなかったり、記録ミスなど様々である。
データ中で欠損値は空白や「%%**%%」「NA」などの記号で表されることがあり、それは表計算ソフトの計算でエラーや間違いが起こる原因となるので気をつける必要がある。
----
==== 表による表現 ====
以下にデータを表で表現した例をいくつか挙げる。
=== 例1 ===
ある集団の性別と年齢を聞き取り、身長を測定して得られた生データである。
^  番号  ^  性別  ^  年齢[歳]  ^  身長[cm]  ^
|  1     |  女    |  22        |  160.6     |
|  2     |  男    |  19        |  171.6     |
|  3     |  男    |  21        |  173.2     |
|  ⋮     |  ⋮     |  ⋮         |  ⋮         |
一番上の行は各列の項目を表すラベルである。
「番号」は個人(個体)を区別するためのものである。
番号以外の各列の項目は、様々な値に変化するので__**変数**__や__**変量**__という。
この表は「性別」「年齢」「身長」の3つの変数があるので 3変数(3変量)のデータという。
変数は $x,y,z$ などの記号で表し、それぞれの変数の値は $x_{1},x_{2},x_{3},\cdots$ のように番号を下付きの添え字で区別することがある。
上の表の各列は以下のように変数で表せる。
^  番号\\ $i$  ^  性別\\ $x$  ^  年齢[歳]\\ $y$  ^  身長[cm]\\ $z$  ^
|  1           |  $x_{1}$     |  $y_{1}$         |  $z_{1}$         |
|  2           |  $x_{2}$     |  $y_{2}$         |  $z_{2}$         |
|  3           |  $x_{3}$     |  $y_{3}$         |  $z_{3}$         |
|  ⋮           |  ⋮           |  ⋮               |  ⋮               |
=== 例2 ===
例 1 の表の行と列を入れ替えたものである。
データの内容は例 1 と全く同じなのでこれでも問題はないが、表計算ソフトでは例 1 のような形式が扱いやすい。
^ 番号      |  1      |  2      |  3      |  …  |
^ 性別      |  女     |  男     |  男     |  …  |
^ 年齢[歳]  |  22     |  19     |  21     |  …  |
^ 身長[cm]  |  160.6  |  171.6  |  173.2  |  …  |
=== 例3 ===
例1の生データから「年齢」を 10代、20代、30代でそれぞれ集計して表にしたデータである。
このような表を__**度数分布表**__という。
^  年齢  ^  度数  ^
|  10代  |  341   |
|  20代  |  156   |
|  30代  |  3     |
|  合計  |  500   |
=== 例4 ===
例1の生データで「年齢」と「性別」で集計して表にしたデータである。
このような表を__**分割表**__という。
^                   |^  年齢                          ||||
| :::               | :::    ^  10代  ^  20代  ^  30代  ^  合計  ^
^  性\\ 別  ^  男    |  173   |  80    |  0     |  253   |
| :::       ^  女    |  168   |  76    |  3     |  247   |
| :::       ^  合計  |  341   |  156   |  3     |  500   |
===== 分布 =====
データがどういう値でどのように広がっているかを__**分布**__という。
データがどのような分布になっているかを読み取るには大きく分けて二通りある。
  - データを可視化するためにグラフを描いて視覚的に読み取る方法
  - 代表値と散らばりの尺度で分布の特徴を数量的に読み取る方法
データの分布をグラフとして表現するために、度数分布表を作成してグラフ(ヒストグラム)に描くことが良く行われる。
===== 度数分布表 =====
生データをいくつかの階級に分け、それぞれの階級に入る観測値がいくつか数えて度数で表した表を__**度数分布表**__という。
度数分布表の例
^  階級番号\\ $i$  ^  下限値\\ $l$  ^  上限値\\ $u$  ^  階級値\\ $v$  ^  度数\\ $f$  ^  累積度数  ^  相対度数  ^
|                1 |            140 |            145 |          142.5 |            2 |          2 |      0.004 |
|                2 |            145 |            150 |          147.5 |           12 |         14 |      0.024 |
|                3 |            150 |            155 |          152.5 |           52 |         66 |      0.104 |
|                4 |            155 |            160 |          157.5 |           91 |        157 |      0.182 |
|                5 |            160 |            165 |          162.5 |          111 |        268 |      0.222 |
|                6 |            165 |            170 |          167.5 |          100 |        368 |      0.200 |
|                7 |            170 |            175 |          172.5 |           84 |        452 |      0.168 |
|                8 |            175 |            180 |          177.5 |           34 |        486 |      0.068 |
|                9 |            180 |            185 |          182.5 |           13 |        499 |      0.026 |
|               10 |            185 |            190 |          187.5 |            1 |        500 |      0.002 |
|  合計            |                |                |                |          500 |            |      1.000 |
^  項目     ^  変数  ^  説明                                                                               ^
| 階級番号  |  $i$   | 階級を区別するための番号である。元データの個体を区別するための番号とは異なる。      |
| 下限値    |  $l$   | 階級の下限値である。                                                                |
| 上限値    |  $u$   | 階級の上限値である。                                                                |
| 階級値    |  $v$   | 階級を代表する値で、普通は下限値と上限値の中央の値にとる。                          |
| 度数      |  $f$   | 階級に属する観測値の個数である。                                                    |
| 累積度数  |        | 最初の階級からその階級までの度数の和である。最後の階級の累積度数は総数に一致する。  |
| 相対度数  |        | 度数を総数で割った割合である。相対度数の合計は 1 になる。                           |
----
==== 度数分布表の作成方法 ====
観測値の総数が $n$ の生データがあるとする。
この生データから以下の手順で度数分布表を作成する。
=== ① 全体の範囲を決める ===
データの最小値と最大値から全体の範囲を決める。
最小値と最大値を含むように範囲を決めればよいが、階級幅と合わせてきりがよくなるように決めた方が分かりやすい。
=== ② 階級数と階級幅を決める ===
それぞれの階級幅は普通は等幅にとる。
等幅の場合は、全体の範囲を階級数で割ると階級幅が求まる。
階級幅や階級数はどうやって決めればよいだろうか。
それを決める絶対的な方法はないが、目安の一つとして__**スタージェスの公式**__がある。
\[
k\simeq 1+\log_{2}n
\]
ここで $k$ は階級数で、$\log_{2} n$ は $n$ に対する底(てい)が 2 の対数である。
右辺が整数にならない場合は、切り上げて整数にする。
スタージェスの公式の階級数をもとに、階級幅が 5 や 10 など、きりのよい数字になるように階級数を決めると分かりやすい。
=== ③ 各階級の下限値と上限値を設定する ===
階級数と階級幅が決まれば、それをもとに各階級の下限値と上限値を設定する。
$i$ 番目の階級を代表する値を__**階級値**__ $v_{i}$ という。
階級値 $v_{i}$ は普通は下限値 $l_{i}$ と上限値 $u_{i}$ の中央の値にとる。
\[
v_{i}=\frac{l_{i}+u_{i}}{2}
\]
=== ④ 観測値がどの階級に属するか調べて度数として数える ===
$i$ 番目の階級にいくつの観測値が入るかを数えて度数 $f_{i}$ とする。
日本では**下限値以上、上限値未満**の観測値を数えるのが普通である。
\[
(下限値)\le (観測値) < (上限値)
\]
=== ⑤ 度数の合計が観測値の総数と一致することを確認する ===
観測値はいずれかの階級に属するため、度数 $f_{i}$ の合計は観測値の総数 $n$ に一致するはずである。
\[
n=f_{1}+f_{2}+\cdots+f_{k}=\sum_{i=1}^{k}f_{i}
\]
これが一致しない場合は、度数の数え間違いをしている可能性が高い。
=== ⑥ 累積度数や相対度数を求める ===
必要なら度数から累積度数や相対度数を求める。
===== ヒストグラム =====
度数分布表を柱状グラフで表したものを__**ヒストグラム**__という。
ヒストグラムは横軸に階級値をとり、横幅が階級幅、高さが度数の長方形を隙間なく並べた柱状グラフである。
ヒストグラムにすると分布の形状が分かりやすくなる。
以下は [[dataset#データセット1]] の身長のヒストグラムである。
スタージェスの公式を使って階級幅 5cm にしてある。
{{ data_literacy_past:2021:histogram1.png?nolink |ヒストグラム(階級幅5cm)}}
階級幅を変えてみるとどのように変わるだろうか。
以下は同じデータで階級幅 10cm にしたヒストグラムと階級幅 0.2cm にしたヒストグラムである。
{{ data_literacy_past:2021:histogram2.png?nolink |ヒストグラム(階級幅10cm)}}
{{ data_literacy_past:2021:histogram3.png?nolink |ヒストグラム(階級幅0.2cm)}}
階級幅が大きすぎると、分布が大ざっぱになって情報がかなり落ちてしまう。
逆に多すぎると細かいところが見えすぎて凸凹が激しく、全体的な分布の傾向がつかみにくくなる。
階級幅を変えることでヒストグラムの印象がかなり変わることが分かるだろう。
===== 演習:度数分布表の作成 =====
  * 使用するデータセット:[[dataset#データセット1]]
「身長」のデータから度数分布表を作成する。
ダウンロードした CSV ファイルを LibreOFfice Calc で開くと、セル D2 から D501 に身長のデータが並んでいる(セル D1 はラベル)。
まず、データの横のセル G1 から M2 に以下のような度数分布表のラベルを用意する。
^     ^  G                ^  H       ^  I       ^  J       ^  K     ^  L         ^  M         ^
^  1  | 身長の度数分布表            ||          |          |        |            |            |
^  2  |  階級番号         |  下限値  |  上限値  |  階級値  |  度数  |  累積度数  |  相対度数  |
次に以下の手順で度数分布表を作成する。
=== ① 全体の階級を決める ===
データの最大値と最小値を求めてデータの範囲を決める。
  - 最小値は空のセルに「''=MIN(D2:D501)''」と入力する。
  - 最大値は空のセルに「''=MAX(D2:D501)''」と入力する。
  - 最小値と最大値から、きりのいい 140 から 190 までの範囲にとるのが良さそうである。
=== ② 階級数と階級幅を決める ===
  - スタージェスの公式は空のセルに「''=1+LOG(500,2)''」と入力して計算する。この結果、階級数は 10 が目安となる。
  - $\frac{190-140}{10}=5$ なので、階級数を 10 にとると階級幅は 5 となってきりが良い。
  - セル G3 に 1 を入力し、セル G12 まで 1 ずつ増やした数を入力する。
=== ③ 各階級の下限値と上限値を設定する ===
  - 下限値はセル H3 に 140 を入力し、セル H12 まで階級幅 5 ずつ増やしていく。
  - 上限値はセル I3 に 145 を入力し、セル I12 まで階級幅 5 ずつ増やしていく。
  - 各階級の階級値は、セル J3 に「''=(H3+I3)/2''」と入力し、セル J3 をコピーしてセル J4 から J12 に貼り付ける。
^      ^  G                ^  H       ^  I       ^  J       ^  K     ^  L         ^  M         ^
^  1   | 身長の度数分布表            ||          |          |        |            |            |
^  2   |  階級番号         |  下限値  |  上限値  |  階級値  |  度数  |  累積度数  |  相対度数  |
^  3   |                 1 |      140 |      145 |    142.5 |        |            |            |
^  4   |                 2 |      145 |      150 |    147.5 |        |            |            |
^  ⋮   |  ⋮                |  ⋮       |  ⋮       |  ⋮       |        |            |            |
^  12  |                10 |      185 |      190 |    187.5 |        |            |            |
=== ④ 観測値がどの階級に属するか調べて度数として数える ===
[[#COUNTIFS 関数]] を使って度数を数える。
  - セル K3 に「''%%=COUNTIFS(D$2:D$501,">="&H3,D$2:D$501,"<"&I3)%%''」と入力する。
  - セル K3 をコピーして K4 から K12 に貼り付ける。
「''%%">="&H3%%''」は「セル H3 の値以上」という条件、「''%%"<"&I3%%''」は「セル I3 の値未満」という条件である((「''&''」はテキストを結合する演算子である。))。
この条件によって各階級で数えられる度数は以下の観測値に合うものになる。
\[
(下限値)\le (観測値)<(上限値)
\]
この他に [[#FREQUENCY 関数]] を使う方法があるが、少し注意が必要である。
  - セル K3 に「''=FREQUENCY(D2:D501,I3:I11)''」と入力する。
  - **入力したら [Shift]+[Ctrl]+[Enter] キーを押す。**
  - 自動的に度数が求められる。
Microsoft Excel では少し操作が異なる。
  - セル K3 から K12 を選択する。
  - 選択したまま「''=FREQUENCY(D2:D501,I3:I12)''」と入力する。
  - 入力したら [Shift]+[Ctrl]+[Enter] キーを押す。
  - 自動的に度数が求められる。
FREQUENCY 関数で指定する区間は上限値である。
ただし、各階級で数えられる度数は以下の観測値に合うものになる。
\[
(下限値)<(観測値)\le(上限値)
\]
日本では COUNTIFS 関数を使う方法が望ましい。
\\
=== ⑤ 度数の合計が観測値の総数と一致することを確認する ===
  - セル K13 に「''=SUM(K3:K12)''」と入力する。
  - 合計が 500 になることを確認する。500にならなければ、これまで作業のどこかに間違いがある。
=== ⑥ 累積度数や相対度数を求める ===
  * 累積度数を求める。
    - セル L3 に「''=K3''」と入力する。
    - セル L4 に「''=L3+K4''」と入力する。
    - セル L4 をコピーしてセル L5 から L12 に貼り付ける。
  * 相対度数を求める。
    - セル M3 に「''=K3/500''」と入力する。
    - セル M3 をコピーしてセル M4 から M12 に貼り付ける。
    - セル M13 に「''=SUM(M3:M12)''」と入力して相対度数の合計を求める。
    - 合計が 1 になることを確認する。
----
==== COUNTIFS 関数 ====
^  関数                                 ^  説明                                                                             ^
| COUNTIFS(範囲1, 条件1, 範囲2, 条件2)  | 範囲1 の中で条件1 に合うセル、かつ、範囲2 の中で条件2 に合うセルの個数を数える。  |
範囲と条件はセットになっている。
ここでは 「''範囲1, 条件1''」と「''範囲2, 条件2''」の2セットになっているが、3セットでも 4セットでもよい。
----
==== FREQUENCY 関数 ====
^  関数                        ^  説明  ^
| FREQUENCY(データ範囲, 区間)  | データ範囲の観測値を区間に従って階級に分けて度数を求める。       |
===== 演習:ヒストグラムの作成 =====
先ほど作成した度数分布表からヒストグラムを作成する。
ヒストグラムは棒グラフで表現する。
=== ① グラフの作成 ===
  - 度数のセル K3 から K12 を選択する。
  - メニューバーの ''**[挿入]**''%%→%%''**[グラフ]**'' を選択してグラフウィザードのダイアログを表示する。
  - 「グラフの種類」で ''**[次へ]**'' をクリックする(デフォルトだとグラフの種類は縦棒)。
  - 「データの範囲」で ''**[次へ]**'' をクリックする。
  - 「データ系列」で ''**[次へ]**'' をクリックする。
  - 「グラフの要素」で次のように入力して ''**[完了]**'' をクリックする。
    * タイトル:「身長の分布」
    * X軸:「身長 [cm]」
    * Y軸:「度数」
=== ② グラフの移動 ===
グラフが度数分布表の上に乗って邪魔な場合は移動させる。
  - グラフ以外のセルを一度クリックする。
  - グラフをシングルクリックし、ドラッグで度数分布表の下の空いているセルの上に移動させる。
=== ③ 階級値の追加 ===
  - グラフ以外のセルを一度クリックする。
  - グラフをダブルクリックする。
  - グラフ上で右クリックして ''**[データ範囲]**'' を選択して「データ範囲」のダイアログを表示する。
  - ''**[データ系列]**'' タブをクリックし、右下の「範囲」の入力フォームの右側のボタンをクリックして、マウスでセル J3 から J12 を選択する。
  - ''**[OK]**'' をクリックする。
=== ④ 棒グラフをヒストグラムにする ===
  - グラフ以外のセルを一度クリックする。
  - グラフをダブルクリックする。
  - 系列の棒をダブルクリックして「データ系列」のダイアログを表示する。
  - ''**[オプション]**'' タブをクリックし、「間隔」を 0% にする。
  - ''**[外枠]**'' タブをクリックし、「スタイル」で ''**[実線]**'' を選択する。
  - ''**[OK]**'' をクリックする。
===== 課題 =====
[[dataset#データセット1]] の「体重」のデータから度数分布表を作成し、ヒストグラムを描きなさい。
作成したファイルは ODFスプレッドシート(拡張子 .ods)で提出すること。
ファイル形式を ODFスプレッドシート(拡張子 .ods)にするには [[office:libreoffice#ファイル形式の変更]] を参照。