Ch06_데이터 시각화 기초 - Matplotlib을 활용한 그래프 시각화
학습목표
- 데이터 시각화의 중요성을 이해한다.
- Python 라이브러리 Matplotlib의 기본 사용법을 학습한다.
- 데이터프레임 생성 및 시각화를 통해 기본적인 그래프를 그리는 방법을 익힌다.
- 타이타닉 데이터셋과 Iris 데이터셋을 활용하여 다양한 그래프를 그려보고 데이터를 분석한다.
1. 데이터 시각화란?
데이터는 이야기이다.
데이터 시각화는 단순히 숫자나 텍스트로 표현된 데이터를 시각적인 형태(그래프, 차트, 지도 등)로 변환하여 정보를 쉽게 이해할 수 있도록 전달하는 과정이다. 즉. 시각화된 데이터는 책 속에서 핵심 문장만을 하이라이트해 독자가 단번에 이야기를 이해하도록 돕는 것이다.
1.1 데이터 시각화가 중요한 이유
(1) 복잡한 데이터를 쉽게 이해
- 복잡한 데이터를 쉽게 이해: 데이터를 숫자와 표로만 보면 정보가 많아질수록 이해가 어려워진다.
예를 들어, 1년간의 매출 데이터를 수백 줄의 숫자로 보면 무엇을 말하고자 하는지 이해하기 어렵다. - "숲을 본다" : 숫자로만 된 데이터를 보는 것은 숲 속의 나무 하나하나를 보는 것과 같다. 시각화를 하면 전체 숲의 구조(패턴, 추세)를 한눈에 볼 수 있다.
숫자:
월별 매출: 100, 150, 200, 300, 400, 450
-> 추세를 이해하기 어려움.
그래프:
선 그래프: 매출이 시간이 지날수록 증가하는 추세를 명확히 알 수 있음.
(2) 숨겨진 패턴과 관계 발견 "보이지 않는 것을 본다"
- 데이터 시각화는 데이터 간의 관계를 시각적으로 드러낸다.
- 데이터의 분포, 상관관계, 그룹 간 차이 등을 쉽게 파악할 수 있다.
데이터 시각화는 "보이지 않는 스토리를 밝혀주는 탐지기"와 같다.
- 타이타닉 생존률 분석: 성별과 생존률의 관계를 시각화하면, 여성의 생존률이 남성보다 훨씬 높다는 패턴이 드러난다.
- Iris 데이터셋: 산점도를 통해 꽃잎(Petal) 길이와 너비의 관계를 보면, 특정 꽃의 종류를 분류할 수 있는 규칙이 보인다.
(3) 의사결정을 지원
- 시각화된 데이터는 복잡한 정보를 한눈에 전달하여 빠르고 정확한 의사결정을 가능하게 한다.
- 데이터에서 통찰을 얻어 행동 계획을 세우는 데 중요한 역할을 한다.
"운전자와 내비게이션"
운전자가 목적지에 도달하려면 내비게이션의 시각적 지도를 보고 경로를 선택해야 한다.
데이터 시각화는 비즈니스나 연구에서 내비게이션 역할을 한다. 예를들어 기업이 월별 매출 추세를 선 그래프로 보면 어느 달에 매출이 가장 낮고, 어떤 조치를 취해야 하는지 판단할 수 있다.
1.2 데이터 시각화의 흥미로운 적용 사례
(1) 비즈니스 매출 분석
- 매출 데이터를 선 그래프로 표현하면, 특정 달에 매출이 급감했는지 혹은 특정 계절에 매출이 증가했는지 알 수 있다.
- 시각화 도구: 선 그래프, 히스토그램.
(2) 타이타닉 생존률 데이터
- 성별 생존률을 막대그래프로 표현하면 여성 생존률이 훨씬 높다는 패턴을 명확히 확인할 수 있다.
- 시각화 도구: 막대그래프, 파이 차트.
(3) 스포츠 경기 데이터
- 축구 선수의 골 기록을 히트맵으로 표현하면, 선수가 어떤 위치에서 가장 많은 골을 넣는지 알 수 있다.
- 시각화 도구: 히트맵.
(4) COVID-19 확진자 추세
- 국가별 확진자 데이터를 선 그래프로 표현하면, 어떤 국가에서 확산세가 높고, 언제 감소했는지 한눈에 볼 수 있다.
- 시각화 도구: 선 그래프, 영역 그래프.
1. 3 파이썬의 데이터 시각화 도구
Python은 강력한 데이터 시각화 라이브러리를 제공하며, 다양한 형태의 데이터를 효과적으로 시각화할 수 있다. 아래는 파이썬에서 널리 사용되는 주요 시각화 도구와 그 특징 및 사용법이다.
사용 목적에 따라 적합한 도구를 선택하여 데이터 시각화를 이용하면 효과적이다.
라이브러리 | 특징 | 주요그래프 | 대화형지원 | 활용도 |
Matplotlib | 기본적인 시각화, 세부 설정 가능 | 선 그래프, 막대그래프, 히스토그램 | ❌ | 기초 시각화, 커스터마이징 |
Seaborn | 통계적 시각화에 강점, 간결한 코드 | 히트맵, 박스플롯, 분포 플롯 | ❌ | 통계 분석, 데이터 탐색 |
Plotly | 대화형 그래프, 3D 지원 | 3D 플롯, 히트맵, 대화형 차트 | ✅ | 대화형 대시보드, 웹 기반 |
Bokeh | 웹과 통합된 대화형 그래프 | 대화형 라인, 막대그래프 | ✅ | 데이터 애플리케이션 |
Pandas | 데이터프레임에서 바로 사용 가능 | 선 그래프, 막대그래프 | ❌ | 간단한 데이터 탐색 |
Altair | 선언형 문법, 간결한 코드, 대화형 시각화 | 대화형 막대그래프, 산점도 | ✅ | 간단한 대화형 시각화 |
이 장에서는 대표적인 데이터 시각화 도구인 Matplotlib을 활용하여 시각화를 학습 해 본다.
2. Matplotlib 기본 사용법
2.1 Matplotlib ?
- Python에서 가장 널리 사용되는 데이터 시각화 라이브러리로, 데이터 과학 및 분석 작업에서 필수 도구로 여겨진다.
- 간단한 라인 플롯(line plot), 막대그래프(bar chart), 파이 차트(pie chart) 등 다양한 그래프를 그릴 수 있으며, 커스터마이징이 가능하다.
2.2 Matplotlib의 주요 특징
- 다양한 그래프 지원:
- 라인 플롯: 데이터를 시간 축이나 연속적인 값으로 표현.
- 막대그래프: 범주형 데이터를 비교.
- 파이 차트: 비율 데이터를 표현.
- 히스토그램: 데이터 분포 확인.
- 산점도: 두 변수 간의 관계 시각화.
- 다중 그래프: 하나의 플롯에 여러 그래프 겹쳐 그리기.
- 커스터마이징 가능:
- 축의 레이블, 제목, 범례, 색상, 스타일 등 세부 조정.
- 플롯 크기와 해상도 변경 가능.
- 다양한 확장 가능성:
- Matplotlib을 기반으로 만든 Seaborn과 같은 고급 라이브러리와 함께 사용 가능.
2. 3 Matplotlib 설치와 기본 사용법
Matplotlib — Visualization with Python
seaborn Cartopy DNA Features Viewer plotnine WCS Axes seaborn seaborn is a high level interface for drawing statistical graphics with Matplotlib. It aims to make visualization a central part of exploring and understanding complex datasets. statistical data
matplotlib.org
(1) 설치
pip install matplotlib
(2) 기본 예제: 라인 플롯
import matplotlib.pyplot as plt
# 데이터 정의
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
# 라인 플롯
plt.plot(x, y, label="Prime Numbers", color="blue", marker="o")
plt.title("Line Plot Example") # 그래프 제목
plt.xlabel("X-axis") # X축 레이블
plt.ylabel("Y-axis") # Y축 레이블
plt.legend() # 범례 표시
plt.grid(True) # 그리드 추가
plt.show() # 그래프 출력
주요 그래프
(1) 막대그래프(plt.bar)
import matplotlib.pyplot as plt
# 데이터
categories = ["A", "B", "C", "D"]
values = [10, 15, 7, 20]
# 막대그래프 생성
plt.bar(categories, values, color="skyblue")
plt.title("Bar Chart Example")
plt.xlabel("Categories")
plt.ylabel("Values")
plt.show()
(2) 파이 차트(plt.pie)
import matplotlib.pyplot as plt
# 데이터 정의
sizes = [30, 20, 50]
labels = ["A", "B", "C"]
colors = ["red", "blue", "green"]
explode = [0, 0.2, 0] # 두 번째 조각 강조
# 파이 차트 그리기
plt.pie(sizes, labels=labels, colors=colors, explode=explode,
autopct="%1.1f%%", shadow=True, startangle=90)
# 제목 추가
plt.title("Pie Chart Example")
# 차트 표시
plt.show()
(3) 히스토그램 plt.hist()
- 📊 히스토그램(Histogram)은 언제 사용하면 좋을까?
히스토그램은 연속형 데이터(수치형 데이터)의 분포를 시각적으로 이해할 때 유용하다. 특정 데이터가 어떤 값 범위에 얼마나 많이 분포되어 있는지(빈도 수)를 쉽게 파악할 수 있다. 연속성이 없는 데이터(예: 설문조사의 선택지) → 히스토그램보다는 막대그래프나 파이차트가 적절
1️⃣ 데이터의 분포 확인할 때 : 평균 근처에 점수가 몰려 있는지, 특정 구간에서 많이 나오는지 분석
2️⃣ 이상치(Outlier) 탐지 : 특정 구간에 데이터가 집중되었거나 비정상적으로 분포가 왜곡된 경우를 감지
3️⃣ 데이터의 범위 및 집중 구간 파악 : 값이 어느 범위에 주로 분포하는지 쉽게 알 수 있음
4️⃣ 두 개 이상의 그룹 비교 : 여러 그룹의 데이터가 어떻게 다르게 분포하는지 비교할 때 사용
5️⃣ 연속형 데이터의 빈도 분석 : 특정 값들이 얼마나 자주 나타나는지(빈도수)를 분석할 때 사용
"연속적인 숫자 데이터의 분포를 확인하고, 빈도 분석, 이상치 탐지, 비교 분석을 할 때 히스토그램을 사용하면 좋다!" 😊
🚀 즉, 데이터가 어떻게 퍼져 있는지 '숲을 보는 것처럼' 한눈에 파악하고 싶다면 히스토그램이 딱이야!
plt.hist(x, bins=10, range=None, density=False, cumulative=False, histtype='bar',
color=None, label=None, alpha=1.0, edgecolor=None, linewidth=None)
import matplotlib.pyplot as plt
import numpy as np
# 난수 생성
data = np.random.normal(0, 1, 1000)
# 히스토그램 생성
plt.hist(data, bins=30, color="green", alpha=0.7)
plt.title("Histogram Example")
plt.xlabel("Value")
plt.ylabel("Frequency")
plt.show()
(4) 산점도 : plt.scatter()
산점도는 두 개의 숫자 데이터가 어떻게 관련되어 있는지(상관관계)를 시각적으로 보여주는 그래프
즉, plt.scatter()는 데이터를 한 점 한 점 찍어서 관계를 보여주는 그래프야! 패턴, 상관관계, 이상치를 쉽게 찾을 수 있어! 😊
✅ 산점도를 언제 사용하면 좋을까?
1️⃣ 두 변수 간의 관계(상관관계)를 분석할 때
- 예: 키 vs 몸무게, 공부 시간 vs 성적, 광고비 vs 매출
2️⃣ 데이터가 특정 패턴을 따르는지 확인할 때
- 예: 점들이 대각선으로 몰려 있다면 강한 상관관계가 있음
3️⃣ 이상치(Outlier)를 찾을 때
- 예: 대부분의 데이터는 특정 범위에 있는데, 혼자 멀리 떨어진 점이 있으면 이상치!
plt.scatter(x, y)
- x → X축 좌표 (독립 변수)
- y → Y축 좌표 (종속 변수)
- x, y의 쌍을 점(●)으로 표시하여 데이터의 패턴을 시각적으로 확인
🎈 키와 몸무게 비교
어떤 학교에서 학생들의 키(X축)와 몸무게(Y축) 를 조사했어.
이 데이터를 산점도로 나타내면 키가 클수록 몸무게도 증가하는 패턴이 보일 거야.
import matplotlib.pyplot as plt
# 학생 키(X축)와 몸무게(Y축) 데이터
height = [150, 160, 165, 170, 175, 180, 185]
weight = [50, 55, 60, 65, 70, 80, 85]
# 산점도 그리기
plt.scatter(height, weight, color='blue', marker='^')
# 그래프 제목 및 축 레이블
plt.title("Height vs Weight")
plt.xlabel("Height (cm)")
plt.ylabel("Weight (kg)")
# 그래프 보여주기
plt.show()
✅ 사용 가능한 마커:
- 'o' → 원형 (기본값)
- '^' → 삼각형(▲)
- 's' → 네모(■)
- 'd' → 다이아몬드(◆)
import numpy as np
x = np.random.rand(50) * 100 # X축 랜덤 값 (0~100)
y = np.random.rand(50) * 100 # Y축 랜덤 값 (0~100)
colors = np.random.rand(50) # 50개 색상 지정 (0~1 사이)
plt.scatter(x, y, c=colors, cmap='viridis', s=100, alpha=0.7)
plt.colorbar() # 색상 바 추가
plt.show()
(5) 꺾은선 그래프(다중 선 그래프) - plt.plot()
🔹 언제 사용하나요?
- 여러 데이터를 한 그래프에서 비교할 때
- 예: 두 개의 회사 매출 비교, 두 과목 성적 비교 등
import matplotlib.pyplot as plt
# 데이터 정의
x = [1, 2, 3, 4, 5]
y1 = [10, 15, 20, 25, 30] # 첫 번째 데이터
y2 = [5, 10, 15, 20, 25] # 두 번째 데이터
# 다중 선 그래프
plt.plot(x, y1, label="Company A", marker="o", linestyle="-", color="blue")
plt.plot(x, y2, label="Company B", marker="s", linestyle="--", color="red")
# 그래프 제목 및 레이블
plt.title("Multi-Line Plot Example")
plt.xlabel("Time")
plt.ylabel("Revenue")
plt.legend()
# 그래프 출력
plt.show()
그래프 종류
그래프 | 사용 목적 | 함수 |
선 그래프 | 시간에 따른 변화 분석 | plt.plot() |
막대 그래프 | 범주형 데이터 비교 | plt.bar() |
파이 차트 | 비율/구성비 분석 | plt.pie() |
산점도 | 두 변수 간의 관계 분석 | plt.scatter() |
히스토그램 | 데이터의 분포(빈도) 확인 | plt.hist() |
박스 플롯 | 이상치, 데이터 범위 확인 | plt.boxplot() |
가로 막대 그래프 | 수직이 아닌 수평 비교 | plt.barh() |
다중 선 그래프 | 여러 데이터 비교 | plt.plot() 여러 개 사용 |
🔧 코랩에서 한글폰트 사용하기
!apt-get install -y fonts-nanum
!fc-cache -fv
!rm -rf ~/.cache/matplotlib
Nanum 폰트 설치 명령어
- apt-get은 Ubuntu(또는 Linux)에서 패키지를 설치, 업그레이드, 제거하는 명령어다.
- fonts-nanum은 나눔 폰트 패키지로, 한글을 지원하는 폰트이다.
- -y는 설치 확인 메시지를 자동으로 "Yes"로 처리하여 사용자 입력 없이 설치를 진행한다.
!fc-cache -fv 폰트 캐시 재생성 명령어
- fc-cache는 **폰트 캐시(font cache)**를 업데이트하는 명령어이다.
- -f는 강제로 캐시를 재생성하라는 의미다.
- -v는 verbose 모드로, 실행 과정(어떤 폰트가 캐시에 추가되었는지)을 자세히 출력한다.
!rm -rf ~/.cache/matplotlib : matplotlib 캐시 삭제 명령어
- rm은 파일이나 디렉토리를 삭제하는 명령어이다.
- -r은 디렉토리 내부의 모든 파일을 삭제하라는 의미다.
- -f는 강제 삭제 옵션이다.
- ~/.cache/matplotlib는 matplotlib의 캐시 폴더 경로다.
결과:
matplotlib 캐시를 삭제함으로써, 새로 설치한 한글 폰트가 matplotlib에서 제대로 적용될 수 있도록 한다.
2. 런타임 재시작 : 설치 후, 코랩의 런타임을 꼭 재시작해야 합니다. 메뉴에서 런타임 -> 런타임 다시 시작을 클릭합니다.
3. 폰트 설정 : matplotlib에서 사용할 폰트를 나눔 폰트로 설정합니다.
import matplotlib.pyplot as plt
plt.rc('font', family='NanumBarunGothic') # 또는 'NanumGothic' 사용 가능
plt.rcParams['axes.unicode_minus'] = False # 마이너스 기호가 깨지지 않도록 설정
이제 한글이 포함된 그래프를 그릴 수 있습니다.
문제가 발생할 경우 확인 사항
- 폰트 설치 확인: !apt-get install fonts-nanum을 제대로 실행했는지 확인.
- 음수 기호 깨짐 방지: plt.rcParams['axes.unicode_minus'] = False를 추가.
- 폰트 설정 확인: rc('font', family='NanumGothic')로 폰트를 Nanum Gothic으로 설
3. 공공데이터로 시각화 실습
3.1 부산의 월별 평균 기온을 시각화
부산의 12개월 평균 기온 데이터를 사용하여 선 그래프를 생성합니다. 각 월의 평균 기온은 부산광역시 공식 웹사이트의 정보를 기반으로 하였습니다. 그래프를 통해 부산의 월별 기온 변화를 시각적으로 확인할 수 있습니다. 예를 들어, 1월의 평균 기온은 약 3.6°C로 가장 낮고, 8월에는 약 26.1°C로 가장 높습니다. 이러한 시각화는 기후 패턴을 이해하는 데 도움이 됩니다.
import matplotlib.pyplot as plt
# 월별 평균 기온 데이터 (출처: 부산광역시 공식 웹사이트)
months = ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월']
avg_temperatures = [3.6, 5.1, 8.9, 14.1, 18.4, 21.9, 25.6, 26.1, 21.8, 17.0, 11.0, 5.9]
# 선 그래프 그리기
plt.plot(months, avg_temperatures, marker='o', linestyle='-', color='blue')
# 그래프 제목 및 축 레이블 추가
plt.title('부산의 월별 평균 기온')
plt.xlabel('월')
plt.ylabel('평균 기온 (°C)')
# 그리드 추가
plt.grid(True)
# 그래프 표시
plt.show()
3.2 타이타닉 생존률 데이터 분석 및 시각화:
🛳️ 타이타닉호의 이야기
1912년 4월 10일, 초호화 여객선 타이타닉호가 영국에서 뉴욕으로 항해를 시작했어. 하지만 모두가 알고 있는 것처럼, 4월 15일 빙산과 충돌하며 침몰했지.
타이타닉호에는 약 2,200명의 승객과 승무원이 탑승했는데, 그중 약 1,500명이 희생되고 700여 명만 살아남았어.
📊 타이타닉 데이터셋이란?
타이타닉 데이터셋은 그날 배에 탑승한 승객들의 정보를 담고 있어. 이 데이터를 분석하면 누가 생존했는지, 누가 희생되었는지에 영향을 준 요소를 알 수 있어!
데이터셋 주요 정보
컬럼명 | 설명 | 값 |
Survived | 생존 여부 | 0: 희생됨, 1: 생존 |
Pclass | 좌석 등급 | 1: 1등석 (고급), 2: 2등석, 3: 3등석 |
Sex | 성별 | Male: 남자, Female: 여자 |
Age | 나이 | 승객의 나이 (숫자 값, 예: 5, 25, 45 등) |
Fare | 요금 | 승객이 지불한 금액 (숫자 값, 예: 7.25, 71.83) |
Embarked | 탑승 항구 | C: 셸부르, Q: 퀸스타운, S: 사우샘프턴 |
import pandas as pd
import matplotlib.pyplot as plt
# 타이타닉 데이터셋 로드
url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
titanic = pd.read_csv(url)
print(titanic.head())
📌 생존자와 희생자 비율
- 원형 그래프 (Pie Chart) 를 그려 생존률과 희생률의 비율을 시각적으로 표시한다.
import pandas as pd
import matplotlib.pyplot as plt
# 타이타닉 데이터셋 로드
url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
titanic = pd.read_csv(url)
print(titanic.head())
# 생존 여부 비율
survival_counts = titanic['Survived'].value_counts()
labels = ['Died', 'Survived']
# 원형 그래프 그리기
plt.pie(survival_counts, labels=labels, autopct='%1.1f%%', colors=['red', 'blue'])
plt.title('Survival Rate on Titanic')
plt.show()
- titanic['Survived']: 데이터셋에서 생존 여부(Survived) 컬럼만 선택.
- value_counts(): 각 값(0: 희생됨, 1: 생존)의 개수를 계산.
- 결과 예시:
- 0: 549명 (희생)
- 1: 342명 (생존)
- labels: 0과 1에 대해 사람이 알아보기 쉽게 이름을 부여.
🎯 "영화 타이타닉처럼 실제로 여성과 어린이가 더 많이 구조되었을까?"
🔍 분석 Point
- 성별 생존률 분석
- 남성과 여성 중 누가 더 많이 생존했는지 확인한다.
- 예상: 영화처럼 여성의 생존률이 높을 가능성이 크다.
- 나이에 따른 생존률 분석
- 어린이(예: 16세 이하)의 생존률이 어른보다 높은지 확인한다.
- 예상: 어린이들이 구조 우선순위에 포함되었을 가능성이 있다.
1️⃣ 성별 생존률 분석
import pandas as pd
import matplotlib.pyplot as plt
# 타이타닉 데이터셋 로드
url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
titanic = pd.read_csv(url)
# 성별 생존률 계산
gender_survival = titanic.groupby('Sex')['Survived'].mean()
# 성별 생존률 시각화
gender_survival.plot(kind='bar', color=['blue', 'pink'], alpha=0.7)
plt.title('Survival Rate by Gender')
plt.xlabel('Gender')
plt.ylabel('Survival Rate')
plt.xticks(rotation=0)
plt.show()
학습 포인트
- 데이터 그룹화와 평균 계산:
- 데이터셋을 성별로 그룹화: titanic.groupby('Sex')
- 생존 여부(Survived) 열만 선택: ['Survived']
- 각 그룹의 평균(생존률) 계산: .mean()
- 막대그래프 시각화:
- bar를 사용해 생존률 데이터를 시각적으로 이해 가능.
- gender_survival.plot(kind='bar')와 plt.bar()의 차이
- gender_survival.plot(kind='bar'):
- pandas의 데이터프레임/시리즈 내장 플롯 기능을 사용.
- 간단하게 데이터프레임 또는 시리즈 데이터를 바로 그래프로 시각화 가능.
- gender_survival이 시리즈 데이터라면, 추가 데이터 가공 없이 바로 막대 그래프를 생성 가능.
- gender_survival.plot(kind='bar'):
2️⃣ 나이에 따른 생존률 분석
이 코드는 타이타닉 데이터셋에서 나이(Age)가 16세 이하인 어린이와 그렇지 않은 성인의 생존률을 계산하는 과정이다.
# 어린이(16세 이하)와 성인의 생존률 비교
titanic['Child'] = titanic['Age'] <= 16 # 나이가 16세 이하인 경우 True
age_survival = titanic.groupby('Child')['Survived'].mean()
# 나이 기반 생존률 시각화
age_survival.index = ['Adult', 'Child'] # True/False를 Adult/Child로 변환
age_survival.plot(kind='bar', color=['green', 'orange'], alpha=0.7)
plt.title('Survival Rate by Age Group')
plt.xlabel('Age Group')
plt.ylabel('Survival Rate')
plt.xticks(rotation=0)
plt.show()
- titanic['Age'] <= 16:
- 나이(Age)가 16세 이하인 경우 True를 반환.
- 나이가 16세보다 크면 False를 반환.
- titanic['Child']: 새로운 열 Child를 데
분석 결과
- 여성이 남성보다 훨씬 높은 생존률을 보임.
- 이는 영화 타이타닉의 "여성 우선 구조" 장면과 일치.
- **어린이(16세 이하)**가 성인보다 생존률이 높음.
- 구조 우선순위에서 "어린이와 여성"이 포함되었음을 데이터로 확인 가능.
🚢 "좌석 등급(Pclass)이 생존에 영향을 미쳤을까?"
타이타닉 데이터셋을 분석하면, 좌석 등급(1등석, 2등석, 3등석)이 생존에 얼마나 영향을 미쳤는지 알 수 있어. 아래는 이 분석을 위한 방법과 결과를 확인하는 방법이야.
📊 분석 Point
- 타이타닉 데이터셋에서 Pclass(좌석 등급)를 기준으로 데이터를 나눈다.
- 1등석(Pclass=1): 고급 좌석.
- 2등석(Pclass=2): 중급 좌석.
- 3등석(Pclass=3): 저렴한 좌석.
- 각 좌석 등급별 생존률을 계산한다.
- 생존 여부(Survived): 0 → 희생, 1 → 생존.
- 그래프로 각 등급의 생존률을 시각화하여 비교한다.
📋 코드: 좌석 등급별 생존률 분석
import pandas as pd
import matplotlib.pyplot as plt
# 타이타닉 데이터셋 로드
url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
titanic = pd.read_csv(url)
# 좌석 등급별 생존률 계산
class_survival = titanic.groupby('Pclass')['Survived'].mean()
print("Survival Rate by Pclass:\n", class_survival)
# 막대 그래프 그리기
ax = class_survival.plot(kind='bar', color=['gold', 'silver', 'brown'], alpha=0.7)
plt.title('Survival Rate by Pclass')
plt.xlabel('Pclass (Seat Class)')
plt.ylabel('Survival Rate')
plt.grid(axis='y')
plt.xticks(rotation=0)
# 그래프 출력
plt.show()
객실 등급별 생존률 출력:
객실 등급별 생존률:
Pclass
1 0.629630
2 0.472826
3 0.242363
Name: Survived, dtype: float64
- 1등급 객실 승객의 생존률이 가장 높고, 3등급 객실 승객의 생존률이 가장 낮다.
- 이는 사회적 계층과 생존률 간의 관계를 나타낼 수 있다.
3.3 Iris 데이터셋 시각화 : Sepal 길이와 너비의 산점도 시각화
🌸 Iris 데이터셋 시각화: Sepal 길이와 너비 산점도
Iris 데이터셋은 머신러닝이나 데이터 분석 입문자들에게 매우 인기 있는 데이터셋이야. **꽃잎(Petal)**과 **꽃받침(Sepal)**의 길이와 너비 정보를 바탕으로 **붓꽃(Iris)**의 품종을 분류하는 데이터야.
1️⃣ Iris 데이터셋이란?
- 붓꽃 데이터셋은 세 가지 붓꽃 품종(Setosa, Versicolor, Virginica)의 특징을 담고 있어.
- 각 품종의 꽃은 **꽃받침(Sepal)**과 **꽃잎(Petal)**의 길이와 너비가 다르기 때문에, 데이터를 시각화하면 품종별 패턴이 보이게 돼.
📋 데이터 구성:
특징(Feature) | 설명 | 단위 |
SepalLengthCm | 꽃받침(Sepal) 길이 | cm |
SepalWidthCm | 꽃받침(Sepal) 너비 | cm |
PetalLengthCm | 꽃잎(Petal) 길이 | cm |
PetalWidthCm | 꽃잎(Petal) 너비 | cm |
Species | 붓꽃의 품종 (Setosa, Versicolor, Virginica) | - |
2️⃣ 꽃받침 길이와 너비는 품종별로 어떻게 다를까?
- Iris 데이터셋의 꽃잎(Petal) 길이와 너비를 산점도로 시각화
from sklearn.datasets import load_iris
import pandas as pd
import matplotlib.pyplot as plt
# Iris 데이터셋 로드
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df["species"] = iris.target
# 산점도 (Petal length vs Petal width)
plt.scatter(df.iloc[:, 2], df.iloc[:, 3], c=df["species"], cmap="viridis", alpha=0.7)
plt.title("Petal Length vs Width")
plt.xlabel("Petal Length (cm)")
plt.ylabel("Petal Width (cm)")
plt.colorbar(label="Species")
plt.show()
- df["species"] = iris.target: 품종 데이터를 추가.
- iris.target은 숫자로 구성된 품종 정보:
- 0: Setosa
- 1: Versicolor
- 2: Virginica
- plt.scatter(): 산점도를 그리는 함수.
- df.iloc[:, 2]: Petal Length (3번째 열).
- df.iloc[:, 3]: Petal Width (4번째 열).
- c=df["species"]: 각 점의 색을 품종(species) 값에 따라 다르게 설정.
- cmap="viridis": 색상 맵(컬러맵)을 설정. viridis는 품종별로 구분되는 색상 제공.
- alpha=0.7: 점의 투명도를 설정.
from sklearn.datasets import load_iris
import pandas as pd
import matplotlib.pyplot as plt
# 1. Iris 데이터셋 로드
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
# Species 열 추가 (종: 0, 1, 2)
df["species"] = iris.target
# 2. 산점도 시각화
plt.figure(figsize=(8, 6))
# 각 종별로 산점도를 생성
species_names = iris.target_names
colors = ['red', 'blue', 'green']
for species, color in zip(range(3), colors):
species_data = df[df["species"] == species]
plt.scatter(
species_data[iris.feature_names[0]], # Sepal Length
species_data[iris.feature_names[1]], # Sepal Width
label=species_names[species],
color=color,
alpha=0.7,
edgecolor="black"
)
# 3. 그래프 설정
plt.title("Sepal Length vs Sepal Width by Species")
plt.xlabel("Sepal Length (cm)")
plt.ylabel("Sepal Width (cm)")
plt.legend(title="Species")
plt.grid(alpha=0.3)
plt.show()
- 데이터 로드 및 데이터프레임 생성:
- load_iris(): sklearn의 Iris 데이터셋을 로드.
- pd.DataFrame: 데이터를 데이터프레임 형태로 변환하고 species(종) 정보를 추가.
- 산점도 생성:
- plt.scatter()를 사용하여 산점도 그리기.
- 각 species별 데이터포인트를 필터링하여 다른 색상으로 시각화.
- 그래프 설정:
- title, xlabel, ylabel로 그래프 제목과 축 이름 추가.
- legend로 각 종별로 범례를 표시.
- grid(alpha=0.3)로 약한 그리드 추가.
- Setosa는 Sepal 길이와 너비에서 다른 두 종과 명확히 구분됨.
- Versicolor와 Virginica는 약간 겹치지만, 분포에 차이가 있음.
과제
- 자신만의 데이터프레임을 생성하여 막대그래프와 파이 차트를 그려보세요.
import pandas as pd
import matplotlib.pyplot as plt
# 1. 데이터프레임 생성
data = {
"Category": ["A", "B", "C", "D", "E"],
"Values": [10, 15, 20, 25, 30]
}
df = pd.DataFrame(data)
print("데이터프레임:")
print(df)
# 2. 막대그래프 그리기
plt.figure(figsize=(8, 6))
plt.bar(df["Category"], df["Values"], color="skyblue", edgecolor="black")
plt.title("Bar Chart Example")
plt.xlabel("Category")
plt.ylabel("Values")
plt.grid(axis="y", linestyle="--", alpha=0.7)
plt.show()
# 3. 파이 차트 그리기
plt.figure(figsize=(8, 6))
plt.pie(df["Values"], labels=df["Category"], autopct="%1.1f%%", startangle=90, colors=["red", "green", "blue", "orange", "purple"])
plt.title("Pie Chart Example")
plt.show()
2. Superstore Sales 데이터셋
가상의 온라인 스토어에서 판매된 제품, 카테고리, 판매량, 이익 등을 포함.
- 그룹화 및 집계(카테고리별 평균 판매량, 총 이익 등).
- 특정 조건 필터링(특정 제품의 판매량 확인).
- 바 차트와 선 그래프 시각화를 해 보자.
파일다운로드 Superstore Sales Dataset - Kaggle : https://www.kaggle.com/datasets/raphaelabayomi/superstore-sales-dataset
SuperStore Sales Dataset
www.kaggle.com
데이터셋 내용
- 가상의 슈퍼스토어에서 발생한 판매 데이터를 포함.
- 데이터는 고객 주문, 판매 지역, 제품 범주, 수익, 이익 등을 다룸.
- 사용 목적:
- 비즈니스 인텔리전스(BI) 분석.
- 데이터 시각화 연습 (예: Tableau, Power BI, Python).
- 데이터 모델링 및 예측.
주요 컬럼
- Order ID: 주문 ID.
- Product Name: 제품 이름.
- Category: 제품 카테고리 (예: Office Supplies, Furniture, Technology).
- Region: 판매 지역.
- Sales: 매출.
- Profit: 이익.
- Quantity: 판매된 제품 수량.
import pandas as pd
# CSV 파일 읽기
file_path = "path_to_your_file/Sample - Superstore.csv"
df = pd.read_csv(file_path)
# 데이터 확인
print("데이터프레임 첫 5개 행:")
print(df.head())
# 주요 통계 정보
print("\n데이터 요약 정보:")
print(df.describe())
# 특정 열 분석 예제
print("\n카테고리별 평균 매출:")
print(df.groupby("Category")["Sales"].mean())
- 카테고리별 평균 판매량, 지역별 총 이익 등 집계 데이터를 도출.
import pandas as pd
# 데이터 로드
df = pd.read_csv("Superstore.csv")
# 카테고리별 평균 판매량
category_sales = df.groupby("Category")["Sales"].mean()
print("카테고리별 평균 판매량:\n", category_sales)
# 지역별 총 이익
region_profit = df.groupby("Region")["Profit"].sum()
print("\n지역별 총 이익:\n", region_profit)
- 특정 조건을 만족하는 데이터를 필터링하여 세부 분석 수행.
# 특정 제품(Product Name)이 포함된 데이터 필터링
specific_product = df[df["Product Name"] == "Staples"]
print("\nStaples 제품 판매 데이터:\n", specific_product)
# 매출이 $100 이상인 데이터 필터링
high_sales = df[df["Sales"] > 100]
print("\n매출 $100 이상 데이터:\n", high_sales)
- 카테고리별 평균 판매량을 바 차트로 시각화.
import matplotlib.pyplot as plt
# 카테고리별 평균 판매량 바 차트
category_sales.plot(kind="bar", color="skyblue", edgecolor="black")
plt.title("Average Sales by Category")
plt.xlabel("Category")
plt.ylabel("Average Sales")
plt.grid(axis="y", linestyle="--", alpha=0.7)
plt.show()
# 월별 총 매출 선 그래프 (날짜 처리)
df["Order Date"] = pd.to_datetime(df["Order Date"])
df["Month"] = df["Order Date"].dt.to_period("M")
monthly_sales = df.groupby("Month")["Sales"].sum()
monthly_sales.plot(kind="line", marker="o", color="green")
plt.title("Monthly Total Sales")
plt.xlabel("Month")
plt.ylabel("Total Sales")
plt.grid(alpha=0.3)
plt.show()