Tour of Evaluation Metrics for Imbalanced Classification

Tour of Evaluation Metrics for Imbalanced Classification

균형분류를 위한 평가 지표 둘러보기

by Jason Brownlee on January 8, 2020 in Imbalanced Classification (https://machinelearningmastery.com/tour-of-evaluation-metrics-for-imbalanced-classification/)

2020년 1월 14일 마지막 업데이트

분류자는 이를 평가하는 데 사용된 메트릭만큼만 적합합니다.

모형을 평가하기 위해 메트릭을 잘못 선택한 경우 불량 모형을 선택하거나 최악의 경우 모형의 예상 성능에 대해 오도할 수 있습니다.

적용 기계 학습에서는 일반적으로 적절한 측정지표를 선택하는 것이 어렵지만, 불균형 분류 문제에서는 특히 어렵다. 첫째, 널리 사용되는 대부분의 표준 메트릭은 균형잡힌 클래스 분포를 가정하기 때문에, 그리고 일반적으로 모든 클래스가 아니므로 모든 예측 오차가 불균형 분류에 대해 동일하지 않기 때문입니다.

이 튜토리얼에서는 불균형 분류에 사용할 수 있는 메트릭을 검색합니다.

이 튜토리얼을 완료하면 다음과 같은 사실을 알 수 있습니다.

분류를 위해 메트릭을 선택하는 과제와 치우친 클래스 분포가 있을 때 특히 어려운 방법에 대해 설명합니다. 분류기 모델을 평가하기 위한 세 가지 주요 유형의 메트릭을 순위, 임계값 및 확률이라고 하는 방법. 어디서부터 시작해야 할지 모르는 경우 불균형 분류에 대한 메트릭을 선택하는 방법. 단계별 튜토리얼과 파이썬 소스 코드 파일을 포함한 파이썬과의 새로운 책 Imbalanced Classification with Python으로 프로젝트를 시작하십시오.

자습서 개요

본 자습서는 다음과 같이 세 부분으로 나뉩니다.

  1. 평가 지표의 과제
  2. 분류기 평가 지표의 분류법
  3. 평가 메트릭 선택 방법

평가 지표의 과제

평가 메트릭은 예측 모형의 성능을 수량화합니다.

여기에는 일반적으로 데이터 집합에서 모델을 교육하고, 모델을 사용하여 교육 중에 사용되지 않은 홀드아웃 데이터 집합에 대한 예측을 수행한 다음, 예측을 홀드아웃 데이터 집합의 예상 값과 비교하는 작업이 포함됩니다.

분류 문제의 경우 메트릭은 예상 클래스 레이블을 예측 클래스 레이블과 비교하거나 해당 문제에 대한 클래스 레이블의 예측 확률을 해석하는 것을 포함합니다.

모델을 선택하고 데이터 준비 방법을 함께 사용하는 것은 평가 메트릭에 의해 안내되는 검색 문제입니다. 실험은 다른 모델로 수행되며 각 실험의 결과는 미터법으로 정량화된다.

평가방안은 분류성능 평가와 분류기 모델링 지도에 모두 중요한 역할을 한다.

균형분류를 위한 평가 지표 둘러보기 으로 제이슨 브라운리 에 January 8, 2020 에서 불균형 분류 트윗 공유 2020년 1월 14일 마지막 업데이트

분류자는 이를 평가하는 데 사용된 메트릭만큼만 적합합니다.

모형을 평가하기 위해 메트릭을 잘못 선택한 경우 불량 모형을 선택하거나 최악의 경우 모형의 예상 성능에 대해 오도할 수 있습니다.

적용 기계 학습에서는 일반적으로 적절한 측정지표를 선택하는 것이 어렵지만, 불균형 분류 문제에서는 특히 어렵다. 첫째, 널리 사용되는 대부분의 표준 메트릭은 균형잡힌 클래스 분포를 가정하기 때문에, 그리고 일반적으로 모든 클래스가 아니므로 모든 예측 오차가 불균형 분류에 대해 동일하지 않기 때문입니다.

이 튜토리얼에서는 불균형 분류에 사용할 수 있는 메트릭을 검색합니다.

이 튜토리얼을 완료하면 다음과 같은 사실을 알 수 있습니다.

분류를 위해 메트릭을 선택하는 과제와 치우친 클래스 분포가 있을 때 특히 어려운 방법에 대해 설명합니다. 분류기 모델을 평가하기 위한 세 가지 주요 유형의 메트릭을 순위, 임계값 및 확률이라고 하는 방법. 어디서부터 시작해야 할지 모르는 경우 불균형 분류에 대한 메트릭을 선택하는 방법. 단계별 튜토리얼과 파이썬 소스 코드 파일을 포함한 파이썬과의 새로운 책 Imbalanced Classification with Python으로 프로젝트를 시작하십시오.

슬슬 출발 해야지.

Tour of Evaluation Metrics for Imbalanced Classification 균형분류를 위한 평가 지표 둘러보기 트래비스 와이즈의 사진, 몇 가지 권한은 유보되어 있습니다.

자습서 개요 본 자습서는 다음과 같이 세 부분으로 나뉩니다.

평가 지표의 과제 분류기 평가 지표의 분류법 평가 메트릭 선택 방법 평가 지표의 과제 평가 메트릭은 예측 모형의 성능을 수량화합니다.

여기에는 일반적으로 데이터 집합에서 모델을 교육하고, 모델을 사용하여 교육 중에 사용되지 않은 홀드아웃 데이터 집합에 대한 예측을 수행한 다음, 예측을 홀드아웃 데이터 집합의 예상 값과 비교하는 작업이 포함됩니다.

분류 문제의 경우 메트릭은 예상 클래스 레이블을 예측 클래스 레이블과 비교하거나 해당 문제에 대한 클래스 레이블의 예측 확률을 해석하는 것을 포함합니다.

모델을 선택하고 데이터 준비 방법을 함께 사용하는 것은 평가 메트릭에 의해 안내되는 검색 문제입니다. 실험은 다른 모델로 수행되며 각 실험의 결과는 미터법으로 정량화된다.

평가방안은 분류성능 평가와 분류기 모델링 지도에 모두 중요한 역할을 한다.

— 불균형 데이터의 분류: A Review, 2009.

분류 정확도 또는 분류 오류와 같은 분류 예측 모형을 평가하는 데 널리 사용되는 표준 메트릭이 있습니다.

표준 메트릭은 대부분의 문제에 대해 잘 작동하며, 이것이 표준 메트릭이 널리 채택되는 이유입니다. 그러나 모든 측정 기준은 문제에 대한 가정이나 문제에서 무엇이 중요한지에 대한 가정을 한다. 따라서 귀하 또는 프로젝트 이해관계자가 모델 또는 예측에 중요하다고 생각하는 것을 가장 잘 포착하는 평가 메트릭을 선택해야 하며, 이로 인해 모형 평가 메트릭의 선택이 어려워집니다.

이 도전은 클래스 분배에 꼬투리가 있을 때 더욱 어려워진다. 그 이유는 많은 표준 메트릭이 소수 클래스와 다수 클래스 간의 1:100 또는 1:1000 비율과 같이 클래스가 불균형하거나 심각하게 불균형되어 있을 때 신뢰할 수 없거나 오해의 소지가 있기 때문입니다.

클래스 불균형의 경우, 왜곡되지 않은 데이터에 사용되는 기본적이고 비교적 강력한 절차가 데이터를 왜곡할 때 비참하게 분해될 수 있기 때문에 문제는 더욱 심각합니다.

— 187페이지, 불균형 학습: 기초, 알고리즘 및 애플리케이션, 2013년

예를 들어, 심각한 불균형 분류 문제에 대한 분류 정확도를 보고하는 것은 위험할 정도로 오해를 불러일으킬 수 있다. 프로젝트 이해관계자들이 결과를 이용하여 결론을 도출하거나 새로운 프로젝트를 계획하는 경우이다.

실제로 불균형 도메인에서 공통 메트릭을 사용하면 최적 이하의 분류 모델로 이어질 수 있으며, 이러한 조치는 치우친 도메인에 대해 무감각하기 때문에 잘못된 결론을 내릴 수 있습니다

— 2015년 불균형 분포에 따른 예측 모델링 조사.

중요한 것은 불균형 분류 작업을 할 때 종종 다른 평가 메트릭이 요구된다는 것입니다.

모든 클래스를 동등하게 중요하게 취급하는 표준 평가 지표와 달리 불균형 분류 문제는 일반적으로 소수 계층과의 분류 오류를 다수 계층의 것보다 더 중요하게 평가한다. 이와 같이 성과 지표는 소수 계층에 초점을 맞추는 것이 필요할 수 있는데, 소수 계층은 유효 모델을 교육하는 데 필요한 관측치가 부족하기 때문에 어려움을 겪게 됩니다.

불균형 데이터 세트의 주요 문제는 데이터 세트가 사용 가능한 데이터 샘플에서 잘 표현되지 않는 경우 성능에 대한 사용자 선호 편향과 연관되어 있다는 사실에 있습니다.

— 2015년 불균형 분포에 따른 예측 모델링 조사.

이제 모델 평가 메트릭을 선택해야 하는 과제에 대해 잘 알고 있으므로 선택할 수 있는 메트릭의 몇 가지 예를 살펴보겠습니다.

분류기 평가 지표의 분류법

분류자 모델을 평가할 때 선택할 수 있는 메트릭은 수십 개이며, 학계에서 제안하는 애완동물 버전의 메트릭스를 모두 고려할 경우 수백 개일 수 있습니다.

여러분이 선택할 수 있는 측정 기준을 다루기 위해, 우리는 Cesar Ferri 등이 2008년 논문 “분류를 위한 성능 측정의 실험적 비교”에서 제안한 분류법을 사용할 것이다. 2013년 책 ’임밸런스 러닝’에서도 채택됐는데 유용성이 입증된 것 같습니다.

평가 메트릭을 세 가지 유용한 그룹으로 나눌 수 있습니다. 다음과 같습니다.

  1. 임계값 메트릭
  2. 랭킹 메트릭스
  3. 확률 메트릭스.

이 중분류는 개업자들이 분류기에 사용하는 최상위 측정기준, 특히 불균형 분류기준이 분류법에 깔끔하게 들어맞기 때문에 유용하다.

여러 기계 학습 연구자들이 분류의 맥락에서 사용되는 세 가지 평가 지표 계열을 식별하였다. 이는 임계값 메트릭(예: 정확도 및 F-측정), 순위 방법 및 메트릭(예: 수신기 작동 특성(ROC) 분석 및 AUC), 확률론적 메트릭(예: 루트 평균 오차)입니다.

— 189페이지, 불균형 학습: 기초, 알고리즘 및 애플리케이션, 2013년

각 조별로 차례로 자세히 살펴보겠습니다.

##불균형 분류를 위한 임계값 메트릭

임계값 메트릭은 분류 예측 오류를 수량화하는 메트릭입니다.

즉, 예측 클래스가 홀드아웃 데이터 집합에서 예상 클래스와 일치하지 않는 경우의 비율, 비율 또는 비율을 요약하도록 설계되었습니다.

임계값 및 오류의 질적 이해에 기반한 메트릭 […] 이러한 측정은 오류 수를 최소화하기 위해 모델을 원할 때 사용됩니다.

— 분류용 성능 측정의 실험적 비교, 2008

아마도 가장 널리 사용되는 임계값 메트릭은 분류 정확도입니다.

- 정확도 = 올바른 예측 / 총 예측

그리고 분류 오류라고 하는 분류 정확도의 보완.

- 오류 = 잘못된 예측 / 총 예측

널리 사용되었지만 분류 정확도는 불균형 분류에 거의 보편적으로 부적절하다. 그 이유는, 높은 정확도(또는 낮은 오차)는 다수 클래스만을 예측하는 스킬 모형으로 달성할 수 있기 때문입니다.

분류 정확도 오류에 대한 자세한 내용은 자습서를 참조하십시오.

  • 불균형 계층분포를 위한 분류정확성 오류

불균형한 분류 문제의 경우, 일반적으로 다수계급을 음의 결과(예: “변동 없음” 또는 “부정 테스트 결과”)라고 하고, 소수계급을 양의 결과(예: “변화” 또는 “양성 테스트 결과”)라고 한다.

-전공수업 : 부정적인 결과, 0등급. -마이너리티 클래스: 긍정적인 결과, 1등급.

대부분의 임계값 메트릭은 이진(2등급) 분류 문제에 대한 혼동 행렬에 사용되는 항으로 가장 잘 이해할 수 있습니다. 이는 메트릭이 이진 분류에 사용할 수 있도록 제한되어 있다는 것을 의미하지 않습니다. 측정되는 내용을 빠르게 이해하는 간단한 방법입니다.

혼동 행렬은 예측 모형의 성능뿐만 아니라 정확하게 예측되는 클래스, 부정확하게 예측되는 클래스, 그리고 어떤 유형의 오류가 발생하는지에 대한 더 많은 통찰력을 제공합니다. 이러한 유형의 혼동 행렬에서 표의 각 셀에는 다음과 같이 요약된 구체적이고 잘 이해된 이름이 있습니다.

           | Positive Prediction | Negative Prediction

Positive Class | True Positive (TP) | False Negative (FN) Negative Class | False Positive (FP) | True Negative (TN)

한 클래스에 집중하기 때문에 불균형 분류에 유용할 수 있는 두 가지 메트릭 그룹이 있습니다. 즉, 민감도 특성과 정밀도 리콜입니다.

민감도-특성 메트릭 민감도는 진정한 양성률을 말하며 양성계급을 얼마나 잘 예측했는지를 요약한다.

-민감도 = TruePositive / (TruePositive + FalseNegative)

구체성은 민감도, 즉 진정한 음수율을 보완하는 것으로, 음수급을 얼마나 잘 예측했는지를 요약한다.

- 구체성 = TrueNegative / (FalsePositive + TrueNegative) 불균형 분류의 경우, 민감도가 특수성보다 더 흥미로울 수 있습니다.

민감도와 구체성은 기하 평균 또는 G-평균이라고 불리는 두 관심사의 균형을 이루는 단일 점수로 결합될 수 있다.

-G-평균 = sqrt(감도 * 구체성)

정밀도-호출 메트릭 정밀도는 양의 클래스에 속하는 양의 클래스에 할당된 예제의 비율을 요약합니다.

- 정밀도 = TruePositive / (TruePositive + FalsePositive) 리콜은 양의 클래스가 얼마나 잘 예측되었는지 그리고 민감도와 동일한 계산인지 요약합니다.

- 리콜 = TruePositive / (TruePositive + FalseNegative) 정밀도와 리콜은 F-점수 또는 F-척도라고 불리는 두 가지 우려의 균형을 추구하는 단일 점수로 결합될 수 있다.

- F-측정 = (2 * 정밀도 * 호출) / (정밀 + 호출) F-측정은 불균형 분류에 대해 널리 사용되는 메트릭입니다.

Fbeta-me Measure는 고조파 평균 계산에서 정밀도와 회수량의 균형을 베타라는 계수에 의해 제어하는 F 측정의 추상화이다.

- Fbeta-측정 = ((1 + 베타^2) * 정밀도 * 리콜) / (베타^2 * 정밀도 + 리콜) 불균형 분류를 위한 정밀도, 회수 및 F-측정에 대한 자세한 내용은 자습서를 참조하십시오.

  • 균형분류를 위한 정밀도, 리콜, F-측정 계산방법

-추가 임계값 메트릭 다른 많은 지표들이 존재하긴 하지만 이러한 지표들이 고려되어야 할 가장 인기 있는 지표입니다. 맛을 알려드리면, 카파, 매크로 평균 정확도, 평균 등급 정확도, 최적화 정밀도, 보정 기하 평균, 균형 정확도 등이 있습니다.

임계값 메트릭은 계산하기 쉽고 이해하기 쉽습니다.

이러한 메트릭의 한 가지 제한은 교육 데이터 집합에서 관찰된 클래스 분포가 모델을 사용하여 예측을 수행할 때 테스트 집합 및 실제 데이터의 분포와 일치할 것이라고 가정합니다. 흔히 있는 일이지만 그렇지 않을 때는 성능이 상당히 오해의 소지가 있다.

이전 섹션에서 논의된 모든 임계값 메트릭의 중요한 단점은 분류기가 배포될 조건에 대해 충분히 알고 있다고 가정한다는 것입니다. 특히, 교육 세트에 존재하는 클래스 불균형이 분류기의 작동 수명 전체에 걸쳐 발생할 클래스 불균형이라고 가정합니다.

— 196페이지, 불균형 학습: 기초, 알고리즘 및 애플리케이션, 2013년

순위 측정 지표는 등급 분포에 대해 어떠한 가정도 하지 않습니다.

불균형 분류를 위한 랭킹 메트릭

순위 메트릭은 클래스를 구분하는 데 얼마나 효과적인지 여부에 따라 분류자를 평가하는 데 더 많은 관심을 기울입니다.

모델이 예제를 얼마나 잘 분류하는지[…]에 기반한 메트릭은 데이터 집합의 가장 좋은 n개 인스턴스를 선택하기 위해 분류자를 사용하는 많은 애플리케이션 […]에서 중요합니다.

— 분류용 성능 측정의 실험적 비교, 2008

이러한 메트릭을 사용하려면 분류자가 클래스 구성원 자격의 점수 또는 확률을 예측해야 합니다.

이 점수부터 다른 임계값을 적용해 분류기의 효과를 시험할 수 있다. 문턱에서 좋은 점수를 유지하는 모델들은 등급 분리가 잘 될 것이고 순위가 더 높아질 것이다.

…양수 클래스에서 분류할 인스턴스에 대한 숫자 점수를 주는 분류자를 생각해 보십시오. 따라서 점수는 단순한 긍정적 예측이나 부정적 예측 대신 세분화 수준을 도입한다.

– 53페이지, Imbalanced Data Set에서 학습, 2018.

가장 일반적으로 사용되는 순위 메트릭은 ROC 곡선 또는 ROC 분석입니다.

ROC는 수신기 운영 특성을 뜻하는 약자로, 클래스 차별 능력을 바탕으로 이진 분류기 분석을 위한 연구 분야를 요약한 것이다.

ROC 곡선은 모형의 예측 집합에 대한 거짓 양성률과 참 양성률을 서로 다른 임계값에서 계산하여 모형의 동작을 요약하기 위한 진단 그림입니다.

진정한 긍정률은 회수율이나 민감도이다.

TruePositiveRate = TruePositive / (TruePositive + FalseNegative)

잘못된 긍정 비율은 다음과 같이 계산됩니다.

FalsePositiveRate = FalsePositive / (FalsePositive + TrueNegative)

각 임계값은 그래프의 점이고 점이 연결되어 곡선을 형성합니다. 스킬이 없는 분류자(예: 모든 임계값 아래의 다수 클래스 예측)는 왼쪽 아래에서 오른쪽 위까지 대각선으로 표시됩니다.

이 라인 아래의 모든 포인트는 스킬이 없는 것보다 좋지 않습니다. 완벽한 모형은 그림의 오른쪽 상단에 있는 점이 됩니다.


ROC 원곡선은 한 모델에 유용한 진단입니다.

ROC 곡선 아래의 영역은 계산할 수 있으며 모형을 비교하는 데 사용할 수 있는 그림을 요약할 수 있는 단일 점수를 제공합니다.

스킬 분류기가 없는 경우 0.5점, 완벽한 분류기는 1.0점이다.

-ROC AUC = 곡선 아래의 ROC 영역

일반적으로 효과적이지만, ROC 곡선 및 ROC AUC는 특히 소수 계층의 예시 수가 적을 때 심각한 계급 불균형 하에서 낙관적일 수 있다.

ROC 원곡선의 대안은 소수 계층에 대한 분류기의 성능에 초점을 맞추고 있지만 비슷한 방식으로 사용할 수 있는 정밀리콜 곡선이다.

다시, 모형에 의한 예측 집합에 서로 다른 임계값이 사용되며, 이 경우 정밀도와 회수율이 계산된다. 점들이 곡선을 형성하고 서로 다른 임계값 범위 내에서 더 나은 성능을 발휘하는 분류기가 더 높은 순위를 차지합니다.

기술 없음 분류기는 데이터 집합의 양수 예제 수에 비례하는 정밀도를 사용하여 그래프의 수평선이 됩니다. 균형 데이터 세트의 경우 이 값은 0.5가 됩니다. 완벽한 분류기는 오른쪽 상단의 한 점으로 표현된다.

ROC 원곡선과 마찬가지로, 정밀도-리콜 원곡선은 단일 분류기를 평가하는데 유용하지만 분류기를 비교하는 데 어려움이 있는 진단 도구이다.

그리고 ROC AUC처럼 곡선 아래 면적을 점수로 계산해 그 점수를 이용해 분류기를 비교할 수 있습니다. 이 경우 소수 계층에 집중하게 되면 정밀-리콜 AUC가 불균형 분류 문제에 보다 유용하게 활용된다.

- PR AUC = 곡선 아래의 정밀-실행 영역

불균형 분류 및 비용 곡선을 위한 ROC 원곡선 수정과 같이 널리 사용되지 않는 다른 순위 메트릭이 있습니다.

불균형 분류를 위한 ROC 곡선 및 정밀도 호출 곡선에 대한 자세한 내용은 자습서를 참조하십시오.

  • 불균형 분류를 위한 ROC 곡선 및 정밀도-재호 곡선

균형분류를 위한 확률적 지표

확률적 지표는 분류자의 예측의 불확실성을 정량화하기 위해 특별히 설계된다.

이것들은 우리가 부정확한 예측 대 올바른 클래스 예측에 덜 관심이 있고 예측에 있어서 모형이 가지고 있는 불확실성에 더 관심이 있고 틀리지만 매우 확신에 찬 예측에 불이익을 주는 문제에 유용하다.

오차의 확률론적 이해, 즉 실제 확률로부터의 편차를 측정하기 […] 이러한 측정은 분류기의 신뢰성에 대한 평가를 원할 때 특히 유용하며, 고장 시뿐만 아니라 높은 확률 또는 낮은 확률로 잘못된 클래스를 선택했는지 여부도 평가해야 합니다.

— 분류용 성능 측정의 실험적 비교, 2008

예측 확률을 기반으로 모형을 평가하려면 확률을 보정해야 합니다.

일부 분류기는 최대우도 추정과 같은 확률론적 프레임워크를 사용하여 훈련되며, 이는 확률이 이미 보정되었음을 의미한다. 예를 들어 로지스틱 회귀 분석을 들 수 있습니다.

많은 비선형 분류기는 확률론적 프레임워크 하에서 훈련되지 않으므로 확률론적 메트릭을 통해 평가되기 전에 데이터 세트에 대해 그들의 확률을 보정해야 한다. 예를 들어 서포트 벡터 기계와 k-근사 이웃이 포함될 수 있습니다.

아마도 예측 확률을 평가하기 위한 가장 일반적인 메트릭은 이항 분류를 위한 로그 손실(또는 음수 로그 우도)이거나 일반적으로 교차 엔트로피로 더 알려져 있다.

기대값이 y이고 예측값이 yhat인 이항 분류 데이터 세트의 경우 다음과 같이 계산할 수 있습니다.

LogLoss = -((1 – y) * log(1 – yhat) + y * log(yhat))

예를 들어 다음과 같이 용어를 추가하는 것만으로 점수를 여러 클래스로 일반화할 수 있습니다.

LogLoss = -(C y_c * log(yhat_c))의 합계 c입니다.

점수는 두 확률 분포 간의 평균 차이를 요약합니다. 완벽한 분류자는 로그 손실이 0.0이며 더 나쁜 값은 무한대까지 양수입니다.

예측 확률에 대한 또 다른 인기있는 점수는 Brier 점수이다.

브리에르 점수의 이점은 불균형 분류를 위한 소수 계층인 플러스 계층에 집중된다는 것이다. 따라서 전체 확률 분포에 초점을 맞춘 로그 손실보다 더 선호됩니다.

Brier 점수는 양의 클래스(예: 1.0)에 대한 기대 확률과 예측 확률 사이의 평균 제곱 오차로 계산됩니다. 평균 제곱 오차는 값 간의 제곱 차이의 평균입니다.

BrierScore = 1/N * 합계 i to N (yhat_i – y_i)^2

분류기 만점의 브리에 점수는 0.0이다. 일반적으로 이진 분류 작업 측면에서 설명되지만, 멀티클래스 분류 문제에 대해서도 Brier 점수를 계산할 수 있다.

다른 분류기에 대한 Brier 점수의 차이는 매우 작을 수 있다. 이 문제를 해결하기 위해, 스킬이 없는 분류자의 점수(예: 교육 데이터 집합에서 양성 클래스의 확률 분포 예측)와 같은 기준 점수를 기준으로 점수를 조정할 수 있습니다.

기준 점수를 사용하여 Brier Skill Score 또는 BSS를 계산할 수 있습니다. 여기서 0.0은 스킬을 나타내지 않으며, 스킬 결과는 음수이며, 완벽한 스킬은 1.0의 값으로 표시됩니다.

BrierSkillScore = 1 – (BrierScore / BrierScore_ref)

균형잡힌 분류 문제에는 인기가 있지만, 치우친 클래스 분포를 갖는 분류 문제에는 확률 채점 방법이 덜 널리 사용된다.

불균형 분류를 위한 확률적 메트릭에 대한 자세한 내용은 자습서를 참조하십시오.

  • 불균형분류를 위한 확률지표 신사입장소개

평가 메트릭 선택 방법 선택할 수 있는 모형 평가 메트릭이 엄청나게 많습니다.

평가 메트릭을 선택하는 것이 매우 중요하고 선택할 수 있는 메트릭이 수십 개 또는 수백 개에 이른다는 점을 고려하면 어떻게 해야 합니까?

학습된 모델에 대한 올바른 평가는 패턴 인식에서 가장 중요한 문제 중 하나입니다.

— 분류용 성능 측정의 실험적 비교, 2008

아마도 가장 좋은 방법은 프로젝트 이해관계자들과 대화하여 모델 또는 예측 집합에서 무엇이 중요한지 알아내는 것입니다. 그런 다음 중요한 내용을 캡처하는 것 같은 메트릭을 몇 개 선택한 다음 다른 시나리오로 메트릭을 테스트합니다.

시나리오는 문제 도메인과 일치하는 왜곡된 클래스 분포가 있는 검정 데이터 집합에 대한 예측 모형의 집합일 수 있습니다. 모형이 모든 다수 클래스, 모든 소수 클래스를 잘 예측하고 불량하게 예측하는 경우 메트릭에 어떤 변화가 발생하는지 테스트할 수 있습니다. 몇 가지 작은 테스트는 메트릭의 성능을 빠르게 파악할 수 있도록 도와줍니다.

또 다른 접근법은 문헌 검토를 수행하고 동일한 일반 유형의 문제에 대해 작업하는 다른 실무자나 학자들이 가장 일반적으로 사용하는 측정 기준을 발견하는 것일 수 있다. 이것은 종종 통찰력이 있을 수 있지만, 일부 연구 분야가 집단적 사고에 빠질 수 있으며, 규모에 따라 많은 수의 모델을 비교하는 데는 좋지만 실제 모델 선택에는 좋지 않을 수 있는 메트릭을 채택할 수 있다는 경고를 받을 수 있다.

아직도 모르겠어?

다음은 몇 가지 첫 번째 제안 사항입니다.

-확률을 예측하고 있습니까? -수업표시가 필요하세요? -긍정적인 수업이 더 중요합니까? -정밀도-호출 AUC 사용 -두 수업 모두 중요합니까? -ROC AUC 사용 -확신이 필요하십니까? -Brier Score 및 Brier Skill Score 사용 -당신은 계급 표기를 예측하고 있습니까? -긍정적인 수업이 더 중요합니까? -거짓 음성 및 거짓 음성도 동일하게 중요합니까? -F1-측정 사용 -거짓 네거티브가 더 중요합니까? -F2-측정 사용 -거짓 진술이 더 중요합니까? -F0.5-측정 사용 -두 수업 모두 중요합니까? -< 80%-90%의 전공수업 예시>가 있습니까? -정확성 사용

80%-90% 전공수업 예시 있습니까?

G-Mean 사용 이러한 제안은 확률을 예측하는 모형을 사용할 수 있지만 바삭바삭한 클래스 레이블이 필요한 중요한 경우를 고려합니다. 이것은 운영자나 구현자가 오분류 오류를 트레이드오프할 임계값을 선택할 수 있도록 하는 중요한 문제 클래스이다. 이 시나리오에서는 모든 합리적인 임계값을 고려하는 오류 메트릭이 필요하므로 곡선 아래의 영역을 사용합니다.

이러한 제안을 유용한 템플릿으로 변환할 수 있습니다.

Introduction to Statistics for Data Science I _ Part1

데이터사이언스를 위한 통계학입문 I

1. 데이터 과학과 통계 - 데이터과학이란 무엇인가

1-1-1 데이터 과학이란

  • 통계학, 데이터마이닝, 빅데이터, 딥러닝, 인공지능 등의 개념을 아우르는 개념

  • 통계적 개념과 지식 – 샘플링, 확률분포, 가설검정, p-value
  • 데이터를 다둘수 있는 기술 (데이터 큐레이션) – 빅데이터 다루기
  • 데이터의 요약된 정보 전달 기술 – 데이터 시각화 (공간지도분석, 다차원그래픽)
  • 데이터윤리, 데이터보안
  • 데이터 도메인에 대한 지식과 분석능력 (현실 문제의 해결능력)

1-1-2 데이터 과학의 예시


- 데이터 분석 결과를 쉽게 이해할 수 있도록 보여주는 것!
- 그래프, 도표, 이미지, 단어 구름 등을 통해 한 눈에 이해할 수 있도록 하는 것!

  • 핀란드의 의료데이터 프로젝트 (FinnGen)

  • 핀란드인(Finnish)과 유전자(Genome)의 합성어.
  • 자발적 참여자의 유전자정보를 수집하고 환자의 의료정보까지 통합구축.
  • 현재 50만명 목표에서 23만명 수집. 그 중 15만명의 유전자정보 보유.
  • 6개월마다 데이터 업데이트 – 전세계 연구자와 공유
  • 관절염/당뇨병 등 자가면역질환 연구 수행중 – 개인 맞춤형 약 개발 추진중

1-1-3 데이터 과학을 위한 통계학 입문

  • 데이터과학을 위한 통계적 개념과 지식
  • 공유데이터와 오픈소스
  • 빅데이터분석을 위한 첫걸음 – 데이터의 중심위치, 산포정도
  • 데이터의 시각화
  • 데이터과학에서 확률분포는 무슨 의미를 전달

1-2 데이터 과학과 통계 - 통계가 상식이 된 사회 -

1-2-1 통계가 왜 필요한가

  • 통계가 왜 필요한가? = 데이터를 올바르게 다룰줄 알면 무엇이 더 좋아지나?

  • 통계는 올바른 의사결정을 돕는다.

  • 요약된 정보 제공

  • 과거 데이터를 통해 미래 데이터를 예측

  • 데이터에 숨겨진 패턴 발견

1-2-2 의사결정애서 통계의 역할


- 고객의 금융 검색 경로를 추적
- 고객 이동경로(Customer Journey) 분석
- 이탈 가능성이 높은 고객을 붙잡고 신규 고객 유입하는데 활용
정부 정책의 근거자료 – 영국의회 노령연금 도입
- 1886년 영국의 사회학자 찰스 부스(Charles Booth)
- 산업혁명으로 부유해진 런던에서 시민 빈곤 상황을 12년간 조사
- 가난을 8단계로 분류하여 절대빈곤이 30.7%에 달한다는 결과를 발표
- 1908년 영국의회의 노령연금 도입

정부 정책의 근거자료 – 서울시 심야버스 노선정책
- 시민들이 사용한 자정~새벽 5시까지의 휴대폰전화 데이터 수집
- 유동인구 분포 및 밀도를 파악하여 유동인구 및 교통수요가 많은 곳에 심야버스 노선 수립
### 1-2-3 요약
- 개인의 일상활동은 데이터화를 통해 예측분석이 가능하도록 수량화, 객관화되어진다.
- 통계는 수많은 데이터로부터 요약된 정보를 제공, 미래 데이터를 예측, 숨겨진 패턴을 발견함으로써 올바른 의사결정을 돕는다. - 통계치는 금융권의 관리전략, 정부 정책 수립, 법정소송에서의 근거자료 등으로 활용될 수 있다.

1-3 데이터 과학과 통계 - 데이터 분석과 윤리 -

1-3-1 데이터의 정직성

한강 수질 검사를 위해 한강물 채취

채취한 한강물을 집에 있던 보온병에 담아 방안에 보관 세계 최고 수질 검사 기관에서분석한 결과, 마셔도 되는 물로 판명됨!
- 왜 신뢰할 수 없을까?
- 데이터를 잘못 수집했다! + 한강이 얼마나 넓은데 어디서 수집?
+ 어제 산성비가 내렸을지도 모르잖아!
+ 손으로 채집하면 어떡해! 오염됐을지도 몰라!
- 데이터를 잘못 보관했다!
+ 보온병에 있던 세균이 옮으면 어떡해?
+ 차가운데 보관해야하는 거 아냐?
+ 다른 사람이 손대지 못하게 안전한 곳에 보관해야지!
- 너무 적은 양의 데이터, 편향된 표본 추출, 데이터의 왜곡 및 훼손 등등
+ 바르지(정직하지) 못한 데이터
+ 데이터분석은 무의미!
- 정직하지 못한 데이터의 주요 원인은 데이터 분석가의
+ 비윤리성
+ 무지함
+ 환경의 제약

1-3-2 기사에 등장하는 통계치 해석과 평가


- 동등한 조건으로 비교 필요 (주5일 근무)
- 근로 시간이 적은 비정규직의 월급여가 전일제인 정규직의 월급여보다 적은 것은 당연한 결과
- 성, 연령, 근속년수 등의 요인을 통제한 후 시급으로 비교하는 것이 적합

- 편향된 표본 추출
- 알고보니 세무사 39명을 대상으로 조사
- 그중 연봉이 3억~4억원대인 자영업 세무사가 우연히 많았던 것

1-3-3 요약

  • 데이터과학의 윤리는 데이터를 올바르게 분석할 뿐만 아니라 올바른 방법으로 데이터를 수집해야 함을 의미한다.
  • 정직하지 못한 데이터의 주요 원인은 데이터분석자의 무지함, 비윤리성, 그리고 환경의 제약에 의한다.
  • 데이터 수집 시 너무 적은 양의 데이터, 편향된 표본 추출, 데이터의 왜곡 및 훼손에 주의해야 한다.
  • 결측치 문제도 고려해야 한다.

1-4 데이터 과학과 통계 - 공유데이터와 오픈소스 -

1-4-1 공유데이터란

  • 모든 사람이 자유롭게 사용 및 재사용이 가능하며 재배포할 수 있는 데이터
  • 이용성 및 접근성
  • 재사용과 재배포
  • 보편적 참여

1-4-2 공유데이터

  • 연구자들을 위한 공유데이터 서비스
    머신러닝기법분석에 활용가능한 데이터 저장소 Machine Learning Repository in UC, Irvine
    [https://archive.ics.uci.edu/ml/index.php] 정부에서 제공하는 공공데이터
  • 통계청 [kostat.go.kr]
  • 공공데이터포털 [www.data.go.kr]
  • 서울열린데이터광장 [data.seoul.go.kr]

1-4-3 공유데이터의 예시

[https://datalab.naver.com/opendata.naver]

1-4-4 오픈소스


- 저작권자가 소스 코드를 공개하여 누구나 복제, 개작, 배포할 수 있는 소프트웨어
- R, Python : 오픈소스 통계분석 프로그램
- C++, 자바, 파이썬 등 다른 프로그래밍 언어와 쉽게 연동
- 빅데이터 시스템인 스파크와도 일부 기능을 연동함으로써 응용범위가 더욱 넓어짐

1-4-5 인공지능에서의 오픈소스


- 구글은 머신러닝과 신경망 연구를 위한 소프트웨어 텐서플로우를 오픈소스로 공개
- 구글 딥마인드는 인공지능 개발 플랫폼인 딥마인드랩을 공개해 누구나 인공지능 알고리즘을 테스트해볼 수 있게 함

1-4-6 공유데이터 vs. 오픈소스

  • 공유데이터 : 단순히 수치로 표현되는 측정치 또는 결과 값으로 표현
  • 오픈소스 : 단순 데이터가 아닌 지적 창작물

1-4-7 GitHub란


• 2008년 미국 Github사에서 서비스를 시작 • 현재 전세계에서 오픈소스 프로젝트 관리를 위해 가장 맣이 사용되는 웹호스팅 서비스!! • Git은 2005년 리눅스 제작자인 리누스 토발즈가 개발

  • Git : 프로그램 등의 소스 코드 관리를 위한 분산 관리 툴 (프로그램 소스를 공유하고 협업하여 개발할수 있는 버전관리 시스템)
  • GitHub은 Git에 프로젝트 관리지원기능을 확장한 웹 호스팅 서비스. Git을 손쉽게 이용 및 오픈소스 개발자들을 확산하는 데 중요한 역할을 한 웹 서비스
  • 가장 인기있는 오픈 소스 코드 저장소
  • 깃허브 사용자는 2,800만 명 이상, 깃허브에 내에 저장된 소스코드 저장소는 약 5,700만 개
  • 2018년 마이크로소프트가 인수

1-4-8 GitHub의 오픈소스 프로젝트

### 1-4-9 GitHub의 활용 : 오픈지식과 오픈코드
• 예시 1 : fMRI데이터를 이용한 Naïve Bayes 기법적용
[https://github.com/mguindani/NPBayes_fMRI]
• 예시2 : 시계열분석 정리내용? 혹은 Tensorflow를 이용한 Keras models?

[https://yjucho1.github.io/]
### 1-4-10 GitHub의 활용 : 지식과 코드

1-4-11 요약

  • 공유데이터의 활용
  • 공유데이터를 생성하고 제공
    • 오픈소스의 활용
    • 오픈소스의 개발과 서비스

Hello World

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

I. Titanic Transcription

  • 이 문서는 Kaggle을 통해 코딩실력을 기르고 싶어 캐글 그랜드마스터이신 ‘이유한 박사’ 님의 방법을 따라하는 것으로
    캐글의 데이터들을 필사적으로 필사하면서 코딩 공부를 하는 문서입니다.

  • 영어로 써진 원문은 파파고를 활용해서 한국어로 번역하려고 노력했습니다.

II. Kaggle KPI 설치

  • Google Colab에서 Kaggle API를 불러오려면 다음 소스코드를 실행한다.
1
!pip install kaggle
Requirement already satisfied: kaggle in /usr/local/lib/python3.6/dist-packages (1.5.9)
Requirement already satisfied: slugify in /usr/local/lib/python3.6/dist-packages (from kaggle) (0.0.1)
Requirement already satisfied: tqdm in /usr/local/lib/python3.6/dist-packages (from kaggle) (4.41.1)
Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from kaggle) (2.23.0)
Requirement already satisfied: python-dateutil in /usr/local/lib/python3.6/dist-packages (from kaggle) (2.8.1)
Requirement already satisfied: certifi in /usr/local/lib/python3.6/dist-packages (from kaggle) (2020.6.20)
Requirement already satisfied: urllib3 in /usr/local/lib/python3.6/dist-packages (from kaggle) (1.24.3)
Requirement already satisfied: six>=1.10 in /usr/local/lib/python3.6/dist-packages (from kaggle) (1.15.0)
Requirement already satisfied: python-slugify in /usr/local/lib/python3.6/dist-packages (from kaggle) (4.0.1)
Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->kaggle) (2.10)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->kaggle) (3.0.4)
Requirement already satisfied: text-unidecode>=1.3 in /usr/local/lib/python3.6/dist-packages (from python-slugify->kaggle) (1.3)

III. Kaggle Token 다운로드

  • Kaggle에서 API Token을 다운로드 받는다.
  • [Kaggle]-[My Account]-[API]-[Create New API Token]을 누르면 kaggle.json 파일이 다운로드 된다.
  • 이 파일을 바탕화면에 옮긴 뒤, 아래 코드를 실행 시킨다.

Part1 : Exploratory Data Analysis(EDA)

1
2
3
4
5
6
7
8
from google.colab import files
uploaded = files.upload()
for fn in uploaded.keys():
print('uploaded file "{name}" with length {length} bytes'.format(
name=fn, length=len(uploaded[fn])))

# kaggle.json을 아래 폴더로 옮긴 뒤, file을 사용할 수 있도록 권한을 부여한다.
!mkdir -p ~/.kaggle/ && mv kaggle.json ~/.kaggle/ && chmod 600 ~/.kaggle/kaggle.json



Upload widget is only available when the cell has been executed in the
current browser session. Please rerun this cell to enable.

Saving kaggle.json to kaggle.json
uploaded file "kaggle.json" with length 68 bytes
1
ls -1ha ~/.kaggle/kaggle.json
/root/.kaggle/kaggle.json
  • 에러 메시지가 없으면 성공적으로 json 파일이 업로드 되었다는 뜻이다.

IV. Kaggle 데이터 불러오기

  • 먼저 kaggle competition list를 불러온다.
1
!kaggle competitions list
Warning: Looks like you're using an outdated API Version, please consider updating (server 1.5.9 / client 1.5.4)
ref                                            deadline             category            reward  teamCount  userHasEntered  
---------------------------------------------  -------------------  ---------------  ---------  ---------  --------------  
contradictory-my-dear-watson                   2030-07-01 23:59:00  Getting Started     Prizes        134           False  
gan-getting-started                            2030-07-01 23:59:00  Getting Started     Prizes        186           False  
tpu-getting-started                            2030-06-03 23:59:00  Getting Started  Knowledge        317           False  
digit-recognizer                               2030-01-01 00:00:00  Getting Started  Knowledge       2373           False  
titanic                                        2030-01-01 00:00:00  Getting Started  Knowledge      18236            True  
house-prices-advanced-regression-techniques    2030-01-01 00:00:00  Getting Started  Knowledge       4579            True  
connectx                                       2030-01-01 00:00:00  Getting Started  Knowledge        395           False  
nlp-getting-started                            2030-01-01 00:00:00  Getting Started  Knowledge       1190           False  
rock-paper-scissors                            2021-02-01 23:59:00  Playground          Prizes        209           False  
riiid-test-answer-prediction                   2021-01-07 23:59:00  Featured          $100,000       1483           False  
nfl-big-data-bowl-2021                         2021-01-05 23:59:00  Analytics         $100,000          0           False  
competitive-data-science-predict-future-sales  2020-12-31 23:59:00  Playground           Kudos       9358           False  
halite-iv-playground-edition                   2020-12-31 23:59:00  Playground       Knowledge         44           False  
predict-volcanic-eruptions-ingv-oe             2020-12-28 23:59:00  Playground            Swag        195           False  
hashcode-drone-delivery                        2020-12-14 23:59:00  Playground       Knowledge         80           False  
cdp-unlocking-climate-solutions                2020-12-02 23:59:00  Analytics          $91,000          0           False  
lish-moa                                       2020-11-30 23:59:00  Research           $30,000       3431           False  
google-football                                2020-11-30 23:59:00  Featured            $6,000        921           False  
conways-reverse-game-of-life-2020              2020-11-30 23:59:00  Playground            Swag        131           False  
lyft-motion-prediction-autonomous-vehicles     2020-11-25 23:59:00  Featured           $30,000        784           False  

titanic 데이터를 불러온다.

1
!kaggle competitions download -c titanic
Warning: Looks like you're using an outdated API Version, please consider updating (server 1.5.9 / client 1.5.4)
test.csv: Skipping, found more recently modified local copy (use --force to force download)
train.csv: Skipping, found more recently modified local copy (use --force to force download)
gender_submission.csv: Skipping, found more recently modified local copy (use --force to force download)

ls 로 경로 내 모든 데이터 파일을 확인한다.

1
!ls
gender_submission.csv  sample_data  test.csv  train.csv

(1) 데이터 수집

  • 지난 시간에 받은 데이터가 총 4개임을 확인했다.
    • data_description.txt
    • sample_submission.csv
    • test.csv
    • train.csv
  • 여기에서는 우선 test.csv & train.csv 파일을 받도록 한다.
1
2
3
4
5
6
7
8
import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use('fivethirtyeight')
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline

train 데이터를 불러와서 data로 넣어주자

1
data= pd.read_csv('train.csv')
1
data.head()

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
1
data.isnull().sum() # 결측치를 확인해준다. 
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

Age와 Cabin에 결측값이 있는 것을 확인했다. 나는 이들을 고치도록 노력할 것이다.

얼마나 살아남았는가?

1
2
3
4
5
6
7
f,ax=plt.subplots(1,2,figsize=(18,8))
data['Survived'].value_counts().plot.pie(explode=[0,0.1], autopct='%1.1f%%',ax=ax[0],shadow=True)
ax[0].set_title('Survived') # 제목 붙여주기
ax[0].set_ylabel('') # y축에 있는 라벨 제거
sns.countplot('Survived',data=data,ax=ax[1]) # seaborn countplot 적용
ax[1].set_title('Survived') # 좌측 표에 제목 추가
plt.show()

png

특징 분석

sex -> Categorical Feature

1
data.groupby(['Sex', 'Survived'])['Survived'].count() # 'Sex', 'Survived' 카테고리 그룹화 
Sex     Survived
female  0            81
        1           233
male    0           468
        1           109
Name: Survived, dtype: int64
1
2
3
4
5
6
f,ax=plt.subplots(1,2,figsize=(18,8)) # 도표 생성
data[['Sex', 'Survived']].groupby(['Sex']).mean().plot.bar(ax=ax[0]) # 성별에 따른 생존자 시각화
ax[0].set_title('Survived vs Sex') # 제목 생성
sns.countplot('Sex', hue='Survived', data=data,ax=ax[1]) # 우측 도표에 생존자 사망자 비교 그래프 생성
ax[1].set_title('Sex:Survived vs Dead')
plt.show()

png

배에 타고 있는 남성의 숫자가 훨씬 많은 반면 구조된 여성의 수는 구조된 남성의 수보다 거의 두배나 많다. 배에 타고 있는 여성의 생존율을 약 75%인 반면 남성은 약 18~19%이다. 이것은 모델링을 위해 매우 중요한 특징으로 보인다. 하지만 그게 최고일까? 다른 기능을 확인해보자.

1
pd.crosstab(data.Pclass, data.Survived, margins=True). style.background_gradient(cmap='summer_r')
            <tr>
                    <th id="T_bd663c72_1ebd_11eb_af08_0242ac1c0002level0_row0" class="row_heading level0 row0" >1</th>
                    <td id="T_bd663c72_1ebd_11eb_af08_0242ac1c0002row0_col0" class="data row0 col0" >80</td>
                    <td id="T_bd663c72_1ebd_11eb_af08_0242ac1c0002row0_col1" class="data row0 col1" >136</td>
                    <td id="T_bd663c72_1ebd_11eb_af08_0242ac1c0002row0_col2" class="data row0 col2" >216</td>
        </tr>
        <tr>
                    <th id="T_bd663c72_1ebd_11eb_af08_0242ac1c0002level0_row1" class="row_heading level0 row1" >2</th>
                    <td id="T_bd663c72_1ebd_11eb_af08_0242ac1c0002row1_col0" class="data row1 col0" >97</td>
                    <td id="T_bd663c72_1ebd_11eb_af08_0242ac1c0002row1_col1" class="data row1 col1" >87</td>
                    <td id="T_bd663c72_1ebd_11eb_af08_0242ac1c0002row1_col2" class="data row1 col2" >184</td>
        </tr>
        <tr>
                    <th id="T_bd663c72_1ebd_11eb_af08_0242ac1c0002level0_row2" class="row_heading level0 row2" >3</th>
                    <td id="T_bd663c72_1ebd_11eb_af08_0242ac1c0002row2_col0" class="data row2 col0" >372</td>
                    <td id="T_bd663c72_1ebd_11eb_af08_0242ac1c0002row2_col1" class="data row2 col1" >119</td>
                    <td id="T_bd663c72_1ebd_11eb_af08_0242ac1c0002row2_col2" class="data row2 col2" >491</td>
        </tr>
        <tr>
                    <th id="T_bd663c72_1ebd_11eb_af08_0242ac1c0002level0_row3" class="row_heading level0 row3" >All</th>
                    <td id="T_bd663c72_1ebd_11eb_af08_0242ac1c0002row3_col0" class="data row3 col0" >549</td>
                    <td id="T_bd663c72_1ebd_11eb_af08_0242ac1c0002row3_col1" class="data row3 col1" >342</td>
                    <td id="T_bd663c72_1ebd_11eb_af08_0242ac1c0002row3_col2" class="data row3 col2" >891</td>
        </tr>
</tbody></table>
Survived 0 1 All
Pclass
1
2
3
4
5
6
7
8
f,ax=plt.subplots(1,2,figsize=(18,8)) # 표 2개 생성 
data['Pclass'].value_counts().plot.bar(color=['#CD7F32','#FFDF00','#D3D3D3'],ax=ax[0]) # 객실 등급별 숫자 시각화
ax[0].set_title('Number Of Passengers By Pclass')
ax[0].set_ylabel('Count') # y축에 Count 라벨링
sns.countplot('Pclass', hue= 'Survived', data=data, ax=ax[1]) # 우측 그래프에 생존자와 사망자 구별
ax[1].set_title('Pclass:Survived vs Dead')
plt.show()

png

우리는 돈이 모든 것을 살 수 없다 말하지만 위 데이터를 보면 높은 등급의 객실 사람들 일수록 더 높은 생존률을 보이는 것을 알 수 있다.

이제는 성별과 객실 등급을 함께 확인해보자.

1
2
pd.crosstab([data.Sex, data.Survived], data.Pclass, margins=True).style.background_gradient(cmap='summer_r')

            <tr>
                    <th id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002level0_row0" class="row_heading level0 row0" rowspan=2>female</th>
                    <th id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002level1_row0" class="row_heading level1 row0" >0</th>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row0_col0" class="data row0 col0" >3</td>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row0_col1" class="data row0 col1" >6</td>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row0_col2" class="data row0 col2" >72</td>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row0_col3" class="data row0 col3" >81</td>
        </tr>
        <tr>
                            <th id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002level1_row1" class="row_heading level1 row1" >1</th>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row1_col0" class="data row1 col0" >91</td>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row1_col1" class="data row1 col1" >70</td>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row1_col2" class="data row1 col2" >72</td>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row1_col3" class="data row1 col3" >233</td>
        </tr>
        <tr>
                    <th id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002level0_row2" class="row_heading level0 row2" rowspan=2>male</th>
                    <th id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002level1_row2" class="row_heading level1 row2" >0</th>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row2_col0" class="data row2 col0" >77</td>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row2_col1" class="data row2 col1" >91</td>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row2_col2" class="data row2 col2" >300</td>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row2_col3" class="data row2 col3" >468</td>
        </tr>
        <tr>
                            <th id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002level1_row3" class="row_heading level1 row3" >1</th>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row3_col0" class="data row3 col0" >45</td>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row3_col1" class="data row3 col1" >17</td>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row3_col2" class="data row3 col2" >47</td>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row3_col3" class="data row3 col3" >109</td>
        </tr>
        <tr>
                    <th id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002level0_row4" class="row_heading level0 row4" >All</th>
                    <th id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002level1_row4" class="row_heading level1 row4" ></th>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row4_col0" class="data row4 col0" >216</td>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row4_col1" class="data row4 col1" >184</td>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row4_col2" class="data row4 col2" >491</td>
                    <td id="T_bd9cba4a_1ebd_11eb_af08_0242ac1c0002row4_col3" class="data row4 col3" >891</td>
        </tr>
</tbody></table>
Pclass 1 2 3 All
Sex Survived
1
2
sns.factorplot('Pclass', 'Survived', hue='Sex', data=data)
plt.show()

png

우리는 1등급 객실의 여성 생존률이 95~96%인 것을 알 수 있다. 94명 중에 고작 3명 밖에 안죽었다. 남성과의 비교를 통해 객실의 관계없이 구조하는 동안 여성에게 우선권이 주어졌다는 것은 명백하다. 심지어 1등급 객실에서도 남성들의 생존율이 매우 낮다.

이를 통해 객실등급이 중요한 특성이라는 것을 확인할 수 있었다. 다른 특성을 확인해보자.

나이 특징

1
2
3
4
print('Oldest Passenger was of :', data['Age'].max(),'Years')
print('Youngest Passenger was of :', data['Age'].min(),'Years')
print('Average Age on the ship :', data['Age'].mean(),'Years')

Oldest Passenger was of : 80.0 Years
Youngest Passenger was of : 0.42 Years
Average Age on the ship : 29.69911764705882 Years
1
2
3
4
5
6
7
8
f,ax=plt.subplots(1,2,figsize=(18,8))
sns.violinplot("Pclass","Age", hue="Survived", data=data,split=True, ax=ax[0])
ax[0].set_title("Pclass and Age vs Survived")
ax[0].set_yticks(range(0,110,10)) # y축 범위 설정
sns.violinplot("Sex", "Age", hue="Survived", data = data, split=True, ax=ax[1])
ax[1].set_title('Sex and Age vs Survived')
ax[1].set_yticks(range(0,110,10))
plt.show()

png

관찰결과)

  1. 객실 등급에 따라 자녀 수가 증가하고 10세 미만의 승객 생존률은 객실 등급에 관계없이 양호한 것으로 보인다.

  2. 1등급 객실에서 20~50세 승객의 생존 가능성은 높고 여성에게는 더욱 좋다.

  3. 남성의 경우 나이가 많을 수록 생존가능성은 줄어든다.

우리는 이전에 Age 177개의 결측값이 있던 것을 확인했다. 우리는 여기에 평균값을 넣어줄 수 있다.

하지만 우리는 이 때 나이가 적거나 낮은 사람에게 적절하지 않은 평균을 넣으면 문제가 생길 수 있다는 것을 알고있다. 그러면 고객의 연령대를 예측할 수 있는 방법은 없을까?

있다! 우리는 승객 이름의 특징을 확인할 수 있다. 우리는 승객들의 이름에 Mr 또는 Mrs등의 특징이 있다는 것을 알수 있다. 따라서 우리는 Mr, Mrs의 평균값을 각 그룹에 할당할 수 있다.

이름에 무엇이 붙는 가 특징!!

1
2
3
data['Initial']=0
for i in data:
data['Initial']=data.Name.str.extract('([A-Za-z]+)\.')

자, 이제 Regex를 사용합시다. A-Z 또는 a-z사이에 있는 문자열을 찾고, 그 뒤에 .(점)이 있는 문자열을 찾는 겁니다. 그래서 우리는 이름에서 이니셜을 성공적으로 추출했다.

1
2
pd.crosstab(data.Initial, data.Sex).T.style.background_gradient(cmap='summer_r') 
# 성별에 있는 이니셜 체크
            <tr>
                    <th id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002level0_row0" class="row_heading level0 row0" >female</th>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row0_col0" class="data row0 col0" >0</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row0_col1" class="data row0 col1" >0</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row0_col2" class="data row0 col2" >1</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row0_col3" class="data row0 col3" >0</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row0_col4" class="data row0 col4" >1</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row0_col5" class="data row0 col5" >0</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row0_col6" class="data row0 col6" >1</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row0_col7" class="data row0 col7" >0</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row0_col8" class="data row0 col8" >0</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row0_col9" class="data row0 col9" >182</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row0_col10" class="data row0 col10" >2</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row0_col11" class="data row0 col11" >1</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row0_col12" class="data row0 col12" >0</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row0_col13" class="data row0 col13" >125</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row0_col14" class="data row0 col14" >1</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row0_col15" class="data row0 col15" >0</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row0_col16" class="data row0 col16" >0</td>
        </tr>
        <tr>
                    <th id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002level0_row1" class="row_heading level0 row1" >male</th>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row1_col0" class="data row1 col0" >1</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row1_col1" class="data row1 col1" >2</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row1_col2" class="data row1 col2" >0</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row1_col3" class="data row1 col3" >1</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row1_col4" class="data row1 col4" >6</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row1_col5" class="data row1 col5" >1</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row1_col6" class="data row1 col6" >0</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row1_col7" class="data row1 col7" >2</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row1_col8" class="data row1 col8" >40</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row1_col9" class="data row1 col9" >0</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row1_col10" class="data row1 col10" >0</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row1_col11" class="data row1 col11" >0</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row1_col12" class="data row1 col12" >517</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row1_col13" class="data row1 col13" >0</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row1_col14" class="data row1 col14" >0</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row1_col15" class="data row1 col15" >6</td>
                    <td id="T_be2cfb00_1ebd_11eb_af08_0242ac1c0002row1_col16" class="data row1 col16" >1</td>
        </tr>
</tbody></table>

좋다. 위를 보면 mlle이나 Mme와 같은 철자가 틀린 이니셜이 있는데 이는 Miss를 나타낸다. 나는 그것들을 미스나 다른 가치에 대해서도 같은 것으로 대체할 것이다.

Initial Capt Col Countess Don Dr Jonkheer Lady Major Master Miss Mlle Mme Mr Mrs Ms Rev Sir
Sex
1
data['Initial'].replace(['Mlle','Mme','Ms','Dr','Major','Lady','Countess','Jonkheer','Col','Rev','Capt','Sir','Don'],['Miss','Miss','Miss','Mr','Mr','Mrs','Mrs','Other','Other','Other','Mr','Mr','Mr'],inplace=True)
1
data.groupby('Initial')['Age'].mean()
Initial
Master     4.574167
Miss      21.860000
Mr        32.739609
Mrs       35.981818
Other     45.888889
Name: Age, dtype: float64

나이 결측치 채워주기

1
2
3
4
5
6
# 이니셜별로 평균연령을 추가해준다. 
data.loc[(data.Age.isnull())&(data.Initial=='Mr'),'Age']=33
data.loc[(data.Age.isnull())&(data.Initial=='Mrs'),'Age']=36
data.loc[(data.Age.isnull())&(data.Initial=='Master'),'Age']=5
data.loc[(data.Age.isnull())&(data.Initial=='Miss'),'Age']=22
data.loc[(data.Age.isnull())&(data.Initial=='Other'),'Age']=46
1
data.Age.isnull().any() # 남은 결측치가 있는지 최종 확인   
False
1
2
3
4
5
6
7
8
9
10
 f,ax=plt.subplots(1,2,figsize=(20,10))
data[data['Survived']==0].Age.plot.hist(ax=ax[0],bins=20, edgecolor='black', color='red')
ax[0].set_title('Survived = 0')
x1= list(range(0,85,5))
ax[0].set_xticks(x1)
data[data['Survived']==1].Age.plot.hist(ax=ax[1], color='green', bins=20, edgecolor='black')
ax[1].set_title('Survived = 1')
x2=list(range(0,85,5))
ax[1].set_xticks(x2)
plt.show()

png

관찰일지)

  1. 5세 미만의 아기들은 상당 수 구조되었다.

  2. 가장 나이가 많은 승객은 구조되었다.

  3. 가장 사망자 수가 많은 나이대는 30~40세이다.

1
2
sns.factorplot('Pclass', 'Survived', col = 'Initial', data = data)
plt.show()

png

따라서 부녀자 우선 구조 정책은 계층에 관계없이 적용된다.

승선 - > 범주형 데이터

1
pd.crosstab([data.Embarked, data.Pclass],[data.Sex, data.Survived], margins=True).style.background_gradient(cmap='summer_r')
            <tr>
                    <th id="T_bf440862_1ebd_11eb_af08_0242ac1c0002level0_row0" class="row_heading level0 row0" rowspan=3>C</th>
                    <th id="T_bf440862_1ebd_11eb_af08_0242ac1c0002level1_row0" class="row_heading level1 row0" >1</th>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row0_col0" class="data row0 col0" >1</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row0_col1" class="data row0 col1" >42</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row0_col2" class="data row0 col2" >25</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row0_col3" class="data row0 col3" >17</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row0_col4" class="data row0 col4" >85</td>
        </tr>
        <tr>
                            <th id="T_bf440862_1ebd_11eb_af08_0242ac1c0002level1_row1" class="row_heading level1 row1" >2</th>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row1_col0" class="data row1 col0" >0</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row1_col1" class="data row1 col1" >7</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row1_col2" class="data row1 col2" >8</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row1_col3" class="data row1 col3" >2</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row1_col4" class="data row1 col4" >17</td>
        </tr>
        <tr>
                            <th id="T_bf440862_1ebd_11eb_af08_0242ac1c0002level1_row2" class="row_heading level1 row2" >3</th>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row2_col0" class="data row2 col0" >8</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row2_col1" class="data row2 col1" >15</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row2_col2" class="data row2 col2" >33</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row2_col3" class="data row2 col3" >10</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row2_col4" class="data row2 col4" >66</td>
        </tr>
        <tr>
                    <th id="T_bf440862_1ebd_11eb_af08_0242ac1c0002level0_row3" class="row_heading level0 row3" rowspan=3>Q</th>
                    <th id="T_bf440862_1ebd_11eb_af08_0242ac1c0002level1_row3" class="row_heading level1 row3" >1</th>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row3_col0" class="data row3 col0" >0</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row3_col1" class="data row3 col1" >1</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row3_col2" class="data row3 col2" >1</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row3_col3" class="data row3 col3" >0</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row3_col4" class="data row3 col4" >2</td>
        </tr>
        <tr>
                            <th id="T_bf440862_1ebd_11eb_af08_0242ac1c0002level1_row4" class="row_heading level1 row4" >2</th>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row4_col0" class="data row4 col0" >0</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row4_col1" class="data row4 col1" >2</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row4_col2" class="data row4 col2" >1</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row4_col3" class="data row4 col3" >0</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row4_col4" class="data row4 col4" >3</td>
        </tr>
        <tr>
                            <th id="T_bf440862_1ebd_11eb_af08_0242ac1c0002level1_row5" class="row_heading level1 row5" >3</th>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row5_col0" class="data row5 col0" >9</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row5_col1" class="data row5 col1" >24</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row5_col2" class="data row5 col2" >36</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row5_col3" class="data row5 col3" >3</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row5_col4" class="data row5 col4" >72</td>
        </tr>
        <tr>
                    <th id="T_bf440862_1ebd_11eb_af08_0242ac1c0002level0_row6" class="row_heading level0 row6" rowspan=3>S</th>
                    <th id="T_bf440862_1ebd_11eb_af08_0242ac1c0002level1_row6" class="row_heading level1 row6" >1</th>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row6_col0" class="data row6 col0" >2</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row6_col1" class="data row6 col1" >46</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row6_col2" class="data row6 col2" >51</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row6_col3" class="data row6 col3" >28</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row6_col4" class="data row6 col4" >127</td>
        </tr>
        <tr>
                            <th id="T_bf440862_1ebd_11eb_af08_0242ac1c0002level1_row7" class="row_heading level1 row7" >2</th>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row7_col0" class="data row7 col0" >6</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row7_col1" class="data row7 col1" >61</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row7_col2" class="data row7 col2" >82</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row7_col3" class="data row7 col3" >15</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row7_col4" class="data row7 col4" >164</td>
        </tr>
        <tr>
                            <th id="T_bf440862_1ebd_11eb_af08_0242ac1c0002level1_row8" class="row_heading level1 row8" >3</th>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row8_col0" class="data row8 col0" >55</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row8_col1" class="data row8 col1" >33</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row8_col2" class="data row8 col2" >231</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row8_col3" class="data row8 col3" >34</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row8_col4" class="data row8 col4" >353</td>
        </tr>
        <tr>
                    <th id="T_bf440862_1ebd_11eb_af08_0242ac1c0002level0_row9" class="row_heading level0 row9" >All</th>
                    <th id="T_bf440862_1ebd_11eb_af08_0242ac1c0002level1_row9" class="row_heading level1 row9" ></th>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row9_col0" class="data row9 col0" >81</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row9_col1" class="data row9 col1" >231</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row9_col2" class="data row9 col2" >468</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row9_col3" class="data row9 col3" >109</td>
                    <td id="T_bf440862_1ebd_11eb_af08_0242ac1c0002row9_col4" class="data row9 col4" >889</td>
        </tr>
</tbody></table>

항만별 생존 가능성

Sex female male All
Survived 0 1 0 1
Embarked Pclass
1
2
3
4
sns.factorplot('Embarked', 'Survived', data=data)
fig=plt.gcf()
fig.set_size_inches(5,3)
plt.show()

png

C항만에서 승선한 사람들이 가장 생존률이 높았고, S항만에서 승선한 사람들이 가장 낮았다.

1
2
3
4
5
6
7
8
9
10
11
f,ax = plt.subplots(2,2,figsize=(20,15))
sns.countplot('Embarked', data=data, ax=ax[0,0]) # 항만별 승선객 수 시각화
ax[0,0].set_title('No. Of Passengers Boarded')
sns.countplot('Embarked', hue='Sex', data=data, ax=ax[0,1]) # 항만별 승선객 수 성별에 따른 시각화
ax[0,1].set_title('Male-Female Split for Embarked')
sns.countplot('Embarked', hue='Survived', data=data, ax=ax[1,0]) # 항만별 승선객 수 성별에 생존자 시각화
ax[1,0].set_title('Embarked vs Survived')
sns.countplot('Embarked', hue='Pclass', data=data, ax=ax[1,1]) # 항만별 승선객 수 객실등급별 생존자 시각화
ax[1,1].set_title('Embarked vs Pclass')
plt.subplots_adjust(wspace=0.2, hspace=0.5)
plt.show()

png

관찰결과:

  1. 최다 승선을 한 항만은 S항만이며 주된 객실은 3등급 객실이었다.

  2. C항만에서 승선한 승객들은 운이 좋은 것으로 보이는 데 그 이유는 1, 2등급 객실 승객을 우선 구조했기 때문이다.

  3. S항만의 승객들은 주로 부자들이 승선한 것으로 보인다. 하지만 여전히 생존률은 낮다, 왜냐하면 3등급 객실 승객의 81%가 살아남지 못했기 때문이다.

  4. Q항만은 대부분 3등급 객실의 고객으로 이루어져있다.

1
2
3
sns.factorplot('Pclass', 'Survived', hue='Sex', col='Embarked', data=data)
plt.show()

png

관찰결과 :

  1. 1등급 객실과 2등급 객실의 여성은 객실 등급에 관계없이 생존률은 거의 1에 가깝다.

  2. S항만의 사람들은 남녀 모두에서 3등급 객실에 사람들이 생존률이 매우 낮은 걸로 보아 운이 나쁘다할 수 있다.

  3. Q항만은 거의 모두가 3등급 객실에서 온 것으로 보아 남성에게는 맞지 않는 항만같다.

항만(Enbarked) 결측치 채워주기

우리는 많은 승객들이 S항만에서 탑승한 것을 통해 결측치에 S항만의 값을 넣어준다.

1
data['Embarked'].fillna('S',inplace=True)
1
data.Embarked.isnull().any() # 결측치 없는지 최종확인 
False

SibSip -> 이산형 변수

이 변수는 혼자 온 고객 또는 가족과 함께 온 고객을 구분한다.

Sibling = brother, sister, stepbrother, stepsister

Spouse = husband, wife

1
pd.crosstab([data.SibSp],data.Survived).style.background_gradient(cmap='summer_r')
            <tr>
                    <th id="T_c0724604_1ebd_11eb_af08_0242ac1c0002level0_row0" class="row_heading level0 row0" >0</th>
                    <td id="T_c0724604_1ebd_11eb_af08_0242ac1c0002row0_col0" class="data row0 col0" >398</td>
                    <td id="T_c0724604_1ebd_11eb_af08_0242ac1c0002row0_col1" class="data row0 col1" >210</td>
        </tr>
        <tr>
                    <th id="T_c0724604_1ebd_11eb_af08_0242ac1c0002level0_row1" class="row_heading level0 row1" >1</th>
                    <td id="T_c0724604_1ebd_11eb_af08_0242ac1c0002row1_col0" class="data row1 col0" >97</td>
                    <td id="T_c0724604_1ebd_11eb_af08_0242ac1c0002row1_col1" class="data row1 col1" >112</td>
        </tr>
        <tr>
                    <th id="T_c0724604_1ebd_11eb_af08_0242ac1c0002level0_row2" class="row_heading level0 row2" >2</th>
                    <td id="T_c0724604_1ebd_11eb_af08_0242ac1c0002row2_col0" class="data row2 col0" >15</td>
                    <td id="T_c0724604_1ebd_11eb_af08_0242ac1c0002row2_col1" class="data row2 col1" >13</td>
        </tr>
        <tr>
                    <th id="T_c0724604_1ebd_11eb_af08_0242ac1c0002level0_row3" class="row_heading level0 row3" >3</th>
                    <td id="T_c0724604_1ebd_11eb_af08_0242ac1c0002row3_col0" class="data row3 col0" >12</td>
                    <td id="T_c0724604_1ebd_11eb_af08_0242ac1c0002row3_col1" class="data row3 col1" >4</td>
        </tr>
        <tr>
                    <th id="T_c0724604_1ebd_11eb_af08_0242ac1c0002level0_row4" class="row_heading level0 row4" >4</th>
                    <td id="T_c0724604_1ebd_11eb_af08_0242ac1c0002row4_col0" class="data row4 col0" >15</td>
                    <td id="T_c0724604_1ebd_11eb_af08_0242ac1c0002row4_col1" class="data row4 col1" >3</td>
        </tr>
        <tr>
                    <th id="T_c0724604_1ebd_11eb_af08_0242ac1c0002level0_row5" class="row_heading level0 row5" >5</th>
                    <td id="T_c0724604_1ebd_11eb_af08_0242ac1c0002row5_col0" class="data row5 col0" >5</td>
                    <td id="T_c0724604_1ebd_11eb_af08_0242ac1c0002row5_col1" class="data row5 col1" >0</td>
        </tr>
        <tr>
                    <th id="T_c0724604_1ebd_11eb_af08_0242ac1c0002level0_row6" class="row_heading level0 row6" >8</th>
                    <td id="T_c0724604_1ebd_11eb_af08_0242ac1c0002row6_col0" class="data row6 col0" >7</td>
                    <td id="T_c0724604_1ebd_11eb_af08_0242ac1c0002row6_col1" class="data row6 col1" >0</td>
        </tr>
</tbody></table>
Survived 0 1
SibSp
1
2
3
4
5
6
7
f,ax=plt.subplots(1,2,figsize=(20,8))
sns.barplot('SibSp','Survived',data=data,ax=ax[0])
ax[0].set_title('SibSp vs Survived')
sns.factorplot('SibSp','Survived',data=data,ax=ax[1])
ax[1].set_title('SibSp vs Survived')
plt.close(2)
plt.show()

png

1
pd.crosstab(data.SibSp, data.Pclass).style.background_gradient(cmap='summer_r')
            <tr>
                    <th id="T_3093142c_1ebe_11eb_af08_0242ac1c0002level0_row0" class="row_heading level0 row0" >0</th>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row0_col0" class="data row0 col0" >137</td>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row0_col1" class="data row0 col1" >120</td>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row0_col2" class="data row0 col2" >351</td>
        </tr>
        <tr>
                    <th id="T_3093142c_1ebe_11eb_af08_0242ac1c0002level0_row1" class="row_heading level0 row1" >1</th>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row1_col0" class="data row1 col0" >71</td>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row1_col1" class="data row1 col1" >55</td>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row1_col2" class="data row1 col2" >83</td>
        </tr>
        <tr>
                    <th id="T_3093142c_1ebe_11eb_af08_0242ac1c0002level0_row2" class="row_heading level0 row2" >2</th>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row2_col0" class="data row2 col0" >5</td>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row2_col1" class="data row2 col1" >8</td>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row2_col2" class="data row2 col2" >15</td>
        </tr>
        <tr>
                    <th id="T_3093142c_1ebe_11eb_af08_0242ac1c0002level0_row3" class="row_heading level0 row3" >3</th>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row3_col0" class="data row3 col0" >3</td>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row3_col1" class="data row3 col1" >1</td>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row3_col2" class="data row3 col2" >12</td>
        </tr>
        <tr>
                    <th id="T_3093142c_1ebe_11eb_af08_0242ac1c0002level0_row4" class="row_heading level0 row4" >4</th>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row4_col0" class="data row4 col0" >0</td>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row4_col1" class="data row4 col1" >0</td>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row4_col2" class="data row4 col2" >18</td>
        </tr>
        <tr>
                    <th id="T_3093142c_1ebe_11eb_af08_0242ac1c0002level0_row5" class="row_heading level0 row5" >5</th>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row5_col0" class="data row5 col0" >0</td>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row5_col1" class="data row5 col1" >0</td>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row5_col2" class="data row5 col2" >5</td>
        </tr>
        <tr>
                    <th id="T_3093142c_1ebe_11eb_af08_0242ac1c0002level0_row6" class="row_heading level0 row6" >8</th>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row6_col0" class="data row6 col0" >0</td>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row6_col1" class="data row6 col1" >0</td>
                    <td id="T_3093142c_1ebe_11eb_af08_0242ac1c0002row6_col2" class="data row6 col2" >7</td>
        </tr>
</tbody></table>

관찰결과 :

위 barplot과 factorplot은 가족의 수가 많아질 수록 생존률이 낮아지는 것을 확인할 수 있다. 이는 가족이 많아질 수록 자신을 챙기지 않고 가족을 챙기려는 경향이 생기기 때문일 거라 유추된다.

Parch

Pclass 1 2 3
SibSp
1
pd.crosstab(data.Parch, data.Pclass).style.background_gradient(cmap='summer_r')
            <tr>
                    <th id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002level0_row0" class="row_heading level0 row0" >0</th>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row0_col0" class="data row0 col0" >163</td>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row0_col1" class="data row0 col1" >134</td>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row0_col2" class="data row0 col2" >381</td>
        </tr>
        <tr>
                    <th id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002level0_row1" class="row_heading level0 row1" >1</th>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row1_col0" class="data row1 col0" >31</td>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row1_col1" class="data row1 col1" >32</td>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row1_col2" class="data row1 col2" >55</td>
        </tr>
        <tr>
                    <th id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002level0_row2" class="row_heading level0 row2" >2</th>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row2_col0" class="data row2 col0" >21</td>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row2_col1" class="data row2 col1" >16</td>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row2_col2" class="data row2 col2" >43</td>
        </tr>
        <tr>
                    <th id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002level0_row3" class="row_heading level0 row3" >3</th>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row3_col0" class="data row3 col0" >0</td>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row3_col1" class="data row3 col1" >2</td>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row3_col2" class="data row3 col2" >3</td>
        </tr>
        <tr>
                    <th id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002level0_row4" class="row_heading level0 row4" >4</th>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row4_col0" class="data row4 col0" >1</td>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row4_col1" class="data row4 col1" >0</td>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row4_col2" class="data row4 col2" >3</td>
        </tr>
        <tr>
                    <th id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002level0_row5" class="row_heading level0 row5" >5</th>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row5_col0" class="data row5 col0" >0</td>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row5_col1" class="data row5 col1" >0</td>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row5_col2" class="data row5 col2" >5</td>
        </tr>
        <tr>
                    <th id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002level0_row6" class="row_heading level0 row6" >6</th>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row6_col0" class="data row6 col0" >0</td>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row6_col1" class="data row6 col1" >0</td>
                    <td id="T_d967ea50_1ebe_11eb_af08_0242ac1c0002row6_col2" class="data row6 col2" >1</td>
        </tr>
</tbody></table>

크로스탭은 3등급 객실에 많은 수의 가족단위 승객이 탓다는 것을 보여준다.

Pclass 1 2 3
Parch
1
2
3
4
5
6
7
f,ax=plt.subplots(1,2,figsize=(20,8))
sns.barplot('Parch', 'Survived', data=data, ax=ax[0])
ax[0].set_title('parch vs Survived')
sns.factorplot('Parch', 'Survived', data=data, ax=ax[1])
ax[1].set_title('Parch vs Survived')
plt.close(2)
plt.show()

png

관찰결과 :

부모를 동반한 승객은 생존 가능성이 더 크다. 하지만 가족의 숫자가 늘어날 수록 생존가능성은 줄어든다.

생존 가능성은 배 안에 1~3명의 부모를 둔 사람에게 좋다. 혼자라는 것은 또한 치명적이고 누군가가 배에 4명 이상의 부모를 두고 있을 때 생존 가능성은 줄어든다.

KDX 소비트랜드 시각화 경진대회 우수상 후기

KDX 소비트랜드 시각화 경진대회 우수상 후기

대회 참가배경

  • 나는 현재 평택시에서 국비로 지원해주는 4차 산업혁명 우수인재 발굴 교육을 수강중에 있다.





이 과정을 참여하면서 마치 고등학교 시절로 돌아간 것처럼 정신없이 공부를 하고 있다. 나는 이 과정을 통해서
- ERP 정보관리사 자격증 취득
- 빅데이터 관련 공모전 참여
- ADsP(빅데이터 분석 준전문가)자격증 취득

을 도전하고 있는데 현재까지 ERP 정보관리사 자격증은 취득을 완료하였고, 빅데이터 관련 공모전은 1개를 나가고 2번째 공모전을 준비중에 있다. ADsP 자격증은 현재 공부중으로 다음주 일요일에 시험을 볼 예정이다.

무튼! 우리가 처음 참여했던 공모전이 바로 ‘KDX 2020소비트랜드 시각화경진대회’ 였다.

우리가 R이라는 데이터 분석 프로그램을 배운지 정확히 1주일도 채 되지 않았을 무렵 우리는 “일단 실전에 부딪히면서 배워서 금방 실력이 는다”는 강사님의 무시무시한 말과 함께 추천해주시는 공모전에 참가신청서를 넣었다.

팀 참가가 가능했기에 우리는 최대한 모자란 힘을 보태고자 3명이서 팀을 이루어 참가를 했고, 대략 10일 가량의 준비기간을 가질 수 있었다.
다행히(?) 강사님의 배려로 인해 수업 시간 중간 중간 공모전을 준비할 시간을 가질 수 있었고, 우리는 데이터를 확인하면서 우리의 방향성을 잡았다.

KDX에서 제공해준 데이터는 다음과 같았다.

You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.