Pythonと確率と統計

2024/1/20
執筆者:小澤昌樹

※本記事は吉政創成株式会社「Python学習とキャリアアップ」より寄稿されたコラムとなります。

NumPy でいろいろな行列を作成する

こんにちは、小澤です。

データ分析を行うためには、確率と統計は欠かせない要素です。確率と統計を理解することで、データの傾向やパターンを把握し、意味のある情報を抽出することができます。『Pythonによるあたらしいデータ分析の教科書(第2版)』の3.4章「確率と統計」(76ページ〜90ページ)を参考にしながら、知識を学び、基礎をしっかりと固めることが重要です。

なお、確率と統計は数学の一分野ですが、データ分析にも役立つスキルです。ただし、データ分析エンジニアが必ずしも数学の詳細な理論を完全に理解する必要はありません。ここで説明する内容は、Pythonを使ったデータ分析に参考になる情報であり、確率と統計の基本的な考え方に焦点を当てていますが、実際の業務ではより実践的なアプローチが求められます。現実のデータに対する具体的な問いに答えるスキルが求められるため、数学的な理論に頼りすぎなくても問題ありません。

確率と統計

確率と統計はデータ分析において重要な役割を果たします。確率と統計の概念を用いた手法、例えば仮説検定、回帰分析、クラスタリング、主成分分析、時系列分析などは、データから価値ある情報を抽出するための強力な理論です。

Pythonを使うと、これらの数学的な理論を実際のデータに適用し、高度なモデルを構築することができます。つまり、確率と統計の理論をPythonと結びつけることで、高度なデータ分析と予測モデリングを実現できるのです。確率と統計の理論とPythonの組み合わせは、データ分析において不可欠な要素です。

具体的には、以下のようにPythonを使えます。

  1. データの収集と前処理
    Pythonを使用すると、大規模なデータを収集して整理することができます。収集したデータをデータベースに格納したり、クレンジングなどの処理をすることができます。
  2. 統計的データ分析
    多くのPythonライブラリが提供されており、これらを活用することで統計分析を効果的に行うことができます。NumPy(92ページ)、pandas(135ページ)、SciPy、statsmodelsなどを使用すると、データの記述統計、仮説検定、回帰分析、クラスタリング、主成分分析、時系列分析など、幅広い操作を行なうことができます。
  3. 確率分布
    確率分布の生成や確率密度関数(PDF)の計算、プロット、確率の計算にもPythonは適しています。特にSciPyライブラリは幅広い統計計算に使用でき、さまざまな確率分布を操作するためのツールを提供しています。SciPyにはさまざまな統計関数が用意されており、確率密度関数のほか、累積分布関数、統計検定、最適化、積分などの機能があります。
  4. 機械学習と深層学習
    統計的手法を使用して機械学習モデルをトレーニングすることで、データから予測モデルを構築することができます。scikit-learn、TensorFlow、PyTorchなどのPythonライブラリは、機械学習や深層学習の実装に適しています。
  5. データ可視化
    データを可視化することは、データ分析において非常に重要な手法です。PythonのライブラリであるMatplotlib(178ページ)やseabornを使用することで、データをグラフ化し視覚的に表現することができ、データの傾向やパターンを理解するのに役立ちます。
  6. モデルの評価
    確率モデルの評価にPythonを使用することができます。確率モデルの評価は、モデルの性能を理解し、改善するために不可欠なステップです。精度、適合度、予測誤差などを計算することで、モデルの改善に繋げることができます。

統計とPython

統計とは、データを取得・集計・分析し、そこから得られた情報を解釈・推論するものです。代表的な手法に、確率・推定・検定などがあります。 統計の基礎的な概念には、

  • 母集団 ... 統計的な推測
  • 調査の対象となる全体の集合
  • 標本 ... 母集団から抽出された部分集合
  • データ ... 標本から収集された実測値
  • 代表値 ... データの典型値を表す指標(平均、中央値)
  • 分散・標準偏差 ... データの変動の度合いを表す指標
  • 確率分布 ... 確率変数が取り得る値の分布
  • 推定 ... 母集団の値を標本から推定すること
  • 仮説検定 ... 標本データに基づき仮説の真偽を判断すること

などがあります。これらについて、Pythonでの簡単なサンプルプログラムを紹介しましょう。Pythonには豊富な統計ライブラリが提供されていますので、それらを効果的に使うことができます。

1. 代表値・分散・標準偏差(記述統計)

統計の目的はデータの特徴を理解することとも言えます。代表値や分散、標準偏差を求めることは、データの特徴を捉えるための第一歩です。Pythonでは、NumPyやPandasなどのライブラリが使えます。

import numpy as np
import pandas as pd

# データの作成
data = np.random.randn(100)

# 平均や標準偏差の計算
mean_value = np.mean(data)
std_dev = np.std(data)

# データの基本統計量の表示
data_summary = pd.DataFrame(data).describe()

2. 確率分布

データの分布を理解することは重要です。PythonではSciPyライブラリを使うと便利です。

from scipy.stats import norm

# 正規分布の確率密度関数
pdf = norm.pdf(x, loc=mean, scale=std_dev)

3. 仮説検定

統計的仮説検定は、母集団に関するある仮説が正しいかどうかをデータから判断する統計的手法のことです。StatsmodelsやSciPyを使用して仮説検定を実行できます。

import statsmodels.api as sm
from scipy.stats import ttest_ind

# t検定(統計的仮説検定の一種)の実行
t_stat, p_value = ttest_ind(group1, group2)

# 線形回帰モデルの構築
X = sm.add_constant(X)
model = sm.OLS(y, X)
results = model.fit()

# 回帰係数や統計量の表示
print(results.summary())

確率とPython

確率とは、ある事象が起こる可能性を0から1の間の実数で表したものです。確率は確からしさを定量的に表現したものとも言え、統計における基本的な指標です。確率の基本的な概念には以下のようなものがあります。

  • 事象 ... 確率を定義づける基本単位(例えば、コインの表が出る回数)
  • 確率 ... 事象が起こる可能性を0〜1の値で表したもの(0は事象が絶対に発生しない、1は事象が確実に発生する)
  • スペース ... 事象がとりうる全ての結果の集まり(例えば、6面のサイコロを振る場合、スペースは{1, 2, 3, 4, 5, 6})
  • 加法定理 ... 完全なスペースを分割する事象の確率の和は1
  • 条件付き確率 ... 条件を考慮した確率
  • ベイズの定理 ... 条件付き確率を利用して逆向きの確率を求める

以下は、NumPyを使用して確率の基本的な概念を実践的に表現したものです。

1. 事象と確率

import numpy as np

# 事象: 6面のサイコロを振ったときの出目
sample_space = np.arange(1, 7)

# 確率: 各出目が出る確率
probability = 1 / len(sample_space)

2. スペース

# スペース: 2つのサイコロを振ったときの組み合わせ
sample_space_2dice = [(i, j) for i in sample_space for j in sample_space]

3. 加法定理

# 例: 2つのサイコロを振ったとき、合計が7になる確率
event_sum_7 = [(i, j) for i, j in sample_space_2dice if i + j == 7]
probability_sum_7 = len(event_sum_7) / len(sample_space_2dice)

4. 条件付き確率

# 例: 1つ目のサイコロが3の場合、合計が7になる確率
event_first_die_3 = [(i, j) for i, j in sample_space_2dice if i == 3]
event_sum_7_given_first_die_3 = [(i, j) for i, j in event_first_die_3 if i + j == 7]
probability_sum_7_given_first_die_3 = len(event_sum_7_given_first_die_3) / len(event_first_die_3)

5. ベイズの定理

# 仮想的な疾患にかかる確率
p_disease = 0.01

# テストの正確性
p_pos_given_disease = 0.95
p_pos_given_no_disease = 0.05

# テストで陽性反応が出る確率
p_pos = (p_pos_given_disease * p_disease) + (p_pos_given_no_disease * (1 - p_disease))

# ベイズの定理による疾患を持っている確率
p_disease_given_pos = (p_pos_given_disease * p_disease) / p_pos

まとめ

今回は、確率と統計の基本的な概念をPythonサンプルコードも交えて紹介しました。Pythonのサンプルコードを通じて、確率と統計がどのように実践的に活用されるかを少しは理解していただけたかと思います。

次回からは、Pythonライブラリを使ったデータ分析に焦点を当て、具体的な使用方法や応用について詳しく説明します。まずはNumPyを使ったデータ分析について解説しますので、引き続きご覧ください。

今回のコラムはいかがでしたでしょうか?インターネット・アカデミーは、Python講座が充実しています。Python認定スクールにもなっているため質の高い知識を得ることができ、基礎学習の先にあるそれぞれの目標を目指していくためには良い場所となります。ご興味ある方は各講座のページを覗いてみてください。

Pythonが学べる講座

この記事の執筆者

小澤昌樹

デジタル人材育成・助成金のお役立ち資料をダウンロード

デジタル人材育成や助成金活用のお役立ち資料などをまとめてダウンロードしていただけます。コンサルタントへの無料相談をご希望の方はこちらからお問い合わせください。

たとえばこんな相談ができます
  • DX人材の育成&事例紹介 リスキリングのロードマップ付き
  • デジタル人材育成に使える助成金制度
  • デジタルスキル標準 役割別おすすめ講座
資料ダウンロードはこちら
会社名必須
部署名必須
お名前必須
電話番号必須
メールアドレス必須

個人情報の利用目的についてご同意いただいた場合のみ、「同意して進む」を押してください。

このページの上へ