데이터분석/DACON

[Basic 펭귄 몸무게 예측 - EDA] 초보자를 위한 상세 설명

묘걍 2023. 9. 29. 20:00

[EDA] 데이터 분석 입문자를 위한 데이터 살펴보기

- 시작하기 전에 - 

구글 코랩으로 데이콘 제출하기

https://colab.research.google.com/?hl=ko 

 

Google Colaboratory

 

colab.research.google.com

여기서부터 진행되는 튜토리얼인데 나는 그냥 내 드라이브에서 폴더를 만들고 생성했다

구글 드라이브에서 새로 만들기 클릭 (혹은 화면상에서 마우스 오른쪽 클릭)

새폴더 클릭

폴더 명을 설정하고 만들기를 클릭하면 폴더 생성됨

폴더 내부로 이동하여 마우스 오른쪽 - 더보기 - 구글 코랩

이렇게 하면 새로운 코랩 파일을 생성할 수 있는데 지금은 다운 받은 파일이 있기 때문에

다운 받은 파일을 끌어다 놓는다. (그 외에 여러가지 방법으로 폴더에 파일을 옮김)

더블 클릭하면 자동으로 파일이 코랩을 통해 열린다


https://dacon.io/competitions/official/235862/codeshare/3902?page=1&dtype=recent 

 

[EDA] 데이터 분석 입문자를 위한 데이터 살펴보기

데이콘 Basic 펭귄 몸무게 예측 경진대회

dacon.io

https://github.com/allisonhorst/palmerpenguins

 

GitHub - allisonhorst/palmerpenguins: A great intro dataset for data exploration & visualization (alternative to iris).

A great intro dataset for data exploration & visualization (alternative to iris). - GitHub - allisonhorst/palmerpenguins: A great intro dataset for data exploration & visualization (alterna...

github.com

👉🏻 주어진 펭귄의 종, 부리 길이, 성별 등의 정보들을 통해 몸무게(target)를 예측하는 대회

👉🏻 target은 그램(g) 단위의 수치로 이루어져 있다

 

1. 패키지 설치

🧐각각의 패키지 알아보기

🧩 pandas

- Python 프로그래밍 언어를 위한 빠르고, 유연한 데이터 구조와 데이터 분석 도구를 제공하는 오픈소스 라이브러리이다

- 데이터 분석데이터 전처리에 이상적이다

* 특징

1. 데이터 구조

     - Series: 1차원 배열과 유사한 데이터 구조로, 다양한 데이터 타입을 저장할 수 있다.

     - DataFrame: 2차원 테이블 형태의 데이터 구조로, 다양한 데이터 타입의 열을 가질 수 있다.

2. 데이터 입출력: CSV, Excel, SQL 데이터베이스, HDF5 및 다른 형식의 파일에서 데이터를 읽거나 쓸 수 있다.

3. 데이터 정렬: 인덱스 또는 열의 값에 따라 데이터를 정렬할 수 있다.

4. 데이터 병합 및 조인: 여러 데이터 프레임을 병합, 조인, 또는 연결할 수 있다.

5. 데이터 필터링: 행과 열을 선택하거나 필터링하여 원하는 데이터만 조회할 수 있다

6. 결측치 처리: 결측치(누락된 데이터)를 찾거나 대체할 수 있다.

7. 집계 및 변환: 데이터를 집계하거나 변환하여 새로운 결과를 얻을 수 있다.

8. 시계열 처리: 시계열 데이터에 대한 다양한 연산 및 변환을 지원한다.

9. 플롯팅: 데이터 시각화를 위한 기본적인 도구를 제공한다.

 

🧩 numpy

- Python에서 대규모의 다차원 배열 및 행렬 연산에 필요한 다양한 수학 함수를 제공하는 핵심 라이브러리이다.

- Numerical Python의 줄임말로, 수치 계산을 위한 기본 패키지로 간주된다.

- 데이터 분석, 과학 연산, 엔지니어링 모델링 및 기타 여러 분야에서 광범위하게 사용됨

* 특징

  1. 다차원 배열 객체(ndarray)
    • numpy의 핵심은 ndarray 객체이다. 이는 동일한 데이터 타입을 가진 N차원의 배열이다.
    • 배열은 벡터화된 연산을 지원하여 빠른 연산이 가능하다
  2. 기본 수학 연산
    • 배열 간의 덧셈, 뺄셈, 곱셈 및 기타 수학 연산을 지원한다.
    • 이러한 연산은 원소별(element-wise)로 이루어진다.
  3. 선형대수 연산
    • 행렬 곱셈, 행렬식, 고유값, 역행렬과 같은 기본적인 선형대수 연산을 지원한다.
  4. 통계 및 수학 함수
    • 평균, 중앙값, 표준편차와 같은 기본 통계 연산 및 수학함수를 제공한다
  5. 브로드캐스팅
    • 다른 형상을 가진 배열 간의 연산이 가능하게 하는 브로드캐스팅 기능을 지원한다
  6. 집합연산
    • 배열 데이터에 대한 기본적인 집합 연산(교집합, 합집합 등)을 지원한다.
  7. 메모리 매핑
    • 대용량 데이터를 메모리에 매핑하여 작은 메모리에서도 큰 파일을 처리할 수 있다.
  8. 푸리에 변환 및 모양 변환
    • 신호처리와 관련된 연산을 위한 푸리에 변환과 배열의 모양 변경 등의 기능을 제공한다
  9. C/C++ 및 Fortran과의 통합
    • numpy는 C, C++ 및 Fortran 코드와 쉽게 연동될 수 있으며 효율적인 연산을 위해 이러한 언어로 작성된 코드를 사용할 수 있다.
  10. 확장 가능성
    • 사용자 정의 데이터 타입 및 유니버셜 함수를 통해 numpy의 기능을 확장할 수 있다.

 

🧩 matplotlib

- Python에서 데이터를 시각적으로 표현하기 위한 매우 인기있는 2D 플로팅 라이브러리이다

- 이 라이브러리는 매우 광범위한 플롯 및 그래프를 생성하는 데 사용되며, 공학, 과학, 금융 및 다양한 분야의 연구에 널리 사용된다

- matplotlib 그자체로도 매우 강력하지만 이를 기반으로 다양한 확장 라이브러리들이 존재한다

- 데이터의 특성을 빠르게 탐색하거나 결과를 보고하는 데 유용한 도구로 간주된다

* 특징

  1. 다양한 플롯 스타일
    • 라인 플롯(line plot), 산점도(scatter plot), 히스토그램(histogram), 바 차트(bar chart), 파이 차트(pie chart), 박스 플롯(box plot), 등고선 플롯(contour plot), 3D 플롯 등 다양한 시각화 스타일을 지원
  2. 플롯 커스터마이징
    • 축, 레전드, 색상, 텍스트, 주석 등의 다양한 요소를 세밀하게 조절하고 커스터마이징할 수 있다
  3. 다양한 백엔드 지원
    • 다양한 백엔드를 지원하여, 그래프를 여러 환경과 형식에서 렌더링할 수 있다.
    • 예를 들면, 다양한 GUI 환경, PDF, SVG, JPG, PNG, BMP, GIF 등의 파일 형식, 웹 환경에서의 렌더링 등을 지원
  4. 통합 기능
    • numpy와 밀접하게 통합되어 있어, numpy 배열을 바로 사용하여 그래프를 그릴 수 있다
    • pandas, seaborn 등의 다른 Python 데이터 분석 라이브러리와도 잘 호환된다
  5. 애니메이션 및 인터액티브 플로
    • matplotlib은 애니메이션 생성 및 인터액티브한 플롯을 지원한다.
  6. 임베디드 사용
    • GUI 어플리케이션에 matplotlib 그래프를 임베드 하여 사용할 수 있다.
  7. 컬러맵 및 색상 처리
    • 다양한 컬러맵을 제공하며, 색상의 표현 및 변환을 위한 푸웁한 도구를 제공
  8. 텍스트 및 주석 처리
    • TeX 수학식 표현과 함게 그래프 내에 텍스트와 주석을 추가하는 기능을 제공한다

 

🧩 seaborn

- Python 데이터 시각화 라이브러리matplotlib을 기반으로 하여 보다 고급 스타일의 통계 그래픽을 쉽게 생성할 수 있게 도와준다

- 깔끔하고 가독성이 좋으며, 색상 팔레트 및 테마들이 잘 구성되어 있다.

- 시각화의 복잡성을 줄이는 동시에 프로패셔널한 퀄리티의 그래픽을 생성하는 데 도움을 준다

- 데이터 탐색 및 결과 시각화에 있어서 매우 유용한 도구로 간주된다.

* 특징

  1. 데이터 셋에 대한 인식
    • pandas DataFrame을 직접 사용하여 데이터를 시각화 하는 것이 간단하다
  2. 통계 시각화 도구
    • 평균, 중앙값, 분포, 상관 관계 등 통계적 측면을 시각화하는 다양한 도구를 제공
  3. 다양한 플롯 유형
    • 산점도 행렬(scatter plot matrix), 페어 플롯(pair plot), 히트맵(heatmap), violin plot, box plot, swarm plot, joint plot 등 다양한 플롯 유형을 지원합니다.
  4. 시간 테미 및 컬러 팔레트
    • 다양한 내장 컬러 팔레트와 테마를 통해 그래프의 전반적인 스타일과 색상 구성을 쉽게 조정할 수 있다
  5. 편리한 데이터 분포 시각화
    • 데이터의 분포를 보여주는 displot, kdeplot 등의 도구를 제공한다
  6. 카테고리 데이터 시각화
    • 범주형 데이터를 시각화하는 데 특화된 여러 플롯을 제공한다. 예를 들면, strip plot, factor plot 등이 있다
  7. 다변량 분포 시각화
    • 여러 변수 간의 관계와 분포를 동시에 시각화하는 도구를 포함
  8. 컬러맵 및 색상 처리
    • 데이터 값에 따라 색상을 조절하거나, 특정 컬러 팔레트를 적용하는 기능을 제공한다
  9. 통합 기능
    • matplotlib와 밀접하게 통합되어 있으며, matplotlib의 기능을 활용하여 추가적인 커스터마이징을 할 수 있다

 

🧩 sklearn

- scikit-learn (sklearn)은 Python 프로그래밍 언어를 위한 머신러닝 라이브러리이다

- 이 라이브러리는 간단하고 효과적인 도구를 제공하여 데이터 마이닝데이터 분석을 수행하는 데 사용된다

- BSD라이선스로 제공되기 때문에 상업적인 프로젝트에도 사용할 수 있다

더보기

BSD라이선스

BSD 라이선스는 "Berkeley Software Distribution"의 약자로, 원래 캘리포니아 대학교 버클리 캠퍼스의 컴퓨터 시스템 연구 그룹에서 개발한 소프트웨어에 사용된 라이선스입니다. BSD 라이선스는 오픈 소스 라이선스 중 하나로, 사용자에게 소스 코드의 사용, 수정, 재배포에 관한 광범위한 자유를 부여합니다.

주요 특징은 다음과 같습니다:

  1. 자유로움: BSD 라이선스는 소프트웨어의 사용, 수정, 복제 및 재배포에 거의 제한이 없습니다. 이로 인해 상업적 및 비상업적 프로젝트 모두에 사용하기에 유용합니다.
  2. 소스 코드 유지: BSD 라이선스로 릴리스된 소프트웨어를 수정하여 재배포할 때, 원본 저작자와 라이선스 정보를 원본 소스 코드나 문서에 유지해야 합니다.
  3. 책임 및 보증의 부인: BSD 라이선스는 소프트웨어에 대한 어떠한 보증도 제공하지 않으며, 소프트웨어의 사용으로 인한 책임을 저작자 또는 라이선스 제공자에게 전가하지 않습니다.

BSD 라이선스에는 몇 가지 버전이 있으며, 가장 일반적인 것들은 "2-clause BSD License"와 "3-clause BSD License"입니다. "3-clause" 버전은 "논쟁 방지 조항"을 포함하고 있어, 소프트웨어를 사용하는 기관의 이름으로 소프트웨어 또는 해당 기관을 승인하거나 지지한다는 것을 나타내는 광고나 홍보 자료를 발표하는 것을 금지합니다.

BSD 라이선스는 그 간결성과 유연성으로 인해 많은 오픈 소스 프로젝트에 사용되며, 다른 오픈 소스 라이선스와 호환됩니다.

- 머신러닝 모델을 개발하고 평가하기 위한 주요 도구로 간주

- 간결하고 일관된 API 디자인으로 인해 초보자도 쉽게 접근하여 머신 러닝 작업을 수행할 수 있다

* 특징

  1. 다양한 알고리즘
    • 분류, 회귀, 클러스터링, 차원 축소, 모델 선택 및 전처리를 위한 다양한 알고리즘을 제공
  2. 효과적인 도구
    • 다양한 머신 러닝 알고리즘에 대한 효과적인 도구를 제공하며, 이를 통해 머신러닝 모델을 쉽게 구축 및 평가할 수 있다.
  3. 데이터 전처리
    • 피처 스케일링, 변환, 데이터 정제 및 데이터 누락 처리와 같은 데이터 전처리 도구를 제공
  4. 모델 평가
    • 교차 검증, 성능 지표 및 스코어링 도구를 포함하여 모델을 평가하고 선택하는 데 필요한 도구를 제공한다
  5. 파이프라인 생성
    • 전처리 단계와 예측 모델을 결합하여 복잡한 워크플로우를 구축하는 데 사용되는 Pipeline도구를 포함한다
  6. 확장성
    • numpy와 scipy를 기반으로하여 빠르고 효율적인 연산을 제공한다
  7. 다양한 샘플 데이터
    • 라이브러리에는 여러 머신러닝 알고리즘을 테스트하고 실험하는 데 사용할 수 있는 샘플 데이터 셋이 포함되어 있다
  8. 오픈 소스
    • scikit-learn은 오픈소스 라이브러리로, 커뮤니티의 기여와 지우너을 받아 계속해서 개선 및 확장 되고 있다

 

2. 데이터 불러오기

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import LabelEncoder

# 다운받은 csv를 pandas의 DataFrame 형식으로 불러옵니다.
data = pd.read_csv('dataset/train.csv')

# id 는 제외하고 분석합니다.
data = data.drop('id', axis=1)

data # 데이터를 확인합니다.

🧩 import

- 특정 기능들이 포함된 라이브러리나 모듈을 사용하기 위해 해당 코드파일을 현재 작업 중인 코드에 불러오는 명령어

- 필요한 도구나 기능들이 담긴 상자(라이브러리나 모듈)를 현재 작업공간으로 가져오는 것

🧩 pd.read_csv()

- pandas에서 제공하는 함수

- CSV파일을 읽어와 pandas의 DataFrame 객체로 변환해주는 역할을 한다.

  • 텍스트 파일의 한 형식으로, 값들이 쉼표(,)로 구분되어 있는 파일이다. 대부분의 표형식의 데이터를 저장하는 데 사용된다
  • pandas: Python에서 데이터 분석을 위해 널리 사용되는 라이브러리이다
  • DataFrame: pandas에서 제공하는 2차원의 데이터 구조로, 엑셀의 스프레드시트나 SQL의 테이블과 유사

 

🧩 DataFrame.drop()

- DataFrame에서 원하는 행이나 열을 제거하기 위한 메서드

  • 열 제거
    • df.drop(clolumns=[ ])
  • 행 제거
    • df.drop(index=행 번호 또는 행 이름)

🎨살펴보기

- 컬럼명

  • id: 샘플 아이디
  • Species: 펭귄의 종
  • Island: 샘플들이 수집된 Palmer station 근처 섬 이름
  • Clutch Completion: 관찰된 펭귄 둥지의 알이 2개 이상인 경우 Full Clutch이며 Yes로 표기
  • Culmen Length: 펭귄 옆모습 기준 부리의 가로 길이
  • Culmen Depth: 펭귄 옆모습 기준 부리의 세로 길이
  • Flipper Length: 펭귄의 팔(날개)길이
  • Sex: 펭귄의 성별
  • Delta 15 N: 토양에 따라 변화하는 안정 동위원소 15N:14N의 비율
  • Delta 13 C: 먹이에 따라 변화하는 안정 동위원소 13C:12C의 비율
  • Body Mass: 펭귄의 몸무게

- 전처리 필요?

   : species, island, clutch completion, sex는 텍스트로 이루어져 있어 전처리 필요

더보기
  1. 일관성: 텍스트 데이터는 종종 다양한 방식으로 표현될 수 있습니다. 예를 들어, "USA", "U.S.A.", "United States", "US"는 모두 동일한 나라를 나타내지만 다르게 기록될 수 있습니다. 이런 불일치를 해결하여 데이터의 일관성을 보장해야 합니다.
  2. 노이즈 제거: 텍스트 데이터는 불필요한 공백, 특수 문자, 오타 등의 노이즈를 포함할 수 있습니다. 이러한 노이즈는 분석의 정확도를 저하시킬 수 있기 때문에 제거해야 합니다.
  3. 정량적 분석 가능: 텍스트를 숫자로 변환(인코딩)함으로써, 통계적 또는 기계 학습 모델에 사용할 수 있게 됩니다. 예를 들어, 단어의 빈도나 문서 간의 유사도를 계산하기 위해 텍스트를 벡터로 변환할 수 있습니다.
  4. 정보 추출: 텍스트 데이터에서 중요한 정보나 패턴을 추출하기 위해서는 전처리 과정이 필요합니다. 예를 들어, 텍스트에서 특정 단어나 구문을 추출하거나, 주제 모델링을 통해 문서의 주제를 파악하기 위해 전처리를 수행합니다.
  5. 데이터 크기 감소: 불필요한 정보나 중복되는 텍스트를 제거함으로써, 데이터의 크기를 줄이고, 저장 공간을 절약하며, 계산 효율성을 높일 수 있습니다.
  6. 표준화: 데이터의 일관성과 비교를 위해 특정 표준이나 형식에 맞추는 작업이 필요할 수 있습니다.
  7. 언어와 문법: 자연어 처리(NLP)에서는 문장의 문법적 구조나 단어의 원형을 파악하기 위해 전처리를 수행합니다.

 

3. 결측치 확인

🧩결측치란?

- 데이터에 값이 없는 부분을 의미한다.

- 어떤 정보나 측정값이 누락되어 기록되지 않은 상태

- 보통 NaN이라고 표현한다

def check_missing_col(dataframe):
    missing_col = []
    counted_missing_col = 0
    for i, col in enumerate(dataframe.columns):
        missing_values = sum(dataframe[col].isna())
        is_missing = True if missing_values >= 1 else False
        if is_missing:
            counted_missing_col += 1
            print(f'결측치가 있는 컬럼은: {col}입니다')
            print(f'해당 컬럼에 총 {missing_values}개의 결측치가 존재합니다.')
            missing_col.append([col, dataframe[col].dtype])
    if counted_missing_col == 0:
        print('결측치가 존재하지 않습니다')
    return missing_col

missing_col = check_missing_col(data)

- 결측치를 검사하는 함수를 생성, 인자로는 dataframe을 받는다

- missing_col이라는 빈 리스트를 생성, 결측치가 있는 열의 이름과 그 열의 데이터 유형을 저장한다

- counted_missing_col은 결측치가 발견된 열의 수를 센다

- dataframe.columns를 통해 모든 열 이름을 순회한다. enumerate를 통해 현재 열의 순서(index)도 함께 가져온다

- missing_values = sum(dataframe[col].isan()는 현재 열에 있는 결측치의 개수를 계산한다.

🧩 .isna()

  • pandas에서 제공하는 메서드로, 데이터프레임이나 시리즈(열) 내의 값이 결측치인지 아닌지 확인
  • 값이 결측치이면 True 아니면 False를 반환한다

- is_missing = True if missing_values >=1 else False는 만약 missing_vlaues가 1이상이면 해당 열에 결측치가 있다는 것이고, 이때 is_missing을 True로 설정한다

- if is_missing:은 is_missing이 True라면, 즉 만약 해당 열에 결측치가 있다면

- counted_missing_col +=1 을 통해 결측치가 발견된 열의 수를 하나 증가시킨다

- print를 통해 현재 컬럼명과 결측치의 개수를 출력한다

- if counted_missing_col == 0: 만약 결측치가 있는 열이 하나도 없다면 결측치가 존재하지 않는다는 내용을 출력한다

- return missing_col을 통해 결측치가 있는 열의 이름과 해당 열의 데이터 유형을 반환한다

🎨살펴보기

- 결측치가 존재한다!

 

 

4. 결측치 처리

# 결측치가 있는 row들을 확인합니다.
data[data.isna().sum(axis=1) > 0]

🎨살펴보기

- 특별한 패턴을 보이지 않음

- 카테고리형 데이터에 대해서는 행을 삭제, 수치형 데이터에 대해서는 평균값을 채워주기

🧩 카테고리형 데이터

- 일반적으로 몇몇 구분 가능한 값(카테고리)으로만 구성된 데이터

- 숫자의 연속된 값이 아니라 구체적인 "분류"나 "라벨"로 표현되는 데이터

  • 색상: "빨강", "파랑", "녹색"
  • 사이즈: "소", "중", "대"
  • 성별: "남성", "여성"
  • 학점: "A", "B", "C", "D", "F"

- 특정 범주나 라벨 중 하나로 분류될 수 있다.

- pandas에서는 dtype으로 category를 가지는 데이터 타입을 제공하여 카테고리형 데이터를 효율적으로 다룰 수 있다

- 이렇게 데이터를 category 타입으로 변환하면 메모리 사용량이 줄어들고, 연산 속도가 빨라질 수 있다.

 

- 카테고리형 데이터를 다룰 때 종종 데이터 인코딩(예: 원-핫 인코딩)이 필요하다.

     - 인코딩은 카테고리형 데이터를 숫자로 변환하는 과정이다. (컴퓨터가 이해하고 처리하기 쉽게 변환)

🧩 수치형 데이터

- 숫자로 표현되는 데이터

- 주로 양을 나타내거나 측정 값을 표현할 때 사용

  • 연속형 데이터: 일정 범위 내에서 어떤 값이든 취할 수 있는 데이터
    • 키, 몸무게, 온도 등
  • 이산형 데이터: 특정한 값을 취하는 데이터
    • 사과의 개수, 학급의 학생 수
# 결측치를 처리하는 함수를 작성합니다.
def handle_na(data, missing_col):
    temp = data.copy()
    for col, dtype in missing_col:
        if dtype == 'O':
            # 카테고리형 feature가 결측치인 경우 해당 행들을 삭제해 주었습니다.
            temp = temp.dropna(subset=[col])
        elif dtype == int or dtype == float:
            # 수치형 feature가 결측치인 경우 평균값을 채워주었습니다.
            temp.loc[:,col] = temp[col].fillna(temp[col].mean())
    return temp

data = handle_na(data, missing_col)

# 결측치 처리가 잘 되었는지 확인해 줍니다.
missing_col = check_missing_col(data)

- handle_na라는 결측치를 처리하는 함수를 만들고 data와 missing_col을 인자로 받는다

- temp 변수에 data.copy()를 통해 dataframe을 복사해둔다. (원본 데이터에 영향을 주지 않기 위해)

- missing_col에서 열 이름과 그 열의 데이터 유형을 순회한다

- 만약 해당 열의 데이터 유형이'O'(object, 즉 문자열 또는 카테고리형)라면

- 해당 열에서 결측치가 있는 행들을 삭제한다

🧩 .dropna()

  • pandas에서 제공하는 메서드
  • 데이터프레임이나 시리즈에 결측치를 가진 행 또는 열을 제거하는데 사용됨
    • dropna(): 결측치가 포함된 행을 삭제한다
    • dropna(axis=1): 결측치가 포함된 열을 삭제한다
  • subset: 특정 열을 기준으로 결측치를 제거하고자 할 때 사용되는 인자
    • 예를 들어, subset=['A', 'B']와 같이 사용하면 'A'열과 'B'열에서 결측치를 찾아 해당 행을 삭제

- 만약 해당 열의 데이터 유형이 int(정수) 또는 float(실수)라면

- 해당 열에서 결측치가 있는 위치에 그 열의 평균 값을 채워 넣는다

🧩 .loc

  • pandas의 DataFrame과 Series에서 특정 행과 열을 선택하기 위한 메서드
  • location의 줄임말
    • 라벨 기반의 선택: .loc는 라벨(즉, 인덱스의 이름)을 기반으로 데이터를 선택한다
    • 행과 열 모두 선택 가능: [행,열]형태로 행과 열을 동시에 선택할 수 있다.
  • 여러 행이나 열을 선택하려면 리스트 형태로 인자를 전달
  • 범위를 선택하려면 슬라이스 형태로 인자를 전달

🧩 .fillna()

  • pandas에서 제공하는 메서드로, 데이터 프레임이나 시리즈의 결측치(NaN)를 원하는 값이나 방법으로 채움
    • 특정 값으로 채우기: () 안에 원하는 값을 넣어준다
    • 평균값, 중앙값, 최빈값: ()안에 df.mean(), df.median(), df.mode().~ (앞에는 데이터프레임, 열 등이 올 수 있음)
    • 이전 값이나 다음 값: ()안에 method= 'ffill'(forward fill)혹은 'bfill' (backward fill)
    • 특정 열의 결측치만: df['특정 컬럼 이름'].fillna()

- 결측치 처리가 완료된 temp 데이터 프레임을 반환한다

- check_missing_col함수를 통해 결측치가 존재하는지 확인한다.

 

5. 기초 통계 분석

# 기초 통계량을 살펴봅니다.
data.describe()

🧩.describe()

- pandas의 DataFrame과 Series 객체에서 사용할 수 있는 메서드로, 해당 데이터의 기술 통계(Descriptive Statistics)를 요약하여 보여준다

  1. 수치형 데이터: 기본적으로 describe()는 수치형 데이터에 대한 통계를 제공
    • count: 비결측치의 개수
    • mean: 평균 값
    • std: 표준 편차
    • min: 최솟값
    • 25%: 25번째 백분위수 (1사분위수)
    • 50%: 50번째 백분위수 (중앙값)
    • 75%: 75번째 백분위수 (3사분위수)
    • max: 최댓값
  2. 카테고리형 데이터: include 파라미터를 사용하여 카테고리형 데이터의 통계를 포함하게 할 수 있다
    • count: 비결측치의 개수
    • unique: 고유한 값의 개수
    • top: 가장 빈번하게 등장하는 값
    • freq: 가장 빈번한 값의 빈도수

분석의 편의를 위해 수치형 feature와 카테고리형 feature를 분리하기

# 전체의 데이터 타입을 확인합니다
data.dtypes

 

numeric_feature = data.columns[(data.dtypes==int) | (data.dtypes== float)]
categorical_feature = data.columns[data.dtypes=='O']

print("수치형 데이터는 다음과 같습니다. \n", list(numeric_feature))
print("카테고리형 데이터는 다음과 같습니다. \n", list(categorical_feature))

- data.dtypes는 데이터 프레임 data의 각 열의 데이터 유형을 반환한다

🧩 .dtypes()

  • pandas DataFrame 또는 Series에서 각 열의 데이터 유형을 나타낸다
  • DataFrame의 경우 각 열의 이름과 그에 해당하는 데이터 유형을 함께 반환한다
  • Series의 경우 하나의 데이터 유형만 반환한다
    • int64: 정수 (64bit로 표현되는 정수)
    • float64: 정수
    • object: 텍스트 또는 문자열
    • bool: 불리언(True/False)
    • datetime64: 날짜 및 시간

- int인지 float인지 검사하여 boolean 값으로 반환하고 그 결과를 OR 연산자를 통해 둘 중 하나라도 True일 경우 True를 반환

- data.columns[]를 사용해 True에 해당하는 열의 이름을 선택한다

🧩 .columns[]

  • pandas의 DataFrame에는 .columns라는 속성이 있다
    • 해당 DataFrame의 모든 열 이름(column labels)을 포함하고 있다
    • Index 객체이다
    • 열 이름을 확인하거나 변경하기 위해 사용된다
  • .columns[]는 이 .columns 속성에 대해 인덱싱을 수행하는 것이다.
  • []안에 들어가는 값이나 조건에 따라 특정 열 이름을 선택할 수 있다.

- 결과적으로 numeric_feature에는 data의 수치형 열 이름이 저장된다.

- .dtypes를 통해 문자열인지 여부를 나타내는 부울 값 시리즈를 반환한다

- data.columns[]를 통해 True에 해당하는 열의 이름을 선택한다

- 결과적으로 categorical_feature에는 data의 카테고리형(문자열)열 이름이 저장된다

- 각각의 리스트를 출력해본다

 

6. 수치형 데이터 시각화

import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use("ggplot")

feature = numeric_feature

# Boxplot 을 사용해서 데이터의 분포를 살펴봅니다.
plt.figure(figsize=(20,15))
plt.suptitle("Boxplots", fontsize=40)

for i in range(len(feature)):
    plt.subplot(2,3,i+1)
    plt.title(feature[i])
    plt.boxplot(data[feature[i]])
plt.show()

- matplotlib의 pyplot을 import한다

🧩 matplotlib.pyplot

  • Matplotlib
    • python에서 데이터를 차트나 플롯으로 시각화하는 라이브러리
    • 다양한 그래프와 차트를 그릴 수 있도록 다양한 기능 제공
  • pyplot
    • matplotlib의 하위 모듈
    • MATLAB과 유사한 방식으로 그래프를 그리기 위한 함수들을 제공
    • 복잡한 설정 없이도 간단하게 그래프를 그릴 수 있다.
    • plt.plot(): 그래프 그리기
    • plt.show(): 그래프 보여주기
    • plt.title(""): 제목 추가
    • plt.xlabel("") / plt.ylabel(""): 레이블 추가

- IPython 환경에서 그래프를 출력 영역에 직접 표시할 수 있게 하는 매직 커맨드

🧩 매직 커맨드

  • IPython환경 (주로 Jupyter Notebook, Jupyter Lab등)에서 사용되는 특별한 명령어들
  • %기호로 시작
  • 특별한 작업을 수행하도록 디자인
  • Line Magic
    • %로 시작
    • 한 줄에 대한 매직 커맨드
    • %run: 파이썬 스크립트 실행
    • %timeit: 파이썬 코드의 실생 시간 측정
    • %pwd: 현재 작업 디렉토리를 출력
    • %ls: 현재 디렉토리의 파일 및 폴더를 나열
    • %who: 현재 환경에 정의된 변수들의 목록 출력
    • %matplotlib inline: Jupyter Notebook 내에서 Matplotlib 그래프를 직접 출력 영역에 표시하도록 설정
  • Cell Magic
    • %%로 시작
    • 전체 세에 대한 매직 커맨드
    • %%timeit: 셀 전체의 실행 시간을 측정한다
    • %%writefile: 셀의 내용을 파일로 저장
더보기

** IPython **

- "Interactive Python"의 줄임말로, Python 프로그래밍 언어를 대화식으로 사용할 수 있게 해주는 강력한 명령 줄 셸

- 그러나 오늘날, IPython은 그것을 넘어서 다양한 프로그래밍 환경에서 확장 가능한 인터랙티브 컴퓨팅 환경을 제공

  1. 강력한 인터랙티브 셸: 표준 Python 셸보다 더 많은 기능을 제공합니다. 예를 들어, 자동 완성, 코드 색상 지정, 고급 히스토리 관리와 같은 기능들이 있습니다.
  2. 통합된 Jupyter: IPython은 이제 Jupyter 프로젝트의 일부로, Jupyter Notebook이라는 웹 기반 인터랙티브 계산 환경을 제공합니다. 이 환경에서는 코드, 텍스트, 수학 공식, 그래프 등을 하나의 문서 안에 통합할 수 있습니다.
  3. 매직 커맨드: IPython에서 제공하는 % 또는 %%로 시작하는 특별한 명령어들로, 시스템 명령어 실행, 코드 프로파일링, 시각화 등 다양한 작업을 수행할 수 있습니다.
  4. 향상된 디버깅: IPython은 표준 Python 디버거보다 향상된 디버깅 기능을 제공합니다.
  5. 병렬 컴퓨팅: IPython은 여러 대의 컴퓨터를 사용한 병렬 계산을 지원하는 도구를 포함하고 있습니다.

- matplotlib의 스타일을 ggplot으로 설정한다. (R에서 사용되는 패키지 테마 모방)

🧩 ggplot

  • 데이터 시각화를 위한 패키지, R프로그래밍 언어에서 가장 유명하고 널리 사용되는 패키지
  • Grammar of Graphics라는 개념을 기반으로 한다 (데이터 시각화를 위한 일종의 '문법'을 제공하여 사용자가 다양한 그래픽을 효과적으로 구축할 수 있게 해줌)
  • Layered Approach: 사용자는 여러 개의 "층"을 조합하여 복잡한 그래픽을 만들 수 있다. (Ex.점 그래프 위에 라인 그래프를 추가하는 것)
  • Aesthetics and Geoms: "Aesthetics"는 데이터의 어떤 부분을 시각화에 사용할지를 정의하는 반면, "Geoms"는 데이터를 어떤 형태(예: 점, 라인, 막대 등)로 시각화할지를 정의
  • Themes: 그래프의 전반적인 디자인과 스타일을 쉽게 변경할 수 있는 테마 시스템을 제공
  • Faceting: 다양한 카테고리나 조건에 따라 여러 개의 서브플롯을 쉽게 생성
  • Extensibility: ggplot은 확장이 가능하므로, 커뮤니티에 의해 추가적인 기능과 확장이 계속적으로 개발되고 있다

- numeric_feature(data의 수치형 열 이름이 저장된 리스트)의 값을 feature에 할당

- 20× 15크기의 새로운 그래프 창을 생성한다

- 그래프 창의 전체 제목은 Boxplots이고 폰트 크기는 40이다

- feature의 각 요소 개수만큼 순회하며

- 2행 3열의 서브 플롯을 생성한다. i+1은 현재 반복에서 서브플롯의 위치를 나타낸다

🧩 서브 플롯

  • 큰 그래프 창 안에 여러개의 작은 그래프를 배열 형태로 배치하는 것
  • 여러 데이터 세트나 여러 관점의 시각화를 동시에 보여주기 위함
  • plt.subplot() 함수로 서브플롯 생성
  • x,y,z를 인자로 받음 → 행의 수, 열의 수, 현재 그리려는 서브플롯의 인덱스

- 현재 서브플롯의 제목을 feature[i]로 설정한다

- data[feature[i]]로 가져온 데이터를 사용해 박스플롯을 그린다

- 지금까지 그린 모든 그래프를 화면에 표시한다

🎨살펴보기

- 수치형 데이터는 모두 정상적으로 보이며 특이한 점은 없다

 

7. 카테고리형 데이터 시각화

# 히스토그램 을 사용해서 데이터의 분포를 살펴봅니다.
feature = categorical_feature

plt.figure(figsize=(20,15))
plt.suptitle("Bar Plot", fontsize=40)

for i in range(len(feature)):
    plt.subplot(2,2,i+1)
    plt.title(feature[i], fontsize=20)
    temp = data[feature[i]].value_counts()
    plt.bar(temp.keys(), temp.values, width=0.5, color='b', alpha=0.5)
    plt.xticks(temp.keys(), fontsize=12)
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.show()

- 위에서 생성한 카테고리형 데이터들 리스트를 feature에 할당한다

- 20×15 크기의 새로운 그래프 창 생성

- 전체 그래프 창의 제목을 Bar Plot으로 설정하고 폰트 크기를 40으로 설정

- feature 리스트의 요소만큼 순회하며

- 2×2그리드의 서브 플롯을 생성한다. i+1은 현재 반복에서의 서브플롯의 위치를 나타냄

- 현재 서브플롯의 제목을 feature[i]로 설정하고 폰트 크기를 20으로 한다

- temp변수에 현재 feature의 각 값의 빈도수를 계산하여 저장

- temp.keys(): 막대 이름 / temp.values: 각 막대의 높이, width: 막대 너비, color: 막대 색상, alpha: 투명도

     - temp는 각 값의 빈도수를 저장하는 딕셔너리

     - temp.keys()는 각 값

     - temp.values는 각 값의 빈도수

- x축의 눈금 레이블을 설정하고 폰트 크기를 12로 설정한다

- 그래프 내의 각 요소들이 겹치지 않게 조절하고 전체 그래프 창의 레이아웃을 조정한다.

🧩 plt.tight_layout()

  • 그래프의 레이아웃을 자동으로 조절하여 여러 서브플롯, 축 레이블, 제목 등의 요소가 서로 겹치지 않게 해주는 유용한 함수
  • 여러개의 서브플롯을 가진 그래프에서 이 함수를 사용하면 각 서브플롯 간의 간격을 조절해준다
  • rect: 그래프 전체 크기와 위치를 조절할 수 있다
    • [left, bottom, right, top] 형태의 리스트로 주어져야한다
    • 각 값은 0과 1 사이의 값을 가지며 그래프 창의 비율로 해석된다.
      1. left: 왼쪽 여백의 위치. 0은 왼쪽 끝을 의미합니다.
      2. bottom: 하단 여백의 위치. 0은 하단 끝을 의미합니다.
      3. right: 오른쪽 여백의 위치. 1은 오른쪽 끝을 의미합니다.
      4. top: 상단 여백의 위치. 1은 상단 끝을 의미합니다.

 

 

- to be continued - 

'데이터분석 > DACON' 카테고리의 다른 글

판다스 첫걸음  (0) 2023.09.18
[Pandas튜토리얼]Ch1. CSV파일과 DataFrame  (0) 2023.09.18