コンテンツにスキップ

第04回 Python統計処理入門(Colab / Pandas / NumPy)

10/20(火)Ⅱ講 10:35〜12:15・B402教室

計算は機械に、判断は人間に ―― 今日から、あなたがコードを書く


この回のゴール

  • データを「表(DataFrame)」として読み込み、列を取り出せる
  • 第2・3回で手計算した代表値・ばらつきを、コードで再現できる
  • describe() / groupby() / isna() / ヒストグラムで、基礎集計を自分で実行できる

到達目標との対応:G3(Pythonで自律的に解析)の本丸。第5回以降の相関・推定・検定は、すべてこの上に乗る。


0. 今日から方式が変わる

第1〜3回は「読んで▶を押すだけ」だった。今日からは、空欄 ____ を自分で埋める。とはいえコードの大半は用意してあるので、入れるのは列名やメソッド名だけ。

エラーは失敗ではない

エラーメッセージは「ここが違うよ」というお知らせKeyError は列名のスペル違い、SyntaxError はカッコや全角・半角のことが多い。落ち着いて読めば、たいてい原因が書いてある。


1. データは「表」= DataFrame

CSVを読み込むと、Excelのような表になる。Pythonではこれを DataFrame と呼び、慣習的に df という名前を付ける。

df = pd.read_csv(URL)     # 表を読み込む
df.shape                  # (行数=学生数, 列数)
list(df.columns)          # 列名の一覧
df.head()                 # 先頭5行

「行=1つの種」「列=体重・妊娠期間などの項目」。これがデータ分析の基本の形だ。


2. 列を取り出す

1列を取り出すには df["列名"] と書く。

df["体重g"]      # 体重の列

列名は正確に

df["テスト店"] のように1文字でも違うと KeyErrorlist(df.columns) で正しい綴りを確認するくせをつけよう。


3. 代表値をコードで(第2回の再現)

第2回で手計算した3つの代表値は、メソッド1つで出る。

df["体重g"].mean()    # 平均  → 5880.9
df["体重g"].median()  # 中央値 → 3006.0
df["一腹産子数"].mode()  # 最頻値 → 1.01(連続値の体重では意味がない)

第2回で電卓を叩いて出した値と、同じになるはず。違いは速さと正確さだけ。


4. ばらつきをコードで(第3回の再現)

df["妊娠期間日"].std()   # 標準偏差 → 37.8
df["妊娠期間日"].var()   # 分散     → 1427.2

第3回の「SD ≈ 11.6点」がそのまま出る。


5. describe() ―― 一気に要約

df["体重g"].describe()

件数・平均・SD・最小・四分位数・最大が一度に出る。手計算なら数十分の作業が一瞬で終わる。


6. グループごとに集計(groupby)

「科ごとの体重平均」のようなグループ別集計は、groupby で書く。

df.groupby("科")["体重g"].mean()
# ヒト科 70526 / オナガザル科 7829 / クモザル科 7127 …

groupby("グループにする列")["集計する列"].集計関数() という形。これは第9回(分散分析)への布石でもある。


7. 欠損を確認

df.isna().sum()   # 列ごとの欠損(未記入)の数
# 初産日齢: 273 / 出産間隔日: 267 / 新生児体重g: 259 …(体重gですら111種が未測定)

本物の研究データは、こういう姿をしている。体重ですら111種が未測定で、初産日齢にいたっては273種が空欄である。現実のデータには必ず欠損がある。第6回で「この偏りが何を意味するか」を詳しく扱う。


8. グラフを1行で

plt.hist(df["体重g"].dropna(), bins=40)

第2・3回で見たヒストグラムも、コードなら1行。日本語が□□に化けるときは、冒頭の japanize-matplotlib を実行したか確認する。


まとめ

やりたいこと コード
列を取り出す df["列名"]
平均・中央値・最頻値 .mean() .median() .mode()
標準偏差・分散 .std() .var()
まとめて要約 .describe()
グループ別集計 df.groupby("列")["列"].mean()
欠損の確認 df.isna().sum()
ヒストグラム plt.hist(df["列"])

手で求めた値と、コードで求めた値は同じ。違うのは速さと正確さ。 計算は機械に任せ、人間は「どの数字を信じるか」の判断に集中する。 コードは直感を持たない。だから直感が系統的に外れる場面でも、同じ手続きを同じ向きに実行する。第1回のモンティ・ホールを1万回試せたのは、飽きも思い込みもない相手だったからだ。


今日の課題(Moodle提出)

配点:100点(自動採点40点 + 記述60点)/ 提出先:Moodle

Colab 04_python_intro.ipynb____ をすべて埋めて実行し、出力された数値を見て答えること。


パートA:選択・数値問題(自動採点・各10点 ×4=40点)

A1. df["体重g"].mean() を実行して出た平均値(小数第1位まで)を入力しなさい。 (半角数字で。例:1234.5)

A2. df.groupby("科")["体重g"].mean() を実行したとき、体重の平均が最も大きかった科はどれか。 - (ア) ヒト科 (イ) オナガザル科 (ウ) コビトキツネザル科

A3. df.isna().sum() を実行したとき、体重g の欠損(未測定)の数はいくつか。(半角数字)

A4. df["体重g"].describe()count(有効な種数) はいくつか。(半角数字)


パートB:記述問題(AIフィードバック対象・60点)

【全記述に共通・重要】自分の出力を引用すること

各記述には、今日あなたのノートが出力した具体的な数値を最低1つ引用すること(例:「平均は5880.9と出た」「科別ではヒト科が70,526gで最大だった」「体重の欠損は111種あった」)。 引用がない記述は満点になりません。

B1.(30点) 第2回・第3回では電卓などで代表値やばらつきを手計算した。今日は同じ値をコードで求めた。両者を比べて、「計算は機械に、判断は人間に」とはどういうことかを、自分の言葉で説明しなさい。手計算とコードはそれぞれ何が得意で、人間が集中すべきことは何か。

B2.(30点) 今日コードを書いていて詰まった点(エラーや迷い)を1つ挙げ、何が原因で、どう解決したか(または何を確認したか)を具体的に書きなさい。詰まらなかった人は、6つの穴埋めのうち1つを選び、何という列名・メソッドを入れて、どんな結果が出たかを書きなさい。

目安:B1・B2あわせて300〜500字。自分の言葉で書くこと。

次回予告

第5回「相関と因果」。2つの列の関係を散布図と相関係数で見る。そして――「相関がある」ことと「因果がある」ことの、決定的な違いへ。