Matplotlib
1. Matplotlib 기초
Matplotlib은 파이썬에서 가장 널리 사용되는 데이터 시각화 라이브러리입니다. 이 라이브러리를 사용하면 다양한 종류의 그래프와 차트를 생성할 수 있어, 데이터 분석 결과를 효과적으로 표현할 수 있습니다. Matplotlib을 이해하기 위해서는 몇 가지 주요 개념을 알아야 합니다.
해당 챕터는 차례대로 실행을 해야하며, 중간에 실행하면 데이터를 포함하지 않아 오류가 발생할 수 있습니다. 위니북스에서는 그래프에서 한글을 지원하지 않습니다. 또한 위니북스에서는 show()
를 사용하지만 코랩 환경에서는 plt.show()
를 사용하여 그래프를 출력해야 합니다. 붙여넣기를 할 수 있도록 항상 주석으로 plt.show()
를 함께 제공해드리겠습니다. 아래 코드를 실행하고 진행해주세요.
1.1 그래프 (Plot)
그래프는 데이터를 시각적으로 표현한 것을 말합니다. 선 그래프, 막대 그래프, 산점도 등 다양한 유형의 그래프가 있으며, 데이터의 특성에 따라 적절한 유형을 선택해야 합니다.
1.2 창 (Figure)
Figure는 그래프가 그려지는 전체 창을 의미합니다. 하나의 Figure 안에 여러 개의 그래프를 배치할 수 있어, 복잡한 데이터 관계도 한 눈에 볼 수 있게 해줍니다.
1.3 영역 (Axes)
Axes는 실제로 데이터가 그려지는 영역을 말합니다. x축과 y축을 포함하며, 3D 그래프의 경우 z축도 포함합니다. 대부분의 그래프 커스터마이징 작업은 이 Axes 객체를 통해 이루어집니다.
1.4 축 (Axis)
축은 그래프의 x축과 y축을 의미합니다. 각 축에는 눈금(ticks)과 레이블(labels)이 있어 데이터의 범위와 단위를 표시합니다. 축의 범위를 조절하면 데이터의 특정 부분을 강조할 수 있습니다.
1.5 제목 (Title)
제목은 그래프의 주제나 내용을 나타내는 텍스트입니다. Figure 전체의 제목과 각 Axes의 제목을 별도로 설정할 수 있어, 복잡한 그래프에서도 정보를 명확히 전달할 수 있습니다.
1.6 레이블 (Label)
레이블은 축의 이름을 나타내는 텍스트입니다. x축과 y축에 각각 레이블을 붙여 각 축이 나타내는 데이터의 의미를 설명합니다. 이를 통해 그래프를 보는 사람이 데이터를 올바르게 해석할 수 있도록 도와줍니다.
이러한 요소들을 조합하여 사용하면 위니브의 데이터를 효과적으로 시각화할 수 있습니다. 예를 들어, 월별 수강생 수, 과목별 수강생 분포, 연령대별 수강생 비율 등 다양한 정보를 그래프로 표현할 수 있습니다.
1.7 범례 (Legend)
범례는 그래프에 표시된 여러 데이터 시리즈를 구분하는 데 사용됩니다. 각 데이터 시리즈의 이름과 해당하는 색상 또는 마커를 보여줍니다.
1.8 스타일 및 색상
Matplotlib은 다양한 스타일과 색상 옵션을 제공하여 그프를 더 매력적으로 만들 수 있습니다.
1.9 저장 (Saving)
생성한 그래프를 파일로 저장할 수 있습니다. 다양한 형식(PNG, JPG, SVG 등)으로 저장 가능합니다. 위니북스에서는 지원하지 않습니다.
fig, ax = plt.subplots()
ax.plot(months, enrollments)
ax.set_title('Monthly Enrollments')
plt.savefig('monthly_enrollments.png', dpi=300, bbox_inches='tight')
plt.close() # 메모리 관리를 위해 Figure 닫기
fig, ax = plt.subplots()
ax.plot(months, enrollments)
ax.set_title('Monthly Enrollments')
plt.savefig('monthly_enrollments.png', dpi=300, bbox_inches='tight')
plt.close() # 메모리 관리를 위해 Figure 닫기
이러한 요소들을 조합하여 사용하면 위니브의 데이터를 효과적으로 시각화할 수 있습니다. 예를 들어, 월별 수강생 수, 과목별 수강생 분포, 연령대별 수강생 비율 등 다양한 정보를 그래프로 표현할 수 있습니다.
2. 데이터 시각화 기초
데이터 시각화는 복잡한 정보를 그래프나 차트로 표현하여 데이터의 패턴, 동향, 관계를 쉽게 파악할 수 있게 해주는 중요한 과정입니다. 이는 특히 대규모 데이터 분석에서 빠른 이해 파악에 큰 도움이 됩니다. 이 장에서는 pandas와 matplotlib을 사용한 기본적인 데이터 시각화 방법을 배워, 다양한 그래프 유형과 그 활용법을 익힘으로써 데이터 특성에 맞는 적절한 시각화 기법을 선택하고 적용하는 능력을 기르게 될 것입니다.
2.1 선 그래프
선 그래프는 연속적인 데이터의 변화 추이를 시각화하는 데 주로 사용됩니다. 특히 시계열 데이터를 표현할 때 효과적입니다. x축에는 보통 시간이, y축에는 측정값이 표시됩니다.
이 코드는 위니브의 일주일간 수강생 수 변화를 선 그래프로 표현합니다. 그래프의 상승과 하강을 통해 수강생 수의 변동 패턴을 쉽게 파악할 수 있습니다.
2.2 막대 그래프
막대 그래프는 범주형 데이터의 값을 비교하는 데 적합합니다. 각 범주는 개별 막대로 표현되며, 막대의 높이는 해당 범주의 값을 나타냅니다.
이 그래프를 통해 위니브의 각 과목 간 수강생 수 차이를 시각적으로 비교할 수 있습니다. 높은 막대는 많은 수강생을, 낮은 막대는 적은 수강생을 의미합니다.
2.3 히스토그램
히스토그램은 연속형 데이터의 분포를 시각화하는 데 사용됩니다. 데이터를 일정 구간으로 나누고, 각 구간에 속하는 데이터의 빈도를 막대의 높이로 표현합니다.
이 히스토그램은 위니브 수강생들의 나이 분포를 보여줍니다. 가장 높은 막대가 있는 구간이 가장 빈번한 나이 범위를 나타내며, 전체적인 모양을 통해 데이터의 대칭성이나 치우침을 파악할 수 있습니다.
2.4 산점도
산점도는 두 변수 간의 관계를 파악하는 데 사용됩니다. 각 데이터 포인트는 x축과 y축의 값에 따라 2차원 평면상에 점으로 표시됩니다.
이 산점도는 위니브 수강생들의 일일 수강 시간과 성취도 사이의 관계를 보여줍니다. 점들의 분포 패턴을 통해 두 변수 간의 상관관계를 시각적으로 확인할 수 있습니다.
2.5 박스 플롯
박스 플롯은 데이터의 분포와 이상치를 한눈에 볼 수 있게 해줍니다. 중앙값, 사분위수, 최소/최대값을 함께 표시하여 데이터의 전반적인 특성을 파악할 수 있습니다.
이 박스 플롯은 위니브의 각 과목별 시험 점수 분포를 보여줍니다. 박스의 위치와 크기를 통해 각 과목의 점수 분포 특성과 과목 간 차이를 비교할 수 있습니다.
2.6 파이 차트
파이 차트는 전체에 대한 각 부분의 비율을 원형으로 표현합니다. 각 범주의 크기를 원의 조각으로 나타내어 전체적인 구성을 한눈에 파악할 수 있게 해줍니다.
이 파이 차트는 위니브의 각 과목별 수강생 비율을 보여줍니다. 각 조각의 크기를 통해 어떤 과목에 더 많은 수강생이 있는지 쉽게 알 수 있습니다.
3. Seaborn을 활용한 시각화
Seaborn은 Python에서 사용되는 강력한 통계적 데이터 시각화 라이브러리입니다. Matplotlib을 기반으로 만들어졌지만, 더 높은 수준의 인터페이스를 제공하여 복잡한 통계 그래프를 쉽게 만들 수 있게 해줍니다. Seaborn의 주요 특징으로는 기본적으로 미적으로 스타일을 제공하며, 다변량 데이터셋을 쉽게 처리할 수 있는 기능을 갖추고 있습니다.
위니북스에서는 SeaBorn을 지원하지 않습니다. 따라서 코랩 환경에서 실행해야 합니다. 여기서는 실행된 화면을 이미지로 제공하겠습니다.
# seaborn을 사용하기 위해 라이브러리 호출
import seaborn as sns
import matplotlib.pyplot as plt
# seaborn을 사용하기 위해 라이브러리 호출
import seaborn as sns
import matplotlib.pyplot as plt
3.1 막대 그래프 (Bar Plot)
산점도는 두 연속형 변수 간의 관계를 시각화하는 그래프입니다. 이 경우 점수와 만족도의 관계를 2차원 평면에 점으로 표현합니다. 각 점의 위치는 해당 데이터의 점수(x축)와 만족도(y축) 값을 나타냅니다. 'hue' 파라미터를 사용해 과목별로 다른 색상을 적용하여 추가적인 범주형 정보를 표현하며, 'size' 파라미터로 수강생 유형에 따라 점의 크기를 다르게 표시합니다.
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 데이터 생성
np.random.seed(0)
data = {
'과목': ['Python', 'JavaScript', 'AI', 'Data Science'] * 25,
'점수': np.random.randint(60, 100, 100),
'수강생_유형': np.random.choice(['Student', 'Employed', 'Job Seeker'], 100)
}
df = pd.DataFrame(data)
plt.figure(figsize=(12, 6))
sns.barplot(x='과목', y='점수', hue='수강생_유형', data=df, ci='sd', dodge=True)
plt.title('Average Scores by Course and Student Type', fontsize=16)
plt.xlabel('Course', fontsize=12)
plt.ylabel('Average Score', fontsize=12)
plt.show()
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 데이터 생성
np.random.seed(0)
data = {
'과목': ['Python', 'JavaScript', 'AI', 'Data Science'] * 25,
'점수': np.random.randint(60, 100, 100),
'수강생_유형': np.random.choice(['Student', 'Employed', 'Job Seeker'], 100)
}
df = pd.DataFrame(data)
plt.figure(figsize=(12, 6))
sns.barplot(x='과목', y='점수', hue='수강생_유형', data=df, ci='sd', dodge=True)
plt.title('Average Scores by Course and Student Type', fontsize=16)
plt.xlabel('Course', fontsize=12)
plt.ylabel('Average Score', fontsize=12)
plt.show()
3.2 산점도 (Scatter Plot)
산점도는 두 연속형 변수 간의 관계를 시각적으로 표현하는 효과적인 그래프입니다. 각 데이터 포인트는 2차원 평면상의 점으로 표시되며, x축과 y축은 각각 다른 변수를 나타냅니다. 이 경우, x축은 점수를, y축은 만족도를 나타내어 두 변수 간의 상관관계를 직관적으로 파악할 수 있게 합니다. 'hue' 파라미터를 사용하여 과목별로 다른 색상을 적용함으로써 추가적인 범주형 변수를 시각화에 포함시킬 수 있습니다. 또한 'size' 파라미터로 수강생 유형에 따라 점의 크기를 다르게 표시하여 4차원의 정보까지 동시에 표현할 수 있습니다.
plt.figure(figsize=(12, 6))
sns.scatterplot(x='점수', y='만족도', hue='과목', size='수강생_유형',
sizes=(50, 200), data=df, alpha=0.7)
plt.title('Scores vs Satisfaction by Course', fontsize=16)
plt.xlabel('Score', fontsize=12)
plt.ylabel('Satisfaction', fontsize=12)
plt.show()
plt.figure(figsize=(12, 6))
sns.scatterplot(x='점수', y='만족도', hue='과목', size='수강생_유형',
sizes=(50, 200), data=df, alpha=0.7)
plt.title('Scores vs Satisfaction by Course', fontsize=16)
plt.xlabel('Score', fontsize=12)
plt.ylabel('Satisfaction', fontsize=12)
plt.show()
3.3 바이올린 플롯 (Violin Plot)
바이올린 플롯은 데이터의 분포를 시각적으로 표현하는 도구입니다. 이 그래프는 박스 플롯과 커널 밀도 추정을 결합한 형태로, 데이터의 전체적인 분포 모양을 보여줍니다. 각 '바이올린'의 너비는 해당 지점의 데이터 밀도를 나타내며, 중앙값, 사분위수 등의 요약 통계도 함께 표시할 수 있습니다. 'split=True' 옵션을 사용하면 하나의 바이올린을 둘로 나누어 두 그룹의 분포를 대칭적으로 비교할 수 있습니다.
plt.figure(figsize=(12, 6))
sns.violinplot(x='과목', y='점수', hue='수강생_유형', data=df, split=True)
plt.title('Score Distribution by Course and Student Type', fontsize=16)
plt.xlabel('Course', fontsize=12)
plt.ylabel('Score', fontsize=12)
plt.show()
plt.figure(figsize=(12, 6))
sns.violinplot(x='과목', y='점수', hue='수강생_유형', data=df, split=True)
plt.title('Score Distribution by Course and Student Type', fontsize=16)
plt.xlabel('Course', fontsize=12)
plt.ylabel('Score', fontsize=12)
plt.show()
3.4 히트맵 (Heatmap)
히트맵은 2차원 데이터를 색상 강도로 시각화하는 도구입니다. 매트릭스 형태로 데이터를 표현하며, 각 셀의 값은 색상으로 인코딩됩니다. 높은 값은 진한 색이나 따뜻한 색으로, 낮은 값은 연한 색이나 차가운 색으로 표시되어 데이터 패턴을 쉽게 파악할 수 있게 합니다. 'cmap' 파라미터로 다양한 색상 스키마를 적용할 수 있고, 'annot=True' 옵션으로 각 셀에 실제 값을 표시할 수 있습니다. 이 특징들로 인해 히트맵은 복잡한 데이터 관계를 직관적으로 표현하고 분석하는 데 유용하며, 다양한 분야에서 활용됩니다.
pivot_data = df.pivot_table(values='점수', index='수강생_유형', columns='과목', aggfunc='mean')
plt.figure(figsize=(12, 8))
sns.heatmap(pivot_data, annot=True, cmap='YlGnBu', fmt='.1f', linewidths=0.5)
plt.title('Average Scores by Student Type and Course', fontsize=16)
plt.xlabel('Course', fontsize=12)
plt.ylabel('Student Type', fontsize=12)
plt.show()
pivot_data = df.pivot_table(values='점수', index='수강생_유형', columns='과목', aggfunc='mean')
plt.figure(figsize=(12, 8))
sns.heatmap(pivot_data, annot=True, cmap='YlGnBu', fmt='.1f', linewidths=0.5)
plt.title('Average Scores by Student Type and Course', fontsize=16)
plt.xlabel('Course', fontsize=12)
plt.ylabel('Student Type', fontsize=12)
plt.show()
이러한 다양한 그래프를 통해 데이터의 여러 측면을 효과적으로 시각화할 수 있습니다. Seaborn은 이런 복잡한 그래프도 간단한 코드로 만들 수 있게 해주어, 데이터 분석 초보자도 쉽게 사용할 수 있습니다.