Python環境を起動中... 初回のみ数秒かかります
Lesson 18 / 20

モジュール

このレッスンで学ぶこと

  • import / from-import / as を使い分けられる
  • math で数学関数・定数を使える
  • random でシャッフル・サンプリングができる
  • datetime で日付計算・年齢算出ができる

1. import の3つの書き方

モジュールとは、関数や定数などをまとめた「機能の部品箱」です。 Python には標準で多くのモジュールが用意されており(標準ライブラリ)、 import で読み込むだけですぐに使えます。 自分でファイルを作って独自のモジュールにすることもできます。

モジュールを読み込む方法は主に3つあり、それぞれ呼び出し方と使いどころが異なります。

PyTorchやNumPyを使う際も import torchimport numpy as np と書くだけで 膨大な機能が使えます。

sample_1.py
Ctrl+Enter
出力

💡 エイリアスはなぜ使う?
numpy のような長い名前を毎回フルネームで書くのは面倒で、打ち間違いの原因にもなります。 import numpy as np と宣言することで、以降は np.array([1, 2, 3]) と 短く書けるようになります。
また、これらの略名は世界中のコードで「公式の慣例」として統一されているため、 他の人が書いたコードを読む際も np = numpy、pd = pandas と即座に判断できます。

import numpy as np           # np  が業界標準
import pandas as pd          # pd  が業界標準
import matplotlib.pyplot as plt   # plt が業界標準
import torch                 # torch はそのまま(元から短いため)
import torch.nn as nn        # nn  が業界標準

2. math モジュール

math は数学関数・定数を提供する標準ライブラリです。 sqrt()(平方根)、log()(自然対数)、exp()(指数関数)、 ceil()(切り上げ)、floor()(切り捨て)などが使えます。 NumPy が使えない環境や、単純な数値計算には math が手軽です。 なお、math はスカラー値(1つの数値)にしか使えません。 リストや配列にまとめて適用したい場合は、のちに学ぶ NumPy の方が適しています。

sample_2.py
Ctrl+Enter
出力

💡 {z:+d} のフォーマット指定子について:
f-string の : 以降はフォーマット指定子です。d は整数として表示、+ は正の数にも符号を付けることを意味します。

z = 3   → f"{z:+d}"  → "+3"   (+ が付く)
z = 0   → f"{z:+d}"  → "+0"   (0 にも + が付く)
z = -3  → f"{z:+d}"  → "-3"   (負は通常どおり - が付く)
# 符号を揃えて縦に並べると視覚的に読みやすくなる

💡 シグモイド関数について:
シグモイド関数 σ(z) = 1 / (1 + e−z) は、どんな実数値でも 0〜1 の範囲に収める関数です。 出力を「確率」として解釈できるため、ニューラルネットワークの二値分類問題(陽性/陰性、病変あり/なし)の 最終層でよく使われます。 z が大きいほど 1(陽性)に近づき、小さいほど 0(陰性)に近づきます。z = 0 のとき出力はちょうど 0.5 です。

3. random モジュール

random は乱数生成・シャッフル・サンプリングができる標準ライブラリです。 機械学習では train/test データの分割、バッチのサンプリング、データ拡張(ランダムな回転・反転など)でよく使います。

重要なのが random.seed() による「シードの固定」です。 seed 値が同じならプログラムを何度実行しても同じ乱数列が生成されるため、 「再現性」が確保されます。機械学習ではデータ分割が実行ごとに変わるとモデル評価が変動するため、 seed の固定は必須の習慣です。

sample_3.py
Ctrl+Enter
出力

4. datetime モジュール

datetime は日付・時刻の生成・計算・フォーマット変換ができる標準ライブラリです。 患者の年齢計算・入院日数・次回受診日の算出・ログのタイムスタンプ管理でよく使います。

主なクラスは3つです。 date は年月日のみ(時刻なし)、 datetime は年月日+時分秒、 timedelta は「2つの日時の差」や「N日間」という期間を表します。 date - datedatetime - datetime の演算結果は timedelta になります。

sample_4.py
Ctrl+Enter
出力

💡 timedelta の詳細:
timedelta は「日時の差」や「一定期間」を表すオブジェクトです。 日付の加減算に使えます。

from datetime import date, timedelta

delta = timedelta(days=30)       # 30日間
delta = timedelta(weeks=2)       # 2週間(= 14日)
delta = timedelta(days=1, hours=6, minutes=30)  # 複数単位の組み合わせも可

# 日時 ± timedelta で未来・過去の日付を計算
date(2026, 5, 1) + timedelta(days=30)  # → 2026-05-31
date(2026, 5, 1) - timedelta(days=7)   # → 2026-04-24

# timedelta のプロパティ
diff = date(2026, 5, 19) - date(2026, 4, 1)
diff.days           # → 48  (日数の整数部分)
diff.seconds        # → 0   (秒の端数。通常は date - date では 0)
diff.total_seconds()  # → 4147200.0  (全体を秒換算した合計)

.days だけ使えばほぼ事足りますが、時分秒まで含む datetime 同士の差では .total_seconds() で「総秒数」を取り出すと計算に便利です。

5. 練習問題

問題 1

mathで標準偏差を計算する

以下の SpO2 データについて、math.sqrt() を使って標準偏差を計算してください。標準偏差 = √(分散)、分散 = Σ(x - mean)² / n

exercise_1.py
出力
ヒントを見る(答え+解説)
import math

spo2_data = [98, 97, 96, 99, 95, 94, 98, 97, 96, 99]

mean = sum(spo2_data) / len(spo2_data)
variance = sum((x - mean)**2 for x in spo2_data) / len(spo2_data)
std = math.sqrt(variance)

print(f"データ: {spo2_data}")
print(f"平均: {mean:.2f}%")
print(f"標準偏差: {std:.2f}%")
# → 平均: 96.90% / 標準偏差: 1.51%

ジェネレータ式 sum((x - mean)**2 for x in spo2_data) で偏差の二乗和を一行で計算し、math.sqrt() で平方根を取ります。NumPy を使えば np.std() で一発ですが、ここで計算手順を理解しておくのが大切です。

問題 2

randomでトレーニングデータをサンプリング

20件の患者IDリスト(P001〜P020)から、seed=123でシャッフルして先頭80%をtrain、残り20%をtestに分割してください。

exercise_2.py
出力
ヒントを見る(答え+解説)
import random

patient_ids = [f"P{i:03d}" for i in range(1, 21)]

random.seed(123)
shuffled = patient_ids.copy()
random.shuffle(shuffled)

split = int(len(shuffled) * 0.8)
train = shuffled[:split]
test = shuffled[split:]

print(f"全体: {len(patient_ids)}件")
print(f"train: {len(train)}件 → {train}")
print(f"test:  {len(test)}件 → {test}")
# → train: 16件 / test: 4件

random.seed() でランダムの初期値を固定すると再現性が確保できます。copy() で元リストを保持しつつ shuffle() で順番を変え、スライスで分割するパターンは機械学習のデータ分割でよく使います。

問題 3

datetimeで入院日数を計算する

入院日と退院日から入院日数を計算し、退院から30日後のフォローアップ日も表示してください。

exercise_3.py
出力
ヒントを見る(答え+解説)
from datetime import date, timedelta

admission_str = "2026-04-15"
discharge_str = "2026-05-03"

admission = date.fromisoformat(admission_str)
discharge = date.fromisoformat(discharge_str)

stay_days = (discharge - admission).days
followup = discharge + timedelta(days=30)

print(f"入院日: {admission}")
print(f"退院日: {discharge}")
print(f"入院日数: {stay_days}日間")
print(f"フォローアップ日: {followup}")
# → 入院日数: 18日間 / フォローアップ日: 2026-06-02

date - date の差は timedelta オブジェクトになり、.days で日数を取り出せます。+ timedelta(days=30) で指定日数後の日付を計算できます。

まとめ

このレッスンのポイント

  • import モジュール名 / from モジュール import 関数 / import モジュール as 別名
  • math: sqrt/log/exp/ceil/floor/pi/e — 数値計算の基本
  • random: seed/shuffle/sample/choice/random — データ分割・サンプリング
  • datetime: date.today/timedelta/strptime/strftime — 日付計算・フォーマット
  • 次は import numpy as np(L19)、その先は import torch

自由に試してみましょう:

free_practice.py
Ctrl+Enter
出力

完了するとトップページに進捗が表示されます