Matplotlib ~ : )

파이썬 데이터 시각화의 기본, Matplotlib 정복하기

작성자:   ~ : )
(with Gemini)
작성일: 2025년 5월 20일
수정일: 2025년 6월 11일

▼ 학습 시작하기 ▼

* 머리말

Matplotlib의 세계에 오신 것을 환영합니다. Matplotlib는 파이썬 프로그래밍 언어 및 NumPy 라이브러리를 위한 강력하고 유연한 시각화 라이브러리입니다. 정적, 애니메이션, 대화형 시각화를 만들 수 있는 포괄적인 기능을 제공합니다.

이 문서는 Matplotlib의 기본적인 사용법부터 시작하여 다양한 종류의 플롯을 생성하고 꾸미는 방법, 그리고 실제 데이터셋(타이타닉)을 활용한 시각화 예제까지 다룹니다. Matplotlib를 통해 데이터를 효과적으로 시각화하고 인사이트를 발견하는 능력을 키울 수 있기를 바랍니다.

- ~ : ) (with Gemini)

제 1 장: Matplotlib란 무엇인가?

Matplotlib는 파이썬에서 데이터를 시각화하는 데 사용되는 가장 널리 알려진 라이브러리 중 하나입니다. John D. Hunter에 의해 처음 개발되었으며, MATLAB과 유사한 인터페이스를 제공하여 사용자가 쉽게 다양한 종류의 그래프를 생성할 수 있도록 지원합니다.

1.1. Matplotlib의 주요 특징

Matplotlib는 주로 matplotlib.pyplot 모듈을 통해 사용되며, 이는 상태 기반 인터페이스를 제공하여 MATLAB 사용자에게 친숙한 방식으로 플롯을 생성하게 합니다.

제 2 장: Pyplot 인터페이스

matplotlib.pyplot은 Matplotlib의 함수들을 모아놓은 컬렉션으로, MATLAB처럼 작동하도록 만들어줍니다. 각 pyplot 함수는 그림(figure)이나 그림 내의 플롯 영역(axes)을 변경하는 역할을 합니다. 예를 들어, 그림을 만들고, 플롯 영역을 만들고, 선을 그리고, 레이블을 추가하는 등의 작업을 수행합니다.

pyplot은 상태를 유지하면서 함수 호출 간에 현재 그림과 플롯 영역을 추적합니다. 가장 일반적인 사용 방식은 다음과 같습니다:

예시 코드: 기본 Pyplot 사용

import matplotlib.pyplot as plt
import numpy as np

# 데이터 준비
x = np.linspace(0, 2 * np.pi, 100)
y_sin = np.sin(x)
y_cos = np.cos(x)

# 그림(figure)과 축(axes) 생성
plt.figure(figsize=(8, 5)) # 그림 크기 지정 (선택 사항)

# 첫 번째 플롯: sin(x)
plt.plot(x, y_sin, label='sin(x)', color='blue', linestyle='-')

# 두 번째 플롯: cos(x)
plt.plot(x, y_cos, label='cos(x)', color='red', linestyle='--')

# 제목 및 레이블 추가
plt.title('Sine and Cosine Functions')
plt.xlabel('X-axis (radians)')
plt.ylabel('Y-axis (value)')

# 범례 표시
plt.legend()

# 그리드 표시 (선택 사항)
plt.grid(True)

# 플롯 보여주기
plt.show()

예상 결과:

(X축이 0에서 2π까지이고 Y축에 sin(x)와 cos(x) 곡선이 그려진 그래프가 나타납니다.
sin(x)는 파란색 실선, cos(x)는 빨간색 점선으로 표시되며, 제목, 축 레이블, 범례, 그리드가 포함됩니다.)

위 예제는 pyplot의 기본적인 흐름을 보여줍니다. 데이터를 준비하고, plt.plot() 함수로 선을 그리며, plt.title(), plt.xlabel(), plt.ylabel(), plt.legend() 등으로 플롯을 꾸민 후 plt.show()로 최종 결과를 화면에 표시합니다.

제 3 장: 기본 플롯

Matplotlib는 다양한 종류의 기본 플롯을 제공합니다. 여기서는 가장 흔히 사용되는 몇 가지 플롯 유형을 살펴보겠습니다.

3.1 선 플롯 (Line Plot)

선 플롯은 시간 경과에 따른 데이터의 변화 추세나 두 변수 간의 관계를 시각화하는 데 유용합니다. plt.plot() 함수를 사용합니다.

예시 코드:

import matplotlib.pyplot as plt
import numpy as np

x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 3, 5, 7, 11]) # 예: 소수 값

plt.figure(figsize=(6,4))
plt.plot(x, y, marker='o', linestyle='-', color='green', label='Prime Numbers Trend')
plt.title('Simple Line Plot')
plt.xlabel('Input X')
plt.ylabel('Output Y')
plt.legend()
plt.grid(True)
plt.show()

예상 결과:

(x축 값이 1~5, y축 값이 2,3,5,7,11인 점들이 녹색 선으로 연결되고 각 점에 'o' 마커가 표시된 그래프가 나타납니다.
제목, 축 레이블, 범례, 그리드가 포함됩니다.)

3.2 막대 그래프 (Bar Chart)

막대 그래프는 범주형 데이터의 빈도, 크기 또는 비율을 비교하는 데 사용됩니다. plt.bar() (수직 막대) 또는 plt.barh() (수평 막대) 함수를 사용합니다.

예시 코드:

import matplotlib.pyplot as plt

categories = ['A', 'B', 'C', 'D']
values = [15, 24, 12, 19]

plt.figure(figsize=(7,5))
plt.bar(categories, values, color=['skyblue', 'lightcoral', 'lightgreen', 'gold'])
plt.title('Category Comparison')
plt.xlabel('Categories')
plt.ylabel('Values')
plt.show()

예상 결과:

(x축에 카테고리 A, B, C, D가 있고, 각 카테고리에 해당하는 값 15, 24, 12, 19를 높이로 하는 막대가 다른 색상으로 그려진 그래프가 나타납니다.
제목과 축 레이블이 포함됩니다.)

3.3 히스토그램 (Histogram)

히스토그램은 연속형 데이터의 분포를 시각화합니다. 데이터 범위를 여러 구간(bin)으로 나누고 각 구간에 속하는 데이터의 빈도를 막대로 표시합니다. plt.hist() 함수를 사용합니다.

예시 코드:

import matplotlib.pyplot as plt
import numpy as np

# 정규 분포를 따르는 임의의 데이터 생성
data = np.random.randn(1000) # 평균 0, 표준편차 1

plt.figure(figsize=(7,5))
plt.hist(data, bins=30, color='purple', edgecolor='black', alpha=0.7)
plt.title('Data Distribution Histogram')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()

예상 결과:

(x축에 데이터 값의 범위가 있고, y축에 빈도가 표시된 히스토그램이 나타납니다. 30개의 구간(bin)으로 나뉘고, 보라색 막대로 표시되며 막대 테두리는 검은색입니다.)

3.4 산점도 (Scatter Plot)

산점도는 두 연속형 변수 간의 관계를 점으로 표시하여 시각화합니다. 데이터 포인트들의 분포 패턴, 상관 관계, 군집 등을 파악하는 데 유용합니다. plt.scatter() 함수를 사용합니다.

예시 코드:

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42) # 재현성을 위한 시드 설정
x_values = np.random.rand(50) * 10
y_values = 2 * x_values + np.random.randn(50) * 2 # y = 2x + noise

colors = np.random.rand(50) # 각 점에 다른 색상
sizes = 1000 * np.random.rand(50) # 각 점에 다른 크기

plt.figure(figsize=(8,6))
plt.scatter(x_values, y_values, c=colors, s=sizes, alpha=0.6, cmap='viridis')
plt.colorbar(label='Color Intensity') # 색상 막대 표시
plt.title('Relationship between X and Y')
plt.xlabel('X Value')
plt.ylabel('Y Value')
plt.grid(True)
plt.show()

예상 결과:

(x축과 y축에 해당하는 50개의 점들이 다양한 색상과 크기로 흩뿌려진 산점도가 나타납니다.
x와 y는 양의 상관관계를 보이며, 색상 강도를 나타내는 컬러바와 제목, 축 레이블, 그리드가 포함됩니다.)

3.5 파이 차트 (Pie Chart)

파이 차트는 전체에 대한 각 부분의 비율을 원형으로 나타내는 데 사용됩니다. plt.pie() 함수를 사용합니다.

예시 코드:

import matplotlib.pyplot as plt

labels = ['Frogs', 'Hogs', 'Dogs', 'Logs']
sizes = [15, 30, 45, 10] # 각 부분의 크기
explode = (0, 0.1, 0, 0)  # 'Hogs' 조각만 약간 분리

plt.figure(figsize=(7,7))
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
        shadow=True, startangle=90)
plt.axis('equal')  # 파이 차트를 원형으로 만듭니다.
plt.title('Proportion of Items')
plt.show()

예상 결과:

(네 개의 조각(Frogs, Hogs, Dogs, Logs)으로 구성된 파이 차트가 나타납니다. 각 조각은 해당 비율을 백분율로 표시하며,
'Hogs' 조각은 약간 돌출되어 있고, 그림자와 함께 표시됩니다. 제목이 포함됩니다.)

제 4 장: 서브플롯 (Subplots)

하나의 그림(figure) 안에 여러 개의 독립된 플롯(axes)을 배치할 수 있으며, 이를 서브플롯이라고 합니다. plt.subplots() 함수나 fig.add_subplot() 메서드를 사용하여 생성합니다.

예시 코드: plt.subplots() 사용

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = np.exp(-x/5) * np.sin(x)

# 2x2 형태의 서브플롯 생성
fig, axs = plt.subplots(2, 2, figsize=(10, 8)) # fig는 전체 그림, axs는 각 서브플롯의 배열

# 첫 번째 서브플롯 (0, 0)
axs[0, 0].plot(x, y1, color='blue')
axs[0, 0].set_title('sin(x)')
axs[0, 0].grid(True)

# 두 번째 서브플롯 (0, 1)
axs[0, 1].plot(x, y2, color='red')
axs[0, 1].set_title('cos(x)')
axs[0, 1].grid(True)

# 세 번째 서브플롯 (1, 0)
axs[1, 0].plot(x, y3, color='green')
axs[1, 0].set_title('tan(x)')
axs[1, 0].set_ylim([-5, 5]) # tan 그래프의 y축 범위 제한
axs[1, 0].grid(True)

# 네 번째 서브플롯 (1, 1)
axs[1, 1].plot(x, y4, color='purple')
axs[1, 1].set_title('exp(-x/5) * sin(x)')
axs[1, 1].grid(True)

# 전체 그림에 대한 제목 (선택 사항)
fig.suptitle('Various Trigonometric and Exponential Functions', fontsize=16)

# 서브플롯 간 간격 조절
plt.tight_layout(rect=[0, 0, 1, 0.96]) # suptitle과의 겹침 방지

plt.show()

예상 결과:

(2x2 격자로 배열된 네 개의 서브플롯이 하나의 그림 안에 나타납니다.
각 서브플롯은 sin(x), cos(x), tan(x), exp(-x/5)*sin(x) 그래프를 각각 다른 색상으로 보여주며,
각각의 제목과 그리드를 가집니다. 전체 그림의 상단에는 "Various Trigonometric and Exponential Functions"라는 제목이 표시됩니다.)

제 5 장: 플롯 꾸미기

Matplotlib는 플롯의 거의 모든 요소를 사용자가 원하는 대로 꾸밀 수 있는 다양한 옵션을 제공합니다.

5.1 색상과 선 스타일

플롯의 선 색상, 마커 종류, 선 스타일 등을 변경하여 가독성을 높이고 정보를 효과적으로 전달할 수 있습니다.

예시 코드:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 5, 0.5)

plt.figure(figsize=(10,6))

plt.plot(x, x, color='red', linestyle='-', marker='o', label='Solid Red with o')
plt.plot(x, x+1, color='blue', linestyle='--', marker='x', label='Dashed Blue with x')
plt.plot(x, x+2, color='green', linestyle=':', marker='s', label='Dotted Green with square')
plt.plot(x, x+3, color='#FF00FF', linestyle='-.', marker='^', markersize=8, label='Dash-dot Magenta with triangle') # Hex color

plt.title('Customized Lines and Markers')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.grid(True)
plt.show()

예상 결과:

(네 개의 다른 선이 그려진 그래프가 나타납니다. 각 선은 지정된 색상, 선 스타일, 마커 종류, 레이블을 가집니다.
예를 들어 첫 번째 선은 빨간색 실선에 동그라미 마커, 두 번째는 파란색 점선에 x 마커 등으로 표시됩니다.
제목, 축 레이블, 범례, 그리드가 포함됩니다.)

주요 옵션:

  • color: 선/마커 색상 (이름, 약자, Hex 코드 등)
  • linestyle 또는 ls: 선 스타일 ('-', '--', '-.', ':', 'None', 'solid', 'dashed', 등)
  • linewidth 또는 lw: 선 두께
  • marker: 데이터 포인트 마커 종류 ('.', ',', 'o', 'v', '^', '<', '>', 's', 'p', '*', 'h', 'H', '+', 'x', 'D', 'd', '|', '_')
  • markersize 또는 ms: 마커 크기
  • markerfacecolor: 마커 내부 색상
  • markeredgecolor: 마커 테두리 색상

5.2 레이블, 제목, 범례

플롯에 제목, 축 레이블, 범례를 추가하여 그래프가 전달하고자 하는 정보를 명확하게 합니다.

예시 코드:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y1 = x**2
y2 = x**3

plt.figure(figsize=(8,6))
plt.plot(x, y1, label='y = x^2')
plt.plot(x, y2, label='y = x^3')

plt.title('Polynomial Functions', fontsize=16, color='darkblue')
plt.xlabel('X Value', fontsize=12)
plt.ylabel('Y Value', fontsize=12)

# 범례 위치 및 스타일 지정
plt.legend(loc='upper left', shadow=True, fontsize='medium', title='Functions')
# loc 옵션: 'best', 'upper right', 'upper left', 'lower left', 'lower right', 'right', 'center left', ...

plt.grid(True)
plt.show()

예상 결과:

(x^2와 x^3 함수가 그려진 그래프가 나타납니다.
그래프 상단에는 'Polynomial Functions'라는 제목이, x축과 y축에는 각각 'X Value', 'Y Value'라는 레이블이 표시됩니다.
왼쪽 상단에는 'Functions'라는 제목 아래 각 선의 레이블('y = x^2', 'y = x^3')이 표시된 범례가 그림자와 함께 나타납니다.)

5.3 눈금과 주석

축의 눈금(ticks) 위치와 레이블을 조절하고, 특정 데이터 포인트에 주석(annotation)을 추가하여 그래프의 세부 정보를 강조할 수 있습니다.

예시 코드:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-np.pi, np.pi, 200)
y = np.sin(x)

plt.figure(figsize=(10,6))
plt.plot(x, y)

# 눈금 설정
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
           [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$\pi/2$', r'$\pi$']) # LaTeX 문자열 사용
plt.yticks([-1, 0, 1])

# 주석 추가
plt.annotate('Peak Value', xy=(np.pi/2, 1), xytext=(np.pi/2 + 0.5, 1.2),
             arrowprops=dict(facecolor='black', shrink=0.05, width=1, headwidth=5),
             fontsize=10)
plt.annotate('Minimum Value', xy=(-np.pi/2, -1), xytext=(-np.pi/2 - 1.5, -1.3),
             arrowprops=dict(arrowstyle='->', connectionstyle='angle3,angleA=0,angleB=-90'),
             fontsize=10)

plt.title('Sine Wave with Custom Ticks and Annotations')
plt.xlabel('Angle (radians)')
plt.ylabel('sin(Angle)')
plt.grid(True, linestyle=':', alpha=0.5)
plt.show()

예상 결과:

(sin(x) 그래프가 나타납니다.
x축 눈금은 -π, -π/2, 0, π/2, π 지점에 해당 LaTeX 심볼로 표시되고, y축 눈금은 -1, 0, 1에 표시됩니다.
그래프의 최댓값 (π/2, 1) 지점과 최솟값 (-π/2, -1) 지점에 각각 'Peak Value', 'Minimum Value'라는 주석과 함께 화살표가 표시됩니다.
제목, 축 레이블, 그리드가 포함됩니다.)

제 6 장: 타이타닉 데이터 시각화 (Matplotlib)

실제 데이터셋인 타이타닉 생존자 데이터를 Matplotlib를 사용하여 시각화하는 예제를 통해 데이터 분석 과정을 살펴봅니다.

6.1 데이터 준비 및 기본 분석

먼저 Pandas를 사용하여 타이타닉 데이터를 불러오고 기본적인 정보를 확인합니다.

예시 코드:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 데이터 불러오기 (일반적으로 CSV 파일 사용)
# 여기서는 예시로 DataFrame을 직접 생성하거나, 웹에서 불러옵니다.
# 실제 사용 시: df = pd.read_csv('titanic.csv')
# Kaggle의 타이타닉 데이터셋 URL
url = 'https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv'
try:
    df = pd.read_csv(url)
except Exception as e:
    print(f"Error loading data: {e}")
    # 대체 데이터 (오류 발생 시)
    data = {'Survived': [0, 1, 1, 1, 0, 0, 0, 0, 1, 1],
            'Pclass': [3, 1, 3, 1, 3, 3, 1, 3, 3, 2],
            'Name': ['Braund, Mr. Owen Harris', 'Cumings, Mrs. John Bradley (Florence Briggs Thayer)',
                     'Heikkinen, Miss. Laina', 'Futrelle, Mrs. Jacques Heath (Lily May Peel)',
                     'Allen, Mr. William Henry', 'Moran, Mr. James', 'McCarthy, Mr. Timothy J',
                     'Palsson, Master. Gosta Leonard', 'Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)',
                     'Nasser, Mrs. Nicholas (Adele Achem)'],
            'Sex': ['male', 'female', 'female', 'female', 'male', 'male', 'male', 'male', 'female', 'female'],
            'Age': [22, 38, 26, 35, 35, np.nan, 54, 2, 27, 14],
            'SibSp': [1, 1, 0, 1, 0, 0, 0, 3, 0, 1],
            'Parch': [0, 0, 0, 0, 0, 0, 0, 1, 2, 0],
            'Ticket': ['A/5 21171', 'PC 17599', 'STON/O2. 3101282', '113803', '373450', '330877', '17463', '349909', '347742', '237736'],
            'Fare': [7.25, 71.2833, 7.925, 53.1, 8.05, 8.4583, 51.8625, 21.075, 11.1333, 30.0708],
            'Cabin': [np.nan, 'C85', np.nan, 'C123', np.nan, np.nan, 'E46', np.nan, np.nan, np.nan],
            'Embarked': ['S', 'C', 'S', 'S', 'S', 'Q', 'S', 'S', 'S', 'C']}
    df = pd.DataFrame(data)

print("--- 데이터 샘플 (처음 5개 행) ---")
print(df.head())
print("\n--- 데이터 정보 ---")
df.info()
print("\n--- 기술 통계 ---")
print(df.describe())
print("\n--- 결측치 확인 ---")
print(df.isnull().sum())

# 간단한 전처리: Age 결측치를 평균으로 채우기
df['Age'].fillna(df['Age'].mean(), inplace=True)
# Embarked 결측치를 최빈값으로 채우기 (데이터가 있다면)
if 'Embarked' in df.columns and df['Embarked'].isnull().any():
    df['Embarked'].fillna(df['Embarked'].mode()[0], inplace=True)

print("\n--- 전처리 후 결측치 확인 ---")
print(df.isnull().sum())

예상 결과:

--- 데이터 샘플 (처음 5개 행) ---
   Survived  Pclass                                               Name     Sex   Age  SibSp  Parch            Ticket     Fare Cabin Embarked
0         0       3                            Braund, Mr. Owen Harris    male  22.0      1      0         A/5 21171   7.2500   NaN        S
1         1       1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1      0          PC 17599  71.2833   C85        C
2         1       3                             Heikkinen, Miss. Laina  female  26.0      0      0  STON/O2. 3101282   7.9250   NaN        S
3         1       1       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1      0            113803  53.1000  C123        S
4         0       3                          Allen, Mr. William Henry    male  35.0      0      0            373450   8.0500   NaN        S

--- 데이터 정보 ---
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890 (실제 데이터셋의 경우, 예제는 10개)
Data columns (total 12 columns):
 #   Column    Non-Null Count  Dtype
---  ------    --------------  -----
 0   Survived  891 non-null    int64
 1   Pclass    891 non-null    int64
 2   Name      891 non-null    object
 3   Sex       891 non-null    object
 4   Age       714 non-null    float64
 5   SibSp     891 non-null    int64
 6   Parch     891 non-null    int64
 7   Ticket    891 non-null    object
 8   Fare      891 non-null    float64
 9   Cabin     204 non-null    object
10  Embarked  889 non-null    object
dtypes: float64(2), int64(4), object(6) (실제 데이터셋 기준, 예제는 다를 수 있음)
memory usage: 83.7+ KB

--- 기술 통계 ---
       Survived      Pclass         Age       SibSp       Parch        Fare
count  891.000000  891.000000  714.000000  891.000000  891.000000  891.000000
mean     0.383838    2.308642   29.699118    0.523008    0.381594   32.204208
std      0.486592    0.836071   14.526497    1.102743    0.806057   49.693429
min      0.000000    1.000000    0.420000    0.000000    0.000000    0.000000
25%      0.000000    2.000000   20.125000    0.000000    0.000000    7.910400
50%      0.000000    3.000000   28.000000    0.000000    0.000000   14.454200
75%      1.000000    3.000000   38.000000    1.000000    0.000000   31.000000
max      1.000000    3.000000   80.000000    8.000000    6.000000  512.329200 (실제 데이터셋 기준)

--- 결측치 확인 ---
Survived      0
Pclass        0
Name          0
Sex           0
Age         177
SibSp         0
Parch         0
Ticket        0
Fare          0
Cabin       687
Embarked      2
dtype: int64 (실제 데이터셋 기준)

--- 전처리 후 결측치 확인 ---
Survived      0
Pclass        0
Name          0
Sex           0
Age           0
SibSp         0
Parch         0
Ticket        0
Fare          0
Cabin       687
Embarked      0
dtype: int64 (실제 데이터셋 기준, Cabin은 여전히 많음)

6.2 생존자/사망자 수 (막대 그래프)

생존 여부에 따른 승객 수를 막대 그래프로 시각화합니다.

예시 코드:

survival_counts = df['Survived'].value_counts().sort_index() # 0: 사망, 1: 생존

plt.figure(figsize=(6,5))
bars = plt.bar(survival_counts.index, survival_counts.values, color=['salmon', 'lightgreen'], tick_label=['Died', 'Survived'])

# 막대 위에 숫자 표시
for bar in bars:
    yval = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2.0, yval + 5, int(yval), va='bottom', ha='center') # va: vertical alignment

plt.title('Survival Count on Titanic (Matplotlib)')
plt.xlabel('Outcome')
plt.ylabel('Number of Passengers')
plt.xticks([0,1], ['Died', 'Survived']) # 명확한 레이블 설정
plt.show()

예상 결과:

(x축에 'Died'와 'Survived'가 있고, 각 결과에 해당하는 승객 수를 나타내는 두 개의 막대(사망자 수는 연어색, 생존자 수는 연두색)가 그려진 그래프가 나타납니다.
각 막대 상단에는 해당 승객 수가 숫자로 표시됩니다. 제목과 축 레이블이 포함됩니다.)

6.3 승객 연령 분포 (히스토그램)

승객들의 연령 분포를 히스토그램으로 나타냅니다.

예시 코드:

plt.figure(figsize=(10, 6))
plt.hist(df['Age'].dropna(), bins=20, color='skyblue', edgecolor='black') # 결측치 제거 후 사용
plt.title('Age Distribution of Passengers (Matplotlib)')
plt.xlabel('Age')
plt.ylabel('Number of Passengers')
plt.grid(axis='y', alpha=0.75)
plt.show()

예상 결과:

(x축에 나이, y축에 승객 수를 나타내는 히스토그램이 표시됩니다. 연령대는 20개의 구간으로 나뉘며 하늘색 막대로 표현됩니다.
제목, 축 레이블, y축 그리드가 포함됩니다.)

6.4 객실 등급 비율 (파이 차트)

승객들의 객실 등급(Pclass) 비율을 파이 차트로 시각화합니다.

예시 코드:

pclass_counts = df['Pclass'].value_counts().sort_index()

plt.figure(figsize=(7,7))
plt.pie(pclass_counts, labels=[f'Class {i}' for i in pclass_counts.index],
        autopct='%1.1f%%', startangle=90, colors=['gold', 'lightcoral', 'lightskyblue'],
        explode=(0, 0.05, 0.05)) # 2, 3등석 약간 분리
plt.title('Passenger Class Distribution (Matplotlib)')
plt.axis('equal')
plt.show()

예상 결과:

(세 개의 조각(Class 1, Class 2, Class 3)으로 구성된 파이 차트가 나타납니다.
각 조각은 해당 객실 등급의 비율을 백분율로 표시하며, Class 2와 Class 3 조각은 약간 돌출되어 있습니다.
색상은 각각 금색, 연한 산호색, 하늘색으로 지정됩니다. 제목이 포함됩니다.)

6.5 나이와 요금 관계 (산점도)

승객의 나이와 지불한 요금 간의 관계를 산점도로 표현합니다. 생존 여부에 따라 점의 색을 다르게 표시할 수 있습니다.

예시 코드:

plt.figure(figsize=(10, 7))
# 생존자와 사망자 데이터 분리
survived_data = df[df['Survived']==1]
died_data = df[df['Survived']==0]

plt.scatter(died_data['Age'], died_data['Fare'], color='red', label='Died', alpha=0.5, s=20)
plt.scatter(survived_data['Age'], survived_data['Fare'], color='blue', label='Survived', alpha=0.5, s=20)

plt.title('Age vs. Fare by Survival (Matplotlib)')
plt.xlabel('Age')
plt.ylabel('Fare')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.7)
# Fare가 매우 높은 이상치를 제외하기 위해 y축 범위 조절 (선택 사항)
plt.ylim(0, 300) # 예시: 요금 상한 300으로 설정
plt.show()

예상 결과:

(x축은 나이, y축은 요금을 나타내는 산점도가 표시됩니다.
사망한 승객은 빨간색 점으로, 생존한 승객은 파란색 점으로 표시되며, 각 점은 반투명하게 처리됩니다.
제목, 축 레이블, 범례, 그리드가 포함되며, y축(요금)은 0부터 300까지로 제한될 수 있습니다.)

제 7 장: 맺음말

이 문서를 통해 Matplotlib의 기본적인 사용법과 다양한 플롯 생성 방법을 익혔습니다. Matplotlib는 매우 강력하고 유연한 도구이므로, 여기서 다룬 내용 외에도 많은 기능과 사용자 정의 옵션이 존재합니다.

더 자세한 정보나 고급 기능에 대해서는 Matplotlib 공식 문서를 참고하시기 바랍니다. 꾸준한 연습을 통해 데이터 시각화 능력을 향상시키시길 바랍니다.