python
판다스 히스토그램: 데이터 시각화 초보자 가이드

판다스 히스토그램: 데이터 시각화 초보자 가이드

MoeNagy Dev

판다스 히스토그램 이해하기

판다스 히스토그램 소개

데이터 조작 및 분석에 강력한 기능을 제공하는 Python의 판다스(Pandas) 라이브러리는 데이터 분포를 시각화하는 데 필수적인 히스토그램을 손쉽게 생성할 수 있도록 해줍니다. 히스토그램은 데이터셋의 빈도 분포를 그래픽으로 나타내어 데이터의 기본 패턴과 특성을 파악하는 데 도움을 줍니다.

판다스 히스토그램의 주요 기능과 장점

판다스 히스토그램은 다음과 같은 주요 기능과 장점을 제공합니다:

  1. 직관적인 데이터 탐색: 히스토그램을 사용하여 데이터의 형태, 중심값 및 분포를 빠르게 파악할 수 있어 탐색적 데이터 분석에 유용한 도구입니다.
  2. 이상치 검출: 히스토그램을 통해 분포의 일반적인 범위를 벗어난 이상치 데이터 포인트를 찾아낼 수 있습니다.
  3. 분포 비교: 여러 개의 히스토그램을 겹쳐 그려 데이터셋이나 하위 그룹 간의 분포를 시각적으로 비교할 수 있습니다.
  4. 통계적 추론: 히스토그램을 사용하여 정규성과 같은 통계적 검정의 가정을 평가하거나 가설 검정을 지원할 수 있습니다.
  5. 사용자 정의 및 유연성: 판다스 히스토그램은 매우 유연하게 사용자 정의할 수 있으며, 빈(bin)의 개수, bin 크기, 색상 등 시각적인 요소를 조정하여 특정한 요구에 맞게 변형할 수 있습니다.

판다스 히스토그램 생성하기

판다스와 맷플롯립 임포트하기

판다스 히스토그램을 생성하기 위해 필요한 라이브러리를 임포트해야 합니다:

import pandas as pd
import matplotlib.pyplot as plt

기본 히스토그램 생성하기

판다스의 hist() 함수를 사용하여 간단한 히스토그램을 생성해보겠습니다:

# 샘플 데이터셋 로드
data = pd.DataFrame({'Age': [25, 30, 35, 40, 45, 50, 55, 60, 65, 70]})
 
# 기본 히스토그램 생성
data['Age'].hist()
plt.show()

위 코드는 데이터셋의 'Age' 열에 대한 히스토그램을 생성하여 나이의 분포를 표시합니다.

히스토그램 외관 변경하기

판다스 히스토그램은 시각화를 개선하기 위해 다양한 커스터마이징 옵션을 제공합니다.

빈(bin) 개수 설정하기

bins 매개변수를 사용하여 히스토그램의 빈(bin) 개수를 조정할 수 있습니다:

data['Age'].hist(bins=6)
plt.show()

이렇게 하면 6개의 빈으로 이루어진 히스토그램이 생성됩니다.

빈(bin) 크기 조정하기

빈(bin) 크기를 조정하려면 bins 매개변수에 빈(bin) 경계의 리스트를 전달하면 됩니다:

bins = [20, 30, 40, 50, 60, 70, 80]
data['Age'].hist(bins=bins)
plt.show()

이렇게 하면 20부터 80까지 10의 간격으로 빈(bin)이 생성됩니다.

히스토그램 색상과 스타일 변경하기

맷플롯립의 스타일 옵션을 사용하여 히스토그램의 색상과 스타일을 커스터마이즈할 수 있습니다:

# 히스토그램 색상 설정
data['Age'].hist(color='green')
plt.show()
 
# 히스토그램 스타일 변경
plt.style.use('seaborn')
data['Age'].hist()
plt.show()

위 예제에서는 히스토그램의 색상을 녹색으로 변경하고, 그래프에 'seaborn' 스타일을 적용하는 방법을 보여줍니다.

히스토그램 속성 탐색하기

판다스 히스토그램은 다양한 통계적 속성에 접근할 수 있도록 제공되며, 이를 통해 데이터에 대한 깊은 통찰력을 얻을 수 있습니다.

히스토그램 통계 정보 얻기

다음 속성을 사용하여 히스토그램의 빈 경계, 빈 개수 및 빈 중심값을 가져올 수 있습니다:

# 히스토그램 생성
hist = data['Age'].hist()
 
# 빈 경계 접근
bin_edges = hist.patches[0].get_bbox().get_points()[:, 0]
 
# 빈 개수 접근
bin_counts = hist.patches[0].get_height()
 
# 빈 중심값 접근
bin_centers = 0.5 * (bin_edges[:-1] + bin_edges[1:])
 
print(f"빈 경계: {bin_edges}")
print(f"빈 개수: {bin_counts}")
print(f"빈 중심값: {bin_centers}")

위 코드는 히스토그램 개체에서 빈 경계, 빈 개수 및 빈 중심값을 추출하는 방법을 보여줍니다.

히스토그램 결합하기

판다스 히스토그램을 결합하여 비교 분석을 수행할 수 있습니다.

여러 히스토그램 겹치기

동일한 그래프에 여러 히스토그램을 겹쳐 그릴 때에는 hist() 대신 plot() 함수를 사용할 수 있습니다:

# 두 개의 열을 포함하는 샘플 데이터셋 생성
data = pd.DataFrame({'Age': [25, 30, 35, 40, 45, 50, 55, 60, 65, 70],
                     'Height': [160, 165, 170, 175, 180, 185, 190, 195, 200, 205]})
 
# 겹쳐진 히스토그램 그리기
data['Age'].plot(kind='hist', alpha=0.5, bins=6, label='Age')
data['Height'].plot(kind='hist', alpha=0.5, bins=6, label='Height')
plt.legend()
plt.show()

위 코드는 'Age'와 'Height' 열에 대한 겹쳐진 히스토그램을 하나의 그래프로 그립니다.

비교 분석을 위한 서브플롯

대신 서브플롯(grid of subplots)을 생성하여 여러 히스토그램을 나란히 표시할 수도 있습니다:

# 서브플롯 생성
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
 
# 개별 서브플롯에 히스토그램 그리기
data['Age'].hist(ax=ax1, bins=6, label='Age')
data['Height'].hist(ax=ax2, bins=6, label='Height')
 
# 레이블 및 타이틀 추가
ax1.set_title('나이 분포')
ax2.set_title('신장 분포')
plt.show()

이 예제에서는 데이터셋의 두 열에 대한 히스토그램을 각각의 서브플롯에 그려 비교 분석을 수행합니다.

고급 히스토그램 기법

판다스 히스토그램은 더 복잡한 데이터 유형을 처리하고 고급 시각화 옵션을 제공할 수 있습니다.

범주형 데이터 처리하기

판다스 히스토그램은 범주형 변수의 분포를 시각화하는 데에도 사용할 수 있습니다.

 
# Create a sample dataset with a categorical variable
data = pd.DataFrame({'Gender': ['남성','여성','남성','여성','남성','여성']})
 
# Create a histogram for the categorical variable
data['Gender'].value_counts().plot(kind='bar')
plt.show()

이 코드는 각 카테고리의 빈도수를 나타내는 범주형 데이터의 히스토그램, 바 차트를 생성합니다.

히스토그램 정규화하기

Pandas 히스토그램은 확률 밀도 함수(PDF) 또는 누적 분포 함수(CDF)를 나타낼 수 있도록 정규화될 수 있습니다.

# 정규화된 확률 밀도 함수(PDF) 히스토그램 생성
data['Age'].plot(kind='hist', density=True, bins=6)
plt.show()
 
# 정규화된 누적 분포 함수(CDF) 히스토그램 생성
data['Age'].plot(kind='hist', cumulative=True, density=True, bins=6)
plt.show()

density=True 매개변수는 히스토그램을 확률 밀도 함수로 정규화하고, cumulative=True는 누적 분포 함수를 나타내는 히스토그램을 생성합니다.

Pandas 히스토그램 사용 예시

Pandas 히스토그램은 다양한 데이터 분석 및 시각화 시나리오에 적용할 수 있는 다재다능한 도구입니다.

탐색적 데이터 분석

히스토그램은 데이터의 분포를 탐색하고, 이상치를 식별하고, 비대칭성 또는 기타 패턴을 감지하는 데 매우 유용한 도구입니다.

# 변수의 분포 탐색하기
data['Age'].hist()
plt.show()
 
# 이상치 식별하기
data['Age'].plot(kind='box')
plt.show()

첫번째 예시에서는 'Age' 열의 분포를 시각화하기 위해 히스토그램을 생성하고, 두번째 예시에서는 상자 수염 그림을 사용하여 잠재적인 이상치를 식별합니다.

데이터셋 비교하기

히스토그램을 겹쳐서 표시하거나 나란히 서브플롯을 생성하면 데이터셋 내에서 서로 다른 데이터 분포 또는 하위 그룹을 비교하는 데 도움이 될 수 있습니다.

# 두 변수의 분포 비교하기
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
data['Age'].hist(ax=ax1, bins=6, label='Age')
data['Height'].hist(ax=ax2, bins=6, label='Height')
plt.show()

이 코드는 두 개의 서로 다른 변수에 대한 히스토그램을 나타내는 두 개의 서브플롯을 포함하는 그림을 생성하여 데이터 분포를 시각적으로 비교할 수 있게 합니다.

가설 검정

히스토그램은 정규성과 같은 통계적 검정에 기반된 가정을 평가하고, 가설 검정을 지원하는 데 사용될 수 있습니다.

# 정규성 검정
from scipy.stats import normaltest
_, p_value = normaltest(data['Age'])
print(f"정규성 검정 p-value: {p_value:.4f}")

이 예시에서는 SciPy 라이브러리의 normaltest() 함수를 사용하여 'Age' 열에 대한 정규성 검정을 수행하고, 결과 p-value를 출력합니다. 히스토그램은 시각적으로 정규성 가정을 확인하는 데 사용될 수 있습니다.

데이터 구조

리스트

리스트는 Python에서 가장 기본적인 데이터 구조 중 하나입니다. 리스트는 순서가 있는 항목의 모음이며, 각 항목은 다른 데이터 유형이 될 수 있습니다. 리스트는 가변적이므로, 리스트 내에 요소를 추가, 제거 및 수정할 수 있습니다.

다음은 리스트를 생성하고 조작하는 예시입니다:

# 리스트 생성하기
fruits = ['사과', '바나나', '체리']
 
# 요소에 접근하기
print(fruits[0])  # 출력: '사과'
print(fruits[-1])  # 출력: '체리'
 
# 요소 수정하기
fruits[1] = '오렌지'
print(fruits)  # 출력: ['사과', '오렌지', '체리']
 
# 요소 추가하기
fruits.append('키위')
print(fruits)  # 출력: ['사과', '오렌지', '체리', '키위']
 
# 요소 제거하기
fruits.remove('바나나')
print(fruits)  # 출력: ['사과', '오렌지', '체리', '키위']

튜플

튜플은 리스트와 비슷하지만, 생성 후에 요소를 수정할 수 없는 불변 데이터 구조입니다. 튜플은 변경되지 않아야 할 관련 데이터를 저장하는 데 자주 사용됩니다.

다음은 튜플을 사용하는 예시입니다:

# 튜플 생성하기
point = (2, 3)
print(point)  # 출력: (2, 3)
 
# 요소에 접근하기
print(point[0])  # 출력: 2
print(point[1])  # 출력: 3
 
# 튜플 요소 수정 시도하기
# point[0] = 4  # TypeError: 'tuple' object does not support item assignment

딕셔너리

딕셔너리는 키-값 쌍의 정렬되지 않은 모음입니다. 데이터를 효율적으로 저장하고 검색하는 데 유용합니다.

다음은 딕셔너리를 사용하는 예시입니다:

# 딕셔너리 생성하기
person = {
    'name': '홍길동',
    'age': 35,
    'occupation': '소프트웨어 엔지니어'
}
 
# 값 접근하기
print(person['name'])  # 출력: '홍길동'
print(person['age'])  # 출력: 35
 
# 새로운 키-값 쌍 추가하기
person['email'] = 'hong.gildong@example.com'
print(person)  # 출력: {'name': '홍길동', 'age': 35, 'occupation': '소프트웨어 엔지니어', 'email': 'hong.gildong@example.com'}
 
# 키-값 쌍 제거하기
del person['occupation']
print(person)  # 출력: {'name': '홍길동', 'age': 35, 'email': 'hong.gildong@example.com'}

집합

집합은 유일한 요소들의 정렬되지 않은 모음입니다. 합집합, 교집합, 차집합 등과 같은 집합 연산에 유용합니다.

다음은 집합을 사용하는 예시입니다:

# 집합 생성하기
colors = {'빨강', '초록', '파랑'}
print(colors)  # 출력: {'빨강', '초록', '파랑'}
 
# 집합에 요소 추가하기
colors.add('노랑')
print(colors)  # 출력: {'빨강', '초록', '파랑', '노랑'}
 
# 집합에서 요소 제거하기
colors.remove('초록')
print(colors)  # 출력: {'파랑', '빨강', '노랑'}
 
# 집합 연산
set1 = {1, 2, 3}
set2 = {2, 3, 4}
print(set1.union(set2))  # 출력: {1, 2, 3, 4}
print(set1.intersection(set2))  # 출력: {2, 3}
print(set1.difference(set2))  # 출력: {1}

제어 흐름

조건문

조건문인 if-elseelif를 사용하면 특정 조건에 따라 다른 코드 블록을 실행할 수 있습니다.

# if-else 문
age = 18
if age >= 18:
    print("성인입니다.")
else:
    print("미성년자입니다.")
 
# elif 문
score = 85
if score >= 90:
    print("성적: A")
elif score >= 80:
    print("성적: B")
elif score >= 70:
    print("성적: C")
else:
    print("성적: F")

반복문

반복문은 forwhile과 같은 구문을 사용하여 코드 블록을 반복해서 실행할 수 있게 해줍니다.

# for 반복문
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
    print(fruit)
 
# while 반복문
count = 0
while count < 5:
    print(count)
    count += 1

리스트 컴프리헨션

리스트 컴프리헨션은 기존의 이터러블(리스트, 튜플, 세트 등)의 각 요소에 대해 변환 또는 조건을 적용하여 리스트를 간결하게 생성하는 방법입니다.

# 제곱들의 리스트를 생성하는 전통적인 방법
numbers = [1, 2, 3, 4, 5]
squares = []
for num in numbers:
    squares.append(num ** 2)
print(squares)  # 출력: [1, 4, 9, 16, 25]
 
# 리스트 컴프리헨션 사용
squares = [num ** 2 for num in numbers]
print(squares)  # 출력: [1, 4, 9, 16, 25]

함수

함수는 특정 작업을 수행하는 재사용 가능한 코드 블록입니다. 인수를 받아들이고 작업을 수행한 후 값을 반환할 수 있습니다.

# 함수 정의
def greet(name):
    """
    주어진 이름으로 사람을 인사합니다.
    """
    print(f"안녕하세요, {name}!")
 
# 함수 호출
greet("Alice")  # 출력: 안녕하세요, Alice!
 
# 반환 값이 있는 함수
def add_numbers(a, b):
    return a + b
 
result = add_numbers(3, 4)
print(result)  # 출력: 7

모듈과 패키지

파이썬의 모듈화된 구조를 통해 코드를 재사용 가능한 구성 요소인 모듈로 구성할 수 있습니다. 모듈은 관련된 모듈의 컬렉션인 패키지로 그룹화될 수 있습니다.

# 모듈 임포트
import math
print(math.pi)  # 출력: 3.141592653589793
 
# 모듈에서 특정 함수만 임포트
from math import sqrt
print(sqrt(16))  # 출력: 4.0
 
# 모듈에 별칭(alias)을 사용하여 임포트
import numpy as np
print(np.array([1, 2, 3]))  # 출력: [1 2 3]

예외 처리

파이썬의 예외 처리는 실행 중 발생하는 오류와 예기치 않은 상황을 관리하고 대응할 수 있도록 해줍니다.

# ZeroDivisionError 처리
try:
    result = 10 / 0
except ZeroDivisionError:
    print("에러: 0으로 나누기.")
 
# 다중 예외 처리
try:
    int_value = int("abc")
except ValueError:
    print("에러: 잘못된 정수 형식.")
except Exception as e:
    print(f"예기치 않은 오류: {e}")

파일 입출력

파이썬은 파일을 읽고 쓰기 위한 내장 함수와 메소드를 제공합니다.

# 파일에 쓰기
with open("example.txt", "w") as file:
    file.write("안녕하세요, 세상!")
 
# 파일에서 읽기
with open("example.txt", "r") as file:
    content = file.read()
    print(content)  # 출력: 안녕하세요, 세상!

결론

이 튜토리얼에서는 파이썬에서 다양한 데이터 구조, 제어 흐름 구문, 함수, 모듈, 예외 처리 및 파일 입출력에 대해 배웠습니다. 이 개념들은 견고하고 효율적인 파이썬 애플리케이션을 구축하는 데 필수적입니다. 이러한 개념들을 연습하고 적용하여 개념을 확실히 이해하고 능숙한 파이썬 프로그래머가 되도록 노력해보세요.

MoeNagy Dev