Logistic Regression เป็นเทคนิคทางสถิติสำหรับทำนาย Binary Outcome (0/1, Yes/No, True/False) ใช้กันกว้างในการเงิน การแพทย์ อาชญากรรมวิทยา และสังคมวิทยา
ติดตั้ง Libraries
pip install numpy pandas statsmodels matplotlib
Dataset: UCLA Graduate Admission
ข้อมูลจาก UCLA IDRE - ปัจจัยที่ส่งผลต่อการรับเข้า Graduate School
- admit: 0=ไม่รับ, 1=รับ (Target)
- gre: GRE score
- gpa: GPA
- rank/prestige: อันดับมหาวิทยาลัย (1=ดีที่สุด, 4=ต่ำสุด)
โค้ดเต็ม: โหลดและสำรวจข้อมูล
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
import numpy as np
# โหลดข้อมูล
df = pd.read_csv('binary.csv')
# หรืออ่านจาก URL: pd.read_csv('https://stats.idre.ucla.edu/stat/data/binary.csv')
# เปลี่ยนชื่อ column 'rank' -> 'prestige' (กันชนกับ method .rank())
df.columns = ['admit', 'gre', 'gpa', 'prestige']
print(df.head())
print(df.describe())
print(df.std())
# Frequency table: admit vs prestige
print(pd.crosstab(df['admit'], df['prestige'], rownames=['admit']))
# Histograms
df.hist()
plt.show()
ผลลัพธ์สำรวจ:
admit gre gpa prestige 0 0 380 3.61 3 1 1 660 3.67 3 2 1 800 4.00 1 3 1 640 3.19 4 4 0 520 2.93 4 # Crosstab prestige 1 2 3 4 admit 0 28 97 93 55 1 33 54 28 12
Dummy Variables (One-Hot Encoding)
แปลง categorical variable (prestige) เป็น dummy variables
# สร้าง dummy variables dummy_ranks = pd.get_dummies(df['prestige'], prefix='prestige') print(dummy_ranks.head()) # เลือก features: admit (target), gre, gpa, prestige_2, prestige_3, prestige_4 # (drop prestige_1 เป็น reference category) cols_to_keep = ['admit', 'gre', 'gpa'] data = df[cols_to_keep].join(dummy_ranks.iloc[:, 1:]) # ข้าม prestige_1 print(data.head())
ผลลัพธ์:
admit gre gpa prestige_2 prestige_3 prestige_4 0 0 380 3.61 0 1 0 1 1 660 3.67 0 1 0 2 1 800 4.00 0 0 0 3 1 640 3.19 0 0 1 4 0 520 2.93 0 0 1
รัน Logistic Regression ด้วย Statsmodels
# เตรียม X และ y train_cols = data.columns[1:] # ทุกคอลัมน์ยกเว้น 'admit' logit = sm.Logit(data['admit'], data[train_cols]) # Fit model result = logit.fit() print(result.summary2())
ผลลัพธ์สรุป (Summary):
Results: Logit
Model: Logit Pseudo R-squared: 0.083
Dependent Variable: admit AIC: 470.52
No. Observations: 400 BIC: 494.47
Df Model: 5 Log-Likelihood: -229.26
Df Residuals: 394 LL-Null: -249.99
Converged: 1.0000 Scale: 1.0000
----------------------------------------------------------------
Coef. Std.Err. z P>|z| [0.025 0.975]
----------------------------------------------------------------
gre 0.0023 0.0011 2.07 0.0385 0.0001 0.0044
gpa 0.8040 0.3318 2.42 0.0154 0.1537 1.4544
prestige_2 -0.6754 0.3165 -2.13 0.0328 -1.2958 -0.0551
prestige_3 -1.3402 0.3453 -3.88 0.0001 -2.0170 -0.6634
prestige_4 -1.5515 0.4178 -3.71 0.0002 -2.3704 -0.7325
intercept -3.9900 1.1400 -3.50 0.0005 -6.2242 -1.7557
----------------------------------------------------------------
การตีความผลลัพธ์
1. Coefficients (สัมประสิทธิ์)
- gre (0.0023): GRE สูงขึ้น → โอกาสรับเพิ่ม (p=0.0385, significant)
- gpa (0.804): GPA สูงขึ้น → โอกาสรับเพิ่มมาก (p=0.0154, significant)
- prestige_2 (-0.675): มหาวิทยาลัยอันดับ 2 → โอกาสรับน้อยกว่าอันดับ 1
- prestige_3 (-1.340): มหาวิทยาลัยอันดับ 3 → โอกาสรับน้อยกว่าอันดับ 1 มากกว่า
- prestige_4 (-1.552): มหาวิทยาลัยอันดับ 4 → โอกาสรับน้อยที่สุด
2. P-values
ทุกตัวแปรมี p < 0.05 → ทุกตัวแปรมีนัยสำคัญทางสถิติ
3. Odds Ratios (คำนวณจาก exp(coef))
import numpy as np print(np.exp(result.params)) # gre 1.0023 (เพิ่ม 1 คะแนน GRE → odds คูณ 1.0023) # gpa 2.234 (เพิ่ม 1 GPA → odds คูณ 2.23) # prestige_2 0.509 (อันดับ 2 → odds ลดเหลือ 50.9%) # prestige_3 0.262 (อันดับ 3 → odds ลดเหลือ 26.2%) # prestige_4 0.212 (อันดับ 4 → odds ลดเหลือ 21.2%)
4. Confidence Intervals
print(result.conf_int()) # 0 1 # gre 0.000120 0.004409 # gpa 0.153684 1.454391 # prestige_2 -1.295751 -0.055135 # prestige_3 -2.016992 -0.663416 # prestige_4 -2.370399 -0.732529 # intercept -6.224242 -1.755716
สรุป
- Logistic Regression ทำนาย binary outcome ได้ดี
- Statsmodels ให้ statistical details ครบ (p-values, CI, odds ratios)
- Prestige ของมหาวิทยาลัย undergraduate มีผลต่อโอกาสรับเข้า graduate school มากที่สุด
- GPA มีผลมากกว่า GRE ต่อหน่วย
ขั้นตอนต่อไป (Model Evaluation)
- ROC Curve / AUC
- Confusion Matrix
- Precision, Recall, F1-Score
- Train/Test Split หรือ Cross Validation