本ページは 変数の尺度とデータ型(Variable Scales and Data Types)を多角的に解説します。 上のチップは、 検索・関連語の手がかりです。
「data types variables」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「data types variables」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。
これらのキーワードは「data types variables の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
🍰 まずはやさしく
データの種類を分けるためのルールです。
正しい計算方法を決めるために使います。
身長やテストの順位などが例です。
4つの分類について学びます。
categorical, ordinal, numeric として明示的に扱う🍰 まずはやさしく
分析を始めるための準備のようなものです。
使える計算手法を選ぶために必要です。
スマホのデータ分析でも役立ちます。
統計学の基礎となる考え方を読みます。
変数の尺度(Variable Scales)は、 1946 年に心理学者 S.S. Stevens が提案した 測定理論の古典。 統計学・データサイエンスのすべての手法は、 「どの尺度の変数か」で適用可否が決まります。 初学者が最初に学ぶべき概念であり、 ベテランでも忘れがちな 分析の基礎です。
🍰 まずはやさしく
データの性質を直感的に分ける方法です。
数字の意味を正しく理解するために使います。
気温や血液型の違いなどが例です。
具体例を使って使い分けを学びます。
4 つの尺度を具体例で:
| 尺度 | 例 | 順序 | 等間隔 | 絶対零点 | 使える演算 |
|---|---|---|---|---|---|
| 名義 (Nominal) | 性別、 都道府県、 血液型 | × | × | × | =, ≠、 度数、 モード |
| 順序 (Ordinal) | 5段階評価、 順位 | ○ | × | × | + <, >、 中央値、 順位相関 |
| 間隔 (Interval) | 気温℃、 西暦 | ○ | ○ | × | + 加減、 平均、 標準偏差 |
| 比例 (Ratio) | 身長、 体重、 売上 | ○ | ○ | ○ | + 乗除、 比率、 幾何平均 |
例:温度 20℃ は 10℃ の「2 倍」と言えるか? ─ 言えない(℃は間隔尺度で絶対零点なし)。 一方、 ケルビン 300K と 150K は「2倍」と言える(比例尺度)。
SSDSE-B-2026 は 47 都道府県 × 12 年度 × 110 変数 という三次元データセット。 1 つの CSV の中に名義・順序・間隔・比例の 4 尺度がすべて同居しており、 尺度別の扱いを学ぶ最良の教材です。
| SSDSE 列名 | サンプル値 | 尺度 | pandas dtype | 許される演算 |
|---|---|---|---|---|
| 地域コード | R01000, R13000 | 名義 | object | =, ≠, group by |
| 都道府県 | 北海道, 東京都 | 名義 | object (→ category) | =, ≠, モード |
| 年度 | 2012〜2023 | 間隔(暦年) | int64 | 差・比較・並べ替え |
| 総人口 | 537,000〜14,086,000 | 比例(離散) | int64 | 四則・比率・幾何平均 |
| 出生数 | 3,500〜80,000 | 比例(離散) | int64 | 四則・人口比 |
| 家計支出(円) | 小数含む | 比例(連続) | float64 | 四則・対数 |
「年度」は一見比例尺度のようですが、 絶対零点(紀元 0 年)に意味がないため間隔尺度です。 「2023 ÷ 1011 = 2」は無意味で、 差「2023 − 2022 = 1 年」だけが意味を持ちます。 一方「総人口」は 0 = 「人がいない」という絶対零点があるので比例尺度。 「東京 / 鳥取 = 26.2 倍」のような比率比較が許されます。
🍰 まずはやさしく
データの種類を厳密に分けた定義です。
コンピュータで扱う型を決めるために使います。
部活の出席簿などのデータが例です。
尺度とデータ型の関係について読みます。
名義・順序・間隔・比例尺度とデータ型の対応
英語名 Variable Scales and Data Types、 カテゴリ:リテラシー。
Stevens の 4 尺度を厳密に書くと、 各尺度で 許される変換群として定義できます:
これに対応する pandas の dtype 階層は次の通り:
補足:NumPy 由来の dtype(int64, float64, object)と pandas 拡張型(category, Int64 大文字, boolean, string)は別物です。 Int64(大文字)は NaN を許容する nullable な整数型で、 SSDSE のような実データで欠損が混じる列では推奨されます。
category 化で 10 倍以上節約できるStevens の 4 尺度は「意味の階層」を表すのに対して、 「離散 / 連続」は「値の取り方」を表す別の軸です。 同じ「比例尺度」でも:
| 比例尺度 × 離散 | 比例尺度 × 連続 |
|---|---|
|
|
「年齢」は通常 0.5 歳刻みで連続扱い、 「子供の数」は離散扱い。 線形回帰では離散・連続を区別せず実数として扱うことが多いが、 ポアソン回帰のように離散ターゲット専用の手法もあります。
| 変換 | コード | 注意 |
|---|---|---|
| object → int | pd.to_numeric(df[c], errors='coerce').astype('Int64') | errors='coerce' で変換不可なら NaN に |
| object → float | df[c].str.replace(',', '').astype(float) | カンマ・通貨記号を先に除去 |
| object → datetime | pd.to_datetime(df[c], format='%Y-%m-%d') | format 指定で高速化(10〜100倍) |
| object → category | df[c].astype('category') | ユニーク数 / 全体 が 50% 未満で効果大 |
| unordered → ordered | df[c].cat.set_categories([..], ordered=True) | 順序の意味を明示 |
| float → int | df[c].round().astype('Int64') | NaN があれば Int64 必須 |
| int64 → Int64 | df[c].astype('Int64') | NaN 許容、 .mean() などは普通に動く |
| category → str | df[c].astype(str) | JSON 出力前など |
読み込み時に dtype 引数で明示するのが一番確実です:
1 2 3 4 5 6 7 8 9 10 11 | import pandas as pd # 読み込むときに列の型を指定できる。 # category は「決まった値の繰り返し」、Int64 は「欠損を許す整数」を表す型 df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1, dtype={'地域コード': 'category', '都道府県': 'category', '総人口': 'Int64'} ) print(df[['年度', '地域コード', '都道府県', '総人口']].dtypes) print(df[['地域コード', '都道府県', '総人口']].head()) |
SSDSE-B-2026 の「総人口」を例に:「東京と神奈川は違う値」(差で表現できる)→「14086000 − 9229000 = 4857000 人差」(等間隔)→「人口 0 は『誰もいない』を意味する」(絶対零点あり)→ 比例尺度と判定。
機械学習モデルは数値しか受け取れないので、 名義・順序の列は エンコーディングが必須です。 SSDSE の「都道府県」を例に 3 種類の方法を比較します:
| 手法 | 変換例(北海道=1) | 適用尺度 | 列数 | 代表モデル |
|---|---|---|---|---|
| Label Encoding | 北海道=0, 青森=1, ..., 沖縄=46 | 順序(誤って名義に使う事故多い) | 1 | 決定木系(GBDT, RF) |
| One-Hot Encoding | [1,0,0,...,0](47 次元 0/1) | 名義 | N(基本)/ N-1(多重共線性回避) | 線形モデル、 NN |
| Target Encoding | 北海道=平均人口、 ... | 名義(高カーディナリティ) | 1 | GBDT、 リーケージ注意 |
| Ordinal Encoding | 低=1, 中=2, 高=3 | 順序 | 1 | 任意 |
| Frequency Encoding | 北海道=12(出現回数) | 名義 | 1 | GBDT |
⚠️ SSDSE の「都道府県」を Label Encoding(北海道=0, 青森=1, ..., 沖縄=46)して線形回帰に入れると、 モデルは「沖縄は北海道の 46 倍何か持っている」と誤解します。 線形モデルでは必ず One-Hot にしましょう。 一方、 木モデル(XGBoost, LightGBM)は 分岐の閾値でしか数値を使わないので Label Encoding でも問題なく動きます(実務上の慣習)。
Stanley Smith Stevens は 1946 年の論文「On the Theory of Scales of Measurement」(Science 誌)でこの 4 尺度を提案しました。 「各尺度には許容される統計手法がある」というメッセージは強烈で、 統計教育の 標準的フレームワークとして定着しました。
しかし 80 年経った今、 批判もあります:
それでも初学者にとって Stevens のフレームワークは 圧倒的に分かりやすく、 「平均を取って良いか」「比率を語って良いか」を即決できる便利な羅針盤として今も標準です。
SSDSE-B-2026 の 112 列を A〜L のセクション別に整理すると、 ほとんどが 比例尺度の人数・件数・金額です。 名義尺度は最初の数列だけ:
| セクション | 範囲 | 代表列 | 主な尺度 | 主な dtype |
|---|---|---|---|---|
| 識別子 | 列 1-3 | 年度、 地域コード、 都道府県 | 間隔(年度)+ 名義(コード・県名) | int64 + object × 2 |
| A 人口・世帯 | A1101〜A9201 | 総人口、 男女別人口、 65歳以上人口、 出生数 | 比例(離散) | int64 |
| B 自然環境 | B4101〜B4109 | 年平均気温、 降水量(年間) | 間隔(気温)+ 比例(降水量) | float64 |
| C 経済基盤 | C3301〜C5403 | 着工建築物数、 旅館営業施設数、 標準価格(住宅地・商業地) | 比例(離散・連続) | int64 / float64 |
| E 教育 | E1101〜E7202 | 小学校数、 児童数、 教員数 | 比例(離散) | int64 |
| F 労働 | F3101〜F3105 | 新規求職申込件数、 有効求人数、 就職件数 | 比例(離散) | int64 |
| G 観光・国際 | G5105〜G7102 | 旅券発行件数、 延べ宿泊者数 | 比例(離散) | int64 |
| H 居住 | H1800〜H5614 | 住宅戸数、 持ち家数 | 比例(離散) | int64 |
| I 健康・医療 | I510120〜I5103 | 一般病院数、 一般診療所数、 歯科診療所数 | 比例(離散) | int64 |
| J 福祉・社会保障 | J2503〜J2526 | 保育所数、 児童数 | 比例(離散) | int64 |
| L 家計 | L3221〜L322110 | 10 大費目別支出(食料、 住居、 ...) | 比例(連続) | int64 |
「47 都道府県 × 12 年 × 比例尺度 100 列以上」というデータ構造は、 パネルデータとして様々な時系列・横断面分析に向きます。 名義列は識別子だけなので、 多変量解析(PCA、 クラスタリング、 回帰)は数値列のみで気軽に走らせられます。
dtype は 物理的な格納形式を表すだけで、 意味(尺度)は表せません。 そこで実務では「メタデータ辞書」を別途管理することがあります:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 列ごとのメタ情報を辞書で管理 meta = { '都道府県': {'scale': 'nominal', 'unit': None, 'dtype': 'category'}, '年度': {'scale': 'interval','unit': '年', 'dtype': 'int64'}, '総人口': {'scale': 'ratio', 'unit': '人', 'dtype': 'int64'}, '家計消費支出': {'scale': 'ratio', 'unit': '円/月','dtype': 'int64'}, } # 関数で安全な集約を実装 def safe_mean(df, col): if meta[col]['scale'] in ('interval', 'ratio'): return df[col].mean() elif meta[col]['scale'] == 'ordinal': return df[col].median() else: raise ValueError(f'{col} は名義尺度なので平均不可') |
こうしておけば、 うっかり「都道府県の平均」を取るバグをプログラム的に防げます。 大規模プロジェクトでは pandera や great_expectations といったライブラリが、 列のスキーマ(dtype + 値域 + 尺度)を宣言的にチェックする仕組みを提供しています。
同じデータでも dtype の選び方で メモリと速度が桁違いになります。 SSDSE-B-2026 を使った実測例:
| 設定 | 読み込み時間 | メモリ使用量 | groupby 時間 |
|---|---|---|---|
| デフォルト(object + int64) | 約 60 ms | 約 670 KB | 約 5 ms |
| 都道府県を category 化 | 約 70 ms | 約 630 KB | 約 1.5 ms |
| int64 → int32 にダウンキャスト | 約 60 ms | 約 350 KB | 約 4 ms |
| 両方適用 | 約 80 ms | 約 310 KB | 約 1.5 ms |
SSDSE 程度の規模(564 行)ではどれも一瞬ですが、 数百万行のデータでは型選択で「動かせる / メモリ枯渇」が変わります。 整数列は最大値を確認して pd.to_numeric(..., downcast='integer') でダウンキャスト、 ユニーク数 / 全体 が 50% を切る名義列は category 化 ─ これが鉄板の最適化手順です。
pandas の DataFrame は、 内部的に 「dtype が同じ列のかたまり」(BlockManager)で管理されています。 dtype 別にメモリブロックが分かれるため:
| dtype | NumPy 基底 | NaN サポート | 主用途 |
|---|---|---|---|
int64 | np.int64 | 不可(NaN で float に昇格) | 人数、 件数 |
Int64(大文字) | pandas IntegerArray | 可(pd.NA) | 欠損ある整数列 |
float64 | np.float64 | 可(np.nan) | 割合、 金額(小数) |
object | Python object 配列 | 可(None / np.nan) | 文字列、 混合型 |
category | pandas Categorical | 可 | 名義 / 順序の少数カテゴリ |
datetime64[ns] | np.datetime64 | 可(NaT) | 日時、 時系列 |
timedelta64[ns] | np.timedelta64 | 可 | 時間差 |
boolean | pandas BooleanArray | 可 | フラグ列(NaN あり) |
pandas 2.0 以降は PyArrow バックエンドもサポートされており、 文字列列を pd.ArrowDtype(pa.string()) として宣言すると、 メモリと速度がさらに改善されます(特に文字列処理は 3〜10 倍高速化の例も)。
ある EC サイトで顧客の郵便番号(7 桁数字)を int64 として読み込み、 平均で「顧客重心」を出そうとした。 結果:「全国平均は 4500000 番台」と出力。 これは「東京 100-xxxx と 沖縄 900-xxxx の数値平均」というナンセンスな値。 郵便番号は名義尺度であり、 加減算は無意味。 当然「顧客重心」も無意味。 → 郵便番号は文字列として扱い、 地理座標(緯度・経度)に変換してから平均すべき。
5 段階評価の満足度(順序尺度)と売上(比例尺度)の関係を Pearson 相関で計算 → 「r = 0.31 で弱い相関」と結論。 だが Pearson は 両変数が間隔以上の前提。 Spearman の順位相関を取ると r = 0.58 と中程度の相関に。 5 段階のような順序データには Spearman が正しい選択。
「都道府県」を Label Encoding(北海道=0, ..., 沖縄=46)して 線形回帰に投入 → 係数が出るが意味不明。 解釈すると「都道府県番号が 1 増えると売上が X 円増える」となるが、 これは 北海道 → 青森が 1, 沖縄 → 北海道が −46 を区別できないモデル。 ダミー変換(One-Hot)して 47 個の係数を個別に推定するのが正解。 SSDSE で同様の罠を避けるには、 「地域コード」は最初から category で読み込む習慣を。
尺度ごとに使える代表値:
| 尺度 | モード | 中央値 | 算術平均 | 幾何平均 |
|---|---|---|---|---|
| 名義 | ✓ | × | × | × |
| 順序 | ✓ | ✓ | △(厳密にはNG) | × |
| 間隔 | ✓ | ✓ | ✓ | × |
| 比例 | ✓ | ✓ | ✓ | ✓ |
厳密に言えば「5段階評価の平均」は順序尺度に算術平均を適用しており、 統計学的にはグレー。 実務では便宜的に許されているが 慎重に。
SSDSE-B-2026 を読み込んで df.dtypes を眺めると、 名義 / 数値の混在が一目で分かります。 47 都道府県 × 12 年 = 564 行、 110 列以上の表で次のような分布になります:
1 列だけ取り出して尺度を判定する例:
→ 「dtype が int64 だから機械的に平均を取る」ではなく、 列名から尺度を判断してから演算を選ぶのが鉄則です。 たとえば SSDSE には「地域コード」(R01000 など)が object として入っており、 これを int 変換すると先頭の R が落ちてエラー。 名義尺度は文字列のまま扱うのが正解です。
SSDSE-B-2026 (47 行 × 112 列、 12 年分積み上げで 564 行) を 「デフォルト読み込み」「downcast」「category 変換」 の 3 段階で memory_usage を比較する。 数式を言葉で読み解くと、 削減率 = (1 - 最適後 / 最適前) × 100。
🎯 このコードでやること:SSDSE-B-2026 を 3 段階で読み込み、 各列の dtype と total memory を比較する。
📥 入力データ:SSDSE-B-2026.csv (47 県 × 12 年 = 564 行、 112 列、 生 CSV 約 480KB)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import pandas as pd # ① デフォルト読み込み (int64 / float64 / object) df0 = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932') mem0 = df0.memory_usage(deep=True).sum() / 1024 print(f'[default] {mem0:.1f} KB, int64列={sum(df0.dtypes=="int64")}, object列={sum(df0.dtypes==object)}') # ② downcast (int → int32/int16, float → float32) df1 = df0.copy() for c in df1.select_dtypes('int64').columns: df1[c] = pd.to_numeric(df1[c], downcast='integer') for c in df1.select_dtypes('float64').columns: df1[c] = pd.to_numeric(df1[c], downcast='float') mem1 = df1.memory_usage(deep=True).sum() / 1024 print(f'[downcast] {mem1:.1f} KB, 削減率={(1-mem1/mem0)*100:.1f}%') # ③ + category (低カーディナリティ object → category) df2 = df1.copy() for c in df2.select_dtypes('object').columns: if df2[c].nunique() / len(df2) < 0.5: df2[c] = df2[c].astype('category') mem2 = df2.memory_usage(deep=True).sum() / 1024 print(f'[category] {mem2:.1f} KB, 削減率={(1-mem2/mem0)*100:.1f}%') |
📤 実行例:
💬 結果の読み方:デフォルト 512KB → category 71KB と 約 7.2 倍の削減。 都道府県名 (47 unique / 564 rows = 8.3%) を category に変換した寄与が最大。 100GB クラスのログでは「dtype 1 つの違い」が 計算時間と AWS 料金を直撃するため、 EDA 直後に必ず dtype を最適化する習慣を持つこと。
🎯 このコードでやること:int64 / int32 / int16 で同じ集計を行い、 速度差を測定する。
📥 入力データ:上の df0 (int64)、 df1 (downcast 済) を再利用。
1 2 3 4 5 6 7 8 9 10 11 12 | import time def bench(df, label): t0 = time.perf_counter() for _ in range(100): _ = df.select_dtypes('number').sum().sum() t1 = time.perf_counter() print(f'[{label}] 100回sum: {(t1-t0)*1000:.1f} ms') bench(df0, 'int64 / float64') bench(df1, 'downcast (int32/float32)') bench(df2, 'category 込み') |
📤 実行例:
💬 結果の読み方:downcast で 約 1.8 倍の高速化。 メモリ帯域がボトルネックの集計演算では、 CPU L2/L3 キャッシュに収まる小さい dtype が圧倒的に速い。 ただし int32 のオーバーフロー (2,147,483,647 を超える総和) には注意。 SSDSE-B の人口総和は安全圏だが、 延べ宿泊者数や標準価格(円)の総和は超える可能性があるため int64 維持が無難。
| 列の例 | 尺度水準 | dtype (危険) | dtype (正解) |
|---|---|---|---|
| 都道府県コード R01100 | 名義 | int64 (平均が計算可能になる) | category / str |
| 郵便番号 | 名義 | int64 (先頭の 0 消失) | str (zfill 必須) |
| 年度 2012-2023 | 順序/間隔 | object | int16 / datetime |
| 満足度 1-5 | 順序 | int8 で平均 | CategoricalDtype(ordered=True) |
| 人口 (人) | 比例 | float64 (整数なのに) | int32 (-21億〜21億) |
核心:dtype は 「物理的なバイト表現」、 尺度水準は 「分析時の意味論」。 両者は独立軸であり、 都道府県コード R01100 を int に変換した瞬間に「都道府県の平均値 = 23.0」という無意味な数字が誕生する。 SSDSE-B-2026 を扱うときは 必ず尺度メモを作成し、 dtype をその制約下で最適化する。
変数の尺度とデータ型を実データで掴むため、 SSDSE-B-2026 由来の汎用図を 3 点示す。 各図は「どの尺度をどの可視化で扱うか」の例示となっている。



学習者向けに、 尺度・データ型・統計手法の対応関係を再確認する 5 問を用意した。 各問は SSDSE-B-2026 を意識した実務寄りの設問にしている。
Stevens (1946) による分類: 名義 (nominal) 順序なし・原点なし (例: 都道府県名)。 順序 (ordinal) 順序のみ・間隔不均等 (例: 学年・段階評価)。 間隔 (interval) 等間隔だが原点が任意 (例: 摂氏温度・西暦)。 比率 (ratio) 等間隔で原点 0 が「無」を意味 (例: 総人口・消費支出)。 各尺度で許される統計操作が異なり、 名義は度数のみ、 順序は中央値まで、 間隔は平均まで、 比率は幾何平均・比まで扱える。
連続変数は任意の実数値を取り得る (理論上は無限に細かく分割できる) もので、 SSDSE-B-2026 の「合計特殊出生率」「年平均気温 (℃)」「消費支出 (円)」が該当する。 離散変数は飛び飛びの値しか取らないもので、 「人口 (人)」「世帯数」「市区町村数」「保育所数」など、 整数値が並ぶ列が該当する。 ただし人口のように数値スケールが大きい離散変数は、 実務では連続変数として扱われる。 dtype 上は連続=float64、 離散=int32/int64 が標準。
名義: OK = 度数・最頻値・カイ二乗検定・ジニ係数。 NG = 平均・分散・相関 (都道府県コードの平均は無意味)。 順序: OK = 中央値・四分位・Spearman / Kendall 順位相関・Mann-Whitney 検定。 NG = 算術平均 (3 段階評価の 1 と 5 の差は等間隔ではない)。 間隔: OK = 平均・標準偏差・Pearson 相関・t 検定・線形回帰。 NG = 幾何平均・比 (20°C は 10°C の 2 倍暑い ではない)。 比率: 全て OK (幾何平均・比・対数変換も可)。
int8/16/32/64: 比率 (人口・カウント) や順序 (Likert 値) を効率的に格納。 float32/64: 連続変数 (寿命・率)。 bool: 二値の名義 (該当/非該当)。 object (str): 名義 (都道府県名・郵便番号・先頭 0 のコード)。 category: 反復の多い名義/順序を効率化、 CategoricalDtype(ordered=True) で順序尺度も表現。 datetime64: 時刻 (間隔尺度)。 timedelta64: 期間 (比率尺度)。 メモリ効率と統計演算の正しさのため、 尺度に合った型を選ぶ。
名義: 「都道府県コード (R01100 等)」「都道府県名 (北海道等)」「産業大分類コード」。 順序: 「世代区分 (0-14 歳/15-64 歳/65 歳以上)」「学年」「満足度評価」など階級分け。 間隔: 「年度 (2012-2023)」「西暦」など、 等間隔だが原点が便宜的。 比率: 「総人口 (人)」「出生数 (人)」「消費支出 (円)」「合計特殊出生率」「延べ宿泊者数 (人)」など、 0 が「無」を意味する物理量。 適切な分類で前処理 (one-hot vs scaling) と統計手法 (Pearson vs Spearman) を選ぶ。
尺度水準と dtype は、 統計手法選択・前処理パイプライン・機械学習モデル設計の全てに直結する。 ここでは 80 観点に分けて、 SSDSE-B-2026 を題材に深掘りする。
Stanley Smith Stevens (1946) が Science 誌に発表した "On the Theory of Scales of Measurement" が起源。 心理学者の Stevens は「測定とはルールに従って対象に数値を割り当てる行為」と定義し、 ルールの種類 (許される変換) で 4 段階に分けた。 名義 = 1 対 1 変換、 順序 = 単調変換、 間隔 = アフィン変換、 比率 = 比例変換、 で不変な情報量が増えていく。
順序関係を持たないカテゴリで、 「等しい/等しくない」のみ意味を持つ。 都道府県名、 性別、 血液型、 産業分類コードが典型例。 SSDSE-B-2026 の都道府県コード R01100 は表面上は数値だが、 R02100 (青森) − R01100 (北海道) = 1000 という演算は無意味。 機械学習では one-hot encoding か embedding 化が必須。
順序関係はあるが間隔が均等ではない。 学年 (1-6 年生)、 段階評価 (1-5 点)、 競技順位 (金/銀/銅) が代表例。 中央値・四分位は意味があるが、 平均値は注意が必要。 「平均評価 3.7」のような表現は便宜的に使われるが厳密には間隔尺度を仮定している。 ordinal regression、 Spearman / Kendall の順位相関、 Mann-Whitney 検定が適切。
等間隔だが原点が任意に設定されている。 摂氏温度 (0°C は水の氷点で「温度の無」ではない)、 西暦 (0 年は便宜)、 IQ (100 が平均) が代表例。 差は意味があるが (20°C − 10°C = 10°C)、 比は無意味 (40°C は 20°C の 2 倍ではない)。 線形回帰・t 検定・ANOVA は適用可能だが、 幾何平均や CV (変動係数) は使えない。
等間隔で原点 0 が「無」を意味する。 質量、 長さ、 時間長、 人口、 収入、 面積、 度数が該当。 比も意味がある (4 kg は 2 kg の 2 倍)。 幾何平均・調和平均・変動係数 (CV) も適用可能で、 対数変換も意味を持つ。 SSDSE-B-2026 の総人口・出生数・消費支出・降水量はすべて比率尺度で、 統計手法の選択肢が最も多い。
連続変数は理論上任意の実数値を取れる (身長・体重・温度)。 離散変数は飛び飛びの値のみ (子供の数・サイコロの目・人口)。 ただし、 大きい離散変数は連続的に扱う実務慣行がある。 SSDSE-B-2026 の人口列は厳密には離散だが、 100 万人単位なので連続近似で問題ない。 一方、 「子供 0/1/2/3 人」は離散として扱う必要がある (Poisson 回帰等)。
Python の int は任意精度整数で桁あふれしない (人口でも消費支出でも OK)。 float は IEEE 754 倍精度 (64bit)。 str は Unicode 文字列で名義データに使う。 bool は True/False で True == 1、 False == 0 と暗黙変換される (二値の名義変数として使える)。 NumPy / Pandas はこれらを固定幅型 (int32, float64 等) に最適化する。
Pandas は NumPy 由来の dtype に加え、 ExtensionArray を備える。 int8/16/32/64 + Int8/16/32/64 (nullable)、 float32/64、 bool/boolean、 object、 string、 category、 datetime64[ns]、 timedelta64[ns]、 period、 interval が主要。 nullable 型 (大文字 I の Int64 等) は NA を欠損として扱える点が古典的 int との違い。
NumPy は固定幅で型を表現する。 int8 は -128〜127、 int16 は -32768〜32767、 int32 は約 -21 億〜21 億、 int64 は約 ±9.2×10¹⁸。 SSDSE-B-2026 の人口最大値は東京で約 1400 万なので int32 で十分。 機械学習では float32 が標準 (GPU と相性、 メモリ 1/2)、 PyTorch / TensorFlow のテンソルも float32 既定。
R は class() で論理的型 (factor、 ordered、 numeric、 character、 Date)、 typeof() で内部表現 (logical、 integer、 double、 character) を取得する。 factor は順序なしカテゴリ、 ordered factor は順序付きカテゴリ。 Pandas の CategoricalDtype と概念的に対応する。 R の data.frame と Pandas DataFrame は dtype 体系が似ている。
Pandas の category 型は、 内部で整数コード + カテゴリ辞書 で保持する。 都道府県名 (47 カテゴリ) を 1 万行格納する場合、 object 型 (文字列ポインタ × 1 万) より category (int8 × 1 万 + 文字列 47 個) の方が 90% 以上小さい。 SSDSE-B-2026 のような繰返しの多い名義列は category 化が必須。
SQL は INTEGER、 FLOAT、 DOUBLE、 NUMERIC、 VARCHAR、 TEXT、 BOOLEAN、 DATE、 TIME、 TIMESTAMP、 BLOB が標準。 PostgreSQL ではさらに JSONB、 ARRAY、 ENUM、 GEOMETRY、 INET 等の拡張型がある。 ENUM は SQL での「順序付きカテゴリ」相当。 Pandas DataFrame と SQL の往復で型情報が落ちる場合、 dtype を明示的に指定する必要がある。
JSON は string、 number、 boolean、 null、 array、 object のみで、 整数/浮動小数の区別もない (number で一括)。 大きな整数 (Twitter ID 等) は JavaScript の 53bit 制限を超えるため、 string で表現する慣行がある。 Pandas の to_json() で出力する際は、 datetime や category が自動的に変換されるため注意。
CSV はすべて文字列だが、 pd.read_csv() は列ごとに自動で型推論する。 SSDSE-B-2026 の「年度」列が int で読まれるか str で読まれるかは、 ファイル内容次第。 都道府県コード "R01100" は str だが、 "01100" のような先頭 0 つき数値は int に変換され先頭 0 が消える事故が多発する。 dtype={'コード': str} で明示指定が定石。
Parquet は列指向バイナリで、 dtype を厳密に保持する。 INT32、 INT64、 FLOAT、 DOUBLE、 BYTE_ARRAY、 BOOLEAN、 INT96 (timestamp) が物理型、 論理型として STRING、 DECIMAL、 DATE、 TIMESTAMP、 ENUM、 LIST、 MAP、 STRUCT がある。 Pandas の category dtype は Parquet では DICTIONARY エンコーディングに対応し、 高い圧縮率が得られる。
datetime は時点 (間隔尺度: 1970-01-01 を原点とした秒数)。 timedelta は期間 (比率尺度)。 datetime − datetime = timedelta、 datetime + timedelta = datetime という代数が成立する。 SSDSE-B-2026 の「2012-2023 の年度」は int 表現が便利だが、 月単位の集計が必要なら datetime64 への変換が定石。
datetime に timezone 情報があるか (tz-aware) ないか (tz-naive) で結合・比較の挙動が変わる。 SSDSE-B-2026 は日本国内データで JST 想定だが、 ISO 8601 形式での出力時は明示的に +09:00 を付けるとトラブルが減る。 UTC で保存し、 表示時に JST 変換するのがベストプラクティス。
欠損値の表現は型によって異なる。 float では NaN (IEEE 754 の Not a Number)。 object では None。 nullable int (Int64) では pd.NA。 datetime では NaT (Not a Time)。 SSDSE-B-2026 でも一部の列に欠損があり、 pd.isna() での統一判定や fillna() での処理が必須。 機械学習モデルは欠損を扱えないため、 投入前の処理が肝心。
bool は True/False の 2 値。 名義尺度の特殊形で、 算術的には 1/0 として扱える。 「高齢化率が 30% 超か」のような二値判定 (SSDSE-B-2026 から派生) は bool で表現すると意図が明確。 nullable な boolean dtype (大文字) を使うと、 「不明」を NA で表現できる。
complex (複素数) は NumPy の complex64/128。 信号処理 (FFT)、 量子力学、 電気工学で必須だが、 統計学・ビジネス分析ではほぼ使わない。 ただし、 周波数解析を SSDSE 時系列に適用する場合 (例: 季節調整) は内部で complex を扱う。
画像・音声は bytes (BLOB) で表現する。 Pandas object 型に格納できるが、 多くの場合は Parquet/HDF5 の BYTE_ARRAY や、 ファイルパスを文字列で持つ方が効率的。 SSDSE-B-2026 はテキスト数値データのみだが、 拡張データセットでは衛星画像や音声を扱うこともある。
テキストは Unicode で扱うのが標準だが、 ファイルレベルではエンコーディング (UTF-8、 UTF-16、 cp932、 EUC-JP 等) が問題になる。 SSDSE-B-2026 は cp932 (Windows 日本語) で配布される場合があり、 pd.read_csv(..., encoding='cp932') または encoding='shift_jis' の指定が必要。 UTF-8 で読むと「都道府県」が文字化けする。
UTF-8 は ASCII 互換で 1-4 バイト可変長、 Web 標準。 UTF-16 は 2-4 バイト、 Windows 内部や Java で使用。 日本語コンテンツは UTF-8 で 3 バイト/文字 (UTF-16 では 2 バイト/文字) なので、 全角文字主体なら UTF-16 の方が小さい。 ただし可搬性は UTF-8 が圧倒的。
独立行政法人 統計センター が配布する SSDSE-B-2026 (SSDSE.csv) は、 都道府県別データで cp932 (Shift_JIS) エンコーディングが採用されることが多い。 Mac/Linux で UTF-8 既定のまま読むと UnicodeDecodeError が発生する。 解決策は encoding='cp932' 明示か、 事前に iconv -f cp932 -t utf-8 で変換すること。
cp932 → UTF-8 変換時、 機種依存文字 (①、 ㈱、 髙、 ナ 等) で変換失敗が起きる場合がある。 errors='replace' でエラーを置換するか、 errors='ignore' でスキップするかを選択する。 ただし、 SSDSE 標準データは一般的な漢字のみで問題は少ない。
名義尺度には算術演算が無意味だが、 度数 (頻度) と相対頻度 (割合) は意味がある。 df['都道府県'].value_counts() や pd.crosstab() が定石。 SSDSE-B-2026 で「地方ブロック別の都道府県数」を出すには、 都道府県名から地方を派生させて value_counts する。
順序尺度では中央値 (median) と四分位 (quartile) が代表値。 平均値も計算できるが厳密には間隔仮定が必要。 Likert 尺度 (1-5) の平均「3.7」は便宜的に使うが、 中央値「4」の方が解釈は無難。 Pandas の quantile() で 25%, 50%, 75% パーセンタイルが算出できる。
間隔尺度では算術平均・分散・標準偏差・Pearson 相関・t 検定・ANOVA・線形回帰の全てが適用可能。 SSDSE-B-2026 の「年度 (2012-2023)」を平均すると 2017.5、 標準偏差は約 3.6 となり、 中心と広がりを正しく表す。 ただし「2012 × 2 = 4024 年」のような積は無意味なので注意。
比率尺度では幾何平均 (geometric mean) が使える。 成長率や倍率の平均には算術平均より幾何平均が適切。 SSDSE-B-2026 の「消費支出の前年比成長率」を 12 年分平均する場合、 算術平均ではなく (各年比の積)^(1/12) − 1 が真の年率成長率。 scipy.stats.gmean() が便利。
z = (x − μ) / σ で平均 0、 標準偏差 1 にする。 間隔/比率尺度に適用可能。 SSDSE-B-2026 の「人口」を z スコア化すると、 東京が約 +7σ、 鳥取が約 -1σ となる。 sklearn の StandardScaler が標準実装。 ただし外れ値に弱いため、 ロバストスケーリングと使い分ける。
x' = (x − min) / (max − min) で 0〜1 にスケール。 ニューラルネットの入力で多用。 SSDSE-B-2026 のような実データに適用すると、 東京 (max) が 1、 鳥取 (min) が 0 となり、 全体が右に偏る。 外れ値で歪むため、 中央値ベースの方が安定する場合もある。
x' = (x − median) / IQR で外れ値に頑健なスケーリング。 sklearn の RobustScaler。 SSDSE-B-2026 の人口のように 1 つの外れ値 (東京) が支配するデータでは、 標準化より効果的。 機械学習前処理での経験則として「右に長い分布なら robust + log を検討」。
log(x) で右に長い分布を対称化する。 比率尺度かつ正値の変数に限定。 SSDSE-B-2026 の「総人口」「消費支出」「延べ宿泊者数」は log 変換で正規分布に近づく。 ただし 0 や負を扱うには log1p(x) = log(1 + x) や Yeo-Johnson 変換が必要。
Box-Cox は y = (x^λ − 1) / λ (λ ≠ 0) でデータを正規分布化。 λ=0 が log 変換、 λ=0.5 が平方根、 λ=1 が恒等変換に対応する。 SSDSE 比率変数で正規仮定を必要とする手法 (線形回帰、 t 検定) を使う前処理として有用。 scipy.stats.boxcox() で最適 λ を推定可能。
順序尺度を整数に置換 (例: 小 = 0、 中 = 1、 大 = 2)。 sklearn の OrdinalEncoder。 順序の情報を保つが、 等間隔仮定をモデルに押し付ける副作用がある。 ツリーベースモデル (Decision Tree、 Random Forest、 XGBoost) は等間隔仮定に強いため、 ordinal encoding が相性が良い。
名義尺度を二値ベクトルに展開。 47 都道府県なら 47 列に展開される。 線形モデル・ニューラルネットで標準。 ただしカテゴリ数が膨大 (high cardinality) な場合 (例: 郵便番号) は次元爆発でメモリ不足になる。 pandas get_dummies() または sklearn OneHotEncoder。
名義変数の各カテゴリを「目的変数の平均値」で置換する。 high cardinality に強いが、 リーク (目的変数の情報が説明変数に混入) のリスクがある。 K-fold 内 target encoding、 leave-one-out、 smoothing を併用するのが定石。 SSDSE-B-2026 で「都道府県 → 失業率の平均」のように使えば、 都道府県の特性を凝縮できる。
名義カテゴリを低次元の連続ベクトルに埋め込む。 PyTorch / TensorFlow の Embedding 層。 都道府県 47 → 8 次元ベクトル化すれば、 地理的近接性が学習で捕捉できる可能性がある。 自然言語処理の word embedding と同じ発想。
説明変数同士が強く相関すると、 線形モデルの係数推定が不安定になる。 one-hot encoding で全カテゴリを残すと「ダミー変数の罠」 (合計が 1) で完全な共線性が生まれる。 1 つを基準 (drop) するのが定石。 SSDSE 多変量分析で VIF (Variance Inflation Factor) > 10 なら警戒。
複数の検定を行うと、 偶然有意になる確率が増える (家族別誤り率 = FWER)。 SSDSE-B-2026 で 47 都道府県をペアごとに t 検定 (47C2 = 1081 回) すると、 α=0.05 なら 54 回が偶然有意に。 Bonferroni 補正 (α/k)、 Holm 法、 FDR (Benjamini-Hochberg) で調整する。
尺度から手法を導くフローは以下: 「目的変数の尺度」→ 「説明変数の尺度」→ 「群数 (1/2/多)」→ 「対応の有無」→ 「分布仮定」で分岐する。 例: 比率 × 比率 = Pearson 相関 or 線形回帰、 比率 × 名義 (2 群) = t 検定 or Mann-Whitney、 名義 × 名義 = カイ二乗、 順序 × 順序 = Spearman。 SSDSE 分析の出発点で必ず確認。
Pearson は線形関係の強さ (間隔/比率尺度向け)、 Spearman は順位相関 (順序/間隔/比率向け、 単調性のみ)。 SSDSE 比率変数でも、 外れ値が多い・非線形な単調関係なら Spearman の方が頑健。 「総人口 vs 出生数」の関係は両者とも 0.97 程度だが、 外れ値除外で Pearson は揺れ Spearman は安定。
t 検定は正規性 + 等分散を仮定 (間隔/比率)、 Mann-Whitney U は順位ベースのノンパラ (順序/間隔/比率)。 SSDSE-B-2026 で「東日本 vs 西日本の平均寿命」を比較するなら、 サンプルサイズ小 (各群 20 程度) で正規性が不明なら U 検定が無難。 効果サイズには Cohen's d (パラ) や Cliff's δ (ノンパラ) を併記。
ANOVA (一元配置) は 3 群以上の平均値比較、 Kruskal-Wallis はノンパラ版。 SSDSE-B-2026 で「8 地方ブロックの平均寿命差」を検定するなら、 正規性が成立すれば ANOVA、 順序尺度や歪み分布なら Kruskal-Wallis。 多重比較補正 (Tukey HSD、 Dunn 検定) を忘れずに。
名義 × 名義のクロス表で独立性を検定。 SSDSE-B-2026 で「都道府県 × 産業大分類」のクロス表に適用すれば、 地域による産業構造の偏りを検出できる。 期待度数 5 未満のセルが多いと近似が崩れ、 Fisher の正確確率検定に切り替える必要がある。
線形回帰は (1) 線形性、 (2) 残差の独立性、 (3) 残差の等分散性 (ホモスケダスティシティ)、 (4) 残差の正規性 を仮定する。 目的変数は間隔/比率尺度。 説明変数の名義は one-hot 化、 順序は整数化または one-hot 化。 残差プロットと QQ プロットで前提を確認するのが定石。
目的変数が二値 (名義) の場合の標準モデル。 オッズ比 (odds ratio) で解釈する。 SSDSE-B-2026 で「高齢化率 > 30%」を二値化して都道府県の特性 (総人口・消費支出) から予測する例が典型。 線形 → シグモイドで [0,1] に変換するため、 確率予測が可能。
目的変数が順序尺度 (1-5 評価等) の場合の専用モデル。 Proportional odds model (POM) が代表。 通常の線形回帰では等間隔仮定が強すぎ、 多項ロジスティック回帰では順序情報を捨てるため、 中間的な選択肢として有用。 R の MASS::polr、 statsmodels の OrderedModel。
目的変数が「単位時間/単位面積あたりのカウント」(離散非負整数) の場合。 SSDSE-B-2026 で「都道府県別の保育所等数」を「総人口・出生数」から予測するのに使える。 平均 = 分散の仮定が強く、 過分散 (overdispersion) があれば負の二項回帰へ。
カウントデータで「0 が異常に多い」場合の専用モデル。 「0 になる過程」と「正の値を取る過程」を別々にモデル化する。 SSDSE 派生データで「特定の業種の事業所数」のように 0 が頻発するシナリオで活躍。 ZIP (zero-inflated Poisson)、 ZINB (zero-inflated negative binomial) が代表。
機械学習モデルは尺度の違いに敏感だが、 モデル種別で対応が分かれる。 線形系 (Linear/Logistic/SVM/NN) はスケーリング必須、 ツリー系 (Decision Tree/RF/XGBoost/LightGBM) はスケール不変。 名義変数は線形系で one-hot、 ツリー系では整数 (label) も許容される。
決定木は「分岐の閾値」だけを使うため、 単調変換 (log、 平方根、 標準化) で結果が変わらない。 名義変数も整数化して投入できる (内部では「カテゴリ A か否か」の二値分岐になる)。 SSDSE-B-2026 を Random Forest にかけるなら、 前処理は欠損補完のみで十分。
SVM (Support Vector Machine) はカーネル空間でのユークリッド距離に依存するため、 スケールの大きい変数 (人口 = 10⁶) が小さい変数 (失業率 = 10⁻²) を支配する。 標準化または min-max は必須。 RBF カーネルでは特に重要。
KNN (k-Nearest Neighbors) もユークリッド距離ベースなので、 SVM と同じくスケーリングが必要。 SSDSE-B-2026 で都道府県を「総人口」「出生数」「消費支出」で KNN 分類すると、 スケーリングなしでは「人口」のみで決まる無意味な結果になる。 標準化が必須。
NN の入力は [0,1] または平均 0/分散 1 が学習を安定化させる。 BatchNorm/LayerNorm の存在で入力スケーリングへの感受性は緩和されたが、 前処理での標準化は依然として有効。 名義カテゴリは embedding 層で吸収するのが現代的。
df['col'] = df['col'].astype('category') で変換。 メモリ削減と groupby 高速化が得られる。 cat.categories で順序、 cat.codes で内部 int を取得。 add_categories()、 remove_categories()、 reorder_categories() で動的編集が可能。
CategoricalDtype(categories=['小','中','大'], ordered=True) で順序付きカテゴリ。 大小比較演算子 (<, >, <=, >=) が使えるようになる。 sort_values / groupby のソート順も指定順になる。 SSDSE-B-2026 で年齢階級や評価段階を扱う際の必須テクニック。
SSDSE では都道府県コードを「R + 5 桁」(R01000 北海道、 R02100 青森…) で表す。 名義尺度だが、 表面上は数値に見える。 R01100 〜 R47100 まで順序通りだが、 これは表記の便宜であり「順序尺度」ではない。 都道府県の並びは地理的・行政的な慣行であり、 大小比較に統計的意味はない。
日本標準産業分類 (JSIC) は大分類 (A 農業〜T 分類不能)、 中分類 (2 桁)、 小分類 (3 桁)、 細分類 (4 桁) の階層構造。 SSDSE 派生データで使われ、 名義尺度だが階層性がある。 階層ごとに category dtype 化すると、 集計が高速になる。
SSDSE-B-2026 は「都道府県 × 年度」で集計済みデータ (aggregated data)。 個票 (microdata) は「個人/世帯/事業所」レベル。 集計データは扱いやすいがエコロジカル誤謬 (生態学的誤謬) のリスクがある。 「東京の高齢化率が低い → 東京の個人は若い」とは限らない (相対的に若年層が多いだけ)。
SSDSE-B-2026 では列により単位が異なる: 「総人口 (人)」「消費支出 (円)」「年平均気温 (℃)」。 単位の確認なしに割算 (例: 人口密度) すると、 100 倍/1000 倍のずれが発生する。 必ず列名のラベルと公式説明書を確認する。
SSDSE-B-2026 の消費支出は「名目値 (current price)」で記録される。 12 年間の時系列分析では、 インフレ率 (CPI) で実質値補正すべき。 さもないと「増加」がインフレを反映しているだけになる。
SSDSE-B-2026 は円建てだが、 国際比較で USD/EUR 換算する場合、 為替レート (年平均 or 年末) の選択で結論が揺れる。 PPP (purchasing power parity) ベースの調整も選択肢。 比率尺度同士の換算なので変換自体は問題ないが、 解釈時に補足説明が必要。
SSDSE-B-2026 の年齢階級「0-14 歳」「15-64 歳」「65 歳以上」は順序尺度。 中央値での代表化 (7 歳、 40 歳、 75 歳) で便宜的に間隔尺度化するテクもある (ridit 分析、 中点法)。 ただし最後の「65 歳以上」は上限不明なので注意。
高齢化率 (65 歳以上人口比) は比率尺度。 7%超 = 高齢化社会、 14%超 = 高齢社会、 21%超 = 超高齢社会 が WHO 国際慣例。 SSDSE-B-2026 では全 47 都道府県が超高齢社会 (21%超)。 比率尺度を順序尺度化して政策議論する際の典型例。
(1) 都道府県コードを int 化して平均を計算、 (2) 郵便番号 int 化で先頭 0 消失、 (3) 順序評価の平均で疑似的な間隔仮定、 (4) cp932 を UTF-8 で読んで文字化け、 (5) 大きすぎる int を int32 に格納してオーバーフロー、 (6) 欠損 NaN を 0 で fillna して分母が膨らむ、 (7) datetime を timezone なしで結合してズレ、 (8) 名目値同士を 12 年差で比較してインフレ反映。
学年 (1〜6 年生) は順序尺度だが、 等間隔とみなして間隔尺度として扱うことが多い (発達段階が概ね等間隔という仮定)。 ただし飛び級・留年がある場合、 「学年 = 年齢」の関係が崩れるため、 文脈次第で名義扱いに退化する。
ISO 3166-1 (国コード: JP, US, GB)、 ISO 3166-2 (都道府県コード: JP-13 東京)、 都道府県全国地方公共団体コード (13000) など複数規格が存在。 SSDSE は独自の R + 5 桁を採用しており、 他データセットとの結合時はコード変換テーブルが必要。
Likert 尺度 (5 件法、 7 件法) は順序尺度だが、 心理学では便宜的に間隔尺度として平均値・SD で集計する慣行がある。 信頼性は Cronbach α、 妥当性は探索的因子分析で確認。 「とてもそう思う/そう思う/どちらでもない/そう思わない/全くそう思わない」の典型 5 件法。
質的データ (インタビュー、 自由記述) はテキスト = 名義尺度の集合。 内容分析 (content analysis) で名義 → 度数化、 KJ 法で名義 → 順序化 → カテゴリ集約が定石。 SSDSE のような数量データと組み合わせる際は「質的でカテゴリを発見、 量的で頻度・関係を測定」の混合法が王道。
p 値 (NHST: Null Hypothesis Significance Testing) のみに依存する分析は「実質的有意性 (effect size)」を見落とすため、 American Statistical Association も補完を推奨。 SSDSE 47 サンプルでも、 大きなサンプルでは小さな差も有意になる罠がある。 効果サイズと信頼区間の併記が必須。
Cohen's d (平均差/SD)、 r (相関)、 η² (ANOVA の分散説明率)、 OR (オッズ比) などが代表。 d = 0.2 が小、 0.5 が中、 0.8 が大 (Cohen の慣例)。 SSDSE 都道府県比較で「平均寿命の地方差 d = 0.4」のような表現が、 実質的意味を伝えやすい。
尺度水準は単変量分析だけでなく多変量分析でも重要。 主成分分析 (PCA) は間隔/比率向け、 対応分析 (correspondence analysis) は名義向け、 多重対応分析 (MCA) は複数名義向け、 多次元尺度構成法 (MDS) は順位/距離行列向け、 と尺度ごとに専用手法がある。
因子分析は間隔尺度を前提とするが、 順序尺度 (Likert) も慣行的に投入される (5 件法以上で連続近似)。 探索的因子分析 (EFA) で潜在因子を発見、 確認的因子分析 (CFA) で仮説検証。 SSDSE 派生データで「生活満足度」「経済豊かさ」「社会保障」などの潜在指標を抽出する場合に活躍。
PCA は分散最大化なので、 スケールの大きい変数が支配する。 SSDSE-B-2026 を未標準化で PCA すると、 第 1 主成分は「人口」に近い結果になる。 標準化後の PCA (相関行列ベース) が定石。 比率尺度・間隔尺度のみ投入し、 名義は事前に one-hot 化するか除外する。
K-means / 階層クラスタリングはユークリッド距離なので、 間隔/比率尺度 + 標準化が前提。 名義変数は Jaccard 距離や Hamming 距離、 混合尺度は Gower 距離が適切。 SSDSE 都道府県を「総人口・出生数・消費支出・合計特殊出生率」で K-means すれば、 標準化後で 4〜5 クラスタに分かれるのが典型。
異常値検出 (outlier detection) は IQR 法、 z-score 法、 Isolation Forest、 LOF (Local Outlier Factor)、 DBSCAN などがある。 IQR / z-score は間隔/比率尺度に限定、 名義変数は頻度の低いカテゴリを「異常」とする頻度ベース手法を使う。 SSDSE では東京・大阪が常に異常値判定される。
分類タスクで目的変数が不均衡 (例: 1% 陽性、 99% 陰性) なら、 重みづけ・SMOTE・undersampling が必要。 SSDSE-B-2026 から「高齢化率 30% 超か」を二値化すると、 既に全 47 道府県が陽性で偏りが極端。 閾値の見直しか別の二値化 (例: 上位 50%) で偏り緩和。
機械学習で「人種」「性別」「年齢」などの保護属性 (名義/順序尺度) を扱う際、 不公平な予測 (disparate impact) が生じうる。 Demographic parity、 Equalized odds、 Predictive parity などの公平性指標で評価する。 SSDSE 都道府県も「保護属性」として扱う議論もあり、 地方間格差の是正に応用される。
(1) 各列の尺度を明示 (名義/順序/間隔/比率)、 (2) dtype を尺度に合わせて選択 (category/Int/Float/datetime)、 (3) 文字化け対策 (encoding 指定)、 (4) 単位確認 (人/千人/百万円)、 (5) 欠損処理戦略を決定、 (6) スケーリング方針 (標準化/min-max/robust/log) を決定、 (7) 統計手法を尺度から逆引き、 (8) 効果サイズ + 信頼区間を必ず併記、 (9) 多重比較補正、 (10) 解釈時にエコロジカル誤謬を警戒。 SSDSE-B-2026 分析の標準手順として常に確認。 この 10 項目を満たしてから初めて分析の本作業に入るのが、 統計・機械学習プロジェクトの定石である。
SSDSE-B-2026 を読み込んだ直後の標準ルーチンは df.info() でメモリと dtype を確認、 df.head() で先頭行を眺め、 df.describe(include='all') で名義列も含めて統計量を確認、 df.isna().sum() で欠損数を確認、 df.nunique() で各列のユニーク数を確認、 の 5 ステップ。 この時点で「都道府県コードが int64 で読まれている」「先頭 0 のコードが消失している」「年度が float64 になっている」などの問題が見える。
大規模 SSDSE 派生データ (数十万行 × 数百列) では、 dtype 最適化で 50-80% のメモリ削減が可能。 int64 → int8 (8 倍)、 object → category (5-20 倍)、 float64 → float32 (2 倍)。 df.memory_usage(deep=True).sum() で実測。 メモリ削減は読み書き速度・groupby 速度・merge 速度・機械学習学習速度の全てに直結する。
「人種」「性別」などの名義尺度を機械学習に投入すると、 差別的予測 (disparate impact) のリスクがある。 EU AI Act、 日本の AI 事業者ガイドラインでも、 高リスク AI システムでの保護属性扱いは慎重さを要求。 SSDSE 都道府県データでも「地方差別」の懸念があり、 必要に応じて保護属性として除外する選択肢を検討する。
pandas 2.0 (2023 年) で PyArrow バックエンドが導入され、 メモリ効率と型推論精度が大幅改善された。 主要な dtype は int64, float64, bool, object, category, datetime64[ns], timedelta64[ns] の 7 種類が中心で、 PyArrow バックエンドでは int64[pyarrow], string[pyarrow], bool[pyarrow] といった Arrow ベースの型も使える。 SSDSE-B-2026 を読む際 pd.read_csv(path, dtype_backend='pyarrow') オプションを使うと、 文字列カラム (都道府県名・年度ラベル等) のメモリが約 1/3 に削減され、 同時に null 値の扱いが pd.NA で統一される。 nullable 型 (Int64, Float64, Boolean 等、 頭文字大文字始まり) は NaN を整数型でも扱える優秀な選択肢で、 「欠損のある整数カラム」を float64 に強制変換せずに保持できる。
都道府県名、 産業コード、 性別、 学歴、 婚姻状況など、 限定された値を取る変数は category 型に変換するとメモリ削減と高速化の両方が得られる。 SSDSE-B-2026 で 47 都道府県を string として保持すると 47 × 各文字列のメモリ消費だが、 category にすると 47 個のラベルテーブル + 整数 index のみで済む。 ordered category (順序付き) なら大小比較も可能で、 例えば 低 < 中 < 高 や 小学校 < 中学校 < 高校 < 大学 といった順序を型システムで保証できる。 pandas の CategoricalDtype(categories=['low','mid','high'], ordered=True) で定義し、 df['col'].astype(cat_dtype) で変換する。 groupby、 sort、 merge も category 同士は整数比較になり高速。
SSDSE-B-2026 自体は年次データだが、 時系列分析の文脈で datetime 型の理解は必須である。 (1) pd.to_datetime(df['年月日'], format='%Y-%m-%d') でパース、 (2) pd.date_range(start='2020-01-01', end='2025-12-31', freq='M') で範囲生成、 (3) df.resample('Q').sum() で四半期集計、 (4) timezone aware で UTC vs JST 管理 (tz_localize('Asia/Tokyo')) など、 datetime 型は時間軸操作の中核となる。 datetime と timedelta の演算でラグ特徴量 (前年同月比) や経過日数 (発生から現在まで) を計算でき、 機械学習特徴量エンジニアリングで頻繁に登場する。
pandas 1.0 で StringDtype() が導入され、 PyArrow 連携で大幅高速化が進んだ。 従来の object dtype と異なり、 NaN の扱いが明確 (pd.NA で統一) で、 string メソッドの結果が型保持される (例: df['col'].str.upper() の結果も string dtype のまま)。 SSDSE-B-2026 で都道府県名カラムを df['都道府県'] = df['都道府県'].astype('string[pyarrow]') で変換すると、 メモリ削減 + str アクセサのバグ回避 + null 演算の一貫性が同時に得られる。 ただし object dtype と string dtype は完全互換ではなく、 一部の旧来のライブラリは object のみ対応する場合もあるため、 ライブラリ互換性に注意が必要。
scikit-learn は基本 numpy.ndarray を入力に取り、 pandas DataFrame でも内部で numpy に変換される。 型注意: (1) int64 と float64 は連続値として扱われ、 そのまま回帰・分類に投入可能、 (2) bool は 0/1 整数として扱われ二値特徴として扱える、 (3) category や string は OneHotEncoder で前処理が必要で、 直接 sklearn に投入すると型エラーになる。 sklearn-pandas や ColumnTransformer で型別の前処理パイプラインを構築するのが標準パターンで、 数値列には StandardScaler、 カテゴリ列には OneHotEncoder、 順序列には OrdinalEncoder を割り当てる。
学年・段階評価・満足度などの順序変数の扱いには 3 つの選択肢がある: (1) OrdinalEncoder で整数化 (等間隔仮定が暗黙に入る)、 (2) OneHotEncoder で one-hot (順序情報を捨てる代わりに線形性仮定を回避)、 (3) OrdinalEncoder + monotonic constraint (LightGBM, XGBoost) で順序保持しつつ柔軟性確保。 SSDSE-B-2026 で「人口階級 (S/M/L)」や「消費支出階級」のような順序変数を扱うなら、 線形モデルでは one-hot、 勾配ブースティングでは monotonic constraint が選択肢として有力。 順序尺度を等間隔扱い (interval) してしまうと、 線形回帰の係数解釈が歪む点に注意。
テキスト one-hot や TF-IDF は数千-数万次元の sparse 行列になる。 scipy.sparse の csr_matrix, csc_matrix, coo_matrix で扱うのが標準で、 メモリ消費は非零要素数のみに比例。 pandas の SparseDtype でも sparse カラムを保持可能で、 0 が大半を占める one-hot 結果を効率的に格納できる。 SSDSE のような小規模データ (数十-数百行) では sparse が必要なケースは限定的だが、 大規模 NLP (BoW / TF-IDF) や推薦システム (user × item 行列) では必須技術。 scikit-learn の多くのモデル (LogisticRegression, SVM, RandomForest 等) は sparse 入力を直接受け付ける。
型変換時によくある罠を 4 つ整理する: (1) 整数カラムに NaN が混入すると pandas は自動的に float64 に変換する (情報損失) — 解決は Int64 nullable 型、 (2) 文字列 "1,234" が数値として扱われない — カンマ削除前処理 df['col'].str.replace(',','').astype(int) が必要、 (3) 日付 "2024/01" が文字列のまま — pd.to_datetime(df['col'], format='%Y/%m') で datetime 変換が必要、 (4) bool が 'True'/'False' 文字列のまま — df['col'].map({'True':True, 'False':False}) で bool 変換が必要。 SSDSE-B-2026 の cp932 エンコーディング環境ではこれらの罠が起きやすく、 読み込み直後の dtype 確認が必須。
SSDSE-B-2026 読み込み後の必須ステップは 5 つある: (1) df.dtypes で全カラム型を確認、 (2) df.memory_usage(deep=True) でメモリ使用量を実測、 (3) df.isna().sum() で欠損数をカウント、 (4) df.describe(include='all') で数値統計とカテゴリ統計の両方、 (5) カテゴリカラムは df['col'].value_counts(dropna=False) で値分布。 これら 5 つを自動化した「データプロファイリング関数」を作っておくと再利用性が高く、 新しいデータセットを受け取った瞬間に品質チェックが完了する。 pandas-profiling (現 ydata-profiling) のような自動レポートツールも有用。
データ型は単なる技術詳細ではなく、 統計分析の前提・前処理・モデル選択を規定する基本概念である。 Stevens の 4 尺度 (名義・順序・間隔・比例) を理解し、 pandas/numpy/sklearn の実装と接続できれば、 分析の再現可能性・効率・品質が同時に向上する。 SSDSE-B-2026 のような実データで「読み込み → 型確認 → 必要な変換 → 分析」のワークフローを確立することが、 データサイエンス初学者にとって最重要のスキルの一つである。 型を意識することで、 「カテゴリ変数を平均してしまう」「順序尺度を等間隔扱いする」「欠損を勝手に 0 で埋める」といった初学者がやりがちな致命的ミスを未然に防げる。
合成データで名義/順序/間隔/比例の 4 尺度に対する適切な要約統計量を計算する。
| 変数 | 尺度 | 値 | 代表値 |
|---|---|---|---|
| 血液型 | 名義 | A,A,B,O,AB | 最頻値=A |
| 満足度 | 順序 | 3,4,5,2,4 | 中央値=4 |
| 気温 [℃] | 間隔 | 20,22,25,18,21 | 平均=21.2 |
| 収入 [万円] | 比例 | 400,520,380,460,340 | 幾何平均=415.4 |
1 2 3 4 5 6 7 8 9 10 11 12 | import numpy as np from scipy import stats bt = ['A','A','B','O','AB'] sat = np.array([3,4,5,2,4]) temp = np.array([20,22,25,18,21]) inc = np.array([400, 520, 380, 460, 340]) # scipy の mode は文字列を受け付けなくなったので、pandas で最頻値を取る import pandas as pd print(f"血液型 最頻値: {pd.Series(bt).mode()[0]}") print(f"満足度 中央値: {np.median(sat)}") print(f"気温 平均: {temp.mean()}") print(f"収入 幾何平均: {stats.gmean(inc):.1f}") |
💬 手計算 (Step 2) と Python 出力が完全一致。
最小コードで動かしてみる例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) df = df[df['年度'] == df['年度'].max()].copy() # 最新年度の 47 行 df['人口'] = df['総人口'] # 別名(実在する列) df['高齢化率'] = df['65歳以上人口'] / df['総人口'] * 100 # 導出 # 「評価」は SSDSE に無い順序尺度なので、高齢化率の三分位から作る df['評価'] = pd.qcut(df['高齢化率'], q=3, labels=['低', '中', '高']) # 尺度ごとに型を明示 df['都道府県'] = df['都道府県'].astype('category') # 名義 df['評価'] = pd.Categorical(df['評価'], ordered=True, # 順序 categories=['低', '中', '高']) df['人口'] = df['人口'].astype(int) # 比例尺度(離散) df['高齢化率'] = df['高齢化率'].astype(float) # 比例尺度(連続) print(df[['都道府県', '評価', '人口', '高齢化率']].head()) |
🎯 このコードでやること:SSDSE-B-2026 を読み込み、 df.info() と df.dtypes で全 110 列の dtype を表示する。 名義 / 比例 の混在ぶりを確認する。
📥 入力データ:data/raw/SSDSE-B-2026.csv(cp932、 2 行目がヘッダー)
1 2 3 4 5 6 7 8 9 10 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) print('shape:', df.shape) print('dtype 集計:') print(df.dtypes.value_counts()) # 先頭 6 列の dtype を個別に確認 print(df.dtypes.head(6)) |
📤 実行すると次の出力が得られる:
💬 結果の読み方:104 列が int64(比例尺度の人数・件数)、 2 列だけが object(名義尺度の都道府県・地域コード)。 地域コードは「R01000」のような文字列なので int 変換不可。 名義列を識別したら category 化することで、 メモリ削減と group by 高速化が両立します。
🎯 このコードでやること:「都道府県」列を object から category に変換し、 メモリ削減量と groupby の 高速化を観察する。
📥 入力データ:上と同じ SSDSE-B-2026(564 行 × 112 列)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) # object → category mem_before = df['都道府県'].memory_usage(deep=True) df['都道府県'] = df['都道府県'].astype('category') mem_after = df['都道府県'].memory_usage(deep=True) print(f'メモリ: {mem_before} B → {mem_after} B') # 都道府県ごとに総人口の平均(2012-2023 の 12 年平均) avg = df.groupby('都道府県', observed=True)['総人口'].mean() print(avg.sort_values(ascending=False).head(5)) |
📤 実行すると次の出力が得られる:
💬 結果の読み方:47 種類しかないカテゴリを category 型にすると、 各セルは「カテゴリ番号 (int8)」+「辞書(47 種類分の文字列)」に分解され、 メモリは 約 31 倍 圧縮されました。 groupby も内部でハッシュではなくカテゴリ番号で集計するため高速。 一方、 順序が必要なら pd.Categorical(..., ordered=True, categories=[...]) で明示的に順序を与える必要があります。
🎯 このコードでやること:SSDSE-B-2026 の「総人口」(比例)「年度」(間隔)「都道府県」(名義)の 3 列で、 尺度別に許される / 禁止される演算を実際に走らせて比較する。
📥 入力データ:2023 年データに絞り込んだ 47 行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) d23 = df[df['年度'] == 2023].copy() # 比例尺度: 四則すべて OK print('総人口の平均:', int(d23['総人口'].mean())) print('幾何平均:', int(np.exp(np.log(d23['総人口']).mean()))) print('東京/鳥取:', round(d23[d23['都道府県']=='東京都']['総人口'].iloc[0] / d23[d23['都道府県']=='鳥取県']['総人口'].iloc[0], 2)) # 間隔尺度: 差は OK / 比率は不可 df_h = df[df['都道府県']=='北海道'] print('年度差(2023-2012):', 2023 - 2012, '年 (= OK)') print('年度比 2023/2012:', round(2023/2012, 4), '(= 意味なし)') # 名義尺度: モードのみ print('都道府県モード:', d23['都道府県'].mode().iloc[0]) |
📤 実行すると次の出力が得られる:
💬 結果の読み方:「総人口は東京が鳥取の 26.23 倍」は意味のある主張ですが、 「2023 年は 2012 年の 1.0055 倍」と言われても何も意味しません(暦年は基準が任意)。 47 都道府県は全て等頻度なので「モード」は辞書順で先頭の県が返るだけです。 演算可否を尺度から逆算する習慣をつけましょう。
| 手順 | コマンド | 確認ポイント |
|---|---|---|
| 1. 形状確認 | df.shape, df.head() | 行数・列数の桁が想定通りか |
| 2. dtype 概観 | df.dtypes, df.info() | object と numeric の比率 |
| 3. 名義 / 比例の判別 | 列名 + df[c].nunique() | ユニーク数が少ない数値列は要注意(コード値の可能性) |
| 4. 欠損確認 | df.isna().sum() | int64 + NaN → Int64 (nullable) に変更 |
| 5. category 化 | .astype('category') | 頻度の低いカテゴリは「その他」に統合 |
| 6. 範囲 / 単位確認 | df.describe() | 最小・最大が単位(円 / 千円 / 千人)と整合するか |
SSDSE のように 政府統計は単位がドキュメントに書いてあるので、 「人口(人)」「家計支出(円)」など 必ず単位確認を。 桁が想定の 1000 倍ずれていれば「千人」表記の可能性が高い。
object として読み込まれる。 pd.to_numeric(..., errors='coerce') でカンマ除去後に変換が必要。 SSDSE は CSV 内に直接数値が入っているので問題ないが、 統計局の他の CSV では頻発。Int64(大文字)を使う。category 化したつもりが object のままで、 速度改善が効かないケース。 df.dtypes で必ず確認。df['level'] > '低' はエラー。 pd.Categorical(..., ordered=True) で順序を明示。pd.to_datetime で datetime64 に変換し忘れると、 ソートが文字列順になる(例:「2023-12-31」 < 「2023-2-1」)。| 前提 | 本概念 | 発展 |
|---|---|---|
| データリテラシー CSV DataFrame |
変数の尺度 とデータ型 |
One-Hot Encoding 標準化 欠損メカニズム カテゴリカル変数 |
尺度の理解は あらゆる前処理・統計手法・機械学習モデルの入口です。 「平均が取れる尺度か」「順序が意味を持つか」を判定できないと、 後段のすべての分析が信頼性を失います。
どの統計手法がどの尺度に適用できるかは、 分析計画を立てる前に確認すべき第 1 問です。 SSDSE-B-2026 を例にとると次のような表になります:
| 手法 | 名義 | 順序 | 間隔 | 比例 | SSDSE 例 |
|---|---|---|---|---|---|
| 最頻値(モード) | ○ | ○ | ○ | ○ | 「最頻の地域コード」(47 等頻度なので無意味) |
| 中央値 | × | ○ | ○ | ○ | 中央値の人口は約 1,549,000 人(鹿児島県相当) |
| 算術平均 | × | △ | ○ | ○ | 平均人口 2,645,809 人 |
| 幾何平均 | × | × | × | ○ | 人口幾何平均 1,831,367 人 |
| 標準偏差・分散 | × | △ | ○ | ○ | 人口 std = 2,797,551(東京が突出) |
| Pearson 相関 | × | × | ○ | ○ | 総人口 vs 出生数 r=0.99 |
| Spearman 順位相関 | × | ○ | ○ | ○ | 県人口順位の年次推移 |
| χ²(カイ二乗)独立性 | ○ | ○ | △ | △ | 「地方ブロック × 高齢化階層」の関連 |
| t 検定 / ANOVA | × | △ | ○ | ○ | 関東 vs 関西の人口平均差 |
| 線形回帰 | × | △ | ○ | ○ | 出生数 ~ 総人口 + 年度 |
| ロジスティック回帰(説明変数) | △(要 dummy) | ○ | ○ | ○ | 人口減少 yes/no を地方ブロックから予測 |
凡例:○ = 直接適用 OK、 △ = 慎重に / 前処理が必要、 × = 不可。 SSDSE-B-2026 の「都道府県」のような名義データを線形回帰に放り込みたいときは pd.get_dummies(df, columns=['都道府県']) で 47 列の 0/1 列に展開する必要があります(自由度に注意)。
「変数の尺度とデータ型」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。 具体的には次の 3 方向と密接につながる:
尺度の理解は適切な統計手法と可視化を選ぶ最初のチェックポイント。
「変数の尺度とデータ型」を扱う際の手法選択は、 状況に応じて以下のフローで判断すると迷いが減る。
このフローに沿って判断することで、 「変数の尺度とデータ型」を中核とした適切な手法選択ができる。