====== 【データリテラシー】第4回 度数分布表とヒストグラム ====== ===== データとは ===== __**データ**__とは何らかの実験・観測・調査を行って得られる観測値の集合である。 実験を行って記録したデータやアンケート調査で得られたデータで、集計などの加工を行う前のデータを__**生データ**__という。 データには全ての観測値がそろっている__**完全データ**__と、所々の観測値が欠けている__**不完全データ**__がある。 観測値が欠けているところを__**欠損値(欠測値)**__といい、その原因としては観測できなかったり、記録ミスなど様々である。 データ中で欠損値は空白や「%%**%%」「NA」などの記号で表されることがある。 それらは表計算ソフトの計算でエラーや間違いが起こる原因となるので気をつける必要がある。 ---- ==== 表による表現 ==== 以下にデータを表で表現した例をいくつか挙げる。 === 例1 === ある集団の性別と年齢を聞き取り、身長を測定して得られた__**生データ**__である。 ^ 番号 ^ 性別 ^ 年齢[歳] ^ 身長[cm] ^ | $1$ | 女 | $22$ | $160.6$ | | $2$ | 男 | $19$ | $171.6$ | | $3$ | 男 | $21$ | $173.2$ | | $\vdots$ | $\vdots$ | $\vdots$ | $\vdots$ | 一番上の行は各列の項目を表すラベルである。 「番号」は個人(個体)を区別するためのもので、学籍番号や ID を使うこともある。 番号以外の各列の項目は、様々な値に変化するので__**変数**__や__**変量**__という。 この表では「性別」「年齢」「身長」の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}$ | | $\vdots$ | $\vdots$ | $\vdots$ | $\vdots$ | === 例2 === 例 1 の表の行と列を入れ替えたものである。 データの内容は例 1 と全く同じなのでこれでも問題はないが、表計算ソフトでは例 1 のような形式が扱いやすい。 ^ 番号 | $1$ | $2$ | $3$ | $\cdots$ | ^ 性別 | 女 | 男 | 男 | $\cdots$ | ^ 年齢[歳] | $22$ | $19$ | $21$ | $\cdots$ | ^ 身長[cm] | $160.6$ | $171.6$ | $173.2$ | $\cdots$ | === 例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_{i}$ ^ 上限値\\ $u_{i}$ ^ 階級値\\ $v_{i}$ ^ 度数\\ $f_{i}$ ^ 累積度数\\ $F_{i}$ ^ 相対度数\\ $f_{i}/n$ ^ | 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_{i}$ | 階級の下限値である。 | | 上限値 | $u_{i}$ | 階級の上限値である。 | | 階級値 | $v_{i}$ | 階級を代表する値で、普通は下限値と上限値の中央の値にとる。 | | 度数 | $f_{i}$ | 階級に属する観測値の個数である。度数の合計が元データの総数 $n$ である。 | | 累積度数 | $F_{i}$ | 最初の階級からその階級までの度数の和である。最後の階級の累積度数は総数 $n$ に一致する。 | | 相対度数 | $f_{i}/n$ | 度数 $f_{i}$ を総数 $n$ で割った割合である。相対度数の合計は 1 になる。 | ---- ==== 度数分布表の作成方法 ==== 観測値の総数が $n$ の生データがあるとする。 ^ 番号 ^ 身長[cm] ^ | $1$ | $160.6$ | | $2$ | $171.6$ | | $3$ | $173.2$ | | $\vdots$ | $\vdots$ | | $n$ | $163.9$ | この生データから以下の手順で度数分布表を作成する。 === ① 全体の範囲を決める === データの最小値と最大値から全体の範囲を決める。 最小値と最大値を含むように範囲を決めればよいが、階級幅と合わせてきりがよくなるように決めた方が分かりやすい。 === ② 階級数と階級幅を決める === それぞれの階級の__**階級幅**__は上限値から下限値を引いたものに等しい。 普通は階級幅を等幅にとるため、全体の範囲を階級数で割ったものが階級幅である。 階級幅や階級数はどうやって決めればよいだろうか。 それらを決める絶対的な方法はないが、目安の一つとして__**スタージェスの公式**__がある。 \[ 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 にしてある。 {{ histogram1.png?nolink |ヒストグラム(階級幅5cm)}} ヒストグラムを描くことで分布の中心の位置や散らばり具合などの特徴を知ることができる。 階級幅を変えてみるとヒストグラムはどのように変わるだろうか。 以下は同じデータで階級幅 10cm にしたヒストグラムと階級幅 0.2cm にしたヒストグラムである。 {{ histogram2.png?nolink |ヒストグラム(階級幅10cm)}} {{ 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 | | | | ^ $\vdots$ | $\vdots$ | $\vdots$ | $\vdots$ | $\vdots$ | | | | ^ 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)''」と入力する。 - 入力したら S+C+Enterを押す。 - 自動的に度数が求められる。 Microsoft Excel では少し操作が異なる。 - セル K3 から K12 を選択する。 - 選択したまま「''=FREQUENCY(D2:D501,I3:I12)''」と入力する。 - 入力したら S+C+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]**'' をクリックする。 \\ ** ① グラフの作成 ** - 度数のセル K3 から K12 を選択する。 - メニューバーの ''**[挿入]**''%%→%%''**[縦棒/横棒の挿入]**''%%→%%''**[集合縦棒]**'' を選択する。 - グラフをクリックすると右側に現れる「+」をクリックして ''**[軸ラベル]**'' にチェックを入れる。 - グラフのタイトルと軸ラベルの場所をクリックしてに以下のように入力する。 * タイトル:「身長の分布」 * 横軸ラベル:「身長 [cm]」 * 縦軸ラベル:「度数」 ** ② グラフの移動 **\\ グラフが度数分布表の上に重なって邪魔な場合はマウスで移動させる。 \\ ** ③ 階級値の追加 ** - グラフ上で右クリックして ''**[データ範囲]**'' を選択して「データソースの選択」のダイアログを表示する。 - 「横(項目)軸ラベル」の''**[編集]**'' をクリックし、マウスでセル J3 から J12 を選択する。 - ''**[OK]**'' をクリックする。 ** ④ 棒グラフをヒストグラムにする ** - 系列の棒をダブルクリックして「データ系列」のウインドウを表示する。 - 「要素の重なり」を 0% にする。 \\ ** ① グラフの作成 ** - 度数のセル J2 から K12 を選択する。 - メニューバーの ''**[挿入]**''%%→%%''**[集合縦棒]**'' を選択する。 - グラフのタイトルの場所をクリックして「身長の分布」と入力する。 - メニューバーの ''**[グラフ]**''%%→%%''**[主横軸ラベル]**''%%→%%''**[軸ラベルを軸の下に配置]**''を選択し、「身長 [cm]」と入力する。 - メニューバーの ''**[グラフ]**''%%→%%''**[主縦軸ラベル]**''%%→%%''**[軸ラベルを垂直に配置]**''を選択し、「度数」と入力する。 ** ② グラフの移動 **\\ グラフが度数分布表の上に重なって邪魔な場合はマウスで移動させる。 \\ ** ③ 階級値の追加 ** - グラフ上で右クリックして ''**[データの選択]**'' を選択して「グラフ」のウインドウを表示する。 - 「横軸(カテゴリ)」の''**[+フィールドの追加]**'' をクリックし、''**[階級値]**'' を選択する。 - 「列の値」で ''**[階級値]**'' のフィールドを削除する。 ** ④ 棒グラフをヒストグラムにする ** - 系列の棒で右クリックして ''**[書式]**'' を選択して「グラフ」のウインドウを表示する。 - ''**[横軸]**'' をクリックして「要素の間隔」を 0% にする。 - ''**[系列"度数"]**'' の ''**[外枠]**'' をクリックして枠線の色(例えば黒)を選択する。 \\ ===== 課題 ===== [[dataset#データセット1]] の「体重」のデータから度数分布表を作成し、ヒストグラムを描きなさい。 作成したファイルは ODF 表計算ドキュメント(拡張子 .ods)で提出すること。 ファイル形式を ODF 表計算ドキュメント(拡張子 .ods)にするには [[office:libreoffice#ファイル形式の変更]] を参照。