In [1]:
import os
import numpy as np
import pandas as pd
In [2]:
os.getcwd() #현재 디렉토리 확인
Out[2]:
'/Users/limjongjun/Desktop/JayJay/Growth/Python/Class101_Pandas'
In [3]:
df1 = pd.read_csv('01_Contract_Data.csv')
df1
Out[3]:
Index | Member_ID | Sales_Type | Contract_Type | Channel | Datetime | Term | Payment_Type | Product_Type | Amount_Month | Customer_Type | Age | Address1 | Address2 | State | Overdue_count | Overdue_Type | Gender | Credit_Rank | Bank | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 66758234 | 렌탈 | 일반계약 | 영업방판 | 2019-05-06 | 60 | CMS | DES-1 | 96900 | 개인 | 42.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 여자 | 9.0 | 새마을금고 |
1 | 2 | 66755948 | 렌탈 | 교체계약 | 영업방판 | 2020-02-20 | 60 | 카드이체 | DES-1 | 102900 | 개인 | 39.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 남자 | 2.0 | 현대카드 |
2 | 3 | 66756657 | 렌탈 | 일반계약 | 홈쇼핑/방송 | 2019-02-28 | 60 | CMS | DES-1 | 96900 | 개인 | 48.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 여자 | 8.0 | 우리은행 |
3 | 4 | 66423450 | 멤버십 | 멤버십3유형 | 재계약 | 2019-05-13 | 12 | CMS | DES-1 | 66900 | 개인 | 39.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 남자 | 5.0 | 농협회원조합 |
4 | 5 | 66423204 | 멤버십 | 멤버십3유형 | 재계약 | 2019-05-10 | 12 | CMS | DES-1 | 66900 | 개인 | 60.0 | 경기도 | 경기도 | 기간만료 | 12 | 있음 | 남자 | 8.0 | 농협회원조합 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
51296 | 51298 | 66579515 | 렌탈 | 프로모션계약 | 대형마트A | 2019-03-01 | 60 | CMS | DES-3A | 96900 | 개인 | 47.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 남자 | NaN | 기업은행 |
51297 | 51299 | 66799558 | 렌탈 | 일반계약 | 대형마트A | 2019-04-01 | 60 | CMS | DES-1 | 96900 | 개인 | 42.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 여자 | 8.0 | 새마을금고 |
51298 | 51300 | 66799197 | 렌탈 | 프로모션계약 | 영업방판 | 2019-04-01 | 39 | 카드이체 | ERA | 120900 | 개인 | 65.0 | 서울특별시 | 서울특별시 | 계약확정 | 0 | 없음 | 여자 | 1.0 | 롯데카드 |
51299 | 51301 | 66792778 | 렌탈 | 일반계약 | 홈쇼핑/방송 | 2020-02-06 | 60 | 카드이체 | DES-1 | 96900 | 개인 | 54.0 | 서울특별시 | 서울특별시 | 계약확정 | 0 | 없음 | 여자 | 2.0 | 롯데카드 |
51300 | 51302 | 66799607 | 렌탈 | 일반계약 | 홈쇼핑/방송 | 2019-04-24 | 60 | CMS | DES-1 | 96900 | 개인 | 53.0 | 서울특별시 | 서울특별시 | 계약확정 | 0 | 없음 | 여자 | 8.0 | 신한은행 |
51301 rows × 20 columns
결측값(Missing Value)¶
- NaN (Not A Number) / None / NA
- 방법 1 : 누락된 결측값이 있는 행 제거
- 방법 2 : 다른 값(평균, 중앙값 etc) 으로 대체
In [ ]:
#Non-Null Count 정보를 통해 결측값 확인
df1.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 51301 entries, 0 to 51300
Data columns (total 20 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Index 51301 non-null int64
1 Member_ID 51301 non-null int64
2 Sales_Type 51301 non-null object
3 Contract_Type 51301 non-null object
4 Channel 51301 non-null object
5 Datetime 51301 non-null object
6 Term 51301 non-null int64
7 Payment_Type 51301 non-null object
8 Product_Type 51301 non-null object
9 Amount_Month 51301 non-null int64
10 Customer_Type 51299 non-null object
11 Age 44329 non-null float64
12 Address1 51299 non-null object
13 Address2 51299 non-null object
14 State 51301 non-null object
15 Overdue_count 51301 non-null int64
16 Overdue_Type 51301 non-null object
17 Gender 51301 non-null object
18 Credit_Rank 42520 non-null float64
19 Bank 48542 non-null object
dtypes: float64(2), int64(5), object(13)
memory usage: 7.8+ MB
In [ ]:
df1.isnull() #결측값에 True
Out[ ]:
Index | Member_ID | Sales_Type | Contract_Type | Channel | Datetime | Term | Payment_Type | Product_Type | Amount_Month | Customer_Type | Age | Address1 | Address2 | State | Overdue_count | Overdue_Type | Gender | Credit_Rank | Bank | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False |
1 | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False |
2 | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False |
3 | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False |
4 | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
51296 | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | True | False |
51297 | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False |
51298 | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False |
51299 | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False |
51300 | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False | False |
51301 rows × 20 columns
In [ ]:
df1.isnull().sum() #결측값이 있는 행 개수 확인
Out[ ]:
Index 0
Member_ID 0
Sales_Type 0
Contract_Type 0
Channel 0
Datetime 0
Term 0
Payment_Type 0
Product_Type 0
Amount_Month 0
Customer_Type 2
Age 6972
Address1 2
Address2 2
State 0
Overdue_count 0
Overdue_Type 0
Gender 0
Credit_Rank 8781
Bank 2759
dtype: int64
In [ ]:
df1.loc[(df1['Age'].isnull())]
Out[ ]:
Index | Member_ID | Sales_Type | Contract_Type | Channel | Datetime | Term | Payment_Type | Product_Type | Amount_Month | Customer_Type | Age | Address1 | Address2 | State | Overdue_count | Overdue_Type | Gender | Credit_Rank | Bank | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
22 | 23 | 66758074 | 렌탈 | 일반계약 | 영업방판 | 2020-07-23 | 60 | CMS | DES-1 | 96900 | 개인 | NaN | 충청도 | 충청도 | 계약확정 | 0 | 없음 | 여자 | 1.0 | 농협중앙회 |
23 | 24 | 66758074 | 렌탈 | 일반계약 | 영업방판 | 2019-01-01 | 60 | CMS | DES-2 | 87900 | 개인 | NaN | 충청도 | 충청도 | 계약확정 | 0 | 없음 | 여자 | 1.0 | 농협중앙회 |
30 | 31 | 25702131 | 멤버십 | 멤버십3유형 | 재계약 | 2019-04-28 | 12 | CMS | DES-1 | 66900 | 사업자 | NaN | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 여자 | NaN | 기업은행 |
37 | 38 | 25851817 | 멤버십 | 멤버십3유형 | 재계약 | 2020-01-23 | 12 | CMS | DES-1 | 96600 | 사업자 | NaN | 서울특별시 | 서울특별시 | 해약확정 | 0 | 없음 | 여자 | NaN | 국민은행 |
55 | 56 | 25856039 | 렌탈 | 교체계약 | 영업방판 | 2019-05-01 | 60 | CMS | DES-1 | 96900 | 사업자 | NaN | 경상도 | 부산광역시 | 계약확정 | 0 | 없음 | 여자 | NaN | 농협중앙회 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
51281 | 51283 | 66799099 | 멤버십 | 멤버십2유형 | 전문매장H | 2019-07-18 | 36 | 무통장 | DES-1 | 56979 | 개인 | NaN | 전라도 | 광주광역시 | 계약확정 | 0 | 없음 | 여자 | NaN | NaN |
51284 | 51286 | 66799094 | 멤버십 | 멤버십2유형 | 전문매장H | 2019-02-24 | 36 | 무통장 | DES-1 | 54603 | 개인 | NaN | 서울특별시 | 서울특별시 | 계약확정 | 0 | 없음 | 여자 | NaN | NaN |
51290 | 51292 | 66798812 | 멤버십 | 멤버십2유형 | 전문매장H | 2020-01-28 | 36 | 무통장 | DES-1 | 54603 | 개인 | NaN | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 여자 | NaN | NaN |
51291 | 51293 | 25731743 | 렌탈 | 일반계약 | 영업방판 | 2020-02-12 | 60 | CMS | DES-3A | 102900 | 사업자 | NaN | 경기도 | 경기도 | 계약확정 | 10 | 있음 | 여자 | NaN | 농협중앙회 |
51292 | 51294 | 66799221 | 멤버십 | 멤버십2유형 | 전문매장H | 2020-04-12 | 36 | 무통장 | DES-1 | 56979 | 개인 | NaN | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 여자 | NaN | NaN |
6972 rows × 20 columns
In [ ]:
df1.dropna() #결측치가 있는 행을 삭제
Out[ ]:
Index | Member_ID | Sales_Type | Contract_Type | Channel | Datetime | Term | Payment_Type | Product_Type | Amount_Month | Customer_Type | Age | Address1 | Address2 | State | Overdue_count | Overdue_Type | Gender | Credit_Rank | Bank | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 66758234 | 렌탈 | 일반계약 | 영업방판 | 2019-05-06 | 60 | CMS | DES-1 | 96900 | 개인 | 42.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 여자 | 9.0 | 새마을금고 |
1 | 2 | 66755948 | 렌탈 | 교체계약 | 영업방판 | 2020-02-20 | 60 | 카드이체 | DES-1 | 102900 | 개인 | 39.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 남자 | 2.0 | 현대카드 |
2 | 3 | 66756657 | 렌탈 | 일반계약 | 홈쇼핑/방송 | 2019-02-28 | 60 | CMS | DES-1 | 96900 | 개인 | 48.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 여자 | 8.0 | 우리은행 |
3 | 4 | 66423450 | 멤버십 | 멤버십3유형 | 재계약 | 2019-05-13 | 12 | CMS | DES-1 | 66900 | 개인 | 39.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 남자 | 5.0 | 농협회원조합 |
4 | 5 | 66423204 | 멤버십 | 멤버십3유형 | 재계약 | 2019-05-10 | 12 | CMS | DES-1 | 66900 | 개인 | 60.0 | 경기도 | 경기도 | 기간만료 | 12 | 있음 | 남자 | 8.0 | 농협회원조합 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
51295 | 51297 | 66792261 | 렌탈 | 일반계약 | 홈쇼핑/방송 | 2019-03-11 | 60 | 카드이체 | DES-1 | 96900 | 개인 | 45.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 여자 | 1.0 | 롯데카드 |
51297 | 51299 | 66799558 | 렌탈 | 일반계약 | 대형마트A | 2019-04-01 | 60 | CMS | DES-1 | 96900 | 개인 | 42.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 여자 | 8.0 | 새마을금고 |
51298 | 51300 | 66799197 | 렌탈 | 프로모션계약 | 영업방판 | 2019-04-01 | 39 | 카드이체 | ERA | 120900 | 개인 | 65.0 | 서울특별시 | 서울특별시 | 계약확정 | 0 | 없음 | 여자 | 1.0 | 롯데카드 |
51299 | 51301 | 66792778 | 렌탈 | 일반계약 | 홈쇼핑/방송 | 2020-02-06 | 60 | 카드이체 | DES-1 | 96900 | 개인 | 54.0 | 서울특별시 | 서울특별시 | 계약확정 | 0 | 없음 | 여자 | 2.0 | 롯데카드 |
51300 | 51302 | 66799607 | 렌탈 | 일반계약 | 홈쇼핑/방송 | 2019-04-24 | 60 | CMS | DES-1 | 96900 | 개인 | 53.0 | 서울특별시 | 서울특별시 | 계약확정 | 0 | 없음 | 여자 | 8.0 | 신한은행 |
40647 rows × 20 columns
In [ ]:
df1.dropna().isnull().sum()
Out[ ]:
Index 0
Member_ID 0
Sales_Type 0
Contract_Type 0
Channel 0
Datetime 0
Term 0
Payment_Type 0
Product_Type 0
Amount_Month 0
Customer_Type 0
Age 0
Address1 0
Address2 0
State 0
Overdue_count 0
Overdue_Type 0
Gender 0
Credit_Rank 0
Bank 0
dtype: int64
In [ ]:
df1['Credit_Rank'].describe()
Out[ ]:
count 42520.000000
mean 3.428810
std 2.213453
min 0.000000
25% 1.000000
50% 3.000000
75% 5.000000
max 10.000000
Name: Credit_Rank, dtype: float64
In [ ]:
#Credit_Rank의 결측치를 평균값으로 대체한 다음 새로운 항목으로 선언
df1['Credit_Rank(Clean)'] = df1['Credit_Rank'].fillna(3.429)
df1.isnull().sum()
Out[ ]:
Index 0
Member_ID 0
Sales_Type 0
Contract_Type 0
Channel 0
Datetime 0
Term 0
Payment_Type 0
Product_Type 0
Amount_Month 0
Customer_Type 2
Age 6972
Address1 2
Address2 2
State 0
Overdue_count 0
Overdue_Type 0
Gender 0
Credit_Rank 8781
Bank 2759
Credit_Rank(Clean) 0
dtype: int64
In [ ]:
#기존의 항목을 데이터프레임에서 제거
df1.drop(columns=['Credit_Rank']).isnull().sum()
Out[ ]:
Index 0
Member_ID 0
Sales_Type 0
Contract_Type 0
Channel 0
Datetime 0
Term 0
Payment_Type 0
Product_Type 0
Amount_Month 0
Customer_Type 2
Age 6972
Address1 2
Address2 2
State 0
Overdue_count 0
Overdue_Type 0
Gender 0
Bank 2759
Credit_Rank(Clean) 0
dtype: int64