저번 사이킷런 포스팅에서는 넘파이를 이용하여 자료를 핸들링하였는데 이번에는 많이 사용하게될 판다스 패키지를 이용하여 핸들링을 해보겠습니다. 이번에는 직접 데이터셋을 이용하여 핸들링 해보겠습니다.
사용되는 데이터는 타이타닉 데이터입니다. 아래 링크를통해 다운로드를 할수 있습니다.
kaggle.com/c/titanic/data
이제 데이터셋이 준비가 완료 됬으니 직접 파이썬에서 구현해보겠습니다.
import os
import pandas as pd
os.getcwd()
os.chdir('/Users/sik/Desktop/CSV')
# 판다스를 이용하여 데이터 프레임 생성 csv 말고 다른 파일도 로딩가능
# 판다스는 기본적으로 ndarray 의 값을 가지고 있음
titan_df = pd.read_csv("titanic_train.csv")
print(titan_df)
os는 디렉터리를 활용할수 있게 해주는 모듈입니다.
위처럼 os.getcwd()를 이용하면 현재 작업중인 디렉터리를 볼수있습니다. 또한 os.chdir()를 이용하면 위와같이 디렉터리 변경을 할 수 있습니다.
train_df인 변수명에 pandas모듈의 read_csv를 이용하여 데이터셋을 로드 하겠습니다.
print로 출력한 결과값은 다음과 같습니다.
print(titan_df)
PassengerId Survived Pclass ... Fare Cabin Embarked
0 1 0 3 ... 7.2500 NaN S
1 2 1 1 ... 71.2833 C85 C
2 3 1 3 ... 7.9250 NaN S
3 4 1 1 ... 53.1000 C123 S
4 5 0 3 ... 8.0500 NaN S
.. ... ... ... ... ... ... ...
886 887 0 2 ... 13.0000 NaN S
887 888 1 1 ... 30.0000 B42 S
888 889 0 3 ... 23.4500 NaN S
889 890 1 1 ... 30.0000 C148 C
890 891 0 3 ... 7.7500 NaN Q
[891 rows x 12 columns]
891개의행 12개의 컬럼을 가지고 있는 것을 볼수 있습니다. 위의 데이터셋같은경우는 테스트와 트레이닝 셋이 이미 분리 되어있기 때문에 따로 분류해주지 않았습니다.
이제 데이터셋이 가지고있는 변수들과 특성들을 파악해 보겠습니다.
# 타입확인
# 데이터 프레임으로 생성된것을 볼수있음.
print("titan_df 의 데이터 타입은 : ", type(titan_df))
# 행과 열의 크기를 가장 잘 확인 할수있는 방법은 .shape를 이용한다.
print(("titan_df 의 행과열을 쉽게 확인하기 : ", titan_df.shape)) # 891개의 행과 12개의 컬럼을 가진것을 확인 할수 있다.
# 데이터프레임의 상세 메타데이터 확인하기
print("titan_df의 메타 데이터 확인하기 : ", titan_df.info()) # 컬럼명 , NULL의수, 데이터 타입을 확인 할수 있음
# 데이터값에 이상치가 많으면 예측성능이 저하됨. 간단히 .describe로 확인이 가능함
print("titan_df의 분포도 확인하기 : ", titan_df.describe()) # 카운트,평균,표준편차,최소값,4분위수,최대값을 확인할수 있음.
코드는 다음과 같습니다. 이제 결과값을 확인해 보도록 하겠습니다.
titan_df 의 데이터 타입은 : <class 'pandas.core.frame.DataFrame'>
('titan_df 의 행과열을 쉽게 확인하기 : ', (891, 12))
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 891 non-null int64
1 Survived 891 non-null int64
2 Pclass 891 non-null int64
3 Name 891 non-null object
4 Sex 891 non-null object
5 Age 714 non-null float64
6 SibSp 891 non-null int64
7 Parch 891 non-null int64
8 Ticket 891 non-null object
9 Fare 891 non-null float64
10 Cabin 204 non-null object
11 Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
titan_df의 메타 데이터 확인하기 : None
titan_df의 분포도 확인하기 : PassengerId Survived Pclass ... SibSp Parch Fare
count 891.000000 891.000000 891.000000 ... 891.000000 891.000000 891.000000
mean 446.000000 0.383838 2.308642 ... 0.523008 0.381594 32.204208
std 257.353842 0.486592 0.836071 ... 1.102743 0.806057 49.693429
min 1.000000 0.000000 1.000000 ... 0.000000 0.000000 0.000000
25% 223.500000 0.000000 2.000000 ... 0.000000 0.000000 7.910400
50% 446.000000 0.000000 3.000000 ... 0.000000 0.000000 14.454200
75% 668.500000 1.000000 3.000000 ... 1.000000 0.000000 31.000000
max 891.000000 1.000000 3.000000 ... 8.000000 6.000000 512.329200
데이터 타입은 데이터 프레임으로 이루어진것을 확인 할수있습니다. 또한 891개의 행을가지고 12개의 컬럼을 가졌다는것도 확인할수 있습니다.
.infoI()를 이용하면 결측값을 제외한 변수의 숫자들을 알 수 있습니다. 한마디로 결측값이 들어있지 않은 컬럼은 891개의 값을 가지는 것을 알 수 있습니다.
.describe() 함수를 이용하면 각 컬럼의 개수,평균,표준편차,최소값,최대값,4분위수 값을 알 수 있습니다.
이제는 인덱싱을 한번 실제 데이터로 해보도록 하겠습니다.
# 조건에 맞게 불린 인덱싱하여 추출하기
con1 = titan_df['Pclass'] == 1 # Pclass에서 1인 값만 추출 (불린형태로 볼수있음)
con2 = titan_df['Sex'] == 'female' # 성별이 여자인 사람만 추출
titan_df[con1 & con2] # 두개의 조건을 모두 만족하는 행을 인덱싱
마지막 결과값을 확인해 보도록 하겠습니다.
titan_df[con1 & con2] # 두개의 조건을 모두 만족하는 행을 인덱싱
PassengerId Survived Pclass ... Fare Cabin Embarked
1 2 1 1 ... 71.2833 C85 C
3 4 1 1 ... 53.1000 C123 S
11 12 1 1 ... 26.5500 C103 S
31 32 1 1 ... 146.5208 B78 C
52 53 1 1 ... 76.7292 D33 C
.. ... ... ... ... ... ... ...
856 857 1 1 ... 164.8667 NaN S
862 863 1 1 ... 25.9292 D17 S
871 872 1 1 ... 52.5542 D35 S
879 880 1 1 ... 83.1583 C50 C
887 888 1 1 ... 30.0000 B42 S
[94 rows x 12 columns]
Pclass 에서 1의 값을 가지고 위 결과값에서는 생략이되어 보이지않지만 성별이 여자인 데이터를 만족하는 94개의 행만 추출이 된 것을 볼수있습니다.
다음은 데이터를 핸들링하다보면 순서대로 정렬해야 할때가 있을 것입니다.
sort를 이용해 실제 데이터를 순서대로 정렬해 보겠습니다.
titan_df_sort = titan_df.sort_values(by=['Name'])
titan_df_sort.head()
# 여러개의 칼럼으로 정렬하기
titan_df_sort_many = titan_df.sort_values(by=['Pclass','Name'],ascending=False)
# pclass와 이름을 내림차순으로 정렬
titan_df_sort_many.head()
by=[]에 한가지 컬럼을 넣으면 그컬럼에 의해 정렬이되고 두개의 컬럼을 넣으면 두개의 컬럼대로 정렬이 되는 것을 확인할수있습니다.
만약 오름차순으로 정렬을 하시고 싶으시면 ascending=True를 사용하시면 됩니다.
다음은 원하는 컬럼별로 gruopby하여 출력하고 싶을때 이용하는 함수입니다.
titan_grouby = titan_df.groupby(by='Pclass')
print(type(titan_grouby)) # 데이터프레임 그룹바이라는 새로운 형태로 된것을 볼수있음.
titan_grouby = titan_df.groupby(by='Pclass').count()
titan_grouby # Pclass가 인덱스로 나머지 데이터를 묶은 것을 확인 할수 있다, grouby 대상을 제외한 모든 컬럼에 count가 적용이 됨.
# 두개의 칼럼을 필터링해 묶어보기
titan_grouby = titan_df.groupby(by='Pclass')[['PassengerId','Survived']].count() # Pcalss를 기준으로 패신져번호,생존 의 숫자를 카운트
titan_grouby
# Pclass 를 기준으로 나이를 최대, 최소값으로 구분하기
titan_grouby = titan_df.groupby(by='Pclass')['Age'].agg([min,max])
titan_grouby
우선 첫번째 결과값을 확인해보겠습니다.
<class 'pandas.core.groupby.generic.DataFrameGroupBy'> 데이터 프레인 그룹바이라는 새로운 형태로 변경된 것을 볼 수 있습니다.
자이제 묶은 데이터들을 활용 해보도록 하겠습니다.
마지막에 Pclass별로 그룹바이한뒤 나이의 최소값과 최대값을 확인해보겠습니다.
min max
Pclass
1 0.92 80.0
2 0.67 70.0
3 0.42 74.0
위 처럼 Pclass(좌석등급)인 1,2,3에서 최소나이와 최대나이를 확인 할 수 있습니다.
이제 마지막으로 컬럼을 lambda를 이용하여 카테고리화 시키도록 하겠습니다.
# 나이를 이용하여 15세 미만이면 어린이 그렇지 않으면 어른인 컬럼을 생성하여 보여줌.
# 보통의경우 if절 뒤에 반환값이 오는데 람다의 경우는 if절 앞에 조건이 오는 것을 볼 수 있음.
titan_df['Child_Adult'] = titan_df['Age'].apply(lambda x : 'Child' if x <=15 else 'Adult')
titan_df[['Age','Child_Adult']].head(10)
# 나이를 이용하여 3단계 구분하기
# 15세 이하이면 어린이 60세 이하면 성인 나머지는 노년으로 데이터를 세분화
titan_df['Age_3'] = titan_df['Age'].apply(lambda x : 'Child' if x <= 15 else ('Adult' if x <= 60 else 'Elderly'))
titan_df[['Age','Age_3']].head(10)
titan_df['Age_3'].value_counts()
두가지 형식으로 코딩해보겠습니다. 하나는 비교적 적은 카테고리인 15세미만이면 어린이,이상이면 어른으로 표기해 줍니다. 결과값 10개만 출력해보도록 하겠습니다.
Age Child_Adult
0 22.0 Adult
1 38.0 Adult
2 26.0 Adult
3 35.0 Adult
4 35.0 Adult
5 NaN Adult
6 54.0 Adult
7 2.0 Child
8 27.0 Adult
9 14.0 Child
잘 분류가 되어있는 것을 확인 할 수 있습니다. 하지만 중간에 결측값이 껴있는 것이 보입니다. 이것은 다음포스팅에서 결측값처리에 대한 부분을 다루도록 하겠습니다.
다음은 조금더 세분화시켜 15세 이하면 어린이 60이하면 성인 그외는 노년으로 데이터를 세분화 해보도록 하겠습니다. 결과값은 다음과 같습니다.
titan_df[['Age','Age_3']].head(10)
Age Age_3
0 22.0 Adult
1 38.0 Adult
2 26.0 Adult
3 35.0 Adult
4 35.0 Adult
5 NaN Elderly
6 54.0 Adult
7 2.0 Child
8 27.0 Adult
9 14.0 Child
titan_df['Age_3'].value_counts()
Adult 609
Elderly 199
Child 83
Name: Age_3, dtype: int64
여기도 마찬가지로 결측값이 존재하는것을 볼수있습니다. 또 value_counts()를 이용하면 쉽게 수량을 파악 할 수 있습니다.
'Python > Sklearn' 카테고리의 다른 글
[Python]Ensemble "Voting" (0) | 2022.03.17 |
---|---|
[Python]Human Activity Recognition Using by "Decision Tree" (0) | 2022.03.17 |
[Python]Data Preprocessing & Encoding (데이터 전처리 인코딩 & 데이터스케일링) (0) | 2022.03.15 |
[Python]Cross Validation & GridSearchCV (교차검증, 하이퍼파라미터 튜닝) (0) | 2022.03.15 |
sklearn을 이용하여 데이터 분석하기 - Numpy (0) | 2022.03.08 |