Competition/Kaggle

[kaggle][필사] Costa Rican Household Proverty (1)

bisi 2020. 9. 19. 02:42

이번 주제는 Costa Rican Household Proverty 로, 

목표는 미주 개발 은행(Inter-American Development Bank)의 세계에서 가장 빈곤 한 일부 가정의 소득 자격을 예측을 하는 것이다. 

 

보통 세계 최 빈곤층은 그들의 자격을 증명하기가 어려운데, 라틴 아메리카는 알고리즘을 통해 소득자격을 확인한다.

예를 들어 프록시 수단 테스트(PMT)을 통해 벽과 천장의 재료 또는 집에서 발견 된 자산과 같은 가족의 관찰 가능한 가구 속성을 고려하는 것이다. 

 

이를 바탕으로 다양한 feature가 제공 되었는데, LGBMClassifier를 사용하여 소득 자격을 예측해본다. 

 

이번 필사는 이유한님의 코드를 참고하였다.

 

 

목록 

Costa Rican Household Proverty (1)

더보기

1. Check datasets

1.1 Read datasets

1.2 Make description df

1.3 Check null data

1.4 Fill missing values

Costa Rican Household Proverty (2)

더보기

2. Feature Engineering

2.1 Object features

2.1.1 dependency

2.1.2 edjefe

2.1.3 edjefa

2.1.4 roof and elecricity

 

2.2 카테고리 변수 추출

 

2.3 연속형 변수를 사용하여 새로운 변수 생성

2.3.1 연속형 변수 컬럼 추출

2.3.2 새로운 변수 생성

2.3.3 가족 변수의 대출 비율

2.3.4 가족 변수의 방 비율

2.3.5 가족 변수의 침대 비율

2.3.6 가족 변수의 태블릿 보유 비율

2.3.7 가족 변수의 핸드폰 보유 비율

2.3.8 가족 변수의 학창 시절의 몇년뒤 

2.3.9 Rich features

 

2.4 집합 변수

Costa Rican Household Proverty (3)

더보기

3. Feature Selection Using shap

4. Model Development

4.1 LGB를 통한 예측 및 변수 중요도 생성

4.2 랜덤하게 찾기 (Randomized Search)

 


 

 

 

 

 

 

 

 

 

 

 

Costa Rican Household Poverty Level Prediction

In [8]:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

sns.set(font_scale=2.2)
plt.style.use('seaborn')

from sklearn.preprocessing import LabelEncoder, MinMaxScaler, StandardScaler, OneHotEncoder
from sklearn.model_selection import StratifiedKFold, train_test_split, ShuffleSplit
from sklearn.metrics import f1_score
import itertools
import lightgbm as lgb
import xgboost as xgb
from xgboost import XGBClassifier
from tqdm import tqdm
import shap
import featuretools as ft
import warnings
warnings.filterwarnings('ignore')
import time
 

1. Check datasets

1.1 Read datasets

In [9]:
from google.colab import drive
drive.mount('/content/drive')
 
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
In [10]:
df_train = pd.read_csv('/content/drive/My Drive/data/costa rican/train.csv')
df_test = pd.read_csv('/content/drive/My Drive/data/costa rican/test.csv')
In [11]:
print('df_train shape:', df_train.shape, '  ', 'df_test shape: ', df_test.shape)
 
df_train shape: (9557, 143)    df_test shape:  (23856, 142)
In [12]:
df_train.head()
Out[12]:
  Id v2a1 hacdor rooms hacapo v14a refrig v18q v18q1 r4h1 r4h2 r4h3 r4m1 r4m2 r4m3 r4t1 r4t2 r4t3 tamhog tamviv escolari rez_esc hhsize paredblolad paredzocalo paredpreb pareddes paredmad paredzinc paredfibras paredother pisomoscer pisocemento pisoother pisonatur pisonotiene pisomadera techozinc techoentrepiso techocane ... meaneduc instlevel1 instlevel2 instlevel3 instlevel4 instlevel5 instlevel6 instlevel7 instlevel8 instlevel9 bedrooms overcrowding tipovivi1 tipovivi2 tipovivi3 tipovivi4 tipovivi5 computer television mobilephone qmobilephone lugar1 lugar2 lugar3 lugar4 lugar5 lugar6 area1 area2 age SQBescolari SQBage SQBhogar_total SQBedjefe SQBhogar_nin SQBovercrowding SQBdependency SQBmeaned agesq Target
0 ID_279628684 190000.0 0 3 0 1 1 0 NaN 0 1 1 0 0 0 0 1 1 1 1 10 NaN 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 ... 10.0 0 0 0 1 0 0 0 0 0 1 1.000000 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 1 0 43 100 1849 1 100 0 1.000000 0.0 100.0 1849 4
1 ID_f29eb3ddd 135000.0 0 4 0 1 1 1 1.0 0 1 1 0 0 0 0 1 1 1 1 12 NaN 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 ... 12.0 0 0 0 0 0 0 0 1 0 1 1.000000 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 1 0 67 144 4489 1 144 0 1.000000 64.0 144.0 4489 4
2 ID_68de51c94 NaN 0 8 0 1 1 0 NaN 0 0 0 0 1 1 0 1 1 1 1 11 NaN 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 ... 11.0 0 0 0 0 1 0 0 0 0 2 0.500000 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 92 121 8464 1 0 0 0.250000 64.0 121.0 8464 4
3 ID_d671db89c 180000.0 0 5 0 1 1 1 1.0 0 2 2 1 1 2 1 3 4 4 4 9 1.0 4 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 ... 11.0 0 0 0 1 0 0 0 0 0 3 1.333333 0 0 1 0 0 0 0 1 3 1 0 0 0 0 0 1 0 17 81 289 16 121 4 1.777778 1.0 121.0 289 4
4 ID_d56d6f5f5 180000.0 0 5 0 1 1 1 1.0 0 2 2 1 1 2 1 3 4 4 4 11 NaN 4 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 ... 11.0 0 0 0 0 1 0 0 0 0 3 1.333333 0 0 1 0 0 0 0 1 3 1 0 0 0 0 0 1 0 37 121 1369 16 121 4 1.777778 1.0 121.0 1369 4

5 rows × 143 columns

In [13]:
df_test.head()
Out[13]:
  Id v2a1 hacdor rooms hacapo v14a refrig v18q v18q1 r4h1 r4h2 r4h3 r4m1 r4m2 r4m3 r4t1 r4t2 r4t3 tamhog tamviv escolari rez_esc hhsize paredblolad paredzocalo paredpreb pareddes paredmad paredzinc paredfibras paredother pisomoscer pisocemento pisoother pisonatur pisonotiene pisomadera techozinc techoentrepiso techocane ... edjefa meaneduc instlevel1 instlevel2 instlevel3 instlevel4 instlevel5 instlevel6 instlevel7 instlevel8 instlevel9 bedrooms overcrowding tipovivi1 tipovivi2 tipovivi3 tipovivi4 tipovivi5 computer television mobilephone qmobilephone lugar1 lugar2 lugar3 lugar4 lugar5 lugar6 area1 area2 age SQBescolari SQBage SQBhogar_total SQBedjefe SQBhogar_nin SQBovercrowding SQBdependency SQBmeaned agesq
0 ID_2f6873615 NaN 0 5 0 1 1 0 NaN 1 1 2 0 1 1 1 2 3 3 3 0 NaN 3 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 ... 17 16.5 1 0 0 0 0 0 0 0 0 2 1.5 1 0 0 0 0 1 0 1 2 1 0 0 0 0 0 1 0 4 0 16 9 0 1 2.25 0.25 272.25 16
1 ID_1c78846d2 NaN 0 5 0 1 1 0 NaN 1 1 2 0 1 1 1 2 3 3 3 16 NaN 3 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 ... 17 16.5 0 0 0 0 0 0 0 1 0 2 1.5 1 0 0 0 0 1 0 1 2 1 0 0 0 0 0 1 0 41 256 1681 9 0 1 2.25 0.25 272.25 1681
2 ID_e5442cf6a NaN 0 5 0 1 1 0 NaN 1 1 2 0 1 1 1 2 3 3 3 17 NaN 3 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 ... 17 16.5 0 0 0 0 0 0 0 0 1 2 1.5 1 0 0 0 0 1 0 1 2 1 0 0 0 0 0 1 0 41 289 1681 9 0 1 2.25 0.25 272.25 1681
3 ID_a8db26a79 NaN 0 14 0 1 1 1 1.0 0 1 1 0 0 0 0 1 1 1 1 16 NaN 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 ... no 16.0 0 0 0 0 0 0 0 1 0 1 1.0 1 0 0 0 0 1 0 1 2 1 0 0 0 0 0 1 0 59 256 3481 1 256 0 1.00 0.00 256.00 3481
4 ID_a62966799 175000.0 0 4 0 1 1 1 1.0 0 0 0 0 1 1 0 1 1 1 1 11 NaN 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 ... 11 NaN 0 0 0 0 1 0 0 0 0 2 0.5 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 1 0 18 121 324 1 0 1 0.25 64.00 NaN 324

5 rows × 142 columns

 

1.2 Make description df

In [14]:
description = [
("v2a1"," Monthly rent payment"),
("hacdor"," =1 Overcrowding by bedrooms"),
("rooms","  number of all rooms in the house"),
("hacapo"," =1 Overcrowding by rooms"),
("v14a"," =1 has toilet in the household"),
("refrig"," =1 if the household has refrigerator"),
("v18q"," owns a tablet"),
("v18q1"," number of tablets household owns"),
("r4h1"," Males younger than 12 years of age"),
("r4h2"," Males 12 years of age and older"),
("r4h3"," Total males in the household"),
("r4m1"," Females younger than 12 years of age"),
("r4m2"," Females 12 years of age and older"),
("r4m3"," Total females in the household"),
("r4t1"," persons younger than 12 years of age"),
("r4t2"," persons 12 years of age and older"),
("r4t3"," Total persons in the household"),
("tamhog"," size of the household"),
("tamviv"," number of persons living in the household"),
("escolari"," years of schooling"),
("rez_esc"," Years behind in school"),
("hhsize"," household size"),
("paredblolad"," =1 if predominant material on the outside wall is block or brick"),
("paredzocalo"," =1 if predominant material on the outside wall is socket (wood, zinc or absbesto"),
("paredpreb"," =1 if predominant material on the outside wall is prefabricated or cement"),
("pareddes"," =1 if predominant material on the outside wall is waste material"),
("paredmad"," =1 if predominant material on the outside wall is wood"),
("paredzinc"," =1 if predominant material on the outside wall is zink"),
("paredfibras"," =1 if predominant material on the outside wall is natural fibers"),
("paredother"," =1 if predominant material on the outside wall is other"),
("pisomoscer"," =1 if predominant material on the floor is mosaic ceramic   terrazo"),
("pisocemento"," =1 if predominant material on the floor is cement"),
("pisoother"," =1 if predominant material on the floor is other"),
("pisonatur"," =1 if predominant material on the floor is  natural material"),
("pisonotiene"," =1 if no floor at the household"),
("pisomadera"," =1 if predominant material on the floor is wood"),
("techozinc"," =1 if predominant material on the roof is metal foil or zink"),
("techoentrepiso"," =1 if predominant material on the roof is fiber cement,   mezzanine "),
("techocane"," =1 if predominant material on the roof is natural fibers"),
("techootro"," =1 if predominant material on the roof is other"),
("cielorazo"," =1 if the house has ceiling"),
("abastaguadentro"," =1 if water provision inside the dwelling"),
("abastaguafuera"," =1 if water provision outside the dwelling"),
("abastaguano"," =1 if no water provision"),
("public"," =1 electricity from CNFL,  ICE, ESPH/JASEC"),
("planpri"," =1 electricity from private plant"),
("noelec"," =1 no electricity in the dwelling"),
("coopele"," =1 electricity from cooperative"),
("sanitario1"," =1 no toilet in the dwelling"),
("sanitario2"," =1 toilet connected to sewer or cesspool"),
("sanitario3"," =1 toilet connected to  septic tank"),
("sanitario5"," =1 toilet connected to black hole or letrine"),
("sanitario6"," =1 toilet connected to other system"),
("energcocinar1"," =1 no main source of energy used for cooking (no kitchen)"),
("energcocinar2"," =1 main source of energy used for cooking electricity"),
("energcocinar3"," =1 main source of energy used for cooking gas"),
("energcocinar4"," =1 main source of energy used for cooking wood charcoal"),
("elimbasu1"," =1 if rubbish disposal mainly by tanker truck"),
("elimbasu2"," =1 if rubbish disposal mainly by botan hollow or buried"),
("elimbasu3"," =1 if rubbish disposal mainly by burning"),
("elimbasu4"," =1 if rubbish disposal mainly by throwing in an unoccupied space"),
("elimbasu5"," =1 if rubbish disposal mainly by throwing in river,   creek or sea"),
("elimbasu6"," =1 if rubbish disposal mainly other"),
("epared1"," =1 if walls are bad"),
("epared2"," =1 if walls are regular"),
("epared3"," =1 if walls are good"),
("etecho1"," =1 if roof are bad"),
("etecho2"," =1 if roof are regular"),
("etecho3"," =1 if roof are good"),
("eviv1"," =1 if floor are bad"),
("eviv2"," =1 if floor are regular"),
("eviv3"," =1 if floor are good"),
("dis"," =1 if disable person"),
("male"," =1 if male"),
("female"," =1 if female"),
("estadocivil1"," =1 if less than 10 years old"),
("estadocivil2"," =1 if free or coupled uunion"),
("estadocivil3"," =1 if married"),
("estadocivil4"," =1 if divorced"),
("estadocivil5"," =1 if separated"),
("estadocivil6"," =1 if widow/er"),
("estadocivil7"," =1 if single"),
("parentesco1"," =1 if household head"),
("parentesco2"," =1 if spouse/partner"),
("parentesco3"," =1 if son/doughter"),
("parentesco4"," =1 if stepson/doughter"),
("parentesco5"," =1 if son/doughter in law"),
("parentesco6"," =1 if grandson/doughter"),
("parentesco7"," =1 if mother/father"),
("parentesco8"," =1 if father/mother in law"),
("parentesco9"," =1 if brother/sister"),
("parentesco10"," =1 if brother/sister in law"),
("parentesco11"," =1 if other family member"),
("parentesco12"," =1 if other non family member"),
("idhogar"," Household level identifier"),
("hogar_nin"," Number of children 0 to 19 in household"),
("hogar_adul"," Number of adults in household"),
("hogar_mayor"," # of individuals 65+ in the household"),
("hogar_total"," # of total individuals in the household"),
("dependency"," Dependency rate"),
("edjefe"," years of education of male head of household"),
("edjefa"," years of education of female head of household"),
("meaneduc","average years of education for adults (18+)"),
("instlevel1"," =1 no level of education"),
("instlevel2"," =1 incomplete primary"),
("instlevel3"," =1 complete primary"),
("instlevel4"," =1 incomplete academic secondary level"),
("instlevel5"," =1 complete academic secondary level"),
("instlevel6"," =1 incomplete technical secondary level"),
("instlevel7"," =1 complete technical secondary level"),
("instlevel8"," =1 undergraduate and higher education"),
("instlevel9"," =1 postgraduate higher education"),
("bedrooms"," number of bedrooms"),
("overcrowding"," # persons per room"),
("tipovivi1"," =1 own and fully paid house"),
("tipovivi2"," =1 own,   paying in installments"),
("tipovivi3"," =1 rented"),
("tipovivi4"," =1 precarious"),
("tipovivi5"," =1 other(assigned"),
("computer"," =1 if the household has notebook or desktop computer,   borrowed)"),
("television"," =1 if the household has TV"),
("mobilephone"," =1 if mobile phone"),
("qmobilephone"," # of mobile phones"),
("lugar1"," =1 region Central"),
("lugar2"," =1 region Chorotega"),
("lugar3"," =1 region Pacífico central"),
("lugar4"," =1 region Brunca"),
("lugar5"," =1 region Huetar Atlántica"),
("lugar6"," =1 region Huetar Norte"),
("area1"," =1 zona urbana"),
("area2"," =2 zona rural"),
("age"," Age in years"),
("SQBescolari"," escolari squared"),
("SQBage"," age squared"),
("SQBhogar_total"," hogar_total squared"),
("SQBedjefe"," edjefe squared"),
("SQBhogar_nin"," hogar_nin squared"),
("SQBovercrowding"," overcrowding squared"),
("SQBdependency"," dependency squared"),
("SQBmeaned"," meaned squared"),
("agesq"," Age squared"),]

description = pd.DataFrame(description, columns=['varname', 'description'])
In [15]:
description
Out[15]:
  varname description
0 v2a1 Monthly rent payment
1 hacdor =1 Overcrowding by bedrooms
2 rooms number of all rooms in the house
3 hacapo =1 Overcrowding by rooms
4 v14a =1 has toilet in the household
... ... ...
136 SQBhogar_nin hogar_nin squared
137 SQBovercrowding overcrowding squared
138 SQBdependency dependency squared
139 SQBmeaned meaned squared
140 agesq Age squared

141 rows × 2 columns

In [16]:
description_ko=[("v2a1","월세납부"),
("hacdor","=1 침실별 과잉 수용"),
("rooms","집 안의 모든 방의 수"),
("hacapo","=1실별 과잉 수용"),
("v14a","=1 가정에 화장실 있음"),
("refrig","=1가구에 냉장고가 있는 경우"),
("v18q","태블릿 소유"),
("v18q1","가구 소유의 태블릿 수"),
("r4h1","12세 미만의 남성"),
("r4h2","남성 12세 이상"),
("r4h3","가구원수합계"),
("r4m1","12세 이하 여성"),
("r4m2","12세 이상 여성"),
("r4m3","가구원 총여성"),
("r4t1","12세 이하인 사람"),
("r4t2","12세 이상"),
("r4t3","가구원 합계"),
("tamhog","가구원수"),
("tamviv","가구원수"),
("escolari","다년간의 교육"),
("rez_esc","학창시절 몇년 뒤"),
("hhsize","가구 크기"),
("paredblolad","=1 외벽의 주요 재료가 블록 또는 벽돌인 경우"),
("paredzocalo","=1 외벽의 주요 재료가 소켓인 경우(목재, 아연 또는 압베스토"),
("paredpreb","=1 외벽의 주요 재료가 사전 조립 또는 시멘트인 경우"),
("pareddes","=1 외벽의 주요 소재가 폐자재일 경우"),
("paredmad","=1 외벽의 주요 재료가 목재인 경우"),
("paredzinc","=1 외벽의 주요 재료가 징크인 경우"),
("paredfibras","=1 외벽의 주요 소재가 천연섬유일 경우"),
("paredother","=1 외벽의 주요 재료가 다른 경우"),
("pisomoscer","=1 바닥의 주요 재료가 모자이크 세라믹 테라조인 경우"),
("pisocemento","=1 바닥의 주요 재료가 시멘트인 경우"),
("pisoother","=1 바닥의 주요 재료가 다른 경우"),
("pisonatur","=1 바닥의 주요 재료가 천연 재료인 경우"),
("pisonotiene","=가정에 층이 없는 경우 1개"),
("pisomadera","=1 바닥의 주요 재료가 목재인 경우"),
("techozinc","=1 지붕의 주요 재료가 금속 포일 또는 징크인 경우"),
("techoentrepiso","=1 지붕의 주요 재료가 섬유 시멘트, 메자닌인 경우 "),
("techocane","=1 지붕의 주요 재료가 천연 섬유인 경우"),
("techootro","=1 지붕의 주요 재료가 다른 경우"),
("cielorazo","=1 집에 천장이 있는 경우"),
("abastaguadentro","=1 주거지 내부의 급수인 경우"),
("abastaguafuera","=1 주거지 외부에 물이 공급되는 경우"),
("abastaguano","=1 물 공급이 없는 경우"),
("public","=CNFL, ICE, ESPH/JASEC에서 나오는 전기 1개"),
("planpri","=민간 발전소에서 나오는 전기 1개"),
("noelec","=1주거지에 전기가 없음"),
("coopele","=협동조합 전기 1개"),
("sanitario1","=1주거지에 화장실 없음"),
("sanitario2","=하수도 또는 하수구에 연결된 화장실 1개"),
("sanitario3","= 정화조에 연결된 화장실 1개"),
("sanitario5","=블랙홀 또는 레트린에 연결된 화장실 1개"),
("sanitario6","=다른 시스템에 연결된 화장실 1개"),
("energcocinar1","=1 요리에 사용되는 주요 에너지원이 없음(주방 없음"),
("energcocinar2","=1 전기 조리에 사용되는 주요 에너지 공급원"),
("energcocinar3","=요리가스에 사용되는 주요 에너지 공급원 1개"),
("energcocinar4","=1 목재 숯 조리에 사용되는 주요 에너지원"),
("elimbasu1","=1 유조선 트럭에 의한 쓰레기 처리의 경우"),
("elimbasu2","=1 주로 식물성 중공 또는 매립에 의한 쓰레기 처리"),
("elimbasu3","=1 주로 불에 태워 폐기물을 처리하는 경우"),
("elimbasu4","=1 빈 공간에 주로 던져서 쓰레기를 처리하는 경우"),
("elimbasu5","=1 주로 강, 하천 또는 바다에 투척하여 쓰레기를 처리하는 경우"),
("elimbasu6","=1 쓰레기 처리가 주로 다른 경우"),
("epared1","=벽이 나쁜 경우 1"),
("epared2","=1 벽이 정규적인 경우"),
("epared3","=벽이 좋은 경우 1개"),
("etecho1","=1 지붕이 나쁜 경우"),
("etecho2","=1 지붕이 정규적인 경우"),
("etecho3","=1 지붕이 양호한 경우"),
("eviv1","=1 바닥이 나쁜 경우"),
("eviv2","=1 바닥이 규칙적인 경우"),
("eviv3","=1 바닥이 좋은 경우"),
("dis","=1 장애인일 경우"),
("male","=1 남성일 경우"),
("female","=1 여성인 경우"),
("estadocivil1","=10세 미만인 경우 1개"),
("estadocivil2","=자유 또는 커플링된 경우 1개"),
("estadocivil3","=결혼한 경우 1개"),
("estadocivil4","=이혼한 경우 1개"),
("estadocivil5","=1 별거한 경우"),
("estadocivil6","=과부 경우 1개"),
("estadocivil7","=싱글일 경우 1개"),
("parentesco1","=가정의 가장일의 경우 1개"),
("parentesco2","=배우자/파트너일 경우 1개"),
("parentesco3","=아들/딸일 경우 1개"),
("parentesco4","=의붓아들/딸 일 경우"),
("parentesco5","=법률상 아들/딸일 경우 1개"),
("parentesco6","=손자/손자일 경우"),
("parentesco7","=어머니/아버지인 경우"),
("parentesco8","=법률상 아버지/어머니일 경우 1개"),
("parentesco9","=형/동생인 경우 1개"),
("parentesco10","=법률상 형제/자매인 경우 1개"),
("parentesco11","=1 다른 가족 구성원의 경우"),
("parentesco12","=1 가족이 아닌 다른 구성원의 경우"),
("idhogar","가구 수준 식별자"),
("hogar_nin","0~19세인 가구원 수 "),
("hogar_adul","어른인 가구원수"),
("hogar_mayor","65세 이상인 가구원수 "),
("hogar_total","가구원 총 인원수"),
("dependency","종속율"),
("edjefe","남성 가장의 수년간 교육"),
("edjefa","여성 가장의 수년간 교육"),
("meaneduc","평균 성인 교육년(18+)"),
("instlevel1","=1 교육 수준 없음"),
("instlevel2","=1 불완전한 초등교육"),
("instlevel3","=1 완전한 초등교육"),
("instlevel4","=1 불완전한 학업 2차 수준"),
("instlevel5","=1 완전한 학문적 2차 수준"),
("instlevel6","=1 불완전한 기술 2차 수준"),
("instlevel7","=1 완전한 기술 2차 수준"),
("instlevel8","=1학부 이상"),
("instlevel9","=1 대학원 고등교육"),
("bedrooms","침실 수"),
("overcrowding","# 객실당 인원수"),
("tipovivi1","=1자체 및 완전유급주택"),
("tipovivi2","=1개 소유, 할부 결제"),
("tipovivi3","=1 임대"),
("tipovivi4","=1 불안정한"),
("tipovivi5","=1 다른사람에게 할당된"),
("computer","=1 가구에 노트북 또는 데스크탑 컴퓨터가 있는 경우, 대여"),
("television","=1가구에 TV가 있는 경우"),
("mobilephone","=휴대전화일 경우 1"),
("qmobilephone","휴대전화 번호"),
("lugar1","=1 지역 중심"),
("lugar2","=1 지역 Chorotega"),
("lugar3","=1 지역 Pacífico central"),
("lugar4","=1 지역 Brunca"),
("lugar5","=1 지역 Huetar Atlántica"),
("lugar6","=1 지역 Huetar Norte"),
("area1","=1 조나 우르바나"),
("area2","=2 조나 시골"),
("age","연령"),
("SQBescolari","에스코라리 제곱"),
("SQBage","나이 제곱"),
("SQBhogar_total","hogar_total 제곱"),
("SQBedjefe","에드제프 제곱"),
("SQBhogar_nin","hogar_nin 제곱"),
("SQBovercrowding","과밀 제곱"),
("SQBdependency","종속성 제곱"),
("SQBmeaned","평균 제곱"),
("agesq","나이 제곱"),]

description_ko = pd.DataFrame(description_ko, columns=['varname', 'description'])
In [17]:
description_ko
Out[17]:
  varname description
0 v2a1 월세납부
1 hacdor =1 침실별 과잉 수용
2 rooms 집 안의 모든 방의 수
3 hacapo =1실별 과잉 수용
4 v14a =1 가정에 화장실 있음
... ... ...
136 SQBhogar_nin hogar_nin 제곱
137 SQBovercrowding 과밀 제곱
138 SQBdependency 종속성 제곱
139 SQBmeaned 평균 제곱
140 agesq 나이 제곱

141 rows × 2 columns

 

1.3 Check null data

In [18]:
total = df_train.isnull().sum().sort_values(ascending=False)
percent = 100 * (df_train.isnull().sum() / df_train.isnull().count()).sort_values(ascending=False)
missing_df = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])

missing_df.head(20)
Out[18]:
  Total Percent
rez_esc 7928 82.954902
v18q1 7342 76.823271
v2a1 6860 71.779847
meaneduc 5 0.052318
SQBmeaned 5 0.052318
techozinc 0 0.000000
techoentrepiso 0 0.000000
techocane 0 0.000000
techootro 0 0.000000
cielorazo 0 0.000000
abastaguadentro 0 0.000000
sanitario3 0 0.000000
abastaguafuera 0 0.000000
abastaguano 0 0.000000
public 0 0.000000
planpri 0 0.000000
noelec 0 0.000000
coopele 0 0.000000
sanitario1 0 0.000000
sanitario2 0 0.000000
 

1.4 Fill missing values

In [19]:
# education이 "yes"이고, 가장이라면, escolari의 년수로 칸을 채운다.
df_train.loc[(df_train['edjefa'] == "yes") & (df_train['parentesco1'] == 1), "edjefa"] = df_train.loc[(df_train['edjefa'] == "yes") & (df_train['parentesco1'] ==1), "escolari"]
df_train.loc[(df_train['edjefe'] == "yes") & (df_train['parentesco1'] == 1), "edjefe"] = df_train.loc[(df_train['edjefe'] == "yes") & (df_train['parentesco1'] ==1), "escolari"]

df_test.loc[(df_test['edjefa'] == "yes") & (df_test['parentesco1'] == 1), "edjefa"] = df_test.loc[(df_test['edjefa'] == "yes") & (df_test['parentesco1'] ==1), "escolari"]
df_test.loc[(df_test['edjefe'] == "yes") & (df_test['parentesco1'] == 1), "edjefe"] = df_test.loc[(df_test['edjefe'] == "yes") & (df_test['parentesco1'] ==1), "escolari"]
In [20]:
# 가정의 가장이라면(edjefa, edjefe) 교육 년수는 4년으로 채운다.
df_train.loc[df_train['edjefa'] == "yes", "edjefa"] = 4
df_train.loc[df_train['edjefe'] == "yes", "edjefe"] = 4

df_test.loc[df_test['edjefa'] == "yes", "edjefa"] = 4
df_test.loc[df_test['edjefe'] == "yes", "edjefe"] = 4
In [21]:
# 가정의 가장(head of household)가 여성(edjefa)/남성(edjefe)로 구분되어 있는데, 둘중에 큰 값을 하나의 컬럼으로 합친다.
df_train['edjef'] = np.max(df_train[['edjefa','edjefe']], axis=1)
df_test['edjef'] = np.max(df_test[['edjefa','edjefe']], axis=1)
In [22]:
# 데이터 불일치를 수정한다.
# 예를 들어 일부행은 화장실을 갖고 있다고 하거나, 가지고 있지 않다고 한다. 
# 우리는 만약 물이 없다면 그들은 물을 마시지 않는다고 가정한다.
df_train.loc[(df_train.v14a == 1) & (df_train.sanitario1 == 1) & (df_train.abastaguano == 0), 'v14a' ] = 0
df_train.loc[(df_train.v14a == 1) & (df_train.sanitario1 == 1) & (df_train.abastaguano == 0), 'sanitario1' ] = 0

df_test.loc[(df_test.v14a == 1) & (df_test.sanitario1 == 1) & (df_test.abastaguano == 0), 'v14a' ] = 0
df_test.loc[(df_test.v14a == 1) & (df_test.sanitario1 == 1) & (df_test.abastaguano == 0), 'sanitario1' ] = 0
In [23]:
# rez_esc : 학창시절 몇년 뒤는 0으로 채운다.
# SQBmeaned : 가쟝의 평균 교육 년수가 없으면 0으로 채운다.
# meaneduc : 평균 교육 년수가 없다면 0으로 채운다.
df_train['rez_esc'].fillna(0, inplace=True)
df_test['rez_esc'].fillna(0, inplace=True)

df_train['SQBmeaned'].fillna(0, inplace=True)
df_test['SQBmeaned'].fillna(0, inplace=True)

df_train['meaneduc'].fillna(0, inplace=True)
df_test['meaneduc'].fillna(0, inplace=True)
In [24]:
df_train['v18q'].value_counts()
Out[24]:
0    7342
1    2215
Name: v18q, dtype: int64
In [25]:
# 가구에 하나라도 있는 경우 가구당 태블릿 수 체크
df_train.loc[df_train['v18q'] == 1, 'v18q1'].value_counts()
Out[25]:
1.0    1586
2.0     444
3.0     129
4.0      37
5.0      13
6.0       6
Name: v18q1, dtype: int64
In [26]:
# 가구에 하나라도 없는 경우 가구당 태블릿 수 체크
df_train.loc[df_train['v18q'] == 0, 'v18q1'].value_counts()
Out[26]:
Series([], Name: v18q1, dtype: int64)
In [27]:
df_train['v18q1'].fillna(0, inplace=True)
df_test['v18q1'].fillna(0, inplace=True)
In [28]:
df_train['tipovivi3'].value_counts()
Out[28]:
0    7821
1    1736
Name: tipovivi3, dtype: int64
In [29]:
sns.kdeplot(df_train.loc[df_train['tipovivi3'] ==1,'v2a1'], label='Monthly rent payment of household(rented=1)')
sns.kdeplot(df_train.loc[df_train['tipovivi3'] ==0,'v2a1'], label='Monthly rent payment of household(rented=0)')
plt.xscale('log')
plt.show()
 
In [30]:
df_train['v2a1'].fillna(0, inplace=True)
df_test['v2a1'].fillna(0, inplace=True)
In [31]:
total = df_train.isnull().sum().sort_values(ascending=False)
percent = 100 * (df_train.isnull().sum() / df_train.isnull().count()).sort_values(ascending=False)
missing_df = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])

missing_df.head(20)
Out[31]:
  Total Percent
edjef 9557 100.0
Target 0 0.0
sanitario3 0 0.0
sanitario2 0 0.0
sanitario1 0 0.0
coopele 0 0.0
noelec 0 0.0
planpri 0 0.0
public 0 0.0
abastaguano 0 0.0
abastaguafuera 0 0.0
abastaguadentro 0 0.0
cielorazo 0 0.0
techootro 0 0.0
techocane 0 0.0
techoentrepiso 0 0.0
techozinc 0 0.0
sanitario5 0 0.0
sanitario6 0 0.0
energcocinar1 0 0.0
In [32]:
total = df_test.isnull().sum().sort_values(ascending=False)
percent = 100 * (df_test.isnull().sum() / df_test.isnull().count()).sort_values(ascending=False)
missing_df = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])

missing_df.head(20)
Out[32]:
  Total Percent
edjef 23856 100.0
abastaguano 0 0.0
sanitario2 0 0.0
sanitario1 0 0.0
coopele 0 0.0
noelec 0 0.0
planpri 0 0.0
public 0 0.0
abastaguafuera 0 0.0
sanitario5 0 0.0
abastaguadentro 0 0.0
cielorazo 0 0.0
techootro 0 0.0
techocane 0 0.0
techoentrepiso 0 0.0
techozinc 0 0.0
sanitario3 0 0.0
sanitario6 0 0.0
pisonotiene 0 0.0
elimbasu5 0 0.0
 

이제 결측치(NaN values)는 없다.

 


github 소스코드 바로가기