(Machine) 14. Kaggle

2 분 소요

# 학습 목표

데이터 분석 대회인 Kaggle 에서 기본적으로 사용되는 데이터 중 하나인 Titanic Project 데이터를 이용하여 지금까지 배운 데이터 핸들링 방법들을 실습하고, Kaggle 대회에 실제 분석 결과를 제출하는 방법에 대해 공부합니다.

# Titanic Project

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

test_df = pd.read_csv('./file/test.csv')
train_df = pd.read_csv('./file/train.csv')

# 1. 인덱스 지정
test_df.set_index('PassengerId', inplace=True)
train_df.set_index('PassengerId', inplace=True)

# print(train_df.head())
# print(test_df.head())

# 2. 인덱스 데이터만 따로 추출
test_index = test_df.index
train_index = train_df.index

# 3. 결과에 해당하는 Y 데이터 추출
y_train_df = train_df.pop("Survived")

# 4. 데이터 전처리 (소수 2째 자리까지만 표현하게)
pd.set_option('display.float_format', lambda x: '%.2f' % x)

# 5. 결측치를 찾아내서 데이터 drop
test_df.isnull().sum() / len(test_df)  # Cabin      0.78

# Cabin의 nan값이 78%이기 떄문에 삭제 시켜준다
del test_df["Cabin"]
del train_df["Cabin"]

# 6. test데이터와 train데이터를 합쳐준다.
all_df = train_df.append(test_df)

# 7. all data에서 nan값 확인 (matplot 그래프를 사용해서 확인해보자!)
(all_df.isnull().sum() / len(all_df)).plot(kind='bar')
# plt.show() #그래프 그리기

# 8. 쓸모없는 Column 삭제
del all_df["Name"]
del all_df["Ticket"]

# 9. Sex(성별), Embarked(어느 항구에서 출발했는지) one hot encoding 으로 바꿔주는 작업
all_df["Sex"] = all_df["Sex"].replace({"male": 0, "female": 1})
# print(all_df.head())
# print(all_df["Embarked"].unique()) #카테고리 작업
all_df["Embarked"] = all_df["Embarked"].replace({"S": 0, "C": 1, "Q": 2 , np.nan: 99})


# 10. one hot encoding 용 dumy matrix 데이터 만들어 all_df에 merge시키기
matrix_df = pd.merge(
    all_df, pd.get_dummies(all_df["Embarked"], prefix="embarked"),
    left_index=True, right_index=True)
# print(matrix_df.head())

# 11. corr함수를 사용해서 상관관계가 큰 값은 삭제( 여기서는 안함..)
matrix_df.corr()

# 12. groupby 를 통해 nan값들을 평균값으로 치환
# print(all_df.groupby("Pclass")["Age"].mean()) # class별 age평균값

all_df.loc[
    (all_df["Pclass"]==1)  & (all_df["Age"].isnull()), "Age"] = 39.16
all_df.loc[
    (all_df["Pclass"]==2)  & (all_df["Age"].isnull()), "Age"] = 29.51
all_df.loc[
    (all_df["Pclass"]==3)  & (all_df["Age"].isnull()), "Age"] = 24.82
# > transformation으로 한번에 할 수도 있음.

# 13. 중간에 다시 nan값이 있나 확인
all_df.isnull().sum() # 확인해 보니 Fare 값이 또 있음..

# 14. Fare값 평균값으로 넣어 주기
# print(all_df.groupby("Pclass")["Fare"].mean()) # Fare에 평균값 찾기
# print(all_df[all_df["Fare"].isnull()])  # nan Fare Data를 갖는 Row 찾기
all_df.loc[all_df["Fare"].isnull(), "Fare"] = 13.30 # 값 넣기


# 14. one hot encoding 부분 원본 데이터 삭제
del all_df["Embarked"]

# 15. Pclass도 one Hot encoding으로 바꿔주자!
all_df["Pclass"] = all_df["Pclass"].replace({1: "A", 2: "B", 3: "C"})
all_df = pd.get_dummies(all_df)


# 16. matrix이랑 합치기
all_df = pd.merge(
    all_df, matrix_df[["embarked_0","embarked_1","embarked_2","embarked_99"]],
    left_index=True, right_index=True)
# print(all_df)
train_df = all_df[all_df.index.isin(train_index)]
test_df = all_df[all_df.index.isin(test_index)]
# print(train_df.head())

# 17. model 뽑아 내기
x_data = train_df.values
y_data = y_train_df.values

from sklearn.linear_model import LogisticRegression
cls = LogisticRegression()
cls.fit(x_data,y_data)
cls.intercept_
cls.coef_
cls.predict(test_df.values)


test_df.index
x_test = test_df.values
y_test =cls.predict(x_test)

result = np.concatenate( (test_index.values.reshape(-1,1),
                 cls.predict(x_test).reshape(-1,1)  ) , axis=1)

df_submssion =pd.DataFrame(result, columns=["PassengerId","Survived"])
print(df_submssion)

# 18. csv 파일 생성
df_submssion.to_csv("submission_result.csv",index=False)

댓글남기기