第04回 Python統計処理入門(Colab / Pandas / NumPy)¶
10/20(火)Ⅱ講 10:35〜12:15・B402教室
計算は機械に、判断は人間に ―― 今日から、あなたがコードを書く
今日のリンク
- 📊 スライドを開く
- 📓 Colabノートを開く(04_python_intro.ipynb)
- 📝 課題を提出する(Moodle・第4回)
- 課題の本文はこのページの末尾にあります
この回のゴール¶
- データを「表(DataFrame)」として読み込み、列を取り出せる
- 第2・3回で手計算した代表値・ばらつきを、コードで再現できる
describe()/groupby()/isna()/ ヒストグラムで、基礎集計を自分で実行できる
到達目標との対応:G3(Pythonで自律的に解析)の本丸。第5回以降の相関・推定・検定は、すべてこの上に乗る。
0. 今日から方式が変わる¶
第1〜3回は「読んで▶を押すだけ」だった。今日からは、空欄 ____ を自分で埋める。とはいえコードの大半は用意してあるので、入れるのは列名やメソッド名だけ。
エラーは失敗ではない
エラーメッセージは「ここが違うよ」というお知らせ。KeyError は列名のスペル違い、SyntaxError はカッコや全角・半角のことが多い。落ち着いて読めば、たいてい原因が書いてある。
1. データは「表」= DataFrame¶
CSVを読み込むと、Excelのような表になる。Pythonではこれを DataFrame と呼び、慣習的に df という名前を付ける。
「行=1つの種」「列=体重・妊娠期間などの項目」。これがデータ分析の基本の形だ。
2. 列を取り出す¶
1列を取り出すには df["列名"] と書く。
列名は正確に
df["テスト店"] のように1文字でも違うと KeyError。list(df.columns) で正しい綴りを確認するくせをつけよう。
3. 代表値をコードで(第2回の再現)¶
第2回で手計算した3つの代表値は、メソッド1つで出る。
df["体重g"].mean() # 平均 → 5880.9
df["体重g"].median() # 中央値 → 3006.0
df["一腹産子数"].mode() # 最頻値 → 1.01(連続値の体重では意味がない)
第2回で電卓を叩いて出した値と、同じになるはず。違いは速さと正確さだけ。
4. ばらつきをコードで(第3回の再現)¶
第3回の「SD ≈ 11.6点」がそのまま出る。
5. describe() ―― 一気に要約¶
件数・平均・SD・最小・四分位数・最大が一度に出る。手計算なら数十分の作業が一瞬で終わる。
6. グループごとに集計(groupby)¶
「科ごとの体重平均」のようなグループ別集計は、groupby で書く。
groupby("グループにする列")["集計する列"].集計関数() という形。これは第9回(分散分析)への布石でもある。
7. 欠損を確認¶
本物の研究データは、こういう姿をしている。体重ですら111種が未測定で、初産日齢にいたっては273種が空欄である。現実のデータには必ず欠損がある。第6回で「この偏りが何を意味するか」を詳しく扱う。
8. グラフを1行で¶
第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つの列の関係を散布図と相関係数で見る。そして――「相関がある」ことと「因果がある」ことの、決定的な違いへ。