本ページでは、 データリテラシーを統合的に解説します。 PPDAC サイクル・CRISP-DM・問いの設計・EDA・変数の尺度・批判的読解を一気通貫で扱います。
「どの手法を使うか」よりその前段のリテラシーが、 分析の質を決定します。 数理・データサイエンス・AI モデルカリキュラム(MDASH)でも導入科目として位置づけられています。
論文記事から各用語のリンクをクリックすると、 該当箇所が開きます:
Tidy data の定義は数学的に 「観測 $\times$ 変数」の長方形構造」。 SSDSE-B-2026 の整然形は:
$$ \text{Tidy}(D) : D \in \mathbb{R}^{n \times p}, \quad D_{ij} = (\text{Prefecture}_i, \text{Variable}_j, \text{Value}_{ij}) $$変数の尺度水準は Stevens の階層:
$$ \text{Nominal} \subset \text{Ordinal} \subset \text{Interval} \subset \text{Ratio} $$SSDSE-B-2026 の Prefecture は 名義尺度、 「年齢階級」は 順序尺度、 「気温」は 間隔尺度、 「人口・出生数」は 比例尺度。 上位の尺度ほど許容される統計操作(差・比・平均)が多くなります。
| 尺度 | 許容操作 | SSDSE-B-2026 例 |
|---|---|---|
| 名義 | =, ≠ | Prefecture(北海道, 東京, ...) |
| 順序 | + >, < | 満足度・教育水準 |
| 間隔 | + 加減・平均 | 気温(°C) |
| 比例 | + 乗除・比 | A1101(人口)・出生数 |
名義尺度に平均値を出すような尺度違反は、 データリテラシー違反の典型例です。 Tidy 化のときに「この列の尺度は?」を明示する習慣をつけましょう。
データを読み・使い・伝え・批判的に評価する力。 統計学・プログラミング・ドメイン知識の三角形の上に成り立つ。
統計教育の世界標準フレームワーク(Wild & Pfannkuch 1999)。
P → P → D → A → C → 再び P へと循環する。 1 サイクルで終わらない。
データマイニング・機械学習プロジェクトの業界横断的プロセスモデル。 IBM・Daimler 等が 1996 年に策定。
各ステップ間に矢印が双方向にあり、 反復的な改善が前提。
| PPDAC | CRISP-DM |
|---|---|
| Problem | Business Understanding |
| Plan + Data | Data Understanding + Preparation |
| Analysis | Modeling + Evaluation |
| Conclusion | Deployment |
分析の質は問いの質で決まる。 SMART 基準を意識:
| 悪い問い | 良い問い |
|---|---|
| 「都道府県の特徴は?」 | 「2024年時点で人口密度が高い都道府県ほど一人当たり所得が高いか?」 |
| 「持ち家は良いか?」 | 「持ち家比率と高齢化率の関連は、 地域ブロックで異なるか?」 |
| 「AI で何かできるか?」 | 「過去 5 年の指標から、 翌年の人口減少率を ±0.5 ポイント以内で予測できるか?」 |
John Tukey が 1977 年に提唱。 「データに何を語らせるか」を可視化と要約統計で探る。
1 2 3 4 5 6 7 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1) print(df.info()) print(df.describe(include='all')) print(df.isnull().sum()) print(df.duplicated().sum()) df.hist(figsize=(15, 12)); plt.tight_layout(); plt.show() |
1 2 | from ydata_profiling import ProfileReport ProfileReport(df, title='SSDSE-B EDA').to_file('eda_report.html') |
| 尺度 | 例 | 許される演算 | 代表値 |
|---|---|---|---|
| 名義 (nominal) | 血液型・地域名 | =, ≠ | 最頻値 |
| 順序 (ordinal) | 満足度 5 段階 | +, <, > | 中央値 |
| 間隔 (interval) | 温度(℃)・西暦 | +, -, 平均 | 平均 |
| 比例 (ratio) | 人口・所得・距離 | ×, ÷ も可 | 幾何平均も可 |
category dtypeint64float64datetime64objectHadley Wickham 2014 の定義:
1 2 3 4 5 6 | import pandas as pd # 横持ち → 縦持ち long = pd.melt(df, id_vars=['都道府県'], value_vars=['指標1','指標2'], var_name='指標', value_name='値') # 縦持ち → 横持ち wide = long.pivot(index='都道府県', columns='指標', values='値') |
1 2 3 | import missingno as msno msno.matrix(df) # 欠損パターンの可視化 msno.heatmap(df) # 欠損間の相関 |
「グラフは嘘をつく」基本パターン:
Darrell Huff の古典(1954)。 現代でも有効な批判的読解の視点:
日本の代表的データソース:
| 落とし穴 | 対処 |
|---|---|
| 手法から考え始める | 必ず問いから。 手法はそのあと。 |
| 標本の偏りを無視 | 「誰が、 どう選ばれたか」を必ず確認。 |
| 尺度を間違える | 名義尺度に平均は計算できない。 |
| 欠損を機械的に削除 | 欠損パターンを調査。 MNAR ならバイアス。 |
| 単位を確認しない | 単位の取り違いで桁ずれ事故。 |
| 単一指標で判断 | 代表値・ばらつき・形状を複数併用。 |
| 出典なし | 出典と取得日を必ず明記。 |
具体例:(1) 高齢化率が高い県ほど一人当たり所得は低いか? (2) 持ち家比率の決定要因は何か? (3) 都市規模別の人口動態の特徴は?
1 2 3 4 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1) print(df.dtypes) # 都道府県:名義、 一人当たり県民所得:比例、 etc. |
1 2 3 4 | print('行数 x 列数:', df.shape) print('欠損:'); print(df.isnull().sum()) print('重複:', df.duplicated().sum()) print(df.describe()) |
確認ポイント:軸の起点、 サンプリング方法、 期間、 出典の信頼性、 著者の意図、 暗黙の仮定など。
| 用途 | パッケージ |
|---|---|
| データ操作 | pandas, polars, pyarrow |
| EDA自動化 | ydata-profiling, sweetviz, autoviz |
| 欠損可視化 | missingno |
| 欠損補完 | sklearn.impute.SimpleImputer/KNNImputer/IterativeImputer |
| 可視化 | matplotlib, seaborn, plotly, altair |
| ノートブック | jupyter, marimo, quarto |
| 再現性 | poetry, pip-tools, conda-lock, dvc |
| レポート | quarto, papermill, nbconvert |
ロンドンのコレラ流行で、 Snow はコレラ患者の自宅を地図にプロット。 Broad Street の給水ポンプ周辺に集中していることを発見し、 ポンプを使用停止 → 流行が収束。 データ可視化が公衆衛生を変えた歴史的事例。 「相関=因果」と判断する前に、 地図というシンプルな可視化が決定的だった。
クリミア戦争の英軍兵士死亡原因を「戦闘」「予防可能な感染症」「その他」に色分けした円グラフで政府に提示。 戦闘より感染症で多く死んでいることを直感的に伝え、 衛生改革を実現。
O-リング故障による爆発事故。 事前データに O-リング温度依存性が示されていたが、 「失敗例だけ」を見てパターンを認識できなかった(生存バイアスの逆)。 視覚化の重要性が再確認された事例。
全体では「男性合格率>女性合格率」だったが、 学部別に見るとほぼすべての学部で「女性合格率>男性合格率」。 女性が「合格率が低い学部に多く出願」していたため、 全体集計で誤って見えた。 集約と層別で結果が逆転する典型例。
新しい分析プロジェクトを始めるときのそのまま使えるコードテンプレート。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | """ 分析タイトル:[ここに記入] 作成者:[氏名] / 作成日:[YYYY-MM-DD] """ import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # ===== Step 1: データ読み込み ===== df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1) print(f'行数: {len(df)}, 列数: {df.shape[1]}') # ===== Step 2: 構造の確認 ===== print(df.dtypes) print(df.head()) # ===== Step 3: データ品質 ===== print('欠損:'); print(df.isnull().sum()) print('重複:', df.duplicated().sum()) # ===== Step 4: 記述統計 ===== print(df.describe()) # ===== Step 5: 単変量分布 ===== num = df.select_dtypes(include='number') num.hist(figsize=(15, 12)) plt.tight_layout(); plt.show() # ===== Step 6: 二変量関係 ===== corr = num.corr() sns.heatmap(corr, annot=True, cmap='RdBu', center=0) plt.show() # ===== Step 7: 注目関係の散布図 ===== sns.scatterplot(data=df, x='一人当たり県民所得', y='持ち家比率') plt.show() # ===== Step 8: 結論メモ ===== """ [手書きで結論を残す] - 見つけたパターン: - 限界: - 次の問い: """ |
A. 嘘です。 むしろ大量データほど系統的バイアスが目立ちにくくなり、 危険。 標本の集め方が重要。
A. 探索的分析(EDA)でデータの構造を見ることと、 確証的分析(CDA)で事前仮説を検証することは別物。 両方が必要。 同じデータで仮説生成と検証をすると過剰適合になる。
A. 統計は推測・解釈、 機械学習は予測に重きを置く傾向。 現代は融合が進行中。
A. 計測しやすい指標だけで意思決定すると、 計測しにくい本質的価値を見落とす(Goodhart の法則)。
本ページは MDASH(数理・データサイエンス・AI モデルカリキュラム)のうち、 主にリテラシーレベルと応用基礎レベルの以下項目に対応:
本実習で SSDSE-B-2026 を用いるのは、 MDASH のリテラシー・応用基礎で要求される「公的統計を読み解く力」を、 47 都道府県という馴染みのある対象で実体験できるため。
データリテラシーの中核概念を一覧で。
「データを正しく見る」基本動作を SSDSE-B-2026 の都道府県データで実行します。
1 2 3 4 5 6 7 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) print(df.describe().T) # 全数値列の count / mean / std / min / 25% / 50% / 75% / max print('---') print(df.dtypes.value_counts()) # 各データ型の列数 print('欠損数:', df.isna().sum().sum()) |
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) col = df.select_dtypes('number').columns[0] q1, q3 = df[col].quantile([0.25, 0.75]) iqr = q3 - q1 lo, hi = q1 - 1.5*iqr, q3 + 1.5*iqr outliers = df[(df[col] < lo) | (df[col] > hi)] print(f'{col} の外れ値 (n={len(outliers)}):') print(outliers[['都道府県', col]].to_string(index=False)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) block_map = { '北海道': '北海道', '青森県': '東北', '岩手県': '東北', '宮城県': '東北', '秋田県': '東北', '山形県': '東北', '福島県': '東北', '茨城県': '関東', '栃木県': '関東', '群馬県': '関東', '埼玉県': '関東', '千葉県': '関東', '東京都': '関東', '神奈川県': '関東', } df['ブロック'] = df['都道府県'].map(block_map).fillna('その他') num_col = df.select_dtypes('number').columns[0] print(df.groupby('ブロック')[num_col].agg(['mean', 'std', 'count'])) |
1 2 3 4 5 6 7 8 | import pandas as pd from scipy import stats df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) x = df.select_dtypes('number').iloc[:, 0].dropna() print('歪度:', stats.skew(x)) print('尖度:', stats.kurtosis(x)) print('Shapiro-Wilk 正規性検定:', stats.shapiro(x)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | from sklearn.preprocessing import StandardScaler, RobustScaler from sklearn.impute import SimpleImputer, KNNImputer import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) num_cols = df.select_dtypes('number').columns # 1) 平均0・分散1 に標準化 scaler = StandardScaler() X_std = scaler.fit_transform(df[num_cols]) # 2) 外れ値に頑健な標準化(中央値・IQR 基準) robust = RobustScaler() X_robust = robust.fit_transform(df[num_cols]) # 3) 欠損値の補完(KNN) imp = KNNImputer(n_neighbors=5) X_imp = imp.fit_transform(df[num_cols]) print('補完後の欠損数:', pd.DataFrame(X_imp).isna().sum().sum()) |
1 2 3 4 5 6 7 8 9 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) # 一括要約 summary = df.describe(percentiles=[.1, .25, .5, .75, .9]).T print(summary) # 列ごとの欠損率 print(df.isna().mean().sort_values(ascending=False).head()) |
1 2 3 4 5 6 7 | import pingouin as pg import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) x = df.select_dtypes('number').iloc[:, 0].dropna() # 多変量正規性 (Henze-Zirkler) print(pg.normality(x)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 | import matplotlib.pyplot as plt import seaborn as sns import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) num_cols = df.select_dtypes('number').columns[:5] fig, axes = plt.subplots(2, 3, figsize=(15, 8)) for ax, col in zip(axes.flat, num_cols): sns.histplot(df[col].dropna(), kde=True, ax=ax) ax.set_title(col, fontsize=10) plt.tight_layout() plt.savefig('eda_distributions.png', dpi=100) |
A1101 → 総人口(千人)。 分析の分母になる基本量です。A1301 → 65 歳以上人口。 高齢化率を産む分子。A1201 → 15 〜 64 歳人口(生産年齢人口)。 経済活動の主体。μ → 全国平均。 比較基準として用います。α → 有意水準。 第一種の誤り許容率(データリテラシー に関する判断で重要)。p → p 値。 H₀ の下でデータがどれだけ稀かを示す。基本量の関係を、 記号 → 意味で整理します。 任意の比率は
$$\text{比率} = \frac{\text{分子}}{\text{分母}} \times 100\quad\text{単位: }\%$$
記号 → 意味:
平均と分散は
$$\bar{x} = \frac{1}{n}\sum_{i=1}^{n} x_i,\quad s^2 = \frac{1}{n-1}\sum_{i=1}^{n}(x_i - \bar{x})^2$$
t 統計量・効果量は
$$t = \frac{\bar{x}_1 - \bar{x}_2}{\sqrt{s_1^2/n_1 + s_2^2/n_2}},\quad d = \frac{\bar{x}_1 - \bar{x}_2}{s_{\text{pooled}}}$$
SSDSE-B-2026 の都道府県データから データリテラシー の文脈で代表値を読み取ります。 各列の記号 → 意味を確認し、 平均・中央値・四分位を併記する習慣を身につけましょう。
| 都道府県 | 総人口(千) | 65歳以上人口(千) | 高齢化率(%) | 記号 → 意味 |
|---|---|---|---|---|
| 秋田県 | 945 | 370 | 39.1 | A1101 → 総人口 / A1301 → 高齢者 / 比率 → 高齢化率 |
| 東京都 | 14,047 | 3,193 | 22.7 | 巨大分母 → 平均を引き上げる外れ値の典型 |
| 沖縄県 | 1,467 | 323 | 22.0 | 若い人口構造 → 全国最低の高齢化率 |
| 大阪府 | 8,838 | 2,420 | 27.4 | 大都市圏の中位 → 比較基準として有用 |
| 島根県 | 658 | 231 | 35.1 | 人口減少地域 → 分母縮小型の高齢化 |
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
# 平均年収 = 給与総額 / 雇用者数 という比率の分母を点検
print(df[['Prefecture','A1101','A1301']].describe())
print('分母(総人口)が小さい県でも%は割れる例:')
print(df.nsmallest(5,'A1101')[['Prefecture','A1101']])data/raw/SSDSE-B-2026.csv(47 都道府県 × 主要統計列)。 出力例は数値・p 値・統計量で、 解釈には「実値で計算してみる → 仮説検定 → 効果量 → 結論」の流れを推奨します。median = df['A1101'].median()
mean = df['A1101'].mean()
print(f'median={median:,.0f} / mean={mean:,.0f} / 乖離={mean-median:,.0f}')
# 東京・神奈川など巨大都市が平均を引き上げる例data/raw/SSDSE-B-2026.csv(47 都道府県 × 主要統計列)。 出力例は数値・p 値・統計量で、 解釈には「実値で計算してみる → 仮説検定 → 効果量 → 結論」の流れを推奨します。import matplotlib.pyplot as plt
df['per_capita'] = df['A1101'] / 1000 # 単位を千人に揃える
df.sort_values('per_capita').plot(kind='barh', x='Prefecture', y='per_capita', figsize=(7,9))
plt.tight_layout(); plt.savefig('per_capita.png', dpi=150)data/raw/SSDSE-B-2026.csv(47 都道府県 × 主要統計列)。 出力例は数値・p 値・統計量で、 解釈には「実値で計算してみる → 仮説検定 → 効果量 → 結論」の流れを推奨します。# 報道で「高齢化率 30% 超」という主張があったとき、SSDSE 値で検証
df['aging'] = df['A1301']/df['A1101']*100
print('SSDSE-B-2026 ベースで 30% 超の県数:', (df['aging']>30).sum())data/raw/SSDSE-B-2026.csv(47 都道府県 × 主要統計列)。 出力例は数値・p 値・統計量で、 解釈には「実値で計算してみる → 仮説検定 → 効果量 → 結論」の流れを推奨します。データリテラシー を中心に、 前提概念・並列分野・発展手法へリンクします。
グループ教材から データリテラシー の文脈に直結する論文・ハンズオンを辿れます。
データリテラシー は古典統計と社会データの交差点で発達してきました。 19 世紀末から 20 世紀初頭にかけて Pearson, Fisher, Neyman などが基礎を整え、 戦後の公的統計整備により実務応用が広がりました。
2010 年代以降は、 「再現性危機」「ビッグデータ」「AI 倫理」の三つの波が データリテラシー に新しい意味を与えました。 単に p<0.05 を出すのではなく、 効果量・信頼区間・事前登録・データシートが必須となっています。
日本では総務省統計局・国立社会保障人口問題研究所・経済産業省 RESAS などが公的統計を整備し、 教育用に SSDSE が無償公開されました。 本ページもこの枠組みで データリテラシー を扱います。
https://www.e-stat.go.jp/https://www.nstac.go.jp/use/literacy/ssdse/https://docs.scipy.org/doc/scipy/reference/stats.htmlhttps://www.statsmodels.org/同じカテゴリの手法、 上位概念、 派生分野へのリンクを補強します。