데이터 분석 대회 Kaggle에 나왔던 타이타닉 데이터로 로지스틱 회귀분석 연습을 해보았습니다. 데이터를 통해 성별, 나이, 객실 등급이 승객의 생존에 어떤 영향을 끼쳤는지 분석해 볼 수 있습니다.
알아보고 싶은 것은 "성별(Sex), 나이(Age), 객실등급(Pclass), 요금?(Fare) 가 생존에 어떻게 어느정도의 영향을 미쳤는가?" 입니다.
=============================================================================================
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | # 2015. 8. 5 import pandas as pd import statsmodels.api as sm import pylab as pl import numpy as np import test2 df = pd.read_csv("c:/train2.csv") # read file print df.head() cols_to_keep = ['Survived', 'Age', 'Fare'] # 분류할 수 없는 컬럼들 # 분류할 수 있는 컬럼들은 더미 컬럼를 만든다. dummy_Pclass = pd.get_dummies(df['Pclass'], prefix='Pclass') dummy_Sex = pd.get_dummies(df['Sex'], prefix='Sex') # 더미를 데이터에 이어 붙인다. data = df[cols_to_keep].join(dummy_Pclass.ix[:,'Pclass_2':]) # Pclass_2 부터 이어 붙임. 이래야 분석에 편리함 data = data.join(dummy_Sex.ix[:,'Sex_male':]) # Sex_male만 이어 붙임 data['intercept'] = 1.0 # 지금까지의 데이터 확인 print data.head() # 출력창에 다음과 같이 뜸 # Survived Age Fare Pclass_2 Pclass_3 Sex_male intercept #0 0 22 7.2500 0 1 1 1 #1 1 38 71.2833 0 0 0 1 #2 1 26 7.9250 0 1 0 1 #3 1 35 53.1000 0 0 0 1 #4 0 35 8.0500 0 1 1 1 # logistic regression train_cols = data.columns[1:] # train_cols는 설명 변수 logit = sm.Logit(data['Survived'], data[train_cols]) # Survived는 목적 변수 # fit the model result = logit.fit() print result.summary() # 분석결과 출력 #============================================================================== # coef std err z P>|z| [95.0% Conf. Int.] #------------------------------------------------------------------------------ #Age -0.0330 0.007 -4.457 0.000 -0.048 -0.019 #Fare 0.0007 0.002 0.340 0.734 -0.003 0.005 #Pclass_2 -1.0809 0.286 -3.778 0.000 -1.642 -0.520 #Pclass_3 -2.2794 0.280 -8.142 0.000 -2.828 -1.731 #Sex_male -2.6049 0.188 -13.881 0.000 -2.973 -2.237 #intercept 3.4772 0.418 8.318 0.000 2.658 4.297 #============================================================================== # odds ratios only print np.exp(result.params) # 오즈 비(Odds Ratio) 출력 #Age 0.967515 #Fare 1.000714 #Pclass_2 0.339281 #Pclass_3 0.102351 #Sex_male 0.073911 #intercept 32.367967 data["predict"] = result.predict(data[train_cols]) print data.head() # 최종결과 (predict가 생존확률) # Survived Age Fare Pclass_2 Pclass_3 Sex_male intercept predict #0 0 22 7.2500 0 1 1 1 0.106363 #1 1 38 71.2833 0 0 0 1 0.906625 #2 1 26 7.9250 0 1 0 1 0.585365 #3 1 35 53.1000 0 0 0 1 0.913663 #4 0 35 8.0500 0 1 1 1 0.071945 | cs |
분석 결과 정리
coef(편회귀계수)의 부호만을 봤을 때, 나이가 많을 수록, 여자보다는 남자일 수록, 1등급보다는 2등급, 3등급일 수록, 요금이 적을 수록 생존확률이 낮아졌다. 또한 coef의 절대값으로 미루어보면 성별이 생존여부에 가장 큰 영향을 미치는 것을 알 수 있었다.
용어
Odds Ratio
Odds Ratio란 Odds의 비율이다. Odds란 성공/실패와 같이 상호 배타적이며 전체를 이루고 있는 것들의 비율을 의미한다. 예를 들어 남자 승객의 경우 577명중 109명이 생존했다. 이 경우 Odds = P(생존)/P(사망) = (109/577)/(468/577) = 0.19/0.81 = 0.23
여자 승객의 경우 314명중 233명이 생존했다. 이 경우 Odds = P(생존)/P(사망) = (233/314)/(81/314) = 2.87
따라서 Odds Ratio = 0.23/2.87 = 약 0.08
[출처] 파이썬 로지스틱 회귀분석2|작성자 3개월
'Tools > Python' 카테고리의 다른 글
Spyder IDE를 anaconda virtual environment에서 실행하는 법 (0) | 2017.08.03 |
---|---|
Python - 선형회귀분석 (& 교호작용을 고려한 선형회귀분석) (0) | 2017.06.29 |
주피터 노트북 팁 1 - 단축키, 변수 출력, 도큐먼트 찾기 (0) | 2017.04.03 |
Python - opencv 설치 (ImportError: No module named cv2) (1) | 2017.01.31 |
Python - 로지스틱 회귀분석 (0) | 2016.12.29 |