論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
型変換
Type Conversion
データ前処理

💡 30秒で分かる結論

データ型を変換する処理

🎨 直感で掴む

モデルに渡す前にデータをクレンジング・変換する工程。 ここでの誤りが下流に伝播するので慎重に。

本ページでは 型変換 を、 定義・前提条件・使い方・落とし穴の順に整理して解説します。 厳密な定義より、 まず何を、 いつ、 どう使うかを理解することを優先してください。

📐 定義

データ型を変換する処理

英語名 Type Conversion

🎯 いつ・どこで使うか

📋 前提条件・適用範囲

この用語を理解・使用するときは、 次のような前提を意識してください:

⚠️ よくある落とし穴

❌ リーケージ
訓練データの統計量を使って検証/テストを変換。 必ず Pipeline。
❌ 過剰なクレンジング
外れ値削除のしすぎは情報損失。
❌ スケーリングの選択
StandardScaler / RobustScaler / MinMaxScaler を用途別に使い分け。

🐍 Python での扱い

SSDSE-B-2026 のような公的統計データを Python で扱う際の基本パターン:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import pandas as pd
import numpy as np

# データ読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
print(df.shape)
print(df.dtypes)
print(df.describe())

# 「型変換」の文脈で扱う場合の例:
# 分野: データ前処理
# 関連手法は同カテゴリの他用語を参照してください。

具体的なコードは データエンジニアリング を参照してください。

📝 レポートでの報告

分析結果を報告するときに含めるべき情報:

✅ チェックリスト

🔖 キーワード索引

astype int / float datetime category to_numeric to_datetime dtype object型 NaN エラー処理

📍 あなたが今見ているもの

CSV を読み込んだら「数値の列が文字列になっていた」「日付が単なるテキストだった」という経験は誰しもあるはず。 この「型を正しい型に直す」のが型変換。 これを怠ると、 sort が辞書順になったり、 集計で意味のない結果が出たり、 機械学習モデルがエラーを吐いたりします。 つまり、 分析の全工程に影響する、 一見地味で実は最重要な前処理

📐 形式的定義

型 $T_1$ の値 $x$ から型 $T_2$ の値 $y$ への写像 $f: T_1 \to T_2$ を「型変換(キャスト)」と呼ぶ:

$$y = f(x), \quad x \in T_1, \quad y \in T_2$$

情報が保存される(可逆)変換と、 情報が落ちる(不可逆)変換がある。 例: int → float は可逆、 float → int は小数部が落ちる。

🔬 pandas の型をことばで理解する

dtype意味代表例注意
int64整数人口、 個数NaN を含めない
float64浮動小数支出金額、 率NaN OK、 比較は誤差注意
object文字列(または混在)都道府県名混在に注意
datetime64[ns]日時調査日、 取引日タイムゾーンに注意
categoryカテゴリ性別、 階層メモリ節約、 順序付け可
bool真偽値該当/非該当NaN は object 化

🧮 型変換の実例 — メモリ使用量

同じ「47 都道府県」のデータを違う型で保存した場合のメモリ比較:

列内容object型category型節約率
47 都道府県名 (47行)~3.5 KB~0.6 KB83%
47 都道府県名 × 10年 (470行)~35 KB~2 KB94%
int64 → int328 bytes/値4 bytes/値50%
float64 → float328 bytes/値4 bytes/値50%

🐍 Python 実装 — 完全ガイド

パターン 1: astype による直接変換

🎯 目的:SSDSE-B-2026 を読み込んだ直後、 「総人口は int、 年は str、 都道府県は category、 消費・所得は float」と型を明示変換し、 集計時に TypeError が出ない状態に整える。
📥 入力data/raw/SSDSE-B-2026.csv (UTF-8、 2 行ヘッダ)。 初期型は多くが object(文字列)。 これに .astype()df.astype({...}) を組み合わせる。
 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='utf-8', skiprows=1)

# 文字列を整数に
df['総人口'] = df['総人口'].astype(int)

# 整数を文字列に
df['年'] = df['年'].astype(str)

# 複数列を一度に
df = df.astype({'消費支出': float, '可処分所得': float, '都道府県': 'category'})
print(df.dtypes)
📤 出力 総人口 int64 年 object 消費支出 float64 可処分所得 float64 都道府県 category dtype: object
💬 解釈astype() は「失敗したら例外を投げる」厳しい変換。 SSDSE-B-2026 の「総人口」のように文字列でも数字のみなら成功するが、 列に「-」「N/A」が紛れていれば ValueError になる。 そのときはパターン 2 の to_numeric(errors='coerce') に切り替える。

パターン 2: to_numeric — エラーに強い数値変換

🎯 目的:SSDSE 等の公的統計は欠損が「-」「…」で表現される。 pd.to_numeric(errors='coerce') でそれらを NaN に置換、 downcast でメモリも 4 倍節約。
📥 入力:「消費支出」「人口」「率」列。 文字列扱いで「-」「N/A」を含む可能性のある列。
1
2
3
4
5
6
7
8
9
# errors='coerce' で変換できない値を NaN に
df['消費支出'] = pd.to_numeric(df['消費支出'], errors='coerce')

# errors='raise' (デフォルト) でエラーを上げる
# errors='ignore' で元の値を保持

# downcast でメモリ節約
df['人口'] = pd.to_numeric(df['人口'], downcast='integer')  # int8〜int64 の最小
df['率'] = pd.to_numeric(df['率'], downcast='float')
📤 出力 df['消費支出'].isna().sum() = 3 # 「-」が 3 件 NaN に df['人口'].dtype = int32 # int64 → int32 でメモリ半減 df['率'].dtype = float32 # float64 → float32 でメモリ半減
💬 解釈errors='coerce' は「変換できないものは NaN にする」現場で最も安全な選択肢。 SSDSE-B-2026 のように欠損記号が「-」「…」で混在する公的統計の取り扱いに必須。 downcast 後はメモリ消費が半減〜1/4 になり、 大規模パネル分析でも実用速度になる。

パターン 3: to_datetime — 日時の変換

🎯 目的:SSDSE-B-2026 の「年度」列や POS 売上の「日付」列を Python の datetime64[ns] 型に変換し、 日付差・週次集計・タイムゾーン換算を可能にする。
📥 入力:文字列形式の日付列(ISO 形式 or 'YYYY/MM/DD')、 もしくは year/month/day 3 列。 タイムゾーン付きデータには tz_localize + tz_convert を組み合わせる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# ISO 形式は自動認識
df['日付'] = pd.to_datetime(df['日付'])

# format 指定(速度・確実性 UP)
df['日付'] = pd.to_datetime(df['日付'], format='%Y/%m/%d')

# 年月日が別列なら
df['日付'] = pd.to_datetime(df[['year', 'month', 'day']])

# タイムゾーン付き
df['UTC日時'] = pd.to_datetime(df['日時']).dt.tz_localize('Asia/Tokyo').dt.tz_convert('UTC')
📤 出力 df['日付'].dtype = datetime64[ns] df['UTC日時'].dtype = datetime64[ns, UTC] (df['日付'].max() - df['日付'].min()).days = 1825 # 5 年間
💬 解釈format= を指定すると変換速度が 10〜100 倍速くなる(自動推測を回避)。 SSDSE のような国内データは Asia/Tokyo で localize → UTC に揃えると、 海外データと突合するときに DST (夏時間)バグが起きない。

パターン 4: カテゴリ型でメモリ節約

🎯 目的:SSDSE-B-2026 の「都道府県」(47 通り)を category 型に変換し、 文字列保持の数十倍メモリを節約。 さらに「規模 = 小/中/大」のような順序付きカテゴリで自然順ソートを可能にする。
📥 入力:object 型の「都道府県」列、 同じく「規模」列。 順序付きには pd.CategoricalDtype(categories=[...], ordered=True) を渡す。
1
2
3
4
5
6
7
8
9
# 単純なカテゴリ化
df['都道府県'] = df['都道府県'].astype('category')

# 順序付きカテゴリ
size_order = pd.CategoricalDtype(categories=['小', '中', '大'], ordered=True)
df['規模'] = df['規模'].astype(size_order)

# メモリ削減効果を確認
print(df.memory_usage(deep=True))
📤 出力 都道府県 (object): 約 5,640 bytes # 47 県の文字列を各行で保持 都道府県 (category): 約 400 bytes # 約 14 倍メモリ節約 (規模列は順序付き、 sort_values で 小→中→大 順に並ぶ)
💬 解釈:47 県 × 数年度のパネルでも category 化で 10 倍以上節約できる。 順序付きカテゴリは sort_valuesgroupby、 不等式比較で「小 < 中 < 大」を自動認識するので、 学年・震度・優先度などの順序データに最適。

パターン 5: 全列一括の型最適化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def optimize_dtypes(df):
    for col in df.select_dtypes(include=['int']).columns:
        df[col] = pd.to_numeric(df[col], downcast='integer')
    for col in df.select_dtypes(include=['float']).columns:
        df[col] = pd.to_numeric(df[col], downcast='float')
    for col in df.select_dtypes(include=['object']).columns:
        if df[col].nunique() / len(df) < 0.5:
            df[col] = df[col].astype('category')
    return df

df = optimize_dtypes(df)
print(df.info(memory_usage='deep'))

⚠️ 型変換でハマる 8 つの罠

⚠️ 1. NaN を int にできない
df['col'].astype(int) は NaN があれば ValueError。 → 'Int64'(pandas 拡張型)か fillna() で対応。
⚠️ 2. カンマ区切り数値
「1,234,567」のような文字列は int 化できない。 str.replace(',', '').astype(int) で除去してから変換。
⚠️ 3. 日付フォーマットのずれ
和暦・「令和5年4月1日」のような表記は to_datetime 失敗。 専用パーサが必要。
⚠️ 4. 浮動小数の罠
0.1 + 0.2 != 0.3 の罠。 金額・率では Decimal や整数(円単位)の方が安全。
⚠️ 5. category の落とし穴
groupby 後、 元の全カテゴリが「0 件で」残る挙動。 observed=True で抑制。
⚠️ 6. 暗黙の型昇格
int 列に NaN を入れた瞬間に float64 化される。 Int64 なら NaN を保ったまま整数を維持。
⚠️ 7. object 型に混在
「123」「abc」が同列に混じると object 化。 計算は遅く、 集計関数も期待動作しない。
⚠️ 8. astype('bool') の挙動
「0」「空文字」「'False'」など、 文字列「False」も True と評価される。 明示的に判定を書く。

🔎 深掘り — pandas の拡張型(Int64, Float64, string)

pandas 1.0 以降、 NaN を保ったまま型を保てる拡張型が登場。 従来の罠を回避できる。

従来拡張型利点
int64Int64NaN を含める
float64Float64pd.NA 統一
objectstring文字列専用、 高速
boolbooleanNaN を含める bool

使い方: df['col'] = df['col'].astype('Int64') のように大文字始まりで指定。

📊 ツール別 型変換の書き方

操作PythonSQLExcelPower Query
文字 → 数int(s)CAST(x AS INT)VALUE()Int64.Type
数 → 文字str(n)CAST(x AS VARCHAR)TEXT()Text.Type
文字 → 日時pd.to_datetimeCAST(x AS DATE)DATEVALUEDate.Type
小数 → 整数int(x)CAST(x AS INT)INT()Number.RoundDown

✅ 型変換の前に必ず確認

  1. 変換前後のサンプル値を最低 5 個確認したか
  2. 欠損がどう扱われるか確認したか(NaN になる? エラー?)
  3. 変換後の分布が想定通りか確認したか(describe()
  4. 不可逆変換(情報損失)かどうか把握したか
  5. 下流処理に影響しないか(モデル、 集計、 可視化)
  6. 変換ロジックを関数化して再現可能にしたか

📚 関連グループ教材(追加)

📖 さらに学ぶには