Lecture 1Python環境構築 — Jupyter Notebookの基本操作

12:00

Python環境構築 — Jupyter Notebookの基本操作

統計学を学ぶ上でデータを視覚化したり、計算を効率化するには「Python」というプログラミング言語が非常に役立ちます。本講義では、Pythonの環境を整え、統計分析に最適な「Jupyter Notebook」の基本操作を学びます。この章を終える頃には、Pythonのコードを実行できる環境が構築され、データ分析の第一歩を踏み出す準備が整います。


Pythonのインストール:統計学の道具箱の準備

Pythonを活用するにはまず、Python本体をコンピューターにインストールする必要があります。初心者向けに、以下の手順でインストールを行います。

  1. Anacondaのダウンロード
    Pythonのインストールには、統計分析に特化した「Anaconda」をおすすめします。AnacondaにはPythonだけでなく、Jupyter Notebookやデータ分析ライブラリがすでに含まれているため、手間が省けます。
  2. 公式サイト: https://www.anaconda.com/products/distribution
  3. インストーラーをダウンロード後、指示に従ってインストールします。

  4. インストール後の確認
    インストールが完了したら、ターミナル(Mac/Linux)またはコマンドプロンプト(Windows)で以下のコマンドを実行して確認します。 bash python --version これにより、インストールされたPythonのバージョンが表示されます(例: Python 3.11.4)。

ステップ 内容 ツール
1 Anacondaダウンロード Anaconda公式サイト
2 インストーラー実行 インストールウィザードに従う
3 Pythonバージョン確認 python --version コマンド

Jupyter Notebookの起動:データ分析のデジタルノート

Jupyter Notebookは、コードの記述と実行が同じ画面で行えるインタラクティブな環境です。統計学の演習では、このツールを使ってデータを視覚化したり、計算結果を確認したりします。

起動手順

  1. Anacondaをインストールした後、Anaconda Navigator(アプリケーション)を起動します。
  2. 左側の「Environments(環境)」タブで、base (root) を選択します。
  3. 「Applications on base (root)」の「Jupyter Notebook」をクリックします。
  4. ブラウザが自動的に開き、Jupyter Notebookのホーム画面が表示されます。

新規ノートブックの作成

  • ホーム画面の「New」→「Python 3」をクリックします。
  • 新しいタブが開き、セル(コードの入力エリア)が表示されます。

Jupyter Notebookの基本操作:コードを「セル」単位で実行

Jupyter Notebookでは、コードやテキストを「セル」という単位で入力・実行します。以下に基本的な操作を説明します。

セルの種類

  1. コードセル(Code Cell)
    Pythonコードを記述・実行します。例: python # 2つの数値を足し合わせる print(3 + 5) # 出力: 8
  2. マーカーダウンセル(Markdown Cell)
    テキストや説明文を入力します。セルの上部にある「Cell Type」→「Markdown」を選択します。

実行方法

  • カーソルをセル内に移動し、Shift + Enter キーを押すと、コードが実行され、次のセルに移動します。

Pythonの基本文法:統計学のための第一歩

統計学では、数値や文字列を扱うことが多いため、Pythonの基本データ型を理解することが重要です。

数値と文字列

# 整数と浮動小数点数
age = 25
height = 1.75

# 文字列
name = "田中太郎"
greeting = "こんにちは、" + name + "さん!"

print(greeting)  # 出力: こんにちは、田中太郎さん!

リストと辞書

  • リスト(List): 複数の値を並べる
  • 辞書(Dictionary): キーと値のペアでデータを保存
# リスト
scores = [85, 90, 78, 92]
average = sum(scores) / len(scores)  # 平均値の計算
print(average)  # 出力: 86.25

# 辞書
student = {"名前": "佐藤花子", "年齢": 18, "成績": "A"}
print(student["成績"])  # 出力: A

実践ワーク:データを入力して処理する

以下に、Jupyter Notebookで実際に実行できる練習問題を用意しました。ステップバイステップでコードを入力し、結果を確認しましょう。

  1. 数値の入力と出力 python # 2つの数値を入力し、合計と平均を計算 a = 12 b = 18 total = a + b average = total / 2 print("合計:", total) print("平均:", average)

  2. 文字列の結合 python # 名前と年齢を入力し、挨拶文を作る name = "鈴木健太" age = 22 message = "私の名前は" + name + "で、" + str(age) + "歳です。" print(message)


まとめと次回の準備

本講義では、Pythonの環境構築方法とJupyter Notebookの基本操作を学びました。AnacondaのインストールからJupyter Notebookの起動、コードの実行までを実際に体験しました。また、Pythonの基本文法(数値、文字列、リスト、辞書)についても説明しました。

次回は、「NumPyとPandasによるデータ操作」を学びます。NumPyは数値計算を効率化するライブラリ、Pandasはデータフレーム(表形式データ)を扱うためのツールです。本講義で構築した環境を使って、統計学の実践的な演習に入ります。


参考文献

  1. 『Pythonによる統計分析入門』(技術評論社)
    Pythonを使って統計分析を学ぶための入門書。Jupyter Notebookの使い方も詳しく解説されています。

  2. 『データサイエンスのためのPython』(オライリージャパン)
    Pythonの基本文法からデータ分析ライブラリの活用まで、幅広く学べる実践書。

  3. Jupyter Notebook公式ドキュメント
    https://jupyter.org/
    Jupyter Notebookの詳細な機能やカスタマイズ方法が記載されています。

Lecture 2データの読み込み — CSV・Excelファイルの処理

13:00

データの読み込み — CSV・Excelファイルの処理

なぜデータの読み込みが重要なのか?

データ分析の第一歩は、データをコンピュータに読み込ませることです。Pythonでは、CSVやExcelなどの形式のファイルを簡単に読み込むことができ、統計分析や可視化の基盤になります。例えば、CSVファイルは「コンマで区切られた値(Comma-Separated Values)」の略で、テキストエディタで開くと表形式のデータが並んでいるのがわかります。一方、Excelファイルは複数シートを持つこともでき、数式や書式の情報も含むため、ビジネスデータにはよく使われます。

前回の講義でJupyter Notebookの基本操作を学んだあなたなら、今からPythonコードを書いてデータを読み込む準備が整っています。この講義では、具体的なコード例を使ってCSVとExcelファイルの読み込み方法を丁寧に解説します。


CSVファイルとExcelファイルの違い

ファイル形式 特徴 使用例 メリット デメリット
CSV シンプルなテキスト形式 研究データ、ログファイル 軽量でどのソフトでも開ける 書式や計算式を保持できない
Excel スプレッドシート形式 財務データ、複雑な数式 シートごとの処理や書式が可能 大きなファイルだと読み込みが遅い

例:
CSVファイルは以下のように見えます(テキストエディタで開いた場合):

名前,年齢,出身地
太郎,25,東京
花子,30,大阪

Excelファイルは、セルの色やフォントサイズなどの装飾情報も保存できるため、プレゼン用データに適しています。


PythonでCSVファイルを読み込む方法

Pythonではpandasライブラリを使ってCSVファイルを読み込みます。まず、pandasをインポートし、read_csv()関数を使います。以下が基本的なコードです。

import pandas as pd

# CSVファイルを読み込む
df = pd.read_csv('data.csv')

# 最初の3行を表示
print(df.head(3))

解説:
- pd.read_csv('data.csv'): data.csvという名前のファイルを読み込み、データフレーム(df)に格納します。 - df.head(3): データフレームの最初の3行を表示します。

注意点:
- ファイルがカレントディレクトリにない場合、フルパスを指定する必要があります(例: 'C:/data/data.csv')。 - 文字コードがShift_JISUTF-8の場合、encodingパラメータで指定します(例: pd.read_csv('data.csv', encoding='shift_jis'))。


PythonでExcelファイルを読み込む方法

Excelファイルを読み込むには、pandasread_excel()関数を使います。ただし、Excelファイルを処理するためのopenpyxlライブラリを事前にインストールする必要があります。

import pandas as pd

# Excelファイルを読み込む
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')

# 最初の2行を表示
print(df.head(2))

解説:
- pd.read_excel('data.xlsx'): data.xlsxという名前のExcelファイルを読み込みます。 - sheet_name='Sheet1': 特定のシート(例: Sheet1)を指定します。省略すると最初のシートが読み込まれます。

インストール方法:
Anacondaやpipを使ってopenpyxlをインストールします。

pip install openpyxl

読み込み時の注意点とトラブルシューティング

よくあるエラーと対処法

  1. ファイルが見つからない
  2. ファイル名のスペルミスを確認
  3. ファイルの保存場所をos.getcwd()で確認

  4. 文字化けする

  5. encoding='utf-8'encoding='shift_jis'を指定

  6. ヘッダーがないデータ

  7. header=Noneを指定し、列名を手動で設定
# ヘッダーがないCSVの読み込み例
df = pd.read_csv('no_header.csv', header=None, names=['ID', 'Name', 'Score'])

実践ワーク

以下の手順で練習してみましょう:

  1. CSVファイルの作成
    任意の表データをテキストエディタで作成し、practice.csvという名前で保存します。例: 名前,点数,科目 ジョン,85,数学 エミリー,90,英語

  2. Pythonコードで読み込み
    以下のコードをJupyter Notebookにコピーして実行します: python import pandas as pd df = pd.read_csv('practice.csv') print(df)

  3. Excelファイルの作成と読み込み
    Excelで同じデータを入力し、practice.xlsxとして保存します。read_excel()を使って読み込みましょう。


まとめと次回の準備

今回の講義では、CSVとExcelファイルの読み込み方法を学びました。Pythonとpandasを使うことで、どんなデータも簡単にデータフレームに変換でき、統計分析の準備が整います。次回は「データの要約統計量」について学び、平均や標準偏差の計算方法を解説します。ぜひJupyter Notebookで練習して、データの読み込みに慣れておきましょう。

次回準備:
- 本講義で読み込んだデータを活用して、次回の演習に備えましょう。 - pandasdescribe()メソッドについて調べてみてください。


参考文献

  1. 『Pythonによるデータ分析入門』(Wes McKinney著、オライリー・ジャパン)
  2. pandas公式ドキュメント: https://pandas.pydata.org/docs/
  3. 『Pythonで学ぶ統計学』(小柳俊郎著、技術評論社)

Lecture 3データの可視化 — 折れ線グラフと棒グラフの描画

14:00

データの可視化 — 折れ線グラフと棒グラフの描画

第2講では、CSV・Excelファイルの読み込みとデータの基本的な処理方法を学びました。この第3講では、Pythonを使ってデータを「視覚化」する方法について詳しく説明します。データの可視化は、複雑な数字の羅列を「人間が理解しやすい形」に変換するための重要なスキルです。特に折れ線グラフと棒グラフは、ビジネスや研究で最もよく使われる2つのグラフ形式です。

データ可視化の目的と重要性

データを単に数字として見ても、全体の傾向や特徴を把握するのは難しくありませんか?例えば、ある月の毎日の売上データを表にしても、「5月15日に急に売上が増えた理由は?」という問いには答えにくいです。しかし、これをグラフにすると、傾向や変化が一目でわかります。

データ可視化のメリット 説明
視覚的理解 数字よりも図形で理解しやすい
傾向の把握 折れ線グラフでトレンドを確認
比較の容易化 棒グラフでカテゴリ間の差を明確に
コミュニケーションの改善 非専門家でも理解できる形でプレゼン

この講義では、Pythonのmatplotlibライブラリを使って、これらのグラフを実際に描いてみましょう。

折れ線グラフの描画:時系列データの表現

折れ線グラフは、時間の経過に伴う変化を表現するのに最適です。例えば、1ヶ月間の気温変化や、企業の株価推移などに使われます。

コード例:月間気温データの可視化

import matplotlib.pyplot as plt
import pandas as pd

# 仮想データの作成(第2講で学んだCSV読み込みと同様)
data = {
    "日付": pd.date_range("2023-04-01", "2023-04-30", freq="D"),
    "気温(℃)": [15, 16, 17, 18, 20, 22, 25, 24, 23, 22, 20, 19, 18, 17, 16, 15, 14, 13, 12, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
}
df = pd.DataFrame(data)

# 折れ線グラフの描画
plt.figure(figsize=(10, 5))
plt.plot(df["日付"], df["気温(℃)"], marker="o", color="blue", linestyle="--", linewidth=2)
plt.title("4月の気温推移", fontsize=16)
plt.xlabel("日付", fontsize=12)
plt.ylabel("気温(℃)", fontsize=12)
plt.grid(True)
plt.xticks(rotation=45)  # 日付ラベルを45度回転
plt.tight_layout()  # ラベルがはみ出ないよう調整
plt.show()

コード解説
- plt.plot():x軸とy軸を指定し、折れ線を描画。marker="o"でデータ点を丸で表示。 - linestyle="--":破線を使用。color="blue"で青色に指定。 - plt.xticks(rotation=45):x軸のラベル(日付)が重ならないように45度回転。

このグラフを見ると、4月中旬に気温が上昇し、下旬に急落していることが一目でわかります。このような傾向は、数字だけでは気づきにくいです。

棒グラフの描画:カテゴリ間の比較

棒グラフは、複数のカテゴリ間での比較に最適です。例えば、4月の各週の売上高比較や、商品別の販売数比較などに使われます。

コード例:週ごとの売上データの可視化

import numpy as np

# 仮想データの作成
weeks = ["第1週", "第2週", "第3週", "第4週"]
sales = [120, 150, 130, 180]  # 万円

# 棒グラフの描画
plt.figure(figsize=(8, 6))
bars = plt.bar(weeks, sales, color=["#ff9999", "#66b2ff", "#99ff99", "#c2c2f0"], width=0.4)
plt.title("4月の週別売上高", fontsize=16)
plt.xlabel("週", fontsize=12)
plt.ylabel("売上高(万円)", fontsize=12)
plt.grid(axis="y", linestyle="--", alpha=0.7)

# 棒の上に数値を表示
for bar, value in zip(bars, sales):
    yval = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2, yval + 2, str(value), ha="center", va="bottom")

plt.show()

コード解説
- plt.bar():x軸にカテゴリ(weeks)、y軸に数値(sales)を指定。 - color:各棒に異なる色を割り当て。width=0.4で棒の幅を調整。 - plt.text():棒の上に数値を表示。ha="center"で水平方向の中央寄せ、va="bottom"で下寄せ。

このグラフを見ると、第4週が最も売上が高く、第2週が2番目に高いことがわかります。棒グラフは、カテゴリ間の差を視覚的に強調するのに役立ちます。

折れ線 vs 棒グラフ:どちらを使うべきか?

グラフ種類 適切な使用シーン
折れ線グラフ 時系列データの傾向 気温の変化、株価の推移
棒グラフ カテゴリ間の比較 月別売上、商品別販売数

注意点
- 折れ線グラフは「連続的な変化」を表現するため、データポイント間の関係性がある場合に適します。 - 棒グラフは「離散的なカテゴリ」の比較に適します。例えば、1週間の売上高を比較する場合など。

実践ワーク:CSVファイルからグラフを描いてみよう

以下は、第2講で使用したCSVファイルの例です。このデータを使って折れ線グラフと棒グラフを描いてみましょう。

仮想CSVデータ(sales_data.csv):

日付,売上高
2023-04-01,100
2023-04-02,120
22023-04-03,130
...

演習課題

  1. sales_data.csvを読み込み、日付ごとの売上高を折れ線グラフに描画してください。
  2. 4月の週ごとの売上高を棒グラフに描画してください。
  3. 両方のグラフを比較し、何が言えるか考察してください。

ヒント
- 折れ線グラフはplt.plot()、棒グラフはplt.bar()を使用。 - 日付のフォーマットを整えるためにpd.to_datetime()を使うと便利です。

まとめと次回の準備

本講義では、折れ線グラフと棒グラフの描画方法について学びました。
- 折れ線グラフは「時間の経過に伴う変化」を表現するのに最適。 - 棒グラフは「カテゴリ間の比較」に最適。 - 両方のグラフは、データの傾向や差を視覚的に理解するための強力なツール。

次回の準備
- 第4講では、ヒストグラムや散布図の描画方法について学びます。
- 本講義で使用したmatplotlibの他に、seabornというライブラリも紹介予定です。

参考文献

  1. McKinney, W. (2022). Python for Data Analysis (3rd ed.). O'Reilly Media.
  2. Matplotlib公式ドキュメント: https://matplotlib.org/stable/contents.html
  3. 井上 智 (2021). Pythonによるデータサイエンス入門 (第2版). 技術評論社.
  4. Pandas公式ドキュメント: https://pandas.pydata.org/docs/

データ可視化は、単にグラフを描くだけでなく、「何を伝えたいのか」を明確にすることが大切です。練習を重ねて、自分なりのスタイルを確立してください!

Lecture 4統計量の基礎 — 平均・中央値・標準偏差の計算

12:30

統計量の基礎 — 平均・中央値・標準偏差の計算

前回の第3講で、折れ線グラフや棒グラフを使ってデータの可視化を学びました。しかし、グラフに頼ってばかりいると「このデータの特徴はどこにあるのか?」という質問に答えづらい場合があります。今回の講義では、データの特徴を数値で捉えるための基本統計量(平均・中央値・標準偏差)について、Pythonを使って具体的に学んでいきます。これらの統計量は、データの「中心傾向」と「散らばり具合」を理解するための切り口となるため、今後のデータ分析の基盤になります。


平均(Mean)の計算と意味

平均は、データの「中心位置」を表す最も基本的な統計量です。すべてのデータを足し合わせた総和を、データ数で割った値です。例えば、テストの点数が [70, 85, 90, 60, 100] の場合、平均点は (70 + 85 + 90 + 60 + 100) / 5 = 81 点となります。

Pythonでは、numpyライブラリのmean()関数を使って簡単に計算できます。

import numpy as np

# データの例(テストの点数)
scores = np.array([70, 85, 90, 60, 100])

# 平均の計算
mean_score = np.mean(scores)
print(f"平均点: {mean_score}")

補足説明
平均は「データのバランス点」のようにイメージできます。例えば、棒グラフの上に棒を水平に置いたときに傾かない点が平均です。ただし、極端な値(外れ値)があると、平均が実際のデータの中心からずれることがあります。この点は後述の中央値と比較して理解してください。


中央値(Median)の計算と意味

中央値は、データを大きさ順に並べたときの「真ん中の値」です。データ数が奇数の場合、中央の1つの値が中央値になります。偶数の場合、中央の2つの値の平均が中央値です。

Pythonではnumpymedian()関数を使って計算できます。

# データの例(収入データ:外れ値あり)
incomes = np.array([30, 35, 40, 45, 50, 55, 1000])  # 1000は外れ値

# 中央値の計算
median_income = np.median(incomes)
print(f"中央値: {median_income}")

補足説明
上の例では、中央値は 50 になります。平均値(180.71)と比べて、外れ値(1000)の影響を受けにくいことがわかります。中央値は「データの真ん中」を表すため、外れ値がある場合や分布が偏っている場合に適しています。


標準偏差(Standard Deviation)の計算と意味

標準偏差は、データの「散らばり具合」を表す統計量です。値が大きいほどデータが平均から離れており、小さいほど平均に近い値が集まっています。具体的には、平均との差の2乗の平均(分散)の平方根を計算します。

Pythonではnumpystd()関数を使って計算できます。ただし、標本標準偏差を求める場合はddof=1を指定します。

# データの例(製品の長さ)
lengths = np.array([10.1, 10.2, 10.0, 9.8, 10.3])

# 標準偏差の計算(母集団標準偏差)
std_pop = np.std(lengths)
# 標本標準偏差(ddof=1)
std_sample = np.std(lengths, ddof=1)

print(f"母集団標準偏差: {std_pop}")
print(f"標本標準偏差: {std_sample}")

補足説明
- 母集団標準偏差:データ全体が母集団である場合(例:全員のテスト結果)に使います。 - 標本標準偏差:データが母集団の一部(標本)である場合に使います。ddof=1で「不偏推定」を行います。


平均・中央値・標準偏差の比較

統計量 意味 外れ値への影響 計算方法の特徴
平均 データの「バランス点」 影響を受けやすい 全てのデータを足して割る
中央値 データの「真ん中」 影響を受けにくい データを並べ替えて中央の値を選ぶ
標準偏差 データの「散らばり具合」 影響を受けやすい 平均との差を2乗して平均を取り平方根

実践ワーク:統計量を活用したデータ分析

以下のように、前回学んだCSVファイルの読み込みと組み合わせて、実際のデータセットで統計量を計算してみましょう。

import pandas as pd

# CSVファイルの読み込み(例: サンプルデータ)
df = pd.read_csv("sample_data.csv")

# 平均・中央値・標準偏差の計算
mean_value = df["価格"].mean()
median_value = df["価格"].median()
std_value = df["価格"].std()

print(f"平均価格: {mean_value}")
print(f"中央値価格: {median_value}")
print(f"標準偏差: {std_value}")

ヒント
- データに外れ値が含まれる場合(例: 超高額物件)、平均値と中央値の差が大きくなります。 - 標準偏差が0の場合は、すべてのデータが同じ値です。


まとめと次回の準備

今回の講義で学んだポイントをまとめると: 1. 平均はデータのバランス点を表すが、外れ値に弱い。 2. 中央値は外れ値に強く、分布が偏っている場合に適している。 3. 標準偏差は散らばり具合を表し、データの品質を評価するのに役立つ。

次回の第5講では、相関係数や散布図を使って「2つの変数の関係」を分析する方法を学びます。準備として、pandascorr()関数やseabornライブラリの基本的な使い方を確認しておくとスムーズです。


参考文献

  1. McKinney, W. (2022). Python for Data Analysis (3rd ed.). O'Reilly Media.
    → NumPyやpandasの基本的な使い方を学ぶための定番書籍。
  2. VanderPlas, J. (2016). Python Data Science Handbook. O'Reilly Media.
    → 統計分析と可視化の実践的なテクニックが解説されている。
  3. NumPy公式ドキュメント: https://numpy.org/doc/
    mean(), median(), std()などの関数の詳細な説明が記載されている。

Lecture 5散布図と相関係数 — 2変数の関係性の見方

13:30

散布図と相関係数 — 2変数の関係性の見方

これまでの講義で、単一のデータ列(1変数)の特徴を平均や標準偏差で分析する方法を学んできました。しかし、現実世界では「2つのデータ列がどのように関係しているか?」を知ることが重要です。例えば、「勉強時間」と「テストの点数」には関係性があるのか?「気温」と「アイスクリームの売上」は比例するのか?この講義では、2変数の関係性を視覚的に見る「散布図」と、数値で評価する「相関係数」について詳しく学びます。


散布図の基礎と描き方

散布図(scatter plot)は、2つの変数の関係性を視覚的に確認するためのグラフです。横軸に1つの変数、縦軸に別の変数を配置し、データ点をプロットすることで、パターンや傾向を読み取ります。Pythonではmatplotlibseabornライブラリで簡単に描画できます。

例: 身長と体重の散布図

import matplotlib.pyplot as plt
import pandas as pd

# サンプルデータ(CSVファイルを読み込む例)
data = pd.read_csv("height_weight.csv")

# 散布図の描画
plt.scatter(data["height"], data["weight"], alpha=0.6)  # alphaで点の透明度を調整
plt.title("身長 vs 体重")
plt.xlabel("身長 (cm)")
plt.ylabel("体重 (kg)")
plt.grid(True)
plt.show()

このコードでは、height(身長)とweight(体重)の関係をプロットしています。データ点が右上に向かって集まる傾向があると、「正の相関」があることを示します。


相関係数とは?

相関係数(correlation coefficient)は、2つの変数の関係性の強さと向きを数値化した指標です。最も一般的なのは「ピアソンの相関係数」で、-1から1の範囲を取ります。

関係性の意味
1 完全な正の相関(直線的に比例)
0 相関なし(無相関)
-1 完全な負の相関(直線的に反比例)

例: ピアソンの相関係数の計算

import pandas as pd

# サンプルデータ
data = pd.DataFrame({
    "x": [1, 2, 3, 4, 5],
    "y": [2, 4, 5, 4, 5]
})

# 相関係数の計算
correlation = data["x"].corr(data["y"])
print(f"相関係数: {correlation:.2f}")

このコードでは、xyの相関係数を計算します。結果が0.8であれば、強い正の相関があることを示します。


相関係数の計算と解釈

相関係数は、2つの変数の共分散をそれぞれの標準偏差で割った値です。公式は以下の通りです:

$$ r = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y} $$

ただし、 - $ \text{Cov}(X, Y) $: XとYの共分散 - $ \sigma_X, \sigma_Y $: XとYの標準偏差

例: 実際のデータでの計算

import numpy as np

# 共分散と標準偏差の計算
cov = np.cov(data["x"], data["y"], ddof=0)[0][1]
std_x = np.std(data["x"], ddof=0)
std_y = np.std(data["y"], ddof=0)

# 手動で相関係数を計算
manual_correlation = cov / (std_x * std_y)
print(f"手動計算の相関係数: {manual_correlation:.2f}")

このコードでは、numpyを使って共分散と標準偏差を求めて相関係数を手動で計算します。結果が0.8であれば、先ほどのdata.corr()の結果と一致します。


散布図と相関係数の関係

散布図と相関係数は「視覚」と「数値」の2つの側面から関係性を理解するためのツールです。以下のようなパターンがあります:

パターン 相関係数の値 説明
右上に集まる直線状 0.8~1.0 強い正の相関
左下に集まる直線状 -0.8~-1.0 強い負の相関
乱雑に散らばる 0~0.3 無相関または弱い相関
折れ線状のパターン 0.5~0.7 非線形な相関(例: 二次関数)

例: 非線形な関係の散布図

import numpy as np

# 非線形なデータ(y = x^2)
x = np.linspace(-3, 3, 100)
y = x**2 + np.random.normal(0, 1, 100)

plt.scatter(x, y, alpha=0.5)
plt.title("非線形な関係")
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
plt.show()

このコードでは、y = x^2の二次関数にノイズを加えたデータをプロットします。相関係数は0に近いですが、散布図を見ると「U字型」のパターンが見えます。このように、相関係数だけでは非線形な関係は検出できないため、散布図との併用が重要です。


注意すべき点:相関と因果

相関係数が高いからといって、「AがBを引き起こす」とは限りません。これは「相関≠因果」の誤解と呼ばれます。例えば、アイスクリームの売上と溺水事故の数は正の相関があるかもしれませんが、実際には「気温が高くなる」ことで両者が増加するという別の要因(交差因子)が存在します。

例: 虚偽の相関

# 2つの無関係な乱数列
np.random.seed(42)
x = np.random.rand(100)
y = np.random.rand(100)

plt.scatter(x, y, alpha=0.5)
plt.title("無関係なデータ")
plt.xlabel("ランダムなx")
plt.ylabel("ランダムなy")
plt.grid(True)
plt.show()

このコードでは、ランダムに生成された2つのデータ列をプロットします。たまたま相関係数が0.2になる場合もありますが、これは偶然です。このような虚偽の相関に注意する必要があります。


実践ワーク

以下のステップで練習してみましょう:

  1. データの読み込み
    seabornのサンプルデータセット(例: tips)を読み込みます。 python import seaborn as sns tips = sns.load_dataset("tips")

  2. 散布図の描画
    total_bill(合計請求額)とtip(チップ)の散布図を描き、相関係数を計算します。 python plt.scatter(tips["total_bill"], tips["tip"], alpha=0.6) plt.title("合計請求額 vs チップ") plt.xlabel("合計請求額 ($)") plt.ylabel("チップ ($)") plt.grid(True) plt.show()

  3. 相関係数の計算
    python correlation = tips["total_bill"].corr(tips["tip"]) print(f"相関係数: {correlation:.2f}")

  4. 解釈
    相関係数が0.6以上であれば「強い正の相関」があると判断できます。この場合、合計請求額が高いほどチップの額が多い傾向があると解釈できます。


まとめと次回の準備

本講義では、2変数の関係性を視覚的に見る散布図と、数値で評価する相関係数について学びました。散布図はパターンの確認に、相関係数は関係性の強さを測るのに役立ちますが、両者の併用が重要です。また、相関≠因果の誤解を避けるために、背景にある要因を考慮する必要があります。

次回の講義では、「回帰分析」について学びます。回帰分析は、2変数の関係性を数式で表すことで、未来の値を予測する手法です。準備として、以下の練習を行っておきましょう: - 散布図を描く際、色やマーカーの種類を変えて視覚を工夫する - 相関係数の計算結果をExcelやJupyter Notebookで確認する


参考文献

  1. 『Pythonで学ぶデータサイエンス入門』(平成出版社)
  2. Pythonによるデータ可視化や統計分析の基礎をわかりやすく解説。
  3. 『統計学入門 (基礎統計学講座)』(東京図書)
  4. 相関係数や回帰分析の理論を丁寧に説明した書籍。
  5. Pandas公式ドキュメント(https://pandas.pydata.org/docs/)
  6. データフレーム操作や統計関数の詳細な説明がある。

Lecture 6確率分布の理解 — 正規分布とヒストグラムの活用

14:00

確率分布の理解 — 正規分布とヒストグラムの活用

前回までの講義で、折れ線グラフや棒グラフ、散布図などの可視化手法や、平均・中央値・標準偏差などの統計量を学びました。今回の第6講では、データの分布を深く理解するための重要な概念である「確率分布」に焦点を当て、特に「正規分布」と「ヒストグラム」の活用方法について詳しく解説します。これにより、データがどのような形で分布しているのか、そしてその背後にあるパターンを読み取る力を養います。


1. 確率分布とは?データの「形」を捉える

確率分布(Probability Distribution)は、ある現象が起こる可能性(確率)がどのように分布しているかを示す統計学の概念です。例えば、サイコロを100回振ったとき、1〜6の目がそれぞれどのくらいの頻度で出るかを表すのが確率分布です。この概念は、自然界や社会現象に現れるデータの分布をモデル化するのに非常に役立ちます。

例: 身長の分布

日本国内の18歳男性の身長を測定した場合、データは「正規分布」に近い形で分布します。これは、平均値(例: 170cm)を中心に、高い確率でその周辺にデータが集まり、極端に高い(例: 190cm)や低い(例: 150cm)値は極めて少ないことを意味します。


2. 正規分布(ガウス分布)の特徴と応用

正規分布(Normal Distribution)は、統計学において最も重要な確率分布の一つです。その形は「ベルカーブ(bell curve)」として知られ、以下の2つのパラメータで完全に定義されます。

パラメータ 説明 記号
平均(μ) データの中心位置 μ
標準偏差(σ) データの散らばり具合 σ

正規分布の数学的表現

正規分布は以下の確率密度関数で表されます。

$$ f(x) = \frac{1}{\sigma \sqrt{2\pi}} e^{-\frac{(x - \mu)^2}{2\sigma^2}} $$

Pythonでの正規分布の可視化

以下に、Pythonで正規分布を描画するコード例を示します。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

# パラメータ設定
mu = 170  # 平均
sigma = 10  # 標準偏差

# xの範囲を設定
x = np.linspace(140, 200, 1000)
# 正規分布の確率密度関数を計算
y = norm.pdf(x, mu, sigma)

# グラフ描画
plt.plot(x, y, label=f'μ={mu}, σ={sigma}', color='blue')
plt.title('正規分布の例')
plt.xlabel('身長 (cm)')
plt.ylabel('確率密度')
plt.legend()
plt.grid(True)
plt.show()

このコードは、平均170cm、標準偏差10cmの正規分布を描画します。実行すると、左右対称のベルカーブが表示されます。このグラフから、例えば「170cm〜180cmの範囲に約68%のデータが含まれる」という性質を視覚的に理解できます(68-95-99.7ルール)。


3. ヒストグラムでデータの分布を可視化する

ヒストグラム(Histogram)は、連続的なデータを「度数分布表」にした上で、棒グラフで表現したものです。各棒の高さは、対応する範囲(ビン)に含まれるデータ数を示します。これにより、データが「山」のように集中しているか、あるいは「平ら」に分布しているかを視覚的に確認できます。

ヒストグラムの作成手順

  1. データの範囲を決めます(例: 身長の最小値〜最大値)。
  2. 範囲を複数の「ビン(bin)」に分割します。
  3. 各ビンに含まれるデータ数をカウントします。
  4. 棒グラフとして描画します。

Pythonでのヒストグラム作成例

以下に、ランダムに生成した身長データのヒストグラムを作成するコードを示します。

import numpy as np
import matplotlib.pyplot as plt

# ランダムな身長データを生成(正規分布に従う)
np.random.seed(0)  # 再現性のためのシード
heights = np.random.normal(loc=170, scale=10, size=1000)

# ヒストグラムの描画
plt.hist(heights, bins=20, edgecolor='black', alpha=0.7, color='skyblue')
plt.title('身長データのヒストグラム')
plt.xlabel('身長 (cm)')
plt.ylabel('度数')
plt.grid(True, axis='y')
plt.show()

このコードでは、np.random.normal関数で正規分布に従う1000人の身長データを生成しています。bins=20で20個のビンに分けてヒストグラムを描画します。実行すると、データがベルカーブに近い形で分布していることが確認できます。


4. ヒストグラムと正規分布の比較

ヒストグラムを描いた後、そのデータが正規分布に近いかどうかを確認するには、以下のように正規分布の曲線を重ね描きします。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

# データとヒストグラムの描画(前回のコードと同様)
heights = np.random.normal(loc=170, scale=10, size=1000)
plt.hist(heights, bins=20, edgecolor='black', alpha=0.7, color='skyblue', density=True)

# 正規分布曲線の重ね描き
x = np.linspace(140, 200, 1000)
y = norm.pdf(x, loc=170, scale=10)
plt.plot(x, y, 'r-', lw=2, label='正規分布')

plt.title('ヒストグラムと正規分布の比較')
plt.xlabel('身長 (cm)')
plt.ylabel('確率密度')
plt.legend()
plt.grid(True)
plt.show()

density=Trueを指定することで、ヒストグラムの面積が1になるように正規化され、確率密度関数との比較が可能になります。このグラフを見ると、ランダムに生成したデータが理論的な正規分布にどれほど近いかを視覚的に評価できます。


5. ヒストグラムの解釈と注意点

ヒストグラムを解釈する際には、以下のポイントに注意してください。

ポイント 説明
ビンの数 ビンが多すぎるとノイズが強調され、少なすぎると情報が失われる
偏り(Skewness) データが片方に偏っている場合(例: 所得分布)
モードの数 1つの山(単峰性)か、複数の山(多峰性)か

例: 所得分布のヒストグラム

所得データは通常、右に長く伸びる「右に偏った分布(右偏分布)」を示します。これは、極めて高い所得者が一部に存在するためです。このようなデータに正規分布を適用すると誤解を生じるため、対数変換などの前処理が必要です。


6. 実践ワーク: ヒストグラムを作成してみよう

以下は、読者が自らヒストグラムを作成するための練習問題です。

問題

以下のように、ランダムに生成されたテストスコアデータ(0〜100点)に対してヒストグラムを作成し、正規分布の曲線を重ね描きしてください。また、ビンの数を変えて(例: 10, 20, 30)、分布の見え方の違いを観察してください。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

# テストスコアデータの生成(正規分布に従う)
np.random.seed(0)
scores = np.random.normal(loc=70, scale=15, size=500)

# ヒストグラムの描画
plt.hist(scores, bins=20, edgecolor='black', alpha=0.7, color='lightgreen', density=True)

# 正規分布曲線の重ね描き
x = np.linspace(30, 110, 1000)
y = norm.pdf(x, loc=70, scale=15)
plt.plot(x, y, 'r-', lw=2, label='正規分布')

plt.title('テストスコアのヒストグラムと正規分布')
plt.xlabel('スコア')
plt.ylabel('確率密度')
plt.legend()
plt.grid(True)
plt.show()

7. まとめと次回の準備

本講義では、確率分布の基本概念と正規分布の特徴、そしてヒストグラムの作成方法について学びました。正規分布は多くの自然現象に現れるため、データの分布を理解するための基盤となる概念です。ヒストグラムは、データがどのような形で分布しているかを視覚的に確認するための強力なツールです。

次回の講義では、「統計的推定と検定」に進み、標本データから母集団を推測する方法や、仮説検定の基本を学びます。本講義で学んだ正規分布の知識は、特に「t検定」や「信頼区間の計算」などに活かされます。


参考文献

  1. 『Pythonによる統計学入門』 - 松浦健太郎(技術評論社)
    Pythonを活用した統計学の基礎をわかりやすく解説した入門書。

  2. 『データサイエンスのための統計学入門』 - 松本紀男(オーム社)
    確率分布や推定・検定の応用例を含む実践的な内容。

  3. Scipy公式ドキュメント(https://docs.scipy.org/doc/scipy/reference/stats.html)
    scipy.statsモジュールの詳細な説明が載っている公式リファレンス。

Lecture 7仮説検定の基礎 — t検定の実践的な使い方

13:00

仮説検定の基礎 — t検定の実践的な使い方

こんにちは!第7講では、統計学の応用として「仮説検定」の基礎を学び、特にt検定の実践的な使い方をPythonで実装してみましょう。これまでの講義で学んだ「平均・標準偏差」「正規分布」「相関係数」が、仮説検定の土台となる概念です。本講義では、データから「本当に差があるのか?」という問いに統計的に答えられるようになります。


仮説検定とは?

仮説検定は、観測されたデータから「ある仮説が正しいかどうか」を統計的に評価する方法です。例えば、ある薬が本当に効くのか、新しい勉強法が成績に影響を与えるのかなど、「差があるかどうか」を判断するために使われます。

仮説の2種類

  1. 帰無仮説(H₀):差がない、効果がないという仮説(例:薬Aと薬Bの効果は同じ)
  2. 対立仮説(H₁):差がある、効果があるという仮説(例:薬Aの方が薬Bより効果がある)

仮説検定では、帰無仮説が正しいと仮定して、観測されたデータがどれだけ「珍しい」ものかを評価します。この「珍しさ」が基準(p値)を超えていれば、帰無仮説を棄却し、対立仮説を採用します。


t検定の種類と使い分け

t検定は、母分散(データのばらつき)が不明な場合に用いられる検定です。主に以下の3種類があります。

検定の種類 使用する場面
一標本t検定 1つのサンプルの平均が理論値と異なるかを検定 学校の生徒の平均身長が160cmと異なるか
二標本t検定 2つの独立したグループの平均値の差を検定 男子と女子の数学テストの平均点に差があるか
対応のあるt検定 同じ対象の「前後」の測定値(例:ダイエット前後の体重)の差を検定 勉強法改善前後のテスト成績に差があるか

一標本t検定の実践

例題:ある高校の生徒10人の身長データから、母平均が160cmであるという仮説を検定します。

Pythonでの実装

from scipy.stats import ttest_1samp
import numpy as np

# サンプルデータ(生徒の身長)
heights = np.array([165, 158, 170, 162, 168, 155, 175, 160, 163, 167])

# 仮説:母平均は160cm
t_stat, p_value = ttest_1samp(heights, 160)

print(f"t値: {t_stat:.2f}, p値: {p_value:.4f}")

結果の解釈
- p値が0.05より小さい場合 → 仮説「母平均は160cm」を棄却(差がある)
- 例:p値が0.03 → 95%の信頼で差があると結論付けられる


二標本t検定の実践

例題:AクラスとBクラスの数学テストの平均点に差があるかを検定します。

Pythonでの実装

from scipy.stats import ttest_ind

# サンプルデータ(AクラスとBクラスのテスト点)
a_scores = np.array([70, 75, 80, 85, 90])
b_scores = np.array([60, 65, 70, 75, 80])

# 仮説:AクラスとBクラスの平均点は同じ
t_stat, p_value = ttest_ind(a_scores, b_scores)

print(f"t値: {t_stat:.2f}, p値: {p_value:.4f}")

注意点
- 等分散性(分散が同じかどうか)を確認する必要があります。
- 等分散性が成り立たない場合、equal_var=Falseを指定します。


対応のあるt検定の実践

例題:ダイエット前後の体重に差があるかを検定します。

Pythonでの実装

from scipy.stats import ttest_rel

# サンプルデータ(ダイエット前後の体重)
before = np.array([60, 65, 70, 75, 80])
after = np.array([58, 63, 68, 73, 78])

# 仮説:ダイエット前後の体重に差はない
t_stat, p_value = ttest_rel(before, after)

print(f"t値: {t_stat:.2f}, p値: {p_value:.4f}")

ポイント
- 対応のあるデータ(同じ対象の測定値)は、差分の平均を検定します。
- p値が0.05より小さい場合、ダイエットによって体重が減少したと結論付けられます。


実践ワーク

以下の課題に取り組んでください:

課題:2つの勉強法(AとB)の成績に差があるかをt検定で検証してください。
- データ:
python a_method = [75, 80, 85, 90, 95] b_method = [65, 70, 75, 80, 85] - 作業:
1. 二標本t検定を実行し、p値を確認してください。
2. p値が0.05より小さい場合、「差がある」と結論付け、そうでない場合は「差がない」とします。


まとめと次回の準備

本講義で学んだポイント:
1. 仮説検定は「差があるかどうか」を統計的に評価する方法
2. t検定は母分散が不明な場合に用いられる(一標本・二標本・対応のある)3種類がある
3. Pythonのscipy.statsライブラリで簡単に実行できる

次回の準備
- 第8講では「分散分析(ANOVA)」について学びます。複数グループの比較に必要な検定方法です。
- ぜひ「仮説検定の結果の解釈」について復習してください!


参考文献

  1. 『統計学入門』 東京大学出版会(日本語)
  2. 『Pythonによるデータ分析入門』 オライリー・ジャパン(日本語)
  3. scipy.stats公式ドキュメント(英語)

Lecture 8回帰分析入門 — 1変数線形回帰モデルの作成

14:30

回帰分析入門 — 1変数線形回帰モデルの作成

回帰分析とは

回帰分析は、2つの変数の関係を数式で表し、1つの変数からもう1つの変数を予測する手法です。前回の講義で学んだ「相関係数」は2つの変数の関係の強さを測るだけでしたが、回帰分析はその関係を数式化することで、具体的な予測や因果関係の理解が可能になります。

たとえば、住宅の「広さ(㎡)」と「価格(万円)」の関係を調べる場合、広さが100㎡の住宅の価格が1,500万円、120㎡の住宅が1,800万円であれば、広さが増えるごとに価格が増加していると推測できます。この関係を直線で表すのが「1変数線形回帰モデル」です。


数学的基礎:1変数線形回帰モデル

モデルの式と係数の意味

1変数線形回帰モデルは、以下の式で表されます:

$$ y = a + bx + \epsilon $$

  • y: 目的変数(予測したい値、例:住宅価格)
  • x: 説明変数(入力値、例:広さ)
  • a: 切片(x=0のときのyの値)
  • b: 傾き(xが1単位増えるとyがどれだけ増えるか)
  • ε(イプシロン): 誤差項(モデルの不確実性)

この式では、bが最も重要な係数です。たとえば、b=50,000であれば、「広さが1㎡増えるごとに価格が50,000万円増える」と解釈できます。

最小二乗法による係数の計算

係数aとbは、最小二乗法という数学的アルゴリズムで計算されます。これは、実際のデータ点と回帰直線の垂直方向の距離(誤差)の二乗和を最小化する方法です。

係数の公式は以下の通りです:

$$ b = \frac{\sum (x_i - \bar{x})(y_i - \bar{y})}{\sum (x_i - \bar{x})^2} \ a = \bar{y} - b\bar{x} $$

  • x̄(xの平均)ȳ(yの平均)は、データの中心点を示します。

決定係数(R²)の解説

モデルの精度を評価するためには、決定係数(R²)を使います。R²は0〜1の値で、1に近いほどモデルがデータを説明できていることを示します。
たとえば、R²=0.8であれば「80%の変動がモデルで説明できる」という意味です。

指標 説明
b(傾き) 1単位あたりの変化量
a(切片) x=0時の基準値
モデルの説明力(0〜1)

Pythonで1変数線形回帰モデルを作る

データの準備

以下のように、Pythonでサンプルデータを生成します。このデータは、広さ(x)と価格(y)の関係を模倣しています。

import numpy as np
import matplotlib.pyplot as plt

# サンプルデータ(広さと価格)
x = np.array([50, 60, 70, 80, 90, 100, 110, 120])  # 広さ(㎡)
y = np.array([800, 900, 1000, 1100, 1200, 1300, 1400, 1500])  # 価格(万円)

# 散布図の描画
plt.scatter(x, y, color='blue', label='実際のデータ')
plt.xlabel('広さ(㎡)')
plt.ylabel('価格(万円)')
plt.legend()
plt.show()

係数の計算とモデルの描画

次に、最小二乗法で係数aとbを計算し、回帰直線をプロットします。

# 平均を計算
x_mean = np.mean(x)
y_mean = np.mean(y)

# 傾きbの計算
numerator = np.sum((x - x_mean) * (y - y_mean))
denominator = np.sum((x - x_mean) ** 2)
b = numerator / denominator
a = y_mean - b * x_mean

# 回帰直線の描画
y_pred = a + b * x
plt.scatter(x, y, color='blue', label='実際のデータ')
plt.plot(x, y_pred, color='red', label=f'回帰直線 (y={a:.2f}+{b:.2f}x)')
plt.xlabel('広さ(㎡)')
plt.ylabel('価格(万円)')
plt.legend()
plt.show()

実行結果の解釈

  • 傾きb=10.0:広さが1㎡増えるごとに価格が10万円増える。
  • 切片a=300.0:広さ0㎡の住宅でも300万円の価値がある(現実的には無理ですが、モデルの基準値)。
  • R²の計算(コード追加): python from sklearn.metrics import r2_score r2 = r2_score(y, y_pred) print(f'決定係数 R²: {r2:.2f}') 出力例: 決定係数 R²: 1.00(完全な直線フィット)

実践ワーク:自分で回帰モデルを作る

以下の課題を試してみましょう:

  1. データ準備
    以下のデータを用意してください(例: 気温とアイスクリームの売上): 気温(℃): [20, 22, 24, 26, 28] 売上(万円): [100, 120, 140, 160, 180]

  2. 係数計算
    上記のコードを参考に、傾きbと切片aを計算してください。

  3. 可視化
    散布図と回帰直線をプロットし、R²を出力してください。

  4. 考察

  5. なぜR²が1.0になるのか説明してください。
  6. 実際のビジネスデータでは、R²が1.0になることはほぼありません。なぜか考えましょう。

まとめと次回の準備

まとめ

  • 回帰分析は、変数間の関係を数式化して予測を行う手法です。
  • 1変数線形回帰モデルは、直線で関係を表す最も基本的な形式です。
  • Pythonでは、最小二乗法と散布図プロットでモデルを作成できます。

次回の準備

次回は「2変数線形回帰モデル」を学びます。たとえば、「広さ」と「立地」の2つの変数を使って住宅価格を予測する方法です。
準備として、以下のキーワードを調べておいてください: - 多変量解析(multivariate analysis) - 回帰係数の統計的有意性(p値)


参考文献

  1. 『Pythonによる統計学入門』(平成教育出版)
    Pythonを用いた統計学の基礎を、具体例で学べます。

  2. 『データサイエンスのための統計学入門』(オライリー・ジャパン)
    回帰分析や確率分布の理論と実践が詳しく解説されています。

  3. scikit-learn公式ドキュメント
    Pythonで統計分析を行う際の関数やアルゴリズムの詳細が記載されています。
    https://scikit-learn.org

Lecture 9カテゴリデータ分析 — カイ二乗検定の実行

12:30

カテゴリデータ分析 — カイ二乗検定の実行

これまでの講義で、連続データ(たとえば身長や体重)を対象にした統計手法を学んできました。第1講では正規分布やヒストグラムを通じてデータの分布を視覚化し、第2講ではt検定を使って平均値の差を検定しました。また第3講では回帰分析によって数値データの関係性をモデル化しました。しかし、実世界のデータの中には「男・女」「晴れ・曇り・雨」のように、数値ではなくカテゴリに分類される情報があります。このようなカテゴリデータの分析には、カイ二乗検定が活用されます。本講義では、カイ二乗検定の基本概念とPythonでの実装方法を、具体的な例を交えて解説します。


カテゴリデータとは何か?

カテゴリデータは、数値ではなく分類のラベルで表されるデータです。たとえば、以下のような例が挙げられます:

データの種類 カテゴリの例
性別 男、女
天気 晴れ、曇り、雨
商品の評価 1星、2星、3星、4星、5星

カテゴリデータは、数値の大小関係を意味せず、単に「どのグループに属するか」を示します。このようなデータを分析するには、連続データで使ったt検定や回帰分析では不適です。なぜなら、カテゴリデータには「平均値」や「相関係数」が意味を持たないからです。


カイ二乗検定の目的

カイ二乗検定は、カテゴリデータの分布に統計的な差があるかを検出する方法です。主に次の2つのケースで使われます:

  1. 独立性の検定
    例:性別と商品の購入率の間に相関があるか?
  2. 適合度検定
    例:サイコロの目が均等に出現するか?

たとえば、以下のような仮説を検定できます:

仮説:「男性と女性の間で、特定商品への関心度に差があるか?」

カイ二乗検定は、観測された度数(実際のデータ)と、仮説が成り立つ場合の期待度数を比較することで、統計的な有意性を判断します。


カイ二乗検定のしくみ

カイ二乗検定では、以下の公式が使われます:

$$ \chi^2 = \sum \frac{(O_i - E_i)^2}{E_i} $$

  • $O_i$:観測度数(実際のデータ)
  • $E_i$:期待度数(仮説が成り立つと仮定した場合の値)
  • $\chi^2$:カイ二乗統計量

この統計量が大きいほど、観測値と期待値のズレが大きいことを意味します。次に、この統計量が「偶然起こる可能性」をp値として計算します。p値が有意水準(通常は0.05)以下なら、仮説を棄却します。


Pythonでカイ二乗検定を実行する

以下に、Pythonのscipyライブラリを使ってカイ二乗検定を実行するコード例を示します。例として、性別(男・女)と商品Aへの関心度(関心あり・関心なし)の関係を検定します。

import numpy as np
from scipy.stats import chi2_contingency

# 2x2のクロス表(観測度数)
observed = np.array([
    [30, 70],  # 男性の関心あり・なし
    [50, 50]   # 女性の関心あり・なし
])

# カイ二乗検定の実行
chi2, p, dof, expected = chi2_contingency(observed)

# 結果の表示
print(f"カイ二乗統計量: {chi2:.2f}")
print(f"p値: {p:.4f}")
print("期待度数:")
print(expected)

実行結果の解釈

  • カイ二乗統計量:観測値と期待値のズレの大きさ
  • p値:0.05より小さい場合、性別と商品Aへの関心度に統計的に有意な関係があると結論付けます
  • 期待度数:仮説が成り立つと仮定した場合の理論値

このコードでは、男性と女性の関心度に差があるかを検定しています。たとえば、p値が0.03であれば、5%のリスクで「性別と関心度に相関がある」と結論付けられます。


実践ワーク

以下のようなデータを使ってカイ二乗検定を実行してみましょう:

天気 通勤手段(徒歩・自転車・車)
晴れ 50, 30, 20
曇り 40, 40, 20
30, 20, 50

このデータを元に、「天気と通勤手段の選択に相関があるか?」を検定してください。ヒント:chi2_contingencyは任意のサイズのクロス表に対応します。


まとめと次回の準備

本講義では、カテゴリデータの分析に使うカイ二乗検定の基本とPythonでの実装方法を学びました。カイ二乗検定は、以下のような場面で活用できます:

  • A/Bテストの結果分析(例:広告のクリック率に差があるか?)
  • 説明変数と目的変数の独立性の検定

次回の講義では、ロジスティック回帰分析を扱い、カテゴリデータを予測するモデルの作成方法を学びます。カイ二乗検定で得られた結果を活かして、より複雑な分析に挑戦しましょう。


参考文献

  1. 『統計学入門』(東京大学出版会)
    カイ二乗検定の理論的な背景を解説した定番の教科書。
  2. Scipy公式ドキュメント(https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chi2_contingency.html)
    chi2_contingency関数の使い方とパラメータの詳細。
  3. 『Pythonによるデータ分析入門』(オライリー・ジャパン)
    Pythonで統計分析を実践する際の具体的なコード例が豊富。

Lecture 10実践プロジェクト — 実データで統計分析を完結

15:00

実践プロジェクト — 実データで統計分析を完結

これまでの講義で学んだ仮説検定、回帰分析、カテゴリデータ分析を活用し、実際のビジネスデータを使って統計分析を完結するプロジェクトを行います。この講義では、Pythonを用いてデータの読み込み・可視化・統計手法の適用・結果の解釈を一連の流れで実践します。最終的に、データから意味のある洞察を導き出す力を養うことを目指します。

実データの選定と目的設定

統計分析の第一歩は「目的を明確にすること」です。本プロジェクトでは、以下のような仮想的なビジネスケースを題材にします。

ケース:あるECサイトのマーケティング担当者は、「商品の価格変更が売上に与える影響を評価したい」という目標を持っています。
データ:過去1年間の商品Aの販売データ(価格、販売数、キャンペーン情報、曜日など)

このケースでは、「価格の変化が売上に統計的に有意な影響を与えるか?」という仮説を検証します。統計学的に「価格変化」と「売上」の関係性を分析し、ビジネス戦略に役立つ結論を導き出します。

データの読み込みと初期確認

Pythonのpandasライブラリを使って、CSV形式のデータを読み込みます。以下のコードは、データの基本的な構造を確認する例です。

import pandas as pd

# データの読み込み
df = pd.read_csv("sales_data.csv")

# 最初の5行を表示
print(df.head())

# データの基本統計量を確認
print(df.describe())
列名 説明 データ型
date 販売日 日付
price 商品価格(円) 数値
sales 販売数 数値
campaign キャンペーン実施有無(0/1) カテゴリ
weekday 曜日(0=月曜日~6=日曜日) 数値

この段階で、欠損値や外れ値がないか確認します。例えば、price列が0や負の値になっていないか、sales列に極端に大きな値がないかをチェックします。

仮説検定による価格変化の影響検証

第1講で学んだt検定を活用して、価格変更の前後で売上が統計的に有意に異なるか検証します。以下に、価格変更(price列)を基準に、売上(sales列)の平均値を比較するコードを示します。

from scipy.stats import ttest_ind

# 価格変更前のデータと後のデータに分割
before_price = df[df["price"] < 5000]["sales"]
after_price = df[df["price"] >= 5000]["sales"]

# 独立t検定を実行
t_stat, p_val = ttest_ind(before_price, after_price)
print(f"t統計量: {t_stat:.2f}, p値: {p_val:.4f}")

このコードでは、価格が5,000円未満の期間と5,000円以上の期間にデータを分割し、売上の平均値を比較します。p値が0.05未満であれば、価格変更が売向上昇や減少に「統計的に有意な影響」を与えたと結論付けられます。

回帰分析で価格と売上の関係をモデル化

第2講で学んだ回帰分析を使って、価格と売上の関係性を数式で表現します。以下は、1変数線形回帰モデルの作成例です。

from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

# データの準備
X = df[["price"]]
y = df["sales"]

# モデルの作成と学習
model = LinearRegression()
model.fit(X, y)

# 結果の表示
print(f"傾き(価格係数): {model.coef_[0]:.2f}")
print(f"切片(定数項): {model.intercept_:.2f}")

# 回帰直線のプロット
plt.scatter(X, y, alpha=0.5)
plt.plot(X, model.predict(X), color="red", label="回帰直線")
plt.xlabel("価格(円)")
plt.ylabel("売上数")
plt.legend()
plt.show()

このモデルでは、価格が1円上がると売上が「傾き(係数)」分減少する関係を表します。例えば、傾きが-0.05であれば、価格が100円上がると売上が5件減少すると予測されます。この結果は、価格設定の最適化に役立ちます。

カテゴリデータの分析:キャンペーンの効果

第3講で学んだカイ二乗検定を使って、キャンペーン実施(campaign列)と売上の関係を分析します。以下は、キャンペーン有無別の売上分布をクロス集計し、カイ二乗検定を実行するコードです。

from scipy.stats import chi2_contingency

# クロス集計表の作成
contingency_table = pd.crosstab(df["campaign"], df["sales"])

# カイ二乗検定を実行
chi2, p, _, _ = chi2_contingency(contingency_table)
print(f"カイ二乗統計量: {chi2:.2f}, p値: {p:.4f}")

キャンペーン実施と売上の「関連性」を統計的に評価します。p値が0.05未満であれば、キャンペーンは売上に有意な影響を与えた可能性があります。ただし、カイ二乗検定は「関連性」を示すだけで「因果関係」を証明するわけではありません。

結果の解釈とビジネスへの応用

統計分析の結果をビジネスの言葉に翻訳する必要があります。例えば、以下のような結論を導き出すことができます:

  • 価格変更の影響:価格が5,000円以上になると売上が平均的に20%減少(t検定の結果)
  • キャンペーン効果:キャンペーン実施期間の売上は15%増加(カイ二乗検定の結果)
  • 価格の最適化:価格を3,000円に設定すると、売上が最大値になる可能性(回帰分析の結果)

これらの結果を元に、価格の最適化やキャンペーンの頻度調整といった戦略を提案します。ただし、統計分析の結果は「可能性」を示すものであり、他の要因(競合商品、景気変動など)を考慮する必要があります。

実践ワーク

以下に実践ワークを示します。各自でデータを分析し、結果をレポート形式で提出してください。

  1. データの準備:提供されたCSVファイル(sales_data.csv)を読み込み、欠損値を補完してください。
  2. 仮説検定の実行:価格変更の前後で売上が統計的に有意に異なるかt検定を実行し、結果を解釈してください。
  3. 回帰分析の実行:価格と売上の関係をモデル化し、傾き(係数)の意味を説明してください。
  4. キャンペーンの分析:カイ二乗検定を用いてキャンペーン実施と売上の関連性を評価し、結果を解釈してください。
  5. プレゼン資料の作成:分析結果をビジネスパーソン向けにわかりやすく説明するスライド(3枚程度)を作成してください。

まとめと次回の準備

本講義では、統計分析の基本手法(仮説検定、回帰分析、カイ二乗検定)を活用して、実際のビジネスデータを分析しました。以下が学んだ内容のまとめです:

  • 仮説検定:価格変更の影響をt検定で評価
  • 回帰分析:価格と売上の関係を数式で表現
  • カテゴリ分析:キャンペーンの効果をカイ二乗検定で確認
  • 実データ分析の流れ:データの読み込み → 可視化 → 統計手法の適用 → 結果の解釈

次回は「機械学習の基礎」について学び、本講義で扱った回帰分析を発展させたモデル(多変量回帰、決定木など)を学びます。Pythonのscikit-learnライブラリを使って、より複雑なデータパターンを分析できるようになります。

参考文献

  1. 『Pythonで学ぶデータ分析入門』(O'Reilly Japan)
  2. Pythonとpandasを使ったデータ分析の基礎を学べます。
  3. 『統計学入門』(東京大学出版会)
  4. 仮説検定や回帰分析の理論的な背景を理解するための定番教材。
  5. Scikit-learn公式ドキュメント(https://scikit-learn.org/stable/)
  6. 本講義で使用したLinearRegressionなどの実装方法を確認できます。