Skip to content

1. 機械学習概要・Python復習

1.1 はじめに

本講義では Python プログラミングの基礎から解説し、最終的にはシンプルな機械学習モデルを構築して、実際のデータに適用できる技術を習得することを目指します。さらに、画像処理 や 自然言語処理といった身近な題材を用いて、機械学習の活用イメージを体験します。

1.1.1 機械学習とは

機械学習(Machine Learning) とは、コンピュータがデータから自動的にパターンやルールを学習し、予測や判断を行う技術です。

従来のプログラミングでは、人間が明示的にルールを記述する必要がありました。一方、機械学習では大量のデータから自動的にルールを発見できます。

機械学習の身近な例

  • スパムメールフィルタ — 過去のメールデータから、スパムかどうかを自動判定
  • レコメンド機能 — ユーザの購買履歴から、おすすめ商品を提案
  • 画像認識 — 写真に写っているものが何かを自動で識別
  • 音声アシスタント — 音声を認識し、自然言語を理解して応答

機械学習は大きく以下の 3 つに分類されます:

  1. 教師あり学習(Supervised Learning)
    正解ラベル付きのデータから学習し、新しいデータに対して予測を行う手法
    例:画像分類、株価予測、スパム判定

  2. 教師なし学習(Unsupervised Learning)
    正解ラベルのないデータからパターンや構造を発見する手法
    例:顧客のグループ分け、異常検知

  3. 強化学習(Reinforcement Learning)
    試行錯誤を通じて最適な行動を学習する手法
    例:ゲーム AI、ロボット制御

本講義では、主に 教師あり学習 を中心に、実際にデータから予測モデルを構築する方法を学んでいきます。

1.1.2 使用技術

本講義で使用する技術スタックは以下のとおりです。すべて無料で利用可能です。

プログラミング言語

  • Python — データサイエンス・機械学習分野で広く利用されているプログラミング言語

開発環境

  • CHIKUWA Editor — 学習用AIを搭載した Python 実行環境(おすすめ)
  • Google Colab — クラウドベースの Python 実行環境(インストール不要)
  • ローカル環境 — VS Code や Anaconda 等を用いた Python 環境の構築も可
CHIKUWA Editor の使い方

本講義では CHIKUWA Editor を推奨開発環境として使用します。詳しい使い方は CHIKUWA Editor の使い方 を参照してください。

Google Colab の使い方

Google Colaboratory(通称 Google Colab)は、ブラウザ上で Python コードを記述・実行できる無料のクラウドサービスです。環境構築が不要で、Google アカウントがあればすぐに Python プログラミングを始められます。

Google Colab の始め方

  1. Google アカウントにログインした状態で Google Colab にアクセス
  2. 「ファイル」→「ノートブックを新規作成」をクリック
  3. セル(コードを入力する枠)に Python コードを入力
  4. [Shift] + [Enter] または再生ボタンをクリックしてコードを実行

基本的な使い方

Google Colab では、セル という単位でコードを記述・実行します。セルには「コードセル」と「テキストセル」の 2 種類があります。

  • コードセル — Python コードを記述・実行するセル
  • テキストセル — Markdown 形式で説明文を記述するセル
# コードセルの例
print("Hello, Google Colab!")

実行結果は以下の画像のように、セルのすぐ下に表示されます。

Google Colab

Google Colab のショートカットキー

  • [Shift] + [Enter]: セルを実行して次のセルに移動
  • [Ctrl] + [Enter]: セルを実行して同じセルに留まる
  • [Ctrl] + [F9](または「すべてのセルを実行」ボタン): すべてのセルを実行
  • [Ctrl] + [M] → [B]: 下に新しいセルを追加
  • [Ctrl] + [M] → [A]: 上に新しいセルを追加

ファイルの保存

Google Colab で作成したノートブックは、自動的に Google Drive の「Colab Notebooks」フォルダに保存されます。ファイル名を変更するには、画面上部のファイル名をクリックします。


以降は Python の基本文法を復習します。C 言語を学習済みの皆さんであれば、C に照らして Python のコードを眺めることで、効率よく Python の文法を学ぶことができるはずです。

1.2 変数と基本データ型

Python を含む多くのプログラミング言語において、データは 変数 に格納して扱います。変数とは、さまざまな情報を保存するための入れ物のようなもので、基本的なデータ型に「整数」「浮動小数点数」「文字列」「論理値」があります。

x = 10          # 整数
pi = 3.1415     # 浮動小数点数
name = "Kano"   # 文字列
is_valid = True # 論理値 (True/False)
int x = 10;            // 整数
float pi = 3.1415;     // 浮動小数点数
char name[] = "Kano";  // 文字列
int is_valid = 1;      // 論理値 (1/0)

C 言語との主な違い

  • 型宣言が不要 — Python では変数の型を宣言する必要がなく、代入する値から自動的に型が決定されます(動的型付け)
  • セミコロン不要 — Python では文末のセミコロン ; が不要です
  • 論理値の表記 — C 言語では 1/0 で真偽を表しますが、Python では True/False というキーワードを使います(先頭大文字に注意)

1.2.2 基本的な算術演算子

数値型のデータは、算術演算子を用いて演算を行うことができます。

式 演算子 説明
x + y 加算演算子 x に y を加えた値
x - y 減算演算子 x から y を引いた値
x * y 乗算演算子 x に y を乗じた値
x / y 除算演算子 x を y で割った値
x % y 剰余演算子 x を y で割った余り
x ** y べき乗演算子 x を y 乗した値

C 言語の算術演算との違い

C 言語にはべき乗演算子がありません。べき乗を計算するには pow() 関数を使う必要があります。また、Python の除算 / は常に浮動小数点数を返しますが、C言語では整数同士の割り算は整数除算になります。Python で整数除算を行いたい場合は // 演算子を使用します。

インタラクティブモード(対話モード)

Google Colab では、変数や数式を直接打ち込むだけで結果が表示されます。print() 関数を使わなくても、セルの最後の行に書かれた値が自動的に出力されます。

# print() を使わなくても結果が表示される
2 + 3  # 5 と表示される
# 変数の値も直接表示できる
x = 10
x  # 10 と表示される

複数の値を表示したい場合は、print() 関数を使う必要があります。

演習 1-1: 変数と演算

演習 1-1

  • 円周率を pi = 3.14159 として変数に代入し、半径 r = 5 の円の面積を計算してください
  • 2つの整数 a = 17 と b = 5 について、除算 /、整数除算 //、剰余 % の結果をそれぞれ出力してください
解答例
# 円の面積を計算
pi = 3.14159
r = 5
area = pi * r ** 2
print(f"半径{r}の円の面積: {area}")
# 出力: 半径5の円の面積: 78.53975

# 除算、整数除算、剰余の計算
a = 17
b = 5

print(f"除算 {a} / {b} = {a / b}")
# 出力: 除算 17 / 5 = 3.4

print(f"整数除算 {a} // {b} = {a // b}")
# 出力: 整数除算 17 // 5 = 3

print(f"剰余 {a} % {b} = {a % b}")
# 出力: 剰余 17 % 5 = 2

1.3 リストと辞書

複数のデータを扱いたいときには、「リスト」 (list) や「辞書」 (dict) といったデータ型を使用します。

1.3.1 リスト

リストは、順番のあるデータの集まり です。インデックス(何番目の要素かを表す数字)で参照できることと、変更(追加・削除・更新)ができる性質を持ちます。

# リストの作成
fruits = ["apple", "banana", "lemon"]
print(fruits[0])  # 出力: "apple"

# 要素の追加
fruits.append("orange")

# 要素数の取得
print(len(fruits))  # 4
// 配列の作成(サイズ固定)
char *fruits[3] = {"apple", "banana", "lemon"};
printf("%s\n", fruits[0]);  // 出力: "apple"

// 要素数
int length = 3;  // 手動で管理

C 言語の配列との違い

  • C 言語の配列はサイズが固定ですが、Python のリストは動的にサイズを変更できます
  • Python では append() 関数で簡単に要素を追加できます
  • Python では len() 関数でリストの長さを取得できます

1.3.2 辞書

辞書は、キーと値がペアとなったデータ構造(順序あり) です。キーを用いることで、値を高速に参照することができます。

# 辞書の作成
person = {"name": "Taro", "age": 30}
print(person["name"]) # "Taro"
print(person["age"])  # 30

# 新しいキーと値の追加
person["city"] = "Tokyo"
// C言語には標準で辞書型がありません
// 構造体を使って似たようなデータを扱います
struct Person {
    char name[50];
    int age;
};

struct Person person;
strcpy(person.name, "Taro");
person.age = 30;
printf("%s\n", person.name);  // "Taro"
printf("%d\n", person.age);   // 30

C 言語との違い

C言語には辞書型に相当するデータ構造が標準では用意されていません。構造体を使うか、ハッシュテーブルを自分で実装する必要があります。Pythonでは辞書が標準で用意されており、非常に使いやすくなっています。

ほかにも、要素の変更ができない「タプル」 (tuple)や、重複のないデータを扱う「集合」(set) がありますが、はじめのうちは「リスト」と「辞書」だけ扱うことができれば十分です。

演習 1-2: リストと辞書

演習 1-2

  • リスト fruits = ["apple", "banana", "orange"] を作成し、"grape"を追加、2番目の要素を出力、要素数を出力してください
  • 自分の情報を辞書で作成してください(名前、年齢、出身地など3つ以上)。そして名前を出力してください
解答例
# リストの操作
fruits = ["apple", "banana", "orange"]
print(f"初期リスト: {fruits}")

# "grape"を追加
fruits.append("grape")
print(f"追加後: {fruits}")

# 2番目の要素を出力(インデックスは0から始まるので1)
print(f"2番目の要素: {fruits[1]}")
# 出力: 2番目の要素: banana

# 要素数を出力
print(f"要素数: {len(fruits)}")
# 出力: 要素数: 4

# 辞書の作成
my_info = {
    "name": "茨城太郎",
    "age": 20,
    "city": "日立",
    "major": "機械システム"
}

# 名前を出力
print(f"名前: {my_info['name']}")
# 出力: 名前: 茨城太郎

# 辞書全体も表示してみる
print(f"全情報: {my_info}")

1.4 if 文(条件分岐)

if 文は、条件に応じて処理を分岐させることができる構文です。複数の分岐を作りたい場合は、elif や else を使用します。

score = 85
if score >= 90:
    print("Excellent")
elif score >= 80:
    print("Good")
else:
    print("Bad")
int score = 85;
if (score >= 90) {
    printf("Excellent\n");
} else if (score >= 80) {
    printf("Good\n");
} else {
    printf("Bad\n");
}

C 言語との違い

  • インデント(字下げ)が必須 — Pythonでは {} の代わりにインデントでブロックを表します。インデントを揃えないと構文エラーになります
  • 条件式に括弧が不要 — Pythonでは if の条件式を () で囲む必要がありません
  • elif キーワード — C言語の else if は、Pythonでは elif と書きます
  • コロン : が必要 — if、elif、else の後には必ずコロン : を付けます

1.4.1 比較演算子

式 説明
x < y x が y より小さいと True、そうでないと False
x > y x が y より大きいと True、そうでないと False
x <= y x が y 以下であれば True、そうでないと False
x >= y x が y 以上であれば True、そうでないと False
x == y x が y と等しいと True、そうでないと False
x != y x が y と等しくないと True、そうでないと False

1.4.2 論理演算子

式 説明
X and Y X と Y がいずれも True であれば True
X or Y X と Y のいずれかが True であれば True
not X X が True であれば False、False であれば True

C 言語との違い

C言語では論理演算子として &&(AND)、||(OR)、!(NOT)を使いますが、Pythonでは and、or、not という英単語を使います。

演習 1-3: 条件分岐

演習 1-3

変数 temperature に気温を、humidity に湿度を代入し、気温が20度以上30度未満、かつ湿度が70%未満のときに "快適" と出力してください。それ以外のときは、適切な文字列を出力してください

解答例
# 気温と湿度の設定(いろいろな値で試してみてください)
temperature = 25
humidity = 60

# 条件分岐
if temperature >= 20 and temperature < 30 and humidity < 70:
    print("快適")
elif temperature < 20:
    print("寒いです")
elif temperature >= 30:
    print("暑いです")
else:
    print("湿度が高いです")

# より詳細な判定の例
temperature = 28
humidity = 75

if temperature >= 20 and temperature < 30 and humidity < 70:
    print("快適")
else:
    # 理由を詳しく出力
    reasons = []
    if temperature < 20:
        reasons.append("気温が低い")
    elif temperature >= 30:
        reasons.append("気温が高い")
    if humidity >= 70:
        reasons.append("湿度が高い")

    print(f"快適ではありません({', '.join(reasons)})")
# 出力: 快適ではありません(湿度が高い)

1.5 繰り返し処理

同じ処理を複数回行うときには、for 文や while 文を使います。

1.5.1 for 文

for 文は、リストの中身を 1 つずつ処理する際に、if 文と組み合わせてよく使用されます。

# リストの中身を 1 つずつ処理する例
for n in [1, 2, 3, 4, 5]:
    print(n)

# 数値の範囲を range で指定する例
for i in range(30):
    if i % 3 == 0:
        print(f"{i}!")
    else:
        print(i)
// 配列の中身を 1 つずつ処理する例
int numbers[] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
    printf("%d\n", numbers[i]);
}

// 数値の範囲でループする例
for (int i = 0; i < 30; i++) {
    if (i % 3 == 0) {
        printf("%d!\n", i);
    } else {
        printf("%d\n", i);
    }
}

C 言語との違い

  • for文の書き方が異なる — Pythonでは for 変数 in リスト: という形式で、直接要素を取り出せます。C言語では for (初期化; 条件; 更新) という形式でインデックスを使います
  • range() 関数 — Pythonの range(30) は 0 から 29 までの数値を生成します。C言語では for (int i = 0; i < 30; i++) と書く必要があります
  • f-string — Pythonの f"{変数}" は文字列内に変数を埋め込む便利な記法です(C言語の printf のフォーマット指定子に相当)

1.5.2 while 文

while 文は、特定の条件を満たす間、同じ処理を繰り返したいときに使用されます。 途中でループを抜け出したいときには break 文、ループの判定に戻りたいときは continue 文を使います。

# n (>2) が素数かどうかを判定するプログラム
n = 23
i = 2
while i < n:
    if n % i == 0:
        print(f"{n} は素数ではない")
        break
    i = i + 1
if i == n:
    print(f"{n} は素数")
// n (>2) が素数かどうかを判定するプログラム
int n = 23;
int i = 2;
while (i < n) {
    if (n % i == 0) {
        printf("%d は素数ではない\n", n);
        break;
    }
    i = i + 1;
}
if (i == n) {
    printf("%d は素数\n", n);
}

C 言語との違い

  • 条件式の括弧 — C言語では while (条件) と括弧が必要ですが、Pythonでは while 条件: と括弧なしで書けます
  • break と continue — これらはC言語と同じように使えます

Warning

条件を間違えて無限ループに陥るとプログラムが固まってしまうので注意してください。

演習 1-4: 繰り返し処理

演習 1-4

  • for 文を使って、1から10までの整数の合計を計算してください
  • リスト numbers = [12, 7, 23, 8, 15, 4, 19] の中から、10以上の数だけを出力してください
  • while 文を使って、1から始めて2倍ずつ増やし、1000を超えたら停止するプログラムを作成してください
解答例
# 1. 1から10までの合計を計算
total = 0
for i in range(1, 11):  # 1から10まで(11は含まない)
    total += i
print(f"1から10までの合計: {total}")
# 出力: 1から10までの合計: 55

# 2. 10以上の数だけを出力
numbers = [12, 7, 23, 8, 15, 4, 19]
print("10以上の数:")
for num in numbers:
    if num >= 10:
        print(num)
# 出力: 12, 23, 15, 19

# リスト内包表記を使う方法
over_10 = [num for num in numbers if num >= 10]
print(f"10以上の数(リスト): {over_10}")

# 3. 1から始めて2倍ずつ増やし、1000を超えたら停止
value = 1
print("2倍ずつ増やす:")
while value <= 1000:
    print(value)
    value *= 2
print(f"最後の値(1000超): {value}")
# 出力: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512
# 最後の値(1000超): 1024

1.6 関数

何度も使う可能性のある一連の処理は、関数 にまとめることで、プログラムをスッキリ整理することができます。関数は def 関数名(引数): といった形で定義し、return で結果を返します。慣れないうちは、無理に関数を使わなくても全く問題ありません。慣れてきたら、より洗練されたプログラムにするために、関数を使うことを検討してください。

# 足し算を行う関数
def add(a, b):
    return a + b
print(add(3, 5)) # 8

# 3 の倍数かどうかを判定する関数
def is_3x(n):
    return n % 3 == 0
print(is_3x(42)) # True

# リストの平均値を計算する関数
def calc_average(numbers):
    return sum(numbers) / len(numbers)
print(calc_average([10, 20, 30, 40])) # 25.0
// 足し算を行う関数
int add(int a, int b) {
    return a + b;
}
printf("%d\n", add(3, 5)); // 8

// 3 の倍数かどうかを判定する関数
int is_3x(int n) {
    return n % 3 == 0;
}
printf("%d\n", is_3x(42)); // 1 (True)

// 配列の平均値を計算する関数
float calc_average(int numbers[], int length) {
    int sum = 0;
    for (int i = 0; i < length; i++) {
        sum += numbers[i];
    }
    return (float)sum / length;
}
int nums[] = {10, 20, 30, 40};
printf("%.1f\n", calc_average(nums, 4)); // 25.0

C 言語との違い

  • 戻り値と引数の型宣言が不要 — Pythonでは関数定義時に型を宣言する必要がありません
  • def キーワード — Pythonでは def で関数を定義します(C言語は戻り値の型から始まる)
  • コロン : とインデント — Python では関数定義の後にコロンを付け、関数本体をインデントで表します
  • 配列の長さ — Pythonのリストは長さの情報を持っているため、引数として長さを渡す必要がありません

より包括的な概念として クラス がありますが、これもはじめのうちは意識しなくて問題ありません。

演習 1-5: 関数

演習 1-5

  • 2つの数の最大値を返す関数 max_value(a, b) を作成してください
  • リストを引数として受け取り、リスト内の偶数の個数を返す関数 count_even(numbers) を作成してください
  • 整数 n を引数として受け取り、n の階乗を計算する関数 factorial(n) を作成してください
解答例
# 1. 最大値を返す関数
def max_value(a, b):
    if a > b:
        return a
    else:
        return b

# テスト
print(max_value(10, 25))  # 出力: 25
print(max_value(100, 50))  # 出力: 100

# 別解: 三項演算子を使う方法
def max_value2(a, b):
    return a if a > b else b

# 2. 偶数の個数を数える関数
def count_even(numbers):
    count = 0
    for num in numbers:
        if num % 2 == 0:
            count += 1
    return count

# テスト
test_numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(f"偶数の個数: {count_even(test_numbers)}")
# 出力: 偶数の個数: 5

# 別解: リスト内包表記とlen関数を使う方法
def count_even2(numbers):
    return len([num for num in numbers if num % 2 == 0])

# 3. 階乗を計算する関数
def factorial(n):
    result = 1
    for i in range(1, n + 1):
        result *= i
    return result

# テスト
print(f"5の階乗: {factorial(5)}")  # 出力: 5の階乗: 120
print(f"3の階乗: {factorial(3)}")  # 出力: 3の階乗: 6
print(f"10の階乗: {factorial(10)}")  # 出力: 10の階乗: 3628800

# 別解: 再帰を使う方法
def factorial_recursive(n):
    if n <= 1:
        return 1
    return n * factorial_recursive(n - 1)

print(f"5の階乗(再帰): {factorial_recursive(5)}")

1.7 ライブラリの使い方

Python では多くの便利な機能が「ライブラリ」として提供されています。指す対象の広さに応じて「パッケージ」「モジュール」とも呼ばれますが、便利なツール群ということで言葉の違いはあまり気にしなくても問題ありません。いずれも import 文で使います。

import numpy as np # 数値計算ライブラリ
import pandas as pd # データ処理ライブラリ
import matplotlib.pyplot as plt # 可視化モジュール

# ライブラリの使用例
arr = np.array([1, 2, 3, 4, 5])
print(arr.mean())  # 平均値を計算
#include <stdio.h>  // 標準入出力ライブラリ
#include <math.h>   // 数学関数ライブラリ
#include <string.h> // 文字列処理ライブラリ

// ライブラリの使用例
double result = sqrt(16.0);  // 平方根を計算
printf("%.1f\n", result);

C 言語との違い

  • import vs #include — Pythonでは import、C言語では #include でライブラリを読み込みます
  • エイリアス — Pythonでは import ... as ... で長い名前を短縮できます。C言語にはこの機能はありません
  • 豊富なライブラリ — Pythonは標準で豊富なライブラリが用意されており、データ分析や機械学習に特化したライブラリも簡単に利用できます

この例のように、import ... as ... とすることで、長いライブラリ名やモジュール名を省略することができます。as を使わずに使用することもできますが、matplotlib.pyplot なんて毎回書いていられないので、plt にして簡潔にしているというわけです。

なお、ここで例にあげた 3 つのライブラリ(numpy, pandas, matplotlib) はデータ分析における三種の神器とも呼ばれ、この 3 つだけで基本的なデータ分析の 8 割をカバーできるといっても過言ではありません。

それぞれの詳しい使い方については、第 2 回以降で説明します。

1.8 総合演習

総合演習 1-1: 倍数チェッカー

総合演習 1-1

1~50 までの数を順番に表示し、3 の倍数のときは数字の後ろに「!」、5 の倍数のときは数字の後ろに「?」、両方の倍数なら数字の後ろに「!?」をつけるプログラムを作成してください。

解答例
# FizzBuzzプログラム
for i in range(1, 51):  # 1から50まで
    if i % 3 == 0 and i % 5 == 0:
        print(f"{i}!?")
    elif i % 3 == 0:
        print(f"{i}!")
    elif i % 5 == 0:
        print(f"{i}?")
    else:
        print(i)

# 別解: 15の倍数を先にチェック
print("\n【別解1】")
for i in range(1, 51):
    if i % 15 == 0:  # 3と5の最小公倍数
        print(f"{i}!?")
    elif i % 3 == 0:
        print(f"{i}!")
    elif i % 5 == 0:
        print(f"{i}?")
    else:
        print(i)

# 別解: 文字列を結合する方法
print("\n【別解2】")
for i in range(1, 51):
    output = str(i)
    if i % 3 == 0:
        output += "!"
    if i % 5 == 0:
        output += "?"
    print(output)

出力例(最初の20個):

1
2
3!
4
5?
6!
7
8
9!
10?
11
12!
13
14
15!?
16
17
18!
19
20?

総合演習 1-2: 数当てゲーム

総合演習 1-2

1から100までのランダムな整数を生成し、ユーザーに数を当ててもらうゲームを作成してください。

要件:

  • import random を使い、random.randint(1, 100) でランダムな数を生成
  • ユーザーの入力は input() で受け取る(int(input("数字を入力: ")) のように使う)
  • ユーザーの予想が正解より大きければ "もっと小さい数です" と表示
  • ユーザーの予想が正解より小さければ "もっと大きい数です" と表示
  • 正解したら "正解です!◯回で当たりました!" と表示してゲーム終了

ヒント: while 文で繰り返し、if 文で条件分岐、変数で試行回数をカウントします。

解答例
import random

# 1から100までのランダムな整数を生成
answer = random.randint(1, 100)
attempts = 0

print("数当てゲーム")
print("1から100までの数を当ててください!")

while True:
    # ユーザーからの入力を受け取る
    try:
        guess = int(input("数字を入力: "))
        attempts += 1

        # 予想と正解を比較
        if guess < answer:
            print("もっと大きい数です")
        elif guess > answer:
            print("もっと小さい数です")
        else:
            print(f"正解です!{attempts}回で当たりました!")
            break

    except ValueError:
        print("エラー: 整数を入力してください")
        attempts -= 1  # エラーの場合は試行回数をカウントしない

# ゲーム終了後のメッセージ
if attempts <= 5:
    print("素晴らしい!")
elif attempts <= 10:
    print("まぁまぁの結果です!")
else:
    print("もう少し頑張りましょう!")

実行例:

数当てゲーム
1から100までの数を当ててください!
数字を入力: 50
もっと小さい数です
数字を入力: 25
もっと大きい数です
数字を入力: 37
もっと小さい数です
数字を入力: 31
もっと大きい数です
数字を入力: 34
正解です!5回で当たりました!
素晴らしい!