変数の尺度|記述統計と標本

このページはプロモーション(広告)を含みます。

記述統計と標本(初級・読む25分+演習30分)

この授業のゴール

仕事でどう使うか

表の列には、計算してよい列と、計算してはいけない列があります。見た目はどちらも数字なので、区別しないと意味のない平均が出ます。

路線 この授業の使いどころ
DS(データサイエンティスト) 集計前に列の尺度を確認し、平均を出す列・件数を数える列・割合にする列を分ける。レポートの「データ定義」の表になります
ML(機械学習エンジニア) 前処理の方針を決める。名義はワンホット、順序は順序符号化、数値は標準化、欠損は補完や欠損フラグ、のように列ごとに手法が変わります
DX(DX推進・AI企画) アンケートの設問設計で、集計したい指標から逆算して回答の形式(選択肢・段階・数値入力)を決める
RS(研究者) 尺度に合った分析手法を選ぶ。順序データを平均で扱うか、順序ロジスティック回帰にするかは、研究計画の判断事項です

「この列は数字だが、平均してよいか」と自問する習慣が、この授業の目的です。

前提

次の言葉を使います。

コードは pandas(表を扱うライブラリ)の Series(1列のデータ)を使います。np.nan は「欠損値」を表す特別な値です。

身近な状況:数字が入っているのに平均できない列

架空のネットショップの顧客アンケートの一部です。1行が顧客1人です。

customer_id 都道府県コード 満足度(1〜5) 来店日の気温(℃) 今月の購入額(円) 郵便番号
1001 13(東京) 5 24 8,400 1500001
1002 27(大阪) 3 31 0 5300001
1003 40(福岡) 4 12 3,200 8100001
1004 13(東京) 4 18 (未入力) 1000005

新人の担当者が、すべての列の平均を計算しました。

どの列に何を計算してよいかを決めるのが、変数の尺度(measurement scale)です。

直感的な説明:「ラベル」「順位」「目盛り」「量」

数字が表すものは、大きく4種類に分けられます。

  1. ラベル:区別するための名前の代わり。背番号や都道府県コード。大小に意味がなく、足し引きも意味がない。
  2. 順位:順番だけに意味がある。マラソンの1位・2位・3位。1位と2位の差が、2位と3位の差と同じとは限らない。
  3. 目盛り:差に意味がある。気温。20℃と10℃の差は10℃で、15℃と5℃の差と同じ。ただし0℃は「熱がない」のではなく、決めた基準点にすぎない。
  4. 量:0が「何もない」を表し、割り算(倍率)に意味がある。購入額、身長、待ち時間。

この4つが名義・順序・間隔・比です。上から下へ、使える計算が増えていきます。

見分けのコツ:「2倍と言って意味が通るか」「差を取って意味が通るか」「大小を比べて意味が通るか」の順に聞きます。最初の問いに「はい」なら比、2つ目なら間隔、3つ目なら順序、どれも「いいえ」なら名義です。

正確な定義:4つの尺度と使える要約

尺度ごとの定義と、使ってよい要約をまとめます。

尺度 意味 例 使ってよい要約
名義尺度(nominal) 区別するだけ。順序なし 都道府県、支払方法、顧客ID、郵便番号 件数、割合、最頻値(最も多い値)
順序尺度(ordinal) 順序に意味がある。差の大きさは不定 満足度の段階、学年、要介護度 上に加えて、中央値、分位点
間隔尺度(interval) 差に意味がある。0は任意の基準 気温(℃)、西暦年、偏差値 上に加えて、平均、標準偏差、差
比尺度(ratio) 0が「ない」を表す。比に意味がある 購入額、重さ、時間、件数 上に加えて、比(倍率)、変動係数

ほかに、値の取り方による別の分け方もあります。

注意する点が3つあります。

用語:「間隔尺度か比尺度か」の見分けは、「値が0のとき、その量が本当にないか」です。購入額0円は購入がない。気温0℃は寒さがないわけではない。

段階付き例題:満足度10人の要約を尺度に合わせて作る

問題:10人の満足度(1=非常に不満〜5=非常に満足)が 5, 4, 4, 3, 5, 2, 4, 4, 1, 3 でした。尺度に合った要約をつくります。

ステップ1:尺度を決める。 段階に順序はあるが、「4と5の差」と「1と2の差」が同じとは限りません。順序尺度です。

ステップ2:並べ替える。 小さい順に 1, 2, 3, 3, 4, 4, 4, 4, 5, 5。

ステップ3:順序尺度で使える要約を出す。

ステップ4:平均を使う場合は条件を書く。 合計 35 を10で割ると 3.5 です。ただし「段階の幅が等しい」と仮定した場合の参考値です。上の人数分布を並べて示します。

ステップ5:同じ平均でも分布は違う。 次のコードで、平均3.0の2つのグループを比べます。value_counts() は値ごとの件数を数え、sort_index() は値の小さい順に並べる関数です。

import pandas as pd

a = pd.Series([3] * 10)                  # 全員が「ふつう」
b = pd.Series([1] * 5 + [5] * 5)         # 極端に二分

print("平均 a:", a.mean(), " b:", b.mean())
print("中央値 a:", a.median(), " b:", b.median())
print(a.value_counts().sort_index().to_dict())
print(b.value_counts().sort_index().to_dict())

出力は「平均 a: 3.0 b: 3.0」「中央値 a: 3.0 b: 3.0」、そして {3: 10} と {1: 5, 5: 5} です。平均も中央値も同じ3でも、人々の状態はまるで違います。 順序データでは分布を出すのが基本です。

操作して理解する:0と欠損、コード化カテゴリ

0と欠損を取り違えたときの影響を、コードで確かめます。7人に「今週の運動時間(時間)」を聞いたところ、2人が無回答でした。

import numpy as np
import pandas as pd

hours = pd.Series([3, 0, np.nan, 5, np.nan, 0, 4])   # float型。np.nan が欠損

print("人数:", len(hours))
print("回答数(count):", hours.count())
print("欠損数:", hours.isna().sum())
print("0時間の人:", (hours == 0).sum())
print("平均(欠損は除く):", round(hours.mean(), 3))
print("平均(欠損を0にした):", round(hours.fillna(0).mean(), 3))

出力は、人数7、回答数5、欠損数2、0時間の人2、平均(欠損を除く)2.4、平均(欠損を0にした)1.714 です。

次にコード化されたカテゴリです。

import pandas as pd

pref = pd.Series([13, 27, 40, 13])          # 13=東京, 27=大阪, 40=福岡
print("平均(意味なし):", pref.mean())
print("件数:", pref.value_counts().to_dict())

平均は 23.25 になりますが、件数を数える value_counts() の結果 {13: 2, 27: 1, 40: 1} のほうが意味を持ちます。

自分で試す問いです。(1) hours の最後の値4を np.nan に変えると、平均はいくつになりますか(答え:8÷4=2.0)。(2) 欠損でなく「該当なし」と答えた人は、0として扱うべきでしょうか。設問の意味で決まります。決めた理由を記録に残してください。

発展:尺度分類の限界と、実務での扱い

この4分類は便利ですが、完璧ではありません。

機械学習の前処理では、名義はワンホット(カテゴリごとに0/1の列に展開)、順序は順序符号化、数値は必要に応じて標準化、というように尺度に応じて変換を選びます(特徴量・前処理・表データ(有料版))。ただし、木に基づくモデルは数値の大小だけを使うため、名義を整数コードに変えても動いてしまいます。動くことと、意味があることは別です。

よくある失敗

失敗1:コード化したカテゴリを平均する

誤った例:都道府県コード 13, 27, 40, 13 の平均を取って「平均23.25」と報告する。

import pandas as pd
pref = pd.Series([13, 27, 40, 13])
print(pref.mean())              # 23.25 ← 意味のない数
print(pref.value_counts().to_dict())   # 件数なら意味がある

誤りの理由:コードは区別のためのラベルで、コード間の差や平均に意味がありません。ライブラリは数値なら黙って計算するため、気づきにくいミスです。

直し方:名義の列はカテゴリ型(astype('category'))にするか、件数・割合で要約する。モデルに入れるときはワンホットにする。

失敗2:順序尺度の平均だけを報告する

誤った例:A店とB店の満足度の平均がどちらも3.0なので「同じ満足度」と報告する。

先ほどの例で、A店は全員が3、B店は1と5が半々でした。平均も中央値も3.0で同じですが、B店には強い不満を持つ人が半数います。

誤りの理由:平均は分布を1つの数に潰します。順序尺度では、特に各段階の人数が重要です。

直し方:各段階の人数(割合)を並べ、「4以上の割合」「2以下の割合」を併記する。平均を示すなら「段階の幅が等しいと仮定した参考値」と書く。

失敗3:欠損を0にして平均する

誤った例:運動時間7人のうち2人が無回答。欠損を0にして平均1.714時間と報告する。

import numpy as np
import pandas as pd
hours = pd.Series([3, 0, np.nan, 5, np.nan, 0, 4])
print(hours.fillna(0).mean())   # 1.714... 誤り
print(hours.mean())             # 2.4 回答者の平均

誤りの理由:無回答の2人の運動時間はわかりません。0と決めると、データにない情報を勝手に足したことになります。

直し方:「回答者5人の平均2.4時間(無回答2人)」と分母と欠損件数を明記する。無回答の理由を調べ、補完するなら方法を書く。0にしてよいのは「該当なし=0」と設問で定義した場合だけです。

まとめ

用語

名義尺度(nominal scale)

区別するだけの尺度。都道府県や支払方法。大小や差に意味がない。

順序尺度(ordinal scale)

順序に意味があるが、差の大きさは不定な尺度。満足度の段階など。

間隔尺度(interval scale)

差に意味があるが、0が任意の基準で倍率に意味がない尺度。気温(℃)など。

比尺度(ratio scale)

0が『ない』を表し、倍率に意味がある尺度。購入額や時間など。

欠損(missing value)

値が観測されていない状態。0とは別。pandasでは NaN で表す。

よくある質問

なぜ尺度を分けるのですか。全部数字として扱ってはいけないのですか。

計算できることと、意味があることは別だからです。ライブラリは数値なら黙って平均を出します。尺度を決めると、その列に使ってよい要約と、避けるべき計算がはっきりします。

満足度の平均は使ってはいけませんか。

使ってもよいが、条件付きです。「段階の幅が等しいと仮定した参考値」と明記し、分布や『4以上の割合』を併記します。厳密な比較では、段階の割合の比較や順序ロジスティック回帰を使います。

顧客IDのような数字は、モデルに入れてよいですか。

通常は入れません。IDは区別のためのラベルなので、大きさに意味がありません。ID順が登録順なら登録時期の代わりになりますが、意図せず情報漏洩(データリーク)になることもあります。使う場合は、意味を確認した別の特徴量にします。

0と欠損は、実際のデータでどう見分けますか。

データ定義書で『未入力はNULL』『該当なしは0』のように決めてあるかを確認します。ない場合は、0の割合が不自然に多くないか、欠損の位置に規則(古いデータだけ空など)がないかを調べ、作成者に確認します。

年齢は比尺度ですか。

年齢は0歳が『生まれていない』ではなく『生後1年未満』を表すので、厳密には満年齢の定義に依存します。実務では年数の差と倍率を使えるので比尺度として扱うことが多いですが、年齢を『20代』のように区切ると順序尺度になります。

尺度が変わると、必ず別の手法になりますか。

目安として、名義は件数・割合・カイ二乗検定、順序は中央値・順位に基づく手法、間隔・比は平均や回帰、と対応します。ただし例外もあるので、目的と前提をレポートに書いて選びます。

確認問題

問1 顧客データの「郵便番号」(例:1500001)の列について、最も適切な扱いはどれか。

  1. ① 比尺度として平均を計算する
  2. ② 間隔尺度として標準偏差を計算する
  3. ③ 名義尺度として扱い、平均は計算しない
  4. ④ 順序尺度として中央値を計算する
解答と解説

正解:③

郵便番号は地域を区別するラベルです。数値に見えても、大小や差に意味はありません。

問2 「今日は20℃で、昨日の10℃の2倍暖かい」という主張について正しいのはどれか。

  1. ① 気温は比尺度なので正しい
  2. ② 気温(℃)は間隔尺度で、0℃が基準点にすぎないので「2倍」は意味を持たない
  3. ③ 気温は名義尺度なので比較できない
  4. ④ 差を取ることもできない
解答と解説

正解:②

℃は間隔尺度です。差(10℃高い)には意味がありますが、倍率には意味がありません。絶対温度では 293.15÷283.15≒1.035倍です。

問3 5段階満足度の平均が、A店もB店も3.0だった。A店は全員が3、B店は1と5が半々である。報告として最も適切なのはどれか。

  1. ① 各段階の人数や割合を併記し、B店の二極化を示す
  2. ② 満足度は同じなので、1つにまとめて報告する
  3. ③ B店は平均が信頼できないので破棄する
  4. ④ B店の1を0に直してから再計算する
解答と解説

正解:①

順序尺度の平均は分布を隠します。段階ごとの割合を示せば、B店の不満層の存在がわかります。

問4 運動時間の調査で、無回答の人を0時間にして平均を計算した。この処理の問題点はどれか。

  1. ① 問題はない。0と欠損は同じ意味である
  2. ② 回答者の人数が増え、平均が必ず大きくなる
  3. ③ 聞けていない人を「運動しなかった人」として扱うため、平均が低く偏り得る
  4. ④ 標準偏差が必ず0になる
解答と解説

正解:③

欠損は「値がわからない」であり、0は「測って0だった」です。欠損を0にすると、実際にはわからない値を0と決めてしまいます。

問5 次の列のうち、比尺度として扱うのが適切なものはどれか。

  1. ① アンケートの満足度(1〜5)
  2. ② 都道府県コード
  3. ③ 偏差値
  4. ④ 今月の購入額(円)
解答と解説

正解:④

購入額は0円が「購入なし」を表し、2倍・半分といった比に意味があります。

問6 10人の満足度(5,4,4,3,5,2,4,4,1,3)について正しい記述はどれか。

  1. ① 最頻値は3、中央値は4
  2. ② 最頻値は4、中央値は4
  3. ③ 最頻値は4、中央値は3.5
  4. ④ 最頻値は5、中央値は4
解答と解説

正解:②

並べると 1,2,3,3,4,4,4,4,5,5。4が4人で最頻、5番目と6番目がともに4なので中央値も4です。平均は3.5です。

次に学ぶこと

次は 分布とヒストグラム で、1つの列の値の分布をヒストグラムで見ます。尺度が数値(間隔・比)の列が対象です。戻るなら 数値・カテゴリ・日時・欠損 で列の型を確認します。

この授業の確認問題だけで習得とはしません。ST01 の総合テストと別データの自力課題で判定します。欠損の扱いは 欠損・重複・異常・品質検証(有料版) でさらに詳しく学べます。

キャリア学習:データサイエンティスト・機械学習エンジニア・DX推進・研究者を目指す人の学習アプリ。164モジュール・984授業を、ブラウザで動くSQLとPythonの演習で。基礎と各分野の最初のモジュールは無料。全部は2,980円の買い切り。

アプリを無料で開く有料版と無料版の違い