[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의 줄임말로, 수치 계산을 위한 기본 패키지로 간주된다.
- 데이터 분석, 과학 연산, 엔지니어링 모델링 및 기타 여러 분야에서 광범위하게 사용됨
* 특징
- 다차원 배열 객체(ndarray)
- numpy의 핵심은 ndarray 객체이다. 이는 동일한 데이터 타입을 가진 N차원의 배열이다.
- 배열은 벡터화된 연산을 지원하여 빠른 연산이 가능하다
- 기본 수학 연산
- 배열 간의 덧셈, 뺄셈, 곱셈 및 기타 수학 연산을 지원한다.
- 이러한 연산은 원소별(element-wise)로 이루어진다.
- 선형대수 연산
- 행렬 곱셈, 행렬식, 고유값, 역행렬과 같은 기본적인 선형대수 연산을 지원한다.
- 통계 및 수학 함수
- 평균, 중앙값, 표준편차와 같은 기본 통계 연산 및 수학함수를 제공한다
- 브로드캐스팅
- 다른 형상을 가진 배열 간의 연산이 가능하게 하는 브로드캐스팅 기능을 지원한다
- 집합연산
- 배열 데이터에 대한 기본적인 집합 연산(교집합, 합집합 등)을 지원한다.
- 메모리 매핑
- 대용량 데이터를 메모리에 매핑하여 작은 메모리에서도 큰 파일을 처리할 수 있다.
- 푸리에 변환 및 모양 변환
- 신호처리와 관련된 연산을 위한 푸리에 변환과 배열의 모양 변경 등의 기능을 제공한다
- C/C++ 및 Fortran과의 통합
- numpy는 C, C++ 및 Fortran 코드와 쉽게 연동될 수 있으며 효율적인 연산을 위해 이러한 언어로 작성된 코드를 사용할 수 있다.
- 확장 가능성
- 사용자 정의 데이터 타입 및 유니버셜 함수를 통해 numpy의 기능을 확장할 수 있다.
🧩 matplotlib
- Python에서 데이터를 시각적으로 표현하기 위한 매우 인기있는 2D 플로팅 라이브러리이다
- 이 라이브러리는 매우 광범위한 플롯 및 그래프를 생성하는 데 사용되며, 공학, 과학, 금융 및 다양한 분야의 연구에 널리 사용된다
- matplotlib 그자체로도 매우 강력하지만 이를 기반으로 다양한 확장 라이브러리들이 존재한다
- 데이터의 특성을 빠르게 탐색하거나 결과를 보고하는 데 유용한 도구로 간주된다
* 특징
- 다양한 플롯 스타일
- 라인 플롯(line plot), 산점도(scatter plot), 히스토그램(histogram), 바 차트(bar chart), 파이 차트(pie chart), 박스 플롯(box plot), 등고선 플롯(contour plot), 3D 플롯 등 다양한 시각화 스타일을 지원
- 플롯 커스터마이징
- 축, 레전드, 색상, 텍스트, 주석 등의 다양한 요소를 세밀하게 조절하고 커스터마이징할 수 있다
- 다양한 백엔드 지원
- 다양한 백엔드를 지원하여, 그래프를 여러 환경과 형식에서 렌더링할 수 있다.
- 예를 들면, 다양한 GUI 환경, PDF, SVG, JPG, PNG, BMP, GIF 등의 파일 형식, 웹 환경에서의 렌더링 등을 지원
- 통합 기능
- numpy와 밀접하게 통합되어 있어, numpy 배열을 바로 사용하여 그래프를 그릴 수 있다
- pandas, seaborn 등의 다른 Python 데이터 분석 라이브러리와도 잘 호환된다
- 애니메이션 및 인터액티브 플로팅
- matplotlib은 애니메이션 생성 및 인터액티브한 플롯을 지원한다.
- 임베디드 사용
- GUI 어플리케이션에 matplotlib 그래프를 임베드 하여 사용할 수 있다.
- 컬러맵 및 색상 처리
- 다양한 컬러맵을 제공하며, 색상의 표현 및 변환을 위한 푸웁한 도구를 제공
- 텍스트 및 주석 처리
- TeX 수학식 표현과 함게 그래프 내에 텍스트와 주석을 추가하는 기능을 제공한다
🧩 seaborn
- Python 데이터 시각화 라이브러리로 matplotlib을 기반으로 하여 보다 고급 스타일의 통계 그래픽을 쉽게 생성할 수 있게 도와준다
- 깔끔하고 가독성이 좋으며, 색상 팔레트 및 테마들이 잘 구성되어 있다.
- 시각화의 복잡성을 줄이는 동시에 프로패셔널한 퀄리티의 그래픽을 생성하는 데 도움을 준다
- 데이터 탐색 및 결과 시각화에 있어서 매우 유용한 도구로 간주된다.
* 특징
- 데이터 셋에 대한 인식
- pandas DataFrame을 직접 사용하여 데이터를 시각화 하는 것이 간단하다
- 통계 시각화 도구
- 평균, 중앙값, 분포, 상관 관계 등 통계적 측면을 시각화하는 다양한 도구를 제공
- 다양한 플롯 유형
- 산점도 행렬(scatter plot matrix), 페어 플롯(pair plot), 히트맵(heatmap), violin plot, box plot, swarm plot, joint plot 등 다양한 플롯 유형을 지원합니다.
- 시간 테미 및 컬러 팔레트
- 다양한 내장 컬러 팔레트와 테마를 통해 그래프의 전반적인 스타일과 색상 구성을 쉽게 조정할 수 있다
- 편리한 데이터 분포 시각화
- 데이터의 분포를 보여주는 displot, kdeplot 등의 도구를 제공한다
- 카테고리 데이터 시각화
- 범주형 데이터를 시각화하는 데 특화된 여러 플롯을 제공한다. 예를 들면, strip plot, factor plot 등이 있다
- 다변량 분포 시각화
- 여러 변수 간의 관계와 분포를 동시에 시각화하는 도구를 포함
- 컬러맵 및 색상 처리
- 데이터 값에 따라 색상을 조절하거나, 특정 컬러 팔레트를 적용하는 기능을 제공한다
- 통합 기능
- matplotlib와 밀접하게 통합되어 있으며, matplotlib의 기능을 활용하여 추가적인 커스터마이징을 할 수 있다
🧩 sklearn
- scikit-learn (sklearn)은 Python 프로그래밍 언어를 위한 머신러닝 라이브러리이다
- 이 라이브러리는 간단하고 효과적인 도구를 제공하여 데이터 마이닝과 데이터 분석을 수행하는 데 사용된다
- BSD라이선스로 제공되기 때문에 상업적인 프로젝트에도 사용할 수 있다
BSD라이선스
BSD 라이선스는 "Berkeley Software Distribution"의 약자로, 원래 캘리포니아 대학교 버클리 캠퍼스의 컴퓨터 시스템 연구 그룹에서 개발한 소프트웨어에 사용된 라이선스입니다. BSD 라이선스는 오픈 소스 라이선스 중 하나로, 사용자에게 소스 코드의 사용, 수정, 재배포에 관한 광범위한 자유를 부여합니다.
주요 특징은 다음과 같습니다:
- 자유로움: BSD 라이선스는 소프트웨어의 사용, 수정, 복제 및 재배포에 거의 제한이 없습니다. 이로 인해 상업적 및 비상업적 프로젝트 모두에 사용하기에 유용합니다.
- 소스 코드 유지: BSD 라이선스로 릴리스된 소프트웨어를 수정하여 재배포할 때, 원본 저작자와 라이선스 정보를 원본 소스 코드나 문서에 유지해야 합니다.
- 책임 및 보증의 부인: BSD 라이선스는 소프트웨어에 대한 어떠한 보증도 제공하지 않으며, 소프트웨어의 사용으로 인한 책임을 저작자 또는 라이선스 제공자에게 전가하지 않습니다.
BSD 라이선스에는 몇 가지 버전이 있으며, 가장 일반적인 것들은 "2-clause BSD License"와 "3-clause BSD License"입니다. "3-clause" 버전은 "논쟁 방지 조항"을 포함하고 있어, 소프트웨어를 사용하는 기관의 이름으로 소프트웨어 또는 해당 기관을 승인하거나 지지한다는 것을 나타내는 광고나 홍보 자료를 발표하는 것을 금지합니다.
BSD 라이선스는 그 간결성과 유연성으로 인해 많은 오픈 소스 프로젝트에 사용되며, 다른 오픈 소스 라이선스와 호환됩니다.
- 머신러닝 모델을 개발하고 평가하기 위한 주요 도구로 간주
- 간결하고 일관된 API 디자인으로 인해 초보자도 쉽게 접근하여 머신 러닝 작업을 수행할 수 있다
* 특징
- 다양한 알고리즘
- 분류, 회귀, 클러스터링, 차원 축소, 모델 선택 및 전처리를 위한 다양한 알고리즘을 제공
- 효과적인 도구
- 다양한 머신 러닝 알고리즘에 대한 효과적인 도구를 제공하며, 이를 통해 머신러닝 모델을 쉽게 구축 및 평가할 수 있다.
- 데이터 전처리
- 피처 스케일링, 변환, 데이터 정제 및 데이터 누락 처리와 같은 데이터 전처리 도구를 제공
- 모델 평가
- 교차 검증, 성능 지표 및 스코어링 도구를 포함하여 모델을 평가하고 선택하는 데 필요한 도구를 제공한다
- 파이프라인 생성
- 전처리 단계와 예측 모델을 결합하여 복잡한 워크플로우를 구축하는 데 사용되는 Pipeline도구를 포함한다
- 확장성
- numpy와 scipy를 기반으로하여 빠르고 효율적인 연산을 제공한다
- 다양한 샘플 데이터
- 라이브러리에는 여러 머신러닝 알고리즘을 테스트하고 실험하는 데 사용할 수 있는 샘플 데이터 셋이 포함되어 있다
- 오픈 소스
- 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는 텍스트로 이루어져 있어 전처리 필요
- 일관성: 텍스트 데이터는 종종 다양한 방식으로 표현될 수 있습니다. 예를 들어, "USA", "U.S.A.", "United States", "US"는 모두 동일한 나라를 나타내지만 다르게 기록될 수 있습니다. 이런 불일치를 해결하여 데이터의 일관성을 보장해야 합니다.
- 노이즈 제거: 텍스트 데이터는 불필요한 공백, 특수 문자, 오타 등의 노이즈를 포함할 수 있습니다. 이러한 노이즈는 분석의 정확도를 저하시킬 수 있기 때문에 제거해야 합니다.
- 정량적 분석 가능: 텍스트를 숫자로 변환(인코딩)함으로써, 통계적 또는 기계 학습 모델에 사용할 수 있게 됩니다. 예를 들어, 단어의 빈도나 문서 간의 유사도를 계산하기 위해 텍스트를 벡터로 변환할 수 있습니다.
- 정보 추출: 텍스트 데이터에서 중요한 정보나 패턴을 추출하기 위해서는 전처리 과정이 필요합니다. 예를 들어, 텍스트에서 특정 단어나 구문을 추출하거나, 주제 모델링을 통해 문서의 주제를 파악하기 위해 전처리를 수행합니다.
- 데이터 크기 감소: 불필요한 정보나 중복되는 텍스트를 제거함으로써, 데이터의 크기를 줄이고, 저장 공간을 절약하며, 계산 효율성을 높일 수 있습니다.
- 표준화: 데이터의 일관성과 비교를 위해 특정 표준이나 형식에 맞추는 작업이 필요할 수 있습니다.
- 언어와 문법: 자연어 처리(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)를 요약하여 보여준다
- 수치형 데이터: 기본적으로 describe()는 수치형 데이터에 대한 통계를 제공
- count: 비결측치의 개수
- mean: 평균 값
- std: 표준 편차
- min: 최솟값
- 25%: 25번째 백분위수 (1사분위수)
- 50%: 50번째 백분위수 (중앙값)
- 75%: 75번째 백분위수 (3사분위수)
- max: 최댓값
- 카테고리형 데이터: 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은 그것을 넘어서 다양한 프로그래밍 환경에서 확장 가능한 인터랙티브 컴퓨팅 환경을 제공
- 강력한 인터랙티브 셸: 표준 Python 셸보다 더 많은 기능을 제공합니다. 예를 들어, 자동 완성, 코드 색상 지정, 고급 히스토리 관리와 같은 기능들이 있습니다.
- 통합된 Jupyter: IPython은 이제 Jupyter 프로젝트의 일부로, Jupyter Notebook이라는 웹 기반 인터랙티브 계산 환경을 제공합니다. 이 환경에서는 코드, 텍스트, 수학 공식, 그래프 등을 하나의 문서 안에 통합할 수 있습니다.
- 매직 커맨드: IPython에서 제공하는 % 또는 %%로 시작하는 특별한 명령어들로, 시스템 명령어 실행, 코드 프로파일링, 시각화 등 다양한 작업을 수행할 수 있습니다.
- 향상된 디버깅: IPython은 표준 Python 디버거보다 향상된 디버깅 기능을 제공합니다.
- 병렬 컴퓨팅: 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 사이의 값을 가지며 그래프 창의 비율로 해석된다.
-
- left: 왼쪽 여백의 위치. 0은 왼쪽 끝을 의미합니다.
- bottom: 하단 여백의 위치. 0은 하단 끝을 의미합니다.
- right: 오른쪽 여백의 위치. 1은 오른쪽 끝을 의미합니다.
- top: 상단 여백의 위치. 1은 상단 끝을 의미합니다.
- to be continued -
'데이터분석 > DACON' 카테고리의 다른 글
판다스 첫걸음 (0) | 2023.09.18 |
---|---|
[Pandas튜토리얼]Ch1. CSV파일과 DataFrame (0) | 2023.09.18 |