忍者ブログ
統計、機械学習、AIを学んでいきたいと思います。 お役に立てば幸いです。

【Python】重複を許さない!set(集合)の基本と活用シーン

Pythonの「set(集合)」は、リストと似ていますが、大きな違いが2つあります。それは「重複した値を持てない」ことと「順序がない」ことです。データのユニーク性を保証したい場面で非常に強力なツールとなります。

1. 考え方:set(集合)の世界

数学の「集合」と同じ概念です。同じ値が何度現れても、集合の中では「1つ」としてカウントされます。また、順番という概念がないため、リストよりも高速に値を検索できるのが特徴です。

a = ['1', '1', '2', '2']

[ setに変換した後の動き ]
重複の排除:'1' と '2' の2つだけが残ります。
順不同:取り出す際に 1, 2 の順とは限りません。
一括判定:ある値が含まれているかどうかの確認が爆速です。

2. Pythonサンプルプログラム

重複を含んだリストを set() 関数に渡すことで、簡単にユニークな(重複のない)要素のみを抽出できます。

# -*- coding: utf-8 -*-

def main():
    # 重複のあるリスト
    a = ['1', '1', '2', '2']
    
    # リストを集合(set)に変換
    b = set(a)

    print("集合の中身を順に取り出します。")

    # for文で出力(順序は保証されません)
    for x in b:
        print(x)

if __name__ == "__main__":
    main()

3. 実行結果

集合の中身を順に取り出します。
1
2

4. ステップアップ:いつ使うの?(数学・データ分析)

「あまり使ったことがない」と感じるかもしれませんが、実は数学的な処理やデータクレンジングで大活躍します。

  • 積集合(AND):2つのグループ両方に所属している人を探す。
  • 和集合(OR):2つのグループのメンバーを重複なく合算する。
  • 差集合(DIFF):Aグループにはいるが、Bグループにはいない人を抽出する。

5. リストと集合の使い分け

どちらを使うべきか迷ったときは、以下の基準で判断しましょう。

データ構造主な用途メリット
リスト (list) 並び順が重要なデータ インデックス(添字)でアクセスできる。
集合 (set) 重複確認、グループ比較 検索が圧倒的に速い。重複を自動で消せる。

6. まとめ

Pythonのsetは、単なる「重複削除ツール」以上の価値があります。特に「ベン図」で描けるようなグループ同士の比較(数学的な集合演算)を行う際には、リストでループを回すよりも圧倒的にシンプルで高速なコードが書けます。データ分析の第一歩として、ぜひ使いこなしましょう!


PR

【Python】Counterでリスト要素の出現回数をサクッと集計する

リストの中に「どの値が何個あるか」を数えたい場面は多いですよね。Pythonでは、標準ライブラリの collections.Counter を使うと、ループを回す手間なく一瞬で集計が可能です。

1. 考え方:Counter(カウンター)の仕組み

Counterは辞書(dict)のサブクラスで、要素をキーに、その出現回数を値として保持する特別なデータ構造です。面倒なカウント処理をすべて自動で行ってくれます。

my_list = [1, 2, 3, 1, 3, 3]

[ 集計ルール ]
・1 が現れた回数 → 2回
・2 が現れた回数 → 1回
・3 が現れた回数 → 3回
これらを {要素: 個数} の形式でまとめてくれます。

2. Pythonサンプルプログラム

collections モジュールから Counter をインポートして使用します。変数名に list などの予約語を使わないように注意して記述しましょう。

# -*- coding: utf-8 -*-
from collections import Counter

def main():
    # 集計対象のリスト
    data_list = [1, 2, 3, 1, 3, 3]

    # Counterオブジェクトを作成(ここで自動集計される)
    c = Counter(data_list)

    print("集計結果を表示します。")
    print(c)

    # 特定の要素の回数だけ知りたい場合
    print(f"「3」が出現した回数: {c[3]}")

if __name__ == "__main__":
    main()

3. 実行結果

集計結果を表示します。
Counter({3: 3, 1: 2, 2: 1})
「3」が出現した回数: 3

4. ステップアップ:便利な応用機能

Counterには、単に数えるだけでなく、実務で役立つ便利なメソッドが備わっています。

  • most_common():出現回数の多い順に並べ替えます。 c.most_common(2) とすれば、上位2件だけを取得できます。
  • 演算ができる:Counter同士を足したり引いたりして、集計結果を合算・差分比較することが可能です。

5. 他の手法との違い

要素を数える方法はいくつかありますが、効率面で大きな違いがあります。

手法特徴使い分け
Counter (今回) 一括で全要素を数える リスト全体の分布を知りたいとき。最も高速。
list.count(x) 特定の1種類だけ数える 「特定の要素が何個あるか」だけ知れば良いとき。
for文 + 辞書 手動で加算していく 集計の途中で特殊な条件判定を入れたいとき。

6. まとめ

データの頻度分析は、プログラミングの基本中の基本です。Pythonなら Counter をインポートするだけで、自作すると数行かかるループ処理をたった1行で済ませることができます。読みやすく効率的なコードを目指すなら、ぜひマスターしておきたい道具の一つですね!

【DS検定対策】確率の基礎を攻略!「和の組み合わせ」は書き出しがコツ

確率の問題で多くの人が迷うのが、複数の事象が重なったときの数え上げです。今回はサイコロを題材に、DS検定でも重要な「標本空間」の捉え方を、分かりやすく解説します。

1. 問題:出る目の和が5の倍数

【 問題 】 大小2個のサイコロを同時に投げたとき、出る目の和が「5の倍数」になるのは、何通りあるでしょうか?

① 4通り   ② 7通り   ③ 12通り   ④ 36通り

2. 整理:標本空間(世界)の可視化

確率のコツは、最初に「起こりうるすべてのパターン」を想定し、その中から条件に合うものを正確に抽出することです。

【 世界の切り出し 】

[ もともとの世界(全事象) ]
6(大) × 6(小) = 36通り

[ 条件の確認 ]
サイコロ2個の和の最小は 2(1+1)、最大は 12(6+6)。
この範囲にある「5の倍数」は 510 の2つだけです。

[ ターゲット(分子):その中で5の倍数 ]
・和が 5 になる:(1,4), (2,3), (3,2), (4,1)
・和が 10 になる:(4,6), (5,5), (6,4)

合計の組み合わせ: 7通り

--------------------------

確率(参考): 7 / 36

3. 計算プロセス

1. 範囲を特定する: 和が「5の倍数」と言われたら、まず現実的なターゲット(5, 10)を決めます。
2. ターゲットを数える: 大小の区別があるため、(1,4) と (4,1) は別のものとして漏れなくカウントします。
3. 答えを出す: 4通り + 3通り = 7通り


4. DS検定形式:実戦4択クイズ

問:2つの独立した試行において、起こりうるすべての結果を網羅した集合のことを統計学用語で何と呼ぶか。

① 標本空間   ② 信頼区間   ③ 有意水準   ④ 帰無仮説

【 正解: ① 】

解説: 試行によって起こりうるすべての結果の集合を「標本空間(Sample Space)」と呼びます。分析を行う際、この全体像を正しく定義することは、データサイエンスの基本中の基本です。


5. まとめ

サイコロの問題は、単純に公式に当てはめるよりも、今回のように「和がいくつになるパターンがあるか」を論理的に書き出す方がミスを防げます。DS検定でも、まずは「分母となる全体像」をしっかり把握することを意識しましょう!


【Python】誤差なし!Fractionクラスで分数を正確に計算する

コンピュータが得意な小数計算には、実はわずかな「誤差」がつきものです。しかし、Pythonの fractions.Fraction クラスを使えば、分数を分数のまま、正確に計算することができます。

1. 考え方:Fraction(分数)クラスのメリット

通常の 1 / 3 などの計算は小数(0.333...)として扱われますが、Fractionを使うと「分子」と「分母」のペアとして保持されます。また、計算結果が自動的に約分(最小の分母に整理)されるのが大きな特徴です。

f1 = Fraction(1, 6) → 1/6
f2 = Fraction(3, 6) → 3/6 (1/2)

[ 計算プロセス ]
・1/6 + 3/6 = 4/6
・4/6 を約分 → 2/3

2. Pythonサンプルプログラム

fractions モジュールから Fraction をインポートします。カンマ区切りで「分子, 分母」の順に指定します。

# -*- coding: utf-8 -*-
from fractions import Fraction

def main():
    # 分数の定義(分子, 分母)
    f1 = Fraction(1, 6)
    f2 = Fraction(3, 6)

    # 加算の実行
    result = f1 + f2

    print("分数の計算を開始します。")
    print(f"{f1} + {f2} = {result}")

if __name__ == "__main__":
    main()

3. 実行結果

分数の計算を開始します。
1/6 + 1/2 = 2/3

4. ステップアップ:多彩な初期化方法

Fractionクラスは、整数のペア以外からも分数を作ることができます。

  • 文字列から生成Fraction("0.75") と書けば 3/4 に変換されます。
  • 小数から生成Fraction(0.5) と書けば 1/2 になります。
  • 属性の取得result.numerator で分子、result.denominator で分母だけを取り出せます。

5. 浮動小数点数(float)との違い

なぜ普通の割り算ではなく、わざわざFractionを使うのか比較してみましょう。

比較項目float (通常の小数)Fraction (分数)
正確さ 循環小数などで誤差が出る 常に正確(厳密)
表示形式 0.3333333333333333 1/3
用途 一般的な計算、速度重視 金融計算、数学の証明、精密な比率

6. まとめ

Pythonの Fraction は、数学的な厳密さを保ちたいプログラムで非常に重宝します。自動で約分までこなしてくれるため、複雑な分数の計算もケアレスミスなく実装できます。誤差が許されないシーンでは、floatの代わりにぜひ活用してみてください!

【Python】文字化けを防ぐ!コーディング行(文字コード)の指定方法

Pythonでプログラムを書く際、コードの中に日本語(コメントや文字列)を含めると、実行環境によっては「文字化け」やエラーが発生することがあります。これを防ぐために、ファイルの先頭で「どの文字コードで書かれているか」を宣言するのがマジックコメントです。

1. 文法:マジックコメントの書き方

ファイルの1行目(または2行目)に以下の形式で記述します。Pythonはこの記述を見て、ファイル全体の文字コードを判別します。

# -- coding: エンコーディング名 --

[ 主な指定内容 ]
utf-8:世界標準の文字コード(推奨)
shift_jis:Windowsの日本語環境で古くから使われる形式
euc-jp:Unix系OSで使われることがある形式

2. Pythonサンプルプログラム

日本語を正しく扱うための標準的な記述例です。現在では、特別な理由がない限り utf-8 を使用するのが一般的です。

-- coding: utf-8 --
def main():
# 日本語のメッセージを変数に代入
message = 'hello'

print("プログラムを実行します。")
print(message)
if name == "main":
main()

3. 実行結果

プログラムを実行します。
hello

4. ステップアップ:なぜこれが必要なの?

Python 3系ではデフォルトの文字コードが UTF-8 に設定されていますが、古いエディタや特定のサーバー環境では、この一行がないと日本語が正しく解釈されず、SyntaxError を吐いて止まってしまうことがあります。

  • エラー防止:多人数で開発する際、環境の違いによるエラーを未然に防げます。
  • 明示性:どの文字コードで保存すべきファイルなのか、開発者に一目で伝わります。

5. Python 2 と Python 3 の違い

バージョンの違いによって、この指定の重要度が異なります。

バージョンデフォルト設定日本語の扱い
Python 3.x UTF-8 指定なしでも動くことが多いが、慣習として書くのが安全。
Python 2.x ASCII 必須。これがないと日本語を含むコードは即エラー。

6. まとめ

# -- coding: utf-8 --」は、いわばPythonファイルにおける「おまじない」のようなものです。最近のエディタでは自動で設定されることも多いですが、基礎として理解しておくことで、いざ日本語が化けた時のトラブルシューティングに役立ちます。常に1行目に書く癖をつけておきましょう!