数値・文字列・真偽値|Pythonの最初の1行

このページはプロモーション(広告)を含みます。

Pythonの最初の1行(初級・読む25分+演習30分)

この授業のゴール

仕事でどう使うか

データ分析の失敗の多くは、値の種類(型)の取り違えから始まります。CSVから読み込んだ金額が文字列のままで、合計が計算できない。「0」と「入力なし」を同じに扱い、平均がずれる。こうした問題は、型を意識すれば防げます。

路線 この授業の使いどころ
DS(データサイエンティスト) 集計前に、各列が数値か文字列かを確認する。売上0円と未入力(欠損)を分け、平均や件数の分母を正しく決める
ML(機械学習エンジニア) 特徴量は数値で与える。カテゴリを表す文字や、真偽の列を、どの数値に変えるかを設計する。小数の誤差が評価値にどれだけ影響するかを見積もる
DX(DX推進・AI企画) 業務システムの項目定義で、郵便番号や電話番号を「数」でなく「文字列」で持つ理由を説明する(先頭の0が消えるため)。金額は整数の円で持つ、などのルールを決める
RS(研究者) 測定値の有効桁数と、計算機上の小数の近似を区別する。欠損値を0と誤って扱った解析結果が出ていないかを確認する

この授業では、4つの基本の型と、「値がない」ことを表す None を扱います。型は、この先のPythonの学習すべての土台です。

前提

次の内容を使います。

この授業では、画面に表示される見た目が同じでも、型が違えば別の扱いになることを実行して確かめます。

身近な状況:注文1件の記録に、4種類の値が混ざっている

ネットショップの注文を1件、変数で表します。

項目 値 何を表すか
商品名 'りんご' 文字
数量 3 個数(整数)
単価 120 円(整数)
割引率 0.1 割合(小数)
会員か True はい / いいえ

見た目の区別は簡単そうですが、CSVファイルから読み込んだ瞬間、数量の 3 も単価の 120 も、文字として読み込まれることがあります。このとき '3' * 120 を計算すると、Pythonは「文字 3 を120回繰り返す」という計算をして、エラーも出さずに長い文字列を返します。

name = 'りんご'
qty = 3
unit_price = 120
rate = 0.1
is_member = True

print(name, type(name))
print(qty, type(qty))
print(unit_price, type(unit_price))
print(rate, type(rate))
print(is_member, type(is_member))

出力の <class 'str'> などが、値の型(種類)です。type(値) で調べられます。型が違えば、足し算や掛け算の意味が変わります。

直感的な説明:同じ「1000」でも、紙に書いた数と、ラベルに書いた文字

財布の中の千円札と、「1000円」と印字されたラベルを想像してください。千円札は払うことができ、足し算もできます。ラベルは文字の並びで、数えることも引き算もできません。ただし、2枚並べて貼れば「10001000円」のような長いラベルを作れます。

Pythonの型もこれと同じです。

画面に 1000 と出ても、それが数なのか文字列なのかは、出力の見た目だけでは区別できません。区別したいときは type() や repr()(文字列なら引用符付きで表示する関数。printと入力値 で扱います)を使います。

正確な定義:Pythonの基本の型

型とは、値の種類のことで、その値に対してできる操作を決めます。

型 名前 書き方の例 主な使い道
int 整数 3、-5、0 個数、円の金額、ID
float 小数(浮動小数点数) 0.1、3.0、-2.5 割合、温度、測定値
str 文字列 'りんご'、"1000" 名前、コード、日付の文字
bool 真偽値 True、False 条件、フラグ(印)
NoneType 値がない None 未入力、該当なし

詳しい決まりを確認します。

ここで、型の確認に使う道具を決めます。type(x) は x の型を返す関数で、type(x).__name__ と書くと型の名前だけを文字列で得られます。たとえば type(3).__name__ は 'int' です。

注意:== で数と文字を比べても、エラーにはなりません。3 == '3' は False になります。型が違えば等しくないので、比較の結果がいつも False になる原因に気づけないことがあります。

段階付き例題:注文1件の小計を、型を確かめながら求める

問題:単価 120 円のりんごを 3 個買う。小計と、会員割引(10%)後の金額を求め、各値の型を確認する。

ステップ1:数式で意味を確認する。小計 $= \text{単価} \times \text{数量} = 120 \times 3 = 360$(円)。割引後 $= \text{小計} \times (1 - \text{割引率}) = 360 \times 0.9 = 324$(円)。単価は円、数量は個、割引率は 0 以上 1 以下の割合です。

ステップ2:コードにして、各変数の型も出す。

unit_price = 120
qty = 3
rate = 0.1
is_member = True

subtotal = unit_price * qty
discounted = subtotal * (1 - rate)

print('小計', subtotal, type(subtotal).__name__)
print('割引後', discounted, type(discounted).__name__)
print('会員?', is_member, type(is_member).__name__)
print('割引後は小計より小さいか?', discounted < subtotal, type(discounted < subtotal).__name__)

ステップ3:1行ずつ読む。

出力 値 型 読み方
小計 360 int int × int は int
割引後 324.0 float 0.1 が float なので結果も float
会員? True bool 真偽値
割引後は小計より小さいか? True bool 比較の結果も bool

ステップ4:意味を確認する。割引後の金額が 324 円(324.0)で、手計算の 360 × 0.9 = 324 と一致しました。324.0 の .0 は「小数の型である」という印で、金額としては 324 円です。最終的に円の整数が必要なときの変換は、次の授業 演算子と型変換 で扱います。

ステップ5:型が混ざると何が起きるか。同じ計算を、文字列の '120' で行うとどうなるかを見ます。

unit_price_text = '120'
qty = 3

print(unit_price_text * qty)
print(len(unit_price_text * qty))
print(type(unit_price_text * qty).__name__)

出力は 120120120、9、str です。エラーにはならず、「'120' を3回つないだ9文字の文字列」ができます。これは数としての小計 360 とは全く別の値です。

操作して理解する:型を予想してから確かめる

次の式の型と値を、実行する前に予想してください。そのあと実行して答え合わせをします。

print(type(3).__name__, type(3.0).__name__, type('3').__name__, type(True).__name__)
print(3 == 3.0, 3 == '3', '3' + '3', 3 + 3)
print(len('りんご'), len(str(1000)), len('1000'))
print(True + 1, 5 > 3, 'a' < 'b')

予想の手順と答えは、次のとおりです。

  1. int float str bool が並びます。
  2. 3 == 3.0 は数として等しいので True。3 == '3' は型が違うので False。'3' + '3' は文字の連結で '33'、3 + 3 は 6。出力は True False 33 6 です。
  3. 'りんご' は3文字なので 3。str(1000) は整数 1000 を文字列 '1000' に変えるので長さ 4。'1000' も長さ 4。出力は 3 4 4 です。
  4. True + 1 は 2(True は 1 として計算される)。5 > 3 は True。文字どうしの比較 'a' < 'b' も True(文字コード順)。出力は 2 True True です。

自分で値を書き換えて遊んでみてください。print(type(None).__name__) は NoneType を出します。print(type(1 / 1).__name__) は float です。割り算 / は、割り切れても必ず float になります。

表示された値を、次の観点で確認する習慣を付けます。(1) 型は期待どおりか、(2) 数と文字が混ざっていないか、(3) True / False を 1 / 0 と取り違えていないか。

発展:浮動小数点の誤差、bool が int の仲間であること、NaN

浮動小数点数の誤差:コンピューターは小数を2進法で保存します。$0.1$ は2進法では循環小数になり、有限の桁で打ち切るため、わずかな誤差が生じます。0.1 を小数点以下20桁まで表示すると 0.10000000000000000555 で、真の 0.1 とはわずかに違います。double(64ビット)の精度は、およそ10進法で15〜16桁です。

import math
print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3)
print(abs((0.1 + 0.2) - 0.3) < 1e-9)
print(math.isclose(0.1 + 0.2, 0.3))
print(round(0.1 + 0.2, 2) == 0.3)

出力は 0.30000000000000004、False、True、True、True です。小数の等しさは == ではなく、許容誤差内で等しいか(abs(a - b) < 1e-9 または math.isclose)で判定します。金額は、円を整数で持つ(または decimal.Decimal を使う)ことで、誤差を避けられます。

bool は int の仲間:True は 1、False は 0 として計算できます。isinstance(True, int) は True です。この性質は、True の個数を sum で数えるときに便利ですが、True + 1 のような式が意図せず通ってしまう原因にもなります。

NaN:float('nan')(Not a Number:数ではない値)は、計算できない結果を表す小数です。NaN は自分自身とも等しくなく(nan == nan は False)、None とは別の値です。pandas では欠損値の表現として NaN が使われます(「型と欠損」(有料版))。「0」「空」「欠損」を区別する考え方は、データ分析全体で重要です。

よくある失敗

失敗1:文字列と数を足す/掛ける

誤り:CSVから読んだ数量が文字列のまま計算に使われる。

qty_text = '3'
unit_price = 120
print(qty_text * unit_price == '3' * 120)   # 文字の120回繰り返し

code = "print('数量:' + 3)\n"
try:
    exec(compile(code, 'sample.py', 'exec'), {})
except Exception as e:
    print(type(e).__name__, ':', e)

1行目の出力は True です。'3' * 120 は「文字 3 を120個つないだ文字列」で、エラーなしで間違った値を返します。もう1つの '数量:' + 3 は TypeError(can only concatenate str (not "int") to str)になります。

直し方:数が必要なら int('3') で変換し、文字列に数を入れたいときは str(3) や f文字列(printと入力値)を使う。エラーになる場合は気づけますが、* のようにエラーが出ない型の取り違えが最も危険です。出力の型と長さを確かめます。

失敗2:文字列の真偽を `bool()` で判定する

誤り:'False' という文字を bool() に渡して、偽になると考える。

print(bool('False'))
print(bool('0'))
print(bool(''))
print(bool(0))
print(bool(0.0))

出力は True、True、False、False、False です。空でない文字列はすべて True になります。'False' も '0' も、中身にかかわらず True です。フォームやCSVから 'True' / 'False' の文字列が来たとき、bool(text) では判定できません。

直し方:text == 'True' のように、文字を比較して真偽値を得る。0、0.0、''(空文字)、None(と、空のリストのような中身が空のもの)が False として扱われ、それ以外の値は True になる、という決まりを覚えておきます。

失敗3:小数を `==` で比べて、一致しない

誤り:金額を小数で計算して == で検算する。

total = 0.1 * 3
print(total)
print(total == 0.3)
print(abs(total - 0.3) < 1e-9)

total_yen = 10 * 3        # 円を整数で持つ(0.1円 = 10銭 = 10 など単位を変える)
print(total_yen == 30)

出力は 0.30000000000000004、False、True、True です。0.1 * 3 は 0.3 とほぼ等しいですが、完全には一致しません。

直し方:(1) 小数どうしは、abs(a - b) < 許容誤差 で比べる。(2) 金額は、最小単位の整数(円)で持つ。小数が必要な場面(税率 0.1 など)では、最後に丸め方(切り捨て・切り上げ・四捨五入)を決めて整数に直す(演算子と型変換)。

失敗4:「0」と「値がない(None)」を同じに扱う

誤り:未入力の売上を None のまま足し、または 0 に置き換えて平均を出す。

sales = [100, 0, None]    # 0 は「売上0円」、None は「未入力」

code = 'print(100 + None)\n'
try:
    exec(compile(code, 'sample.py', 'exec'), {})
except Exception as e:
    print(type(e).__name__, ':', e)

# None を 0 に置き換えた平均と、None を除いた平均
print((100 + 0 + 0) / 3)
print((100 + 0) / 2)

最初の出力は TypeError : unsupported operand type(s) for +: 'int' and 'NoneType' です。次の2つの平均は 33.333333333333336 と 50.0 で、同じデータなのに 未入力を0とみなすか、除外するかで平均が大きく変わります。

直し方:0(売上がない)と None(わからない)を別の値として扱い、どちらにするかを集計の仕様として決めて書く。分母にどれを含めるのかを、レポートに明記します。

まとめ

用語

型(type)

値の種類。できる操作を決める。int、float、str、bool などがある。

浮動小数点数(floating-point number)

小数を2進法で近似して持つ数(float)。0.1 + 0.2 のように、わずかな誤差が生じる。

文字列(string)

引用符で囲んだ文字の並び。連結や長さの計算はできるが、数としての計算はできない。

真偽値(boolean)

True か False のどちらかを取る値。比較の結果として得られる。

None(None)

値がないことを表す特別な値。0や空文字とは別物。

よくある質問

`int` と `float` は、どう使い分けますか?

個数、円の金額、IDのように「数えられるもの」は int、割合や測定値のように「連続的な量」は float が向いています。ただし float は誤差があるため、金額を小数で持つのは避け、最小単位の整数で持つのが基本です。

`'1000'` と `1000` を見分けるにはどうしますか?

type(x) で型を確認するか、print(repr(x)) で引用符付きの表示を見ます。引用符が付けば文字列です。データ分析では、CSVの列が文字列で読み込まれていないか、読み込み直後に確認する習慣が役立ちます。

郵便番号や電話番号は、数ではなく文字列で持つのはなぜですか?

先頭の0に意味があり(03-1234-5678)、足し算や平均を取らないからです。数として持つと 03 が 3 になり、桁が欠けます。「計算するか」で型を決める、と考えると迷いません。

`True` と `False` を、なぜ数のように計算できるのですか?

bool が int の仲間として作られていて、True は 1、False は 0 として扱われるからです。条件に合う件数を sum で数える場面で便利ですが、意図せず True + 1 が通ることもあるので、型を意識して使います。

金額の計算で、小数の誤差を避けるにはどうしますか?

円を整数で持ち、割合を掛けた後に丸め方(切り捨て・切り上げ・四捨五入)を決めて整数へ直します。さらに厳密さが必要な会計システムでは decimal.Decimal が使われます。どの丸め方にするかは、会社や取引の規則に従う必要があります。

`None` と `NaN` は同じですか?

別物です。None は「値がない」ことを表す特別な値、NaN は数としての計算結果が定まらない小数です。pandas では、欠損が NaN で表されることが多く、判定には isna などの専用の関数を使います。同じ「欠損」でも表し方は道具により違うので、確認が必要です。

確認問題

問1 type('1000') が表す型はどれか。

  1. ① int(整数)
  2. ② float(小数)
  3. ③ bool(真偽値)
  4. ④ str(文字列)
解答と解説

正解:④

引用符で囲まれた値は、中身が数字だけでも文字列です。数としての計算はできません。

問2 '120' * 3 を実行すると何が起きるか。

  1. ① '360' になる
  2. ② エラーにならず、文字列 '120120120' になる
  3. ③ 360 になる
  4. ④ TypeError になる
解答と解説

正解:②

文字列に整数を掛けると、文字列を繰り返す計算になります。エラーが出ないため、数の計算をしたつもりで気づけないことが危険です。

問3 0.1 + 0.2 == 0.3 を実行した結果はどれか。

  1. ① False(小数の誤差のため)
  2. ② True
  3. ③ TypeError
  4. ④ 0.3
解答と解説

正解:①

0.1 と 0.2 は2進法で正確には表せず、足し算の結果は 0.30000000000000004 になります。小数の一致は abs(差) < 許容誤差 で判定します。

問4 bool('False') の結果はどれか。

  1. ① 文字列 'False'
  2. ② エラー
  3. ③ True
  4. ④ False
解答と解説

正解:③

空でない文字列は、中身にかかわらず True になります。文字列 'True' / 'False' を真偽値に直すには、text == 'True' で比べます。

問5 売上データで、0 と None の違いとして適切な説明はどれか。

  1. ① 0 は売上が0円という値、None は売上の値がない(未入力など)という意味で、別物として扱う
  2. ② どちらも売上なしを表すので、同じ扱いでよい
  3. ③ None は 0 の別の書き方である
  4. ④ None を足し算に使うと自動的に 0 として扱われる
解答と解説

正解:①

0は観測された値、None は値がないことを表します。平均の分母に含めるか除くかで結果が変わるため、集計の仕様として決める必要があります。

問6 type(3 == 3.0).__name__ の結果と、3 == 3.0 の値の組はどれか。

  1. ① float と 3.0
  2. ② str と '3'
  3. ③ bool と True
  4. ④ int と 1
解答と解説

正解:③

比較演算の結果は bool です。3 と 3.0 は数として等しいので True になります。

次に学ぶこと

次は 演算子と型変換 で、int('1000') のような型変換と、// % ** などの演算子、丸め方を学びます。この授業で見た「文字と数の取り違え」を、変換で直す方法です。

この授業の確認問題だけでモジュールの習得とはしません。PY01 の総合テストと自力課題で判定します。pandas の列の型と欠損は 「型と欠損」(有料版) で扱います。

キャリア学習:データサイエンティスト・機械学習エンジニア・DX推進・研究者を目指す人の学習アプリ。164モジュール・984授業を、ブラウザで動くSQLとPythonの演習で。基礎と各分野の最初のモジュールは無料。全部は2,980円の買い切り。

アプリを無料で開く有料版と無料版の違い