데이터 사이언스

Data Science Introduction [1]

망나 2019. 1. 15. 23:54

저는 아직 Data Scientist가 정확히 어떤 배경지식이 필요하며 필드에서 어떤 역할을 하는지에 대해 알지 못 합니다. 그래서 저는 인터넷에 돌아다니는 방대한 지식들을 바탕으로 공부하려 합니다. 오늘부터 공부하는 모든 내용들을 이곳 블로그 [ Data Science ] 카테고리에 정리할 것이고, 그로인해 스스로 동기부여를 할 수 있기를 기대하고 있습니다. 작심삼일로 끝나지 않기를... 


가장 먼저 data scientist들에게 가장 핫하고 많은 고수들이 모여든다고 하는 "Kaggle"을 중심으로 시작하겠습니다. (Kaggle 가입만 해놓고 미뤄둔게 몇 달인지 모르것네)


먼저, 간단하게나마 데이터 사이언스의 개념에 대해서 살짝 정리 해보겠습니다. Wikipedia에 따르면 Data science is an interdisciplinary field that uses scientific methods, processes, algorithms and systems to extract knowledge and insights from data in various forms, both structured and unstructured, similar to data mining. Data science is a "concept to unify statistics, data analysis, machine learning and their related methods" in order to "understand and analyze actual phenomena" with data. It employs techniques and theories drawn from many fields within the context of mathematics, statistics, information science, and computer science.


아주 간단하게 정리한다면, 데이터 과학은 데이터로부터 어떠한 지식을 얻기 위한 방법, 절차 또는 알고리즘이며 수학, 통계, 정보 과학, 컴퓨터 과학과 같은 여러 학문의 기술과 이론을 사용한다고 합니다. 데이터 사이언티스트의 프로필을 본다면 아마도 아래 그림과 같을 것 입니다.


[출처] 우와 공부할 거 많다 행복해



훌륭한 데이터 사이언티스트가 되기 위해선 다양한 분야에서 뛰어난 멀티플레이어가 되야 합니다. 누구든지 처음부터 완벽할 수는 없는 법이고, 꾸준히 노력한다면 저도 언젠가는 뛰어난 데이터 사이언티스트가 될 수 있다는 믿음을 가지고 달려보겠습니다.



매일 이정도 노력은 해야지..



가장 먼저, Kaggle에서 아주 유명하고 저 같은 초보자에게 맛보기로 좋은 Titanic 문제로 시작하도록 하겠습니다. Titanic 챌린지에서 저희에게 요구하는 것은 다음과 같습니다. 타이타닉호의 승객들에 대한 데이터(이름, 성별, 나이, 등...)을 줄테니 이를 기반으로 승객들의 생사여부를 예측해봐라. 따라서 저희가 할 일은 주어진 데이터를 학습해서 생존여부를 가장 정확하게 예측할 수 있는 모델을 설계하는 것 입니다.


본격적으로 진행하기에 앞서 Kaggle의 여러 Kernel들에서 본 우수한 선배 데이터 사이언티스트들이 이러한 문제들을 해결하기 위해서 어떠한 프로세스를 따르는지에 대해서 큰 그림을 그려보도록 하겠습니다. 많은 kernel들을 읽은 결과 대부분 다음과 같은 가지 단계를 포함하고 있었습니다.


  1. Define the Problems. 가장 먼저 문제 정의 단계입니다. 데이터를 확인하고 모델을 설계하고 구현하는 단계가 가장 재미있고 중요할 것 같지만 그 전에 해결해야 할 문제가 무엇인지부터 정확히 알아야 합니다. "Problems before requirements, requirements before solutions, solutions before design, and design before technology." 모든 일에 순서가 있듯이 Data Science의 첫 시작은 문제를 정의하고 우리가 무엇을 해야하는지를 정확히 분석하는 것 입니다.

  2. Prepare Data. 데이터를 모으고 사용하기 쉽게 준비하는 단계입니다. 분석에 바로 사용할 수 있도록 애초에 준비된 데이터는 존재하지 않습니다...어떻게 보면 분석을 시작도 하기 전에 이 단계에서 지쳐버릴 수도 있을 정도로 힘들고 시간이 많이 걸릴 수도 있습니다. 하지만 그 만큼 최종 결과물에 큰 영향을 끼치는 중요한 단계이고 필수적인 절차입니다. 이 단계에서는 데이터의 형식을 맞추거나, 데이터 안의 사라진 데이터 또는 이상치들을 어떻게 처리할지 등의 작업들을 수행합니다.

  3. Exploratory Data Analysis. 탐색적 데이터 분석은 준비된 데이터들을 여러가지 방법으로 시각화하고 비교 분석하여 데이터들의 의미를 좀 더 구체적으로 이해하는 단계입니다. 따라서 이 단계에서 데이터들 본연의 의미들을 이해하고 서로간의 상관관계 등을 분석함으로써 정확한 가설을 세우거나 데이터에 적합한 분석 모델을 선택 할 수 있습니다.

  4. Model Selection. 이제 앞 단계에서 우리는 데이터에 대해서 확실히 이해했을 것 입니다. 그렇다면 이제 우리의 데이터와 문제에 적합한 모델을 선택해야합니다. 데이터 분석을 위해 사용되는 모델들은 정말 다양합니다. 모델들은 각각의 특징들이 있고 우리는 이 다양한 모델들 중에서 지금 우리에게 필요한 모델을 선택하기만 하면 됩니다(다양한 모델에 대한 배경 지식이 있고 많이 사용해 본 사람일 수록 쉽고 정확하게 선택 하겠죠?). 쉽게 말해 지금 작업에 필요한 최적의 도구(모델)을 선택하는 단계입니다.

  5. Validate and Optimize. 우리가 무엇을 해야할지를 알았고(문제 정의) 이를 위해서 우리가 사용할 수 있는 자원들을 모으고 준비 했고(데이터 준비) 각 자원들의 특성과 서로간의 상호작용에 대해서도 알았고(탐색적 데이터 분석) 작업에 사용할 가장 효율적인 도구도 선택했습니다(모델 선택). 그럼 이제 직접 실행해보고 그 결과를 분석해야 합니다. 만약 결과가 우리의 생각데로 맞아 떨어져서 한번에 문제가 완벽하게 해결됬다면 뭔가 잘못 된 겁니다. 장난이고, 그럴 가능성이 정말 낮기 때문에..뭐 기적처럼 아니면 내가 너무 뛰어나서 일 수도 있지만... 어쨋든 결과를 분석하고 계속해서 최적화를 진행해야 합니다. 문제 정의를 다시 할 수도 있고, 다른 데이터를 더 사용하거나 아니면 사용했던 데이터에서 일부를 제외할 수도 있고, 분석에 사용하는 모델을 변경할 수도 있습니다. 앞의 모든 과정을 다시 점검하면서 결과를 최적화하는 단계라고 생각하시면 됩니다.


일단 가볍게 이렇게 정리를 하고 세부적이고 더 깊은 내용에 대해서는 차근차근 알아가도록 하겠습니다. 저도 잘 몰라서요 아직...

Not Yet...







Titanic: Machine Learning from Disaster


[1] Define the Problems


문제 정의는 이미 위에서 간단하게 했습니다. 주어진 타이타닉호 탑승객들의 정보를 이용해서 생존여부를 예측하면 됩니다.



[2] Prepare Data


데이터에 어떤 정보들이 있는지 먼저 볼까요? 총 12개의 column들로 구성이 되어 있고요, 각 column들은 다음과 같습니다.


- PassengerID : 탑승객의 ID

- Survived : 생사여부

- Pclass : 탑승 클래스(1-upper/2-middle/3-lower)

- Name : 이름

- Sex : 성별

- Age : 나이

- SibSp : 형제 자매 수

- Parch : 부모 자식 수

- Ticket : 티켓 번호

- Fare : 운임

- Cabin : 선실 번호

- Embarked : 승선항


그냥 간단하게 봤을 때, 생존여부에 영향을 끼칠 가능성이 있는 항목은 Pclass, Sex, Age, SibSp, Parch 정도 일 것 같습니다. 저의 직관적인 판단으로 1등급 클래스에 탑승한 승객들이 생존 확률이 2, 3등급 클래스의 승객들 보다 높을 것 같습니다.


실제로 각 항목별로 누락된 데이터나 이상치 데이터가 존재하는지를 확인해서 처리하고 또한 수치로 표현된 데이터들을 클래스 형태의 데이터로 변환하기 위해서 데이터를 자세히 살펴보겠습니다.


  1. PassengerID : 탑승객의 ID는 말 그대로 탑승객을 구분할 수 있는 랜덤한 정수 데이터입니다. 탑승객의 생존여부를 예측하는데는 크게 영향을 끼치지 않을 것 같아서 분석 대상에서 제외해도 될 것 같습니다.

  2. Survived : 승객의 생사여부를 나타내는 binary norminal datatype으로 1(생존), 0(사망)으로 구분 됩니다. 우리가 최종적으로 예측해야하는 종속 변수입니다.

  3. Pclass : 탑승 클래스 데이터로써 승객의 생사여부 예측에 중요한 영향을 끼칠 것 같습니다.

  4. Name : 탑승객의 이름으로 이 데이터를 통해서 성별, 가족 구성원 수, 사회적 지위(doctor or master)를 추론해 낼 수 있습니다.

  5. Sex, Age : 성별과 나이 데이터를 통해서 성별과 연령층별 생존 확률을 계산하여 탑승객들의 생존여부를 예측하는데 사용할 수 있습니다.

  6. SibSp, Parch : 형제 자매와 부모 자식 관계 수로 대가족 or 개인처럼 승객의 형태를 분류하여 생존여부를 예측하는데 사용할 수 있습니다.

  7. Ticket, Fare : 티켓 번호와 요금 데이터로 PassengerID와 함께 생존여부 예측에는 큰 영향을 끼치지 않을 것 같습니다.

  8. Cabin, Embarked : 선실 번호와 승선항입니다. 선실 번호는 생존여부에 중요한 영향을 끼칠 것 같지만, 승선항의 경우에는 크게 연관성이 없을 것으로 예상됩니다.

각 데이터들에 대해서 조금 더 상세히 살펴봤습니다. 이제 데이터를 분석에 사용할 수 있도록 "Data Cleaning"을 진행하도록 하겠습니다. (Data Cleaning에도 다양한 방법들이 있으며 세부적으로 다루게 되면 많은 내용이 있어 이번 글에서는 자세히 설명하지 않고 넘어가도록 하겠습니다.)

  • Completing

    먼저 Nan 데이터부터 처리하도록 하겠습니다. 데이터에 Nan 데이터가 있을 경우, 분석에 필요 없는 데이터는 그냥 제외시키면 되지만, 분석에 꼭 필요한 중요한 데이터들에 Nan 값이 존재할 경우 우리는 해당 값들을 분석에 사용 가능한 값으로 대체해야 합니다. 이때 값들의 median, mode 등을 계산하여 대체하게 됩니다.



    데이터 확인 결과 Train 데이터에서 Age 177개, Cabin 687개, Embarked 2개 그리고 Test 데이터에서 Age에 86개, Fare에 1개, Cabin에 327개의 Nan 데이터가 존재합니다.



    median, mode 값을 이용해서 Age, Embarked, Fare의 Nan 데이터를 대체하고 승객의 생존여부를 예측하는데 필요없을 것 같은 PassengerID, Cabin, Ticket 데이터를 삭제하였습니다. 그림에서 볼 수 있듯 이제 데이터에는 Nan 값이 존재하지 않습니다.


  • Create

    이번에는 승객의 생존여부를 예측하는데 도움이 될 만한 새로운 데이터를 생성하도록 하겠습니다. 앞에서도 살짝 언급했는데 이름을 통해서 사회적인 지위를 알 수 있고, 형재 자매와 부모 자식의 수로 승객이 혼자인지 가족과 함께 있는지도 알 수 있습니다. 이렇게 기존의 데이터를 통해서 추가적으로 추론해서 필요한 정보를 얻을 수 있습니다.
    우리는 분석을 위해서 FamilySize, IsAlone, Title, FareBin, AgeBin 총 5개의 새로운 데이터를 생성했습니다.



    code를 보면 FamilySize는 SibSp와 Parch를 활용하였고 FamilySize를 활용하여 승객이 혼자인지 아닌지를 나타내는 IsAlone을 얻었습니다. 그리고 Fare와 Age 같은 연속적인 값을 cut과 qcut을 통해서 분류한 FareBin, AgeBin을 얻었습니다. (cut과 qcut의 차이점)


  • Convert

    이번 단계에서는 데이터들을 category 형태의 데이터로 변환하는 단계입니다. Embarked, Title 등 문자 형태의 데이터들을 categorical 하게 (예를 들어 "1"은 Male, "0"은 Female) 나타내 분석에 활용하겠습니다.




  • Split Training and Testing Data
     
    이제 모델 학습을 위해서 데이터를 학습 데이터와 평가 데이터로 나누겠습니다. python sklearn 패키지를 활용하면 한 줄의 코드로 쉽게 작업이 가능합니다.




    이제 분석을 시작하기 위한 데이터 준비가 거의 마무리 된 것 같습니다. 이제 이 단계에서 탐색적 데이터 분석을 통해서 데이터들 간의 상관관계를 또는 연관성을 분석해야 하지만, 일단 대표적인 머신러닝 알고리즘을 바로 적용시켜보고 결과가 어떻게 나오는지 한번 알아보겠습니다. 순서가 거꾸로인것 같지만 저는 일단 결과물을 한번 보고 싶어서요...

    일단 많이 사용되는 대표적인 6가지 알고리즘을 적용시켜봤습니다.



    어떤가요? 결과가 마음에 드시나요? 가장 좋은 결과로 XGBClassifier 모델을 사용했을 때, Test Accuracy가 평균 0.83 가까이 나온 것을 볼 수 있습니다. 하지만 여기서 멈춘다면 Data Scientist라고 할 수 없겠죠. 누구든 Python 라이브러리를 사용하기만 하면 이 정도의 결과는 얻을 수 있습니다. 따라서 우리가 한 발 더 나아가서 Data Science를 하기 위해선 잠시 건너 뛰었던 탐색적 데이터 분석 (Exploratory Data Analysis)이 필요합니다. 저도 이제 막 시작하는 초보자이기 때문에 Kaggle의 여러 Kernel들을 보고 다른 분들이 어떤 방식으로 EDA를 하는지 알아보도록 하겠습니다.

    참고로 현재 XGBClassifier 모델을 통한 예측 결과를 제출하면,



    ...아직 갈 길이 먼 것 같습니당......

    내용이 너무 길어져서 Data Science Introduction [2]에서 이어가도록 하겠습니다.