728x90
반응형
라이브러리 설치
- 판다스
- 맷플롯립
- 시본
- 넘파이
- 스태츠모델
- 로우 데이터를 가지고 데이터 전처리를 해줘야한다.
일종의 필터링작업으로 이상데이터 클린징, Null값이나 0값을 대체하거나 제거한다. - 행의 개수, 열의 개수 파악 -> 데이터 크기 파악
- 열의 데이터 종류파악 범주형 데이터와 연속형 데이터 파악
- 범주형 데이터(카테고리 데이터) EDA -> 빈도분석, 교차분석
- 연속형 데이터 -> 평균 중간값 분산
나이는 범주형 분석 불가 -> 연속형 데이터
타이타닉 탑승객의 생존률 분석 보고서 작성¶
데이터 준비¶
1. 데이터의 이해¶
분석할 데이터는 행과 열로 표현된 정형데이터로 행은 탑승객들의 정보, 열은 변수로 되어있다.
첫번째로 변수에 대해 분류를 한다.
여기서 변수에 대한 데이터 분류를 해야하는데, 티켓번호, 탑승요금, 객실번호는 연속형 데이터이고,
생존여부, 티켓의 클래스, 성별, 함께 탑승한 사람, 탑승 항구는 범주형 데이터이다.
survied | 0=No; 1=Yes | |
pclass | 1=등급, 2=등급, 3=등급 | |
sex | male, female | |
age | ||
sibSp | 형제 수+배우자 수 | |
parch | 부모 수+자녀 수 | |
ticket | ||
fare | ||
cabin | ||
embarked |
In [34]:
import pandas as pd
In [43]:
file_path='C:\\users\\jihoon\\train.csv'
In [54]:
df = pd.read_csv(file_path, engine='python')
In [46]:
df
Out[46]:
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
886 | 887 | 0 | 2 | Montvila, Rev. Juozas | male | 27.0 | 0 | 0 | 211536 | 13.0000 | NaN | S |
887 | 888 | 1 | 1 | Graham, Miss. Margaret Edith | female | 19.0 | 0 | 0 | 112053 | 30.0000 | B42 | S |
888 | 889 | 0 | 3 | Johnston, Miss. Catherine Helen "Carrie" | female | NaN | 1 | 2 | W./C. 6607 | 23.4500 | NaN | S |
889 | 890 | 1 | 1 | Behr, Mr. Karl Howell | male | 26.0 | 0 | 0 | 111369 | 30.0000 | C148 | C |
890 | 891 | 0 | 3 | Dooley, Mr. Patrick | male | 32.0 | 0 | 0 | 370376 | 7.7500 | NaN | Q |
891 rows × 12 columns
데이터를 불러왔으니 이제 데이터 전처리를 시행해야한다. 데이터 전처리에서 우선해야 하는 일은 데이터 클린징인데, 결측 데이터를 처리한다.
결측 데이터 처리 순서
- 결측 데이터 확인
- 결측 데이터 대체/제거
- 결측 데이터 반영 확인
In [55]:
df.isnull()
Out[55]:
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | False | False | False | False | False | False | False | False | False | False | True | False |
1 | False | False | False | False | False | False | False | False | False | False | False | False |
2 | False | False | False | False | False | False | False | False | False | False | True | False |
3 | False | False | False | False | False | False | False | False | False | False | False | False |
4 | False | False | False | False | False | False | False | False | False | False | True | False |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
886 | False | False | False | False | False | False | False | False | False | False | True | False |
887 | False | False | False | False | False | False | False | False | False | False | False | False |
888 | False | False | False | False | False | True | False | False | False | False | True | False |
889 | False | False | False | False | False | False | False | False | False | False | False | False |
890 | False | False | False | False | False | False | False | False | False | False | True | False |
891 rows × 12 columns
In [56]:
df.notnull()
Out[56]:
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | True | True | True | True | True | True | True | True | True | True | False | True |
1 | True | True | True | True | True | True | True | True | True | True | True | True |
2 | True | True | True | True | True | True | True | True | True | True | False | True |
3 | True | True | True | True | True | True | True | True | True | True | True | True |
4 | True | True | True | True | True | True | True | True | True | True | False | True |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
886 | True | True | True | True | True | True | True | True | True | True | False | True |
887 | True | True | True | True | True | True | True | True | True | True | True | True |
888 | True | True | True | True | True | False | True | True | True | True | False | True |
889 | True | True | True | True | True | True | True | True | True | True | True | True |
890 | True | True | True | True | True | True | True | True | True | True | False | True |
891 rows × 12 columns
In [57]:
df.isnull().sum()
Out[57]:
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
In [62]:
df.isnull().sum(1)
Out[62]:
0 1
1 0
2 1
3 0
4 1
..
886 1
887 0
888 2
889 0
890 1
Length: 891, dtype: int64
In [63]:
df.notnull().sum(1)
Out[63]:
0 11
1 12
2 11
3 12
4 11
..
886 11
887 12
888 10
889 12
890 11
Length: 891, dtype: int64
결측치 파악이 끝나면, 원하는 결과를 도출하기 위해 결측값을 제거할지 대체할지를 선택한다.
In [85]:
import seaborn as sns
In [98]:
df.info()
<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
많지 않은 행렬이기 때문에 이상데이터는 눈으로 확인해본 결과 존재하지 않았고, 중복데이터는 나이에 대해서 무의미하기 때문에 진행하지 않았다.
In [145]:
df_1=df[['PassengerId','Pclass','Survived','Age','Sex']]
In [146]:
df_1
Out[146]:
PassengerId | Pclass | Survived | Age | Sex | |
---|---|---|---|---|---|
0 | 1 | 3 | 0 | 22.0 | male |
1 | 2 | 1 | 1 | 38.0 | female |
2 | 3 | 3 | 1 | 26.0 | female |
3 | 4 | 1 | 1 | 35.0 | female |
4 | 5 | 3 | 0 | 35.0 | male |
... | ... | ... | ... | ... | ... |
886 | 887 | 2 | 0 | 27.0 | male |
887 | 888 | 1 | 1 | 19.0 | female |
888 | 889 | 3 | 0 | NaN | female |
889 | 890 | 1 | 1 | 26.0 | male |
890 | 891 | 3 | 0 | 32.0 | male |
891 rows × 5 columns
먼저 등급과 생존유무, 나이, 성별만을 변수로 같은 데이터 프레임을 만들고, 분석을 시작하려고 한다.
- 등급별 생존률
- 성별별 생존률
In [114]:
df_1.dtypes
Out[114]:
Pclass int64
Survived int64
Age float64
Sex object
dtype: object
In [116]:
df_1['Sex'].value_counts()
Out[116]:
male 577
female 314
Name: Sex, dtype: int64
In [120]:
pd.crosstab(df_1['Sex'],df_1['Survived']).apply(lambda r: r/len(df_1)*100, axis=1)
Out[120]:
Survived | 0 | 1 |
---|---|---|
Sex | ||
female | 9.090909 | 26.150393 |
male | 52.525253 | 12.233446 |
In [121]:
pd.crosstab(df_1['Pclass'],df_1['Survived']).apply(lambda r: r/len(df_1)*100, axis=1)
Out[121]:
Survived | 0 | 1 |
---|---|---|
Pclass | ||
1 | 8.978676 | 15.263749 |
2 | 10.886644 | 9.764310 |
3 | 41.750842 | 13.355780 |
In [135]:
pd.crosstab(df_1['Pclass'],df_1['Survived']).apply(lambda r: r/len(df_1)*100, axis=1)
Out[135]:
Survived | 0 | 1 |
---|---|---|
Pclass | ||
1 | 8.978676 | 15.263749 |
2 | 10.886644 | 9.764310 |
3 | 41.750842 | 13.355780 |
In [159]:
df_Pclass=df[['PassengerId','Pclass','Survived']]
In [164]:
df_Sex=df[['PassengerId','Sex']]
In [166]:
df_Pclass_Sex=pd.merge(df_Pclass, df_Sex, on='PassengerId')
In [171]:
pd.crosstab(df_Pclass_Sex['Sex'],df_Pclass_Sex['Pclass']).apply(lambda r: r/len(df_1)*100, axis=1)
Out[171]:
Pclass | 1 | 2 | 3 |
---|---|---|---|
Sex | |||
female | 10.549944 | 8.529742 | 16.161616 |
male | 13.692480 | 12.121212 | 38.945006 |
In [170]:
df_Pclass_Sex
Out[170]:
PassengerId | Pclass | Survived | Sex | |
---|---|---|---|---|
0 | 1 | 3 | 0 | male |
1 | 2 | 1 | 1 | female |
2 | 3 | 3 | 1 | female |
3 | 4 | 1 | 1 | female |
4 | 5 | 3 | 0 | male |
... | ... | ... | ... | ... |
886 | 887 | 2 | 0 | male |
887 | 888 | 1 | 1 | female |
888 | 889 | 3 | 0 | female |
889 | 890 | 1 | 1 | male |
890 | 891 | 3 | 0 | male |
891 rows × 4 columns
등급별 남자와 여자의 생존률을 파악하려고 이너병합을 했지만, 그 다음 과정에서 막혔다. 이제 책을 따라가면서 하도록 해야겠다.
In [ ]:
목표 : 생존여부 성별 승객구분 연령집단 교차표
승객구분
연령집단
생존지도 -> 의사결정트리
728x90
반응형
'Computer Engineering > Big Data Analytics Using Python' 카테고리의 다른 글
[에러잡기] UnicodeDecodeError가 뜰 때 (0) | 2021.04.06 |
---|---|
[빅데이터 분석 프로젝트] 마크다운으로 팁 데이터 분석 보고서 작성하기 -Part 1 (0) | 2021.04.06 |
[빅데이터 분석] 5. 데이터 클린징 (0) | 2021.03.15 |
[빅데이터 분석] 4. 데이터 보기 (0) | 2021.03.15 |
[빅데이터 분석] 3. 데이터 준비 (0) | 2021.03.13 |