Plotly·Bokeh·Altair·Folium 예제는 실행 폴더에 HTML 파일을 만들고 브라우저로 확인합니다. WordCloud는 C:/Windows/Fonts/malgun.ttf를 사용합니다. GeoPandas 설치가 실패하면 먼저 py -3.13 -m pip install --upgrade pip setuptools wheel을 실행한 뒤 다시 설치합니다.
1
Matplotlib
정적 그래프의 기본이 되는 대표 라이브러리
01
월별 매출 꺾은선그래프
출력·활용 설명: 월을 x축, 매출을 y축에 배치한 기본 시계열 그래프이다. marker는 실제 관측 지점을 보여 주고, grid는 값의 변화를 읽기 쉽게 한다.
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
months = ["1월", "2월", "3월", "4월", "5월", "6월"]
sales = [120, 135, 128, 150, 170, 190]
plt.figure(figsize=(8, 4.8))
plt.plot(months, sales, marker="o", linewidth=2)
plt.title("월별 매출 변화")
plt.xlabel("월")
plt.ylabel("매출(만원)")
plt.grid(True, linestyle="--", alpha=0.4)
plt.tight_layout()
plt.show()
02
과목별 평균 막대그래프
출력·활용 설명: 범주형 자료를 비교하는 막대그래프이다. 각 막대 위에 값을 직접 표시하여 정확한 점수도 확인할 수 있다.
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
subjects = ["국어", "수학", "영어", "과학", "정보"]
scores = [82, 91, 86, 94, 96]
plt.figure(figsize=(8, 4.8))
bars = plt.bar(subjects, scores, edgecolor="black")
plt.title("과목별 평균 점수")
plt.xlabel("과목")
plt.ylabel("평균 점수")
plt.ylim(0, 100)
for bar, score in zip(bars, scores):
plt.text(bar.get_x() + bar.get_width()/2, score + 1, str(score),
ha="center", va="bottom")
plt.tight_layout()
plt.show()
03
키와 몸무게 산점도
출력·활용 설명: 두 수치형 변수의 관계를 점으로 표현한다. 오른쪽 위로 점이 모이면 두 변수 사이에 양의 관계가 있음을 시각적으로 추정할 수 있다.
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
heights = [150, 155, 160, 162, 168, 170, 174, 178, 181, 185]
weights = [45, 49, 52, 55, 61, 64, 68, 72, 77, 82]
plt.figure(figsize=(7, 5))
plt.scatter(heights, weights, s=70, alpha=0.75)
plt.title("키와 몸무게의 관계")
plt.xlabel("키(cm)")
plt.ylabel("몸무게(kg)")
plt.grid(True, linestyle=":", alpha=0.5)
plt.tight_layout()
plt.show()
04
시험 점수 히스토그램
출력·활용 설명: 연속형 자료를 일정 구간으로 나누어 빈도를 나타낸다. 점수가 어느 구간에 집중되어 있는지 빠르게 확인할 수 있다.
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
scores = [55, 62, 68, 70, 72, 75, 77, 78, 80, 82, 84, 85,
86, 88, 89, 90, 91, 92, 94, 95, 96, 98]
plt.figure(figsize=(8, 4.8))
plt.hist(scores, bins=8, edgecolor="black", alpha=0.8)
plt.title("시험 점수 분포")
plt.xlabel("점수")
plt.ylabel("학생 수")
plt.tight_layout()
plt.show()
05
동아리 학생 수 원그래프
출력·활용 설명: 전체에서 각 범주가 차지하는 비율을 원의 부채꼴로 표현한다. axis('equal')은 원이 찌그러지지 않도록 한다.
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
clubs = ["과학", "코딩", "천문", "로봇", "독서"]
students = [28, 35, 18, 24, 15]
plt.figure(figsize=(7, 6))
plt.pie(students, labels=clubs, autopct="%1.1f%%", startangle=90)
plt.title("동아리별 학생 비율")
plt.axis("equal")
plt.tight_layout()
plt.show()
06
두 지역 기온 비교
출력·활용 설명: 같은 x축을 공유하는 두 자료를 한 그래프에 겹쳐 비교한다. 범례로 각 선의 의미를 구분한다.
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
days = ["월", "화", "수", "목", "금", "토", "일"]
seoul = [25, 27, 28, 29, 31, 30, 28]
busan = [24, 25, 26, 27, 28, 28, 27]
plt.figure(figsize=(8, 4.8))
plt.plot(days, seoul, marker="o", label="서울")
plt.plot(days, busan, marker="s", label="부산")
plt.title("지역별 주간 기온")
plt.xlabel("요일")
plt.ylabel("기온(℃)")
plt.legend()
plt.grid(True, alpha=0.35)
plt.tight_layout()
plt.show()
07
누적 막대그래프
출력·활용 설명: bottom 매개변수로 두 막대를 위아래로 쌓는다. 전체 규모와 각 하위 집단의 구성 비율을 동시에 비교할 수 있다.
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
grades = ["1학년", "2학년", "3학년"]
boys = [70, 66, 62]
girls = [58, 64, 69]
plt.figure(figsize=(7, 5))
plt.bar(grades, boys, label="남학생")
plt.bar(grades, girls, bottom=boys, label="여학생")
plt.title("학년별 학생 구성")
plt.xlabel("학년")
plt.ylabel("학생 수")
plt.legend()
plt.tight_layout()
plt.show()
08
상자그림
출력·활용 설명: 중앙값, 사분위 범위, 최솟값과 최댓값을 한 번에 비교한다. 평균만으로는 알기 어려운 분포 차이를 확인할 수 있다.
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
class_a = [68, 72, 75, 77, 80, 83, 85, 88, 91, 95]
class_b = [60, 65, 70, 74, 79, 84, 88, 93, 97, 100]
plt.figure(figsize=(7, 5))
plt.boxplot([class_a, class_b], tick_labels=["A반", "B반"])
plt.title("반별 점수 분포")
plt.ylabel("점수")
plt.grid(True, axis="y", alpha=0.3)
plt.tight_layout()
plt.show()
09
오차막대 그래프
출력·활용 설명: 평균값과 함께 측정 불확실성 또는 표준편차를 표시한다. capsize는 오차막대 끝의 가로선을 조절한다.
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
experiments = ["실험 A", "실험 B", "실험 C", "실험 D"]
means = [10.2, 12.1, 9.8, 13.4]
errors = [0.5, 0.8, 0.4, 0.7]
plt.figure(figsize=(7, 5))
plt.errorbar(experiments, means, yerr=errors, fmt="o-", capsize=5)
plt.title("실험 평균과 오차")
plt.xlabel("실험")
plt.ylabel("측정값")
plt.grid(True, alpha=0.35)
plt.tight_layout()
plt.show()
10
2행 2열 복합 그래프
출력·활용 설명: subplots로 여러 그래프를 한 화면에 배치한다. 동일한 자료라도 표현 방식에 따라 강조되는 정보가 달라짐을 비교할 수 있다.
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
x = [1, 2, 3, 4, 5]
y = [2, 5, 4, 8, 7]
fig, axes = plt.subplots(2, 2, figsize=(10, 7))
axes[0, 0].plot(x, y, marker="o")
axes[0, 0].set_title("꺾은선")
axes[0, 1].bar(x, y)
axes[0, 1].set_title("막대")
axes[1, 0].scatter(x, y)
axes[1, 0].set_title("산점도")
axes[1, 1].hist(y, bins=5, edgecolor="black")
axes[1, 1].set_title("히스토그램")
fig.suptitle("동일 자료의 다양한 표현")
fig.tight_layout()
plt.show()
2
Seaborn
통계 분포와 관계를 보기 좋게 표현하는 라이브러리
01
범주별 막대그래프
출력·활용 설명: DataFrame의 열 이름을 x와 y에 지정하여 통계 그래프를 만든다. errorbar=None은 작은 예제에서 불필요한 신뢰구간 계산을 생략한다.
import pandas as pd
import seaborn as sns
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
sns.set_theme(style="whitegrid")
df = pd.DataFrame({
"과목": ["국어", "수학", "영어", "과학", "정보"],
"평균": [82, 91, 86, 94, 96]
})
sns.barplot(data=df, x="과목", y="평균", errorbar=None)
plt.title("과목별 평균")
plt.ylim(0, 100)
plt.tight_layout()
plt.show()
02
반별 점수 상자그림
출력·활용 설명: 범주별 분포를 상자그림으로 비교한다. 중앙선은 중앙값이며 상자 길이는 가운데 50% 자료의 범위를 뜻한다.
import pandas as pd
import seaborn as sns
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
sns.set_theme(style="whitegrid")
df = pd.DataFrame({
"반": ["A"] * 8 + ["B"] * 8,
"점수": [70, 75, 78, 80, 82, 85, 90, 94,
65, 72, 76, 81, 86, 89, 93, 98]
})
sns.boxplot(data=df, x="반", y="점수")
plt.title("반별 점수 분포")
plt.tight_layout()
plt.show()
03
점수 바이올린플롯
출력·활용 설명: 상자그림의 요약 통계와 분포의 밀도 형태를 함께 보여 준다. 넓은 부분일수록 해당 값 주변에 자료가 많이 모여 있다.
import pandas as pd
import seaborn as sns
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
sns.set_theme(style="whitegrid")
df = pd.DataFrame({
"수준": ["기초"] * 10 + ["심화"] * 10,
"점수": [55, 60, 62, 66, 68, 70, 72, 75, 77, 80,
70, 74, 78, 82, 84, 86, 90, 92, 95, 98]
})
sns.violinplot(data=df, x="수준", y="점수", inner="quart")
plt.title("학습 수준별 점수 밀도")
plt.tight_layout()
plt.show()
04
공부 시간과 점수 회귀선
출력·활용 설명: 산점도 위에 선형 회귀선을 추가한다. ci=None은 신뢰구간 음영을 생략하여 핵심 관계를 단순하게 보여 준다.
import pandas as pd
import seaborn as sns
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
sns.set_theme(style="whitegrid")
df = pd.DataFrame({
"공부시간": [1, 2, 2.5, 3, 4, 4.5, 5, 6, 7, 8],
"점수": [55, 60, 63, 67, 72, 76, 80, 85, 90, 94]
})
sns.regplot(data=df, x="공부시간", y="점수", ci=None)
plt.title("공부 시간과 점수")
plt.tight_layout()
plt.show()
05
과목 상관관계 히트맵
출력·활용 설명: 상관계수 행렬을 색과 숫자로 표시한다. 1에 가까울수록 같은 방향의 강한 선형 관계를 뜻한다.
import pandas as pd
import seaborn as sns
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
sns.set_theme(style="whitegrid")
df = pd.DataFrame({
"수학": [70, 75, 80, 85, 90, 95],
"과학": [68, 74, 82, 84, 91, 96],
"정보": [72, 78, 81, 88, 93, 97]
})
corr = df.corr(numeric_only=True)
sns.heatmap(corr, annot=True, cmap="Blues", vmin=-1, vmax=1)
plt.title("과목별 상관계수")
plt.tight_layout()
plt.show()
06
요일별 이용량 선그래프
출력·활용 설명: 범주 순서를 그대로 유지하면서 변화 추세를 표현한다. marker를 사용하면 각 날짜의 실제 값을 쉽게 구분할 수 있다.
import pandas as pd
import seaborn as sns
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
sns.set_theme(style="whitegrid")
df = pd.DataFrame({
"요일": ["월", "화", "수", "목", "금", "토", "일"],
"이용량": [120, 135, 128, 150, 170, 210, 195]
})
sns.lineplot(data=df, x="요일", y="이용량", marker="o")
plt.title("요일별 도서관 이용량")
plt.tight_layout()
plt.show()
07
그룹별 산점도
출력·활용 설명: hue에 범주형 열을 지정하면 그룹별로 점을 구분할 수 있다. 하나의 그래프에서 관계와 집단 차이를 함께 본다.
import pandas as pd
import seaborn as sns
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
sns.set_theme(style="whitegrid")
df = pd.DataFrame({
"키": [155, 160, 165, 170, 175, 158, 163, 168, 173, 178],
"몸무게": [48, 52, 57, 63, 69, 50, 54, 60, 66, 73],
"그룹": ["A"] * 5 + ["B"] * 5
})
sns.scatterplot(data=df, x="키", y="몸무게", hue="그룹", s=90)
plt.title("그룹별 키와 몸무게")
plt.tight_layout()
plt.show()
08
빈도 카운트플롯
출력·활용 설명: 별도의 집계 없이 범주별 등장 횟수를 자동 계산한다. order로 x축 범주의 표시 순서를 고정한다.
import pandas as pd
import seaborn as sns
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
sns.set_theme(style="whitegrid")
df = pd.DataFrame({
"선호과목": ["정보", "과학", "정보", "수학", "과학",
"정보", "영어", "수학", "정보", "과학"]
})
sns.countplot(data=df, x="선호과목", order=["국어", "수학", "영어", "과학", "정보"])
plt.title("선호 과목 응답 수")
plt.tight_layout()
plt.show()
09
쌍그래프
출력·활용 설명: 여러 수치형 변수의 모든 조합에 대한 산점도와 각 변수의 분포를 한 번에 생성한다.
import pandas as pd
import seaborn as sns
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
sns.set_theme(style="whitegrid")
df = pd.DataFrame({
"수학": [70, 75, 80, 85, 90, 95],
"과학": [68, 74, 82, 84, 91, 96],
"정보": [72, 78, 81, 88, 93, 97]
})
sns.pairplot(df, diag_kind="hist")
plt.show()
10
피벗 히트맵
출력·활용 설명: 긴 형태의 자료를 피벗하여 행과 열의 조합별 값을 색으로 표현한다. 시간대와 요일의 패턴을 동시에 파악할 수 있다.
import pandas as pd
import seaborn as sns
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
sns.set_theme(style="whitegrid")
df = pd.DataFrame({
"요일": ["월", "월", "화", "화", "수", "수"],
"시간대": ["오전", "오후"] * 3,
"이용자": [30, 45, 35, 50, 40, 60]
})
table = df.pivot(index="시간대", columns="요일", values="이용자")
sns.heatmap(table, annot=True, fmt=".0f", cmap="YlGnBu")
plt.title("요일·시간대별 이용자")
plt.tight_layout()
plt.show()
3
Pandas
DataFrame에서 바로 그래프를 만드는 분석 중심 도구
01
Series 꺾은선그래프
출력·활용 설명: Series의 인덱스가 자동으로 x축이 되고 값이 y축이 된다. 간단한 자료는 별도의 Matplotlib 호출을 최소화할 수 있다.
import pandas as pd
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
s = pd.Series([120, 135, 128, 150, 170],
index=["1월", "2월", "3월", "4월", "5월"])
ax = s.plot(kind="line", marker="o", title="월별 매출")
ax.set_xlabel("월")
ax.set_ylabel("매출(만원)")
plt.tight_layout()
plt.show()
02
DataFrame 막대그래프
출력·활용 설명: 여러 수치 열을 그룹 막대로 자동 배치한다. DataFrame의 열 이름은 범례가 되고 인덱스는 x축 범주가 된다.
import pandas as pd
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
df = pd.DataFrame({
"국어": [80, 85, 90],
"수학": [88, 92, 95]
}, index=["1반", "2반", "3반"])
ax = df.plot(kind="bar", title="반별 과목 평균", rot=0)
ax.set_ylabel("점수")
plt.tight_layout()
plt.show()
03
가로 막대그래프
출력·활용 설명: 범주 이름이 길거나 항목 수가 많을 때 가로 막대가 읽기 쉽다. set_index로 지역을 축 레이블로 사용한다.
import pandas as pd
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
df = pd.DataFrame({
"지역": ["서울", "부산", "대전", "광주", "전주"],
"인구": [950, 330, 145, 140, 65]
}).set_index("지역")
df["인구"].plot(kind="barh", title="지역별 인구(만 명)")
plt.xlabel("인구(만 명)")
plt.tight_layout()
plt.show()
04
산점도
출력·활용 설명: plot.scatter는 두 열을 직접 지정해 관계를 나타낸다. 데이터 전처리와 시각화를 같은 DataFrame 흐름 안에서 수행할 수 있다.
import pandas as pd
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
df = pd.DataFrame({
"공부시간": [1, 2, 3, 4, 5, 6, 7],
"점수": [55, 61, 68, 74, 82, 88, 94]
})
df.plot.scatter(x="공부시간", y="점수", s=70,
title="공부 시간과 점수")
plt.tight_layout()
plt.show()
05
히스토그램
출력·활용 설명: Series에서 바로 히스토그램을 만든다. bins는 구간 수이며 값이 클수록 분포를 더 세밀하게 나눈다.
import pandas as pd
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
df = pd.DataFrame({
"점수": [55, 62, 68, 70, 72, 75, 77, 80, 82, 84,
85, 88, 90, 92, 94, 96, 98]
})
df["점수"].plot(kind="hist", bins=7, edgecolor="black",
title="점수 분포")
plt.xlabel("점수")
plt.tight_layout()
plt.show()
06
영역그래프
출력·활용 설명: 시간에 따른 구성량을 면적으로 누적 표현한다. 전체 증가와 에너지원별 기여를 함께 볼 수 있다.
import pandas as pd
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
df = pd.DataFrame({
"태양광": [10, 15, 22, 30, 38],
"풍력": [8, 12, 16, 20, 27]
}, index=["2022", "2023", "2024", "2025", "2026"])
df.plot.area(alpha=0.75, title="재생에너지 생산량")
plt.xlabel("연도")
plt.ylabel("생산량")
plt.tight_layout()
plt.show()
07
파이그래프
출력·활용 설명: Series의 인덱스를 조각 이름으로 사용한다. ylabel을 빈 문자열로 설정하면 불필요한 축 이름을 제거할 수 있다.
import pandas as pd
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
s = pd.Series(
[35, 25, 20, 12, 8],
index=["정보", "과학", "수학", "영어", "국어"]
)
s.plot(kind="pie", autopct="%1.1f%%",
title="선호 과목 비율", ylabel="")
plt.tight_layout()
plt.show()
08
상자그림
출력·활용 설명: 각 열을 하나의 집단으로 간주해 상자그림을 만든다. 중앙값과 자료의 퍼짐을 비교하기 적합하다.
import pandas as pd
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
df = pd.DataFrame({
"A반": [68, 72, 75, 80, 84, 88, 92],
"B반": [60, 70, 76, 82, 87, 94, 99]
})
df.plot(kind="box", title="반별 점수 분포")
plt.ylabel("점수")
plt.tight_layout()
plt.show()
09
밀도그래프
출력·활용 설명: 커널 밀도 추정으로 부드러운 분포 곡선을 만든다. 이 예제는 scipy가 필요하므로 전체 설치 명령에 scipy를 포함했다.
import pandas as pd
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
df = pd.DataFrame({
"측정값": [1.1, 1.3, 1.4, 1.5, 1.7, 1.8, 2.0,
2.1, 2.2, 2.4, 2.7, 3.0]
})
df["측정값"].plot(kind="kde", title="측정값 밀도")
plt.xlabel("측정값")
plt.tight_layout()
plt.show()
10
두 축 그래프
출력·활용 설명: 단위와 크기가 다른 두 지표를 왼쪽과 오른쪽 y축에 나누어 표시한다. secondary_y=True가 보조축을 만든다.
import pandas as pd
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
df = pd.DataFrame({
"매출": [120, 135, 150, 170, 190],
"광고비": [20, 25, 30, 35, 42]
}, index=["1월", "2월", "3월", "4월", "5월"])
ax = df["매출"].plot(kind="bar", alpha=0.7, label="매출")
df["광고비"].plot(kind="line", marker="o", secondary_y=True,
ax=ax, label="광고비")
ax.set_title("매출과 광고비")
ax.set_ylabel("매출(만원)")
ax.right_ax.set_ylabel("광고비(만원)")
plt.tight_layout()
plt.show()
4
Plotly
확대·축소와 툴팁을 지원하는 인터랙티브 그래프
01
인터랙티브 선그래프
출력·활용 설명: 마우스를 올리면 값이 표시되고 확대·축소할 수 있는 선그래프를 HTML 파일로 저장한다.
from bokeh.plotting import figure, output_file, save
from bokeh.models import ColumnDataSource, HoverTool
output_file("bokeh_01_line.html", title="월별 매출")
p = figure(x_range=["1월","2월","3월","4월","5월"], height=400, title="월별 매출")
p.line(["1월","2월","3월","4월","5월"], [120,135,128,150,170], line_width=3)
p.circle(["1월","2월","3월","4월","5월"], [120,135,128,150,170], size=10)
save(p)
02
막대그래프
출력·활용 설명: vbar의 top에 막대 높이를 지정한다.
from bokeh.plotting import figure, output_file, save
from bokeh.models import ColumnDataSource, HoverTool
subjects=["국어","수학","영어","과학","정보"]; scores=[82,91,86,94,96]
p=figure(x_range=subjects, height=400, title="과목별 점수")
p.vbar(x=subjects, top=scores, width=0.7)
output_file("bokeh_02_bar.html"); save(p)
03
산점도와 툴팁
출력·활용 설명: HoverTool을 추가해 점 위에 마우스를 올렸을 때 원자료 값을 확인한다.
from bokeh.plotting import figure, output_file, save
from bokeh.models import ColumnDataSource, HoverTool
source=ColumnDataSource(data=dict(hours=[1,2,3,4,5,6,7], scores=[55,61,68,74,82,88,94]))
p=figure(height=400, title="공부 시간과 점수", tools="pan,wheel_zoom,box_zoom,reset,save")
p.scatter("hours","scores",source=source,size=12)
p.add_tools(HoverTool(tooltips=[("공부시간","@hours"),("점수","@scores")]))
output_file("bokeh_03_scatter.html"); save(p)
04
원그래프
출력·활용 설명: wedge와 누적 각도를 이용해 원그래프를 만든다.
from bokeh.plotting import figure, output_file, save
from bokeh.models import ColumnDataSource, HoverTool
from math import pi
from bokeh.transform import cumsum
import pandas as pd
df=pd.DataFrame({"항목":["과학","코딩","천문","로봇"],"값":[28,35,18,24]})
df["각도"]=df["값"]/df["값"].sum()*2*pi
p=figure(height=420,title="동아리 구성",toolbar_location=None,
tools="hover",tooltips="@항목: @값",x_range=(-0.5,1.0))
p.wedge(x=0,y=1,radius=0.4,start_angle=cumsum("각도",include_zero=True),
end_angle=cumsum("각도"),source=df,legend_field="항목")
output_file("bokeh_04_pie.html"); save(p)
05
수평 막대
출력·활용 설명: hbar는 긴 범주명을 읽기 쉬운 가로 막대를 만든다.
from bokeh.plotting import figure, output_file, save
from bokeh.models import ColumnDataSource, HoverTool
regions=["서울","부산","대전","광주","전주"]; values=[950,330,145,140,65]
p=figure(y_range=regions,height=400,title="지역별 인구")
p.hbar(y=regions,right=values,height=0.6)
output_file("bokeh_05_hbar.html"); save(p)
06
계단그래프
출력·활용 설명: 값이 특정 시점에서 불연속적으로 바뀌는 자료를 계단 형태로 표현한다.
from bokeh.plotting import figure, output_file, save
from bokeh.models import ColumnDataSource, HoverTool
x=[1,2,3,4,5,6]; y=[10,10,14,14,18,21]
p=figure(height=400,title="단계별 누적 변화")
p.step(x,y,mode="after",line_width=3)
output_file("bokeh_06_step.html"); save(p)
07
영역그래프
출력·활용 설명: varea로 기준선과 수열 사이를 채워 규모 변화를 강조한다.
from bokeh.plotting import figure, output_file, save
from bokeh.models import ColumnDataSource, HoverTool
x=[1,2,3,4,5]; y1=[10,15,22,30,38]; y2=[8,12,16,20,27]
p=figure(height=400,title="재생에너지 생산")
p.varea(x=x,y1=0,y2=y1,alpha=0.5,legend_label="태양광")
p.line(x,y2,line_width=3,legend_label="풍력")
output_file("bokeh_07_area.html"); save(p)
08
여러 선
출력·활용 설명: 범례를 클릭하면 해당 선을 숨길 수 있도록 click_policy를 설정한다.
from bokeh.plotting import figure, output_file, save
from bokeh.models import ColumnDataSource, HoverTool
days=["월","화","수","목","금","토","일"]
p=figure(x_range=days,height=400,title="지역별 기온")
p.line(days,[25,27,28,29,31,30,28],line_width=3,legend_label="서울")
p.line(days,[24,25,26,27,28,28,27],line_width=3,legend_label="부산")
p.legend.click_policy="hide"
output_file("bokeh_08_multiline.html"); save(p)
09
막대 위 값 표시
출력·활용 설명: LabelSet을 이용해 막대 위에 정확한 수치를 표시한다.
from bokeh.plotting import figure, output_file, save
from bokeh.models import ColumnDataSource, HoverTool
from bokeh.models import LabelSet
source=ColumnDataSource(data=dict(x=["A","B","C","D"],y=[12,18,15,22],text=["12","18","15","22"]))
p=figure(x_range=["A","B","C","D"],height=400,title="실험 결과")
p.vbar(x="x",top="y",source=source,width=0.7)
labels=LabelSet(x="x",y="y",text="text",source=source,y_offset=5,text_align="center")
p.add_layout(labels)
output_file("bokeh_09_labels.html"); save(p)
10
연결된 네트워크 형태
출력·활용 설명: GraphRenderer를 사용해 노드와 간선을 브라우저에서 시각화한다.
from bokeh.plotting import figure, output_file, save
from bokeh.models import ColumnDataSource, HoverTool
from bokeh.models import GraphRenderer, StaticLayoutProvider, Circle, MultiLine
p=figure(height=450,x_range=(-1.5,1.5),y_range=(-1.5,1.5),title="간단한 연결망")
graph=GraphRenderer()
graph.node_renderer.data_source.data=dict(index=[0,1,2,3])
graph.node_renderer.glyph=Circle(radius=0.12)
graph.edge_renderer.data_source.data=dict(start=[0,0,1,2],end=[1,2,3,3])
graph.edge_renderer.glyph=MultiLine(line_width=2)
graph.layout_provider=StaticLayoutProvider(graph_layout={0:(0,1),1:(-1,0),2:(1,0),3:(0,-1)})
p.renderers.append(graph)
output_file("bokeh_10_graph.html"); save(p)
6
Altair
데이터 열과 시각 채널을 선언하는 문법 중심 도구
01
막대그래프
출력·활용 설명: N은 범주형, Q는 수치형 자료임을 선언한다.
import pandas as pd
import altair as alt
df=pd.DataFrame({"과목":["국어","수학","영어","과학","정보"],"점수":[82,91,86,94,96]})
chart=alt.Chart(df).mark_bar().encode(x="과목:N",y="점수:Q",tooltip=["과목","점수"]).properties(title="과목별 점수")
chart.save("altair_01_bar.html")
02
선그래프
출력·활용 설명: sort=None으로 입력한 월 순서를 유지한다.
import pandas as pd
import altair as alt
df=pd.DataFrame({"월":["1월","2월","3월","4월","5월"],"매출":[120,135,128,150,170]})
chart=alt.Chart(df).mark_line(point=True).encode(x=alt.X("월:N",sort=None),y="매출:Q",tooltip=["월","매출"])
chart.save("altair_02_line.html")
03
산점도
출력·활용 설명: encode에서 시각 변수와 데이터 열의 대응을 선언한다.
import pandas as pd
import altair as alt
df=pd.DataFrame({"공부시간":[1,2,3,4,5,6,7],"점수":[55,61,68,74,82,88,94]})
chart=alt.Chart(df).mark_circle(size=100).encode(x="공부시간:Q",y="점수:Q",tooltip=["공부시간","점수"])
chart.save("altair_03_scatter.html")
04
색상 그룹 산점도
출력·활용 설명: color 채널에 그룹을 지정해 범주를 구분한다.
import pandas as pd
import altair as alt
df=pd.DataFrame({"키":[155,160,165,170,158,163,168,173],"몸무게":[48,52,57,63,50,54,60,66],"그룹":["A"]*4+["B"]*4})
chart=alt.Chart(df).mark_circle(size=100).encode(x="키:Q",y="몸무게:Q",color="그룹:N",tooltip=list(df.columns))
chart.save("altair_04_group.html")
05
히스토그램
출력·활용 설명: bin은 수치 자료를 구간화하고 count()는 각 구간의 빈도를 계산한다.
import pandas as pd
import altair as alt
df=pd.DataFrame({"점수":[55,62,68,70,72,75,77,80,82,84,85,88,90,92,94,96,98]})
chart=alt.Chart(df).mark_bar().encode(x=alt.X("점수:Q",bin=alt.Bin(maxbins=7)),y="count():Q")
chart.save("altair_05_hist.html")
06
상자그림
출력·활용 설명: mark_boxplot 하나로 범주별 상자그림을 선언한다.
import pandas as pd
import altair as alt
df=pd.DataFrame({"반":["A"]*7+["B"]*7,"점수":[68,72,75,80,84,88,92,60,70,76,82,87,94,99]})
chart=alt.Chart(df).mark_boxplot().encode(x="반:N",y="점수:Q")
chart.save("altair_06_box.html")
07
면적그래프
출력·활용 설명: 긴 형식 자료를 이용해 범주별 누적 면적을 그린다.
import pandas as pd
import altair as alt
df=pd.DataFrame({"연도":[2022,2023,2024,2025,2026],"태양광":[10,15,22,30,38],"풍력":[8,12,16,20,27]})
long_df=df.melt("연도",var_name="에너지원",value_name="생산량")
chart=alt.Chart(long_df).mark_area().encode(x="연도:O",y="생산량:Q",color="에너지원:N")
chart.save("altair_07_area.html")
08
텍스트 레이블 막대
출력·활용 설명: 두 차트를 + 연산자로 겹쳐 막대 위에 값을 표시한다.
import pandas as pd
import altair as alt
df=pd.DataFrame({"항목":["A","B","C","D"],"값":[12,18,15,22]})
bars=alt.Chart(df).mark_bar().encode(x="항목:N",y="값:Q")
labels=alt.Chart(df).mark_text(dy=-8).encode(x="항목:N",y="값:Q",text="값:Q")
(bars+labels).save("altair_08_labels.html")
09
상호작용 선택
출력·활용 설명: 범례를 클릭하면 선택한 그룹만 강조된다.
import pandas as pd
import altair as alt
df=pd.DataFrame({"키":[155,160,165,170,175,158,163,168,173,178],"몸무게":[48,52,57,63,69,50,54,60,66,73],"그룹":["A"]*5+["B"]*5})
selector=alt.selection_point(fields=["그룹"],bind="legend")
chart=alt.Chart(df).mark_circle(size=100).encode(x="키:Q",y="몸무게:Q",color="그룹:N",opacity=alt.condition(selector,alt.value(1),alt.value(0.15))).add_params(selector)
chart.save("altair_09_select.html")
10
히트맵
출력·활용 설명: 행과 열 조합의 값을 색상 채널에 연결한 선언형 히트맵이다.
import pandas as pd
import altair as alt
df=pd.DataFrame({"요일":["월","월","화","화","수","수"],"시간대":["오전","오후"]*3,"이용자":[30,45,35,50,40,60]})
chart=alt.Chart(df).mark_rect().encode(x="요일:N",y="시간대:N",color="이용자:Q",tooltip=list(df.columns))
chart.save("altair_10_heatmap.html")
import folium
m=folium.Map(location=[35.8242,127.1480],zoom_start=13)
folium.Marker([35.8242,127.1480],popup="전주 중심",tooltip="마우스를 올려 보세요").add_to(m)
m.save("folium_02_marker.html")
03
여러 도시 마커
출력·활용 설명: 딕셔너리를 반복하여 여러 위치를 표시한다.
import folium
cities={"서울":(37.5665,126.9780),"부산":(35.1796,129.0756),"전주":(35.8242,127.1480)}
m=folium.Map(location=[36.2,127.8],zoom_start=7)
for name,(lat,lon) in cities.items():
folium.Marker([lat,lon],popup=name).add_to(m)
m.save("folium_03_cities.html")
04
원형 마커
출력·활용 설명: 학생 수에 비례하도록 원의 반지름을 계산한다.
import folium
data=[("A학교",35.82,127.14,800),("B학교",35.84,127.12,500),("C학교",35.80,127.16,650)]
m=folium.Map(location=[35.82,127.14],zoom_start=12)
for name,lat,lon,count in data:
folium.CircleMarker([lat,lon],radius=count/100,popup=f"{name}: {count}명",fill=True).add_to(m)
m.save("folium_04_circle.html")
05
이동 경로
출력·활용 설명: Polyline으로 여러 좌표를 연결해 이동 경로를 표현한다.
import folium
route=[[35.8242,127.1480],[35.8300,127.1350],[35.8380,127.1250],[35.8450,127.1180]]
m=folium.Map(location=route[0],zoom_start=13)
folium.PolyLine(route,weight=5,tooltip="이동 경로").add_to(m)
for i,point in enumerate(route,1):
folium.Marker(point,popup=f"{i}번째 지점").add_to(m)
m.save("folium_05_route.html")
import folium
from folium.plugins import MiniMap
m=folium.Map(location=[35.8242,127.1480],zoom_start=13)
MiniMap(toggle_display=True).add_to(m)
m.save("folium_08_minimap.html")
09
마커 클러스터
출력·활용 설명: 가까운 마커를 자동으로 묶어 복잡한 지도를 정리한다.
import folium
from folium.plugins import MarkerCluster
points=[(35.820+i*0.003,127.140+(i%3)*0.004) for i in range(12)]
m=folium.Map(location=[35.83,127.145],zoom_start=13)
cluster=MarkerCluster().add_to(m)
for i,(lat,lon) in enumerate(points,1):
folium.Marker([lat,lon],popup=f"지점 {i}").add_to(cluster)
m.save("folium_09_cluster.html")
10
간단 단계구분도
출력·활용 설명: 외부 경계 파일 없이 직접 만든 GeoJSON 영역을 값에 따라 다르게 표시한다.
import geopandas as gpd
import pandas as pd
from shapely.geometry import Point, Polygon, LineString
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
gdf=gpd.GeoDataFrame({"학교":["A","B","C"]},geometry=[Point(127.14,35.82),Point(127.16,35.83),Point(127.13,35.84)],crs="EPSG:4326")
ax=gdf.plot(figsize=(7,6),markersize=100)
for x,y,name in zip(gdf.geometry.x,gdf.geometry.y,gdf["학교"]): ax.text(x,y,name)
plt.title("학교 위치"); plt.tight_layout(); plt.show()
02
다각형 영역
출력·활용 설명: 다각형 경계와 통계 열을 결합해 단계구분도를 만든다.
import geopandas as gpd
import pandas as pd
from shapely.geometry import Point, Polygon, LineString
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
polys=[Polygon([(0,0),(2,0),(2,2),(0,2)]),Polygon([(2,0),(4,0),(4,2),(2,2)])]
gdf=gpd.GeoDataFrame({"지역":["서부","동부"],"인구":[30,70]},geometry=polys,crs="EPSG:3857")
gdf.plot(column="인구",legend=True,edgecolor="black")
plt.title("지역별 인구"); plt.tight_layout(); plt.show()
03
선 경로
출력·활용 설명: LineString으로 연결 경로 또는 도로망을 표현한다.
import geopandas as gpd
import pandas as pd
from shapely.geometry import Point, Polygon, LineString
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
roads=[LineString([(0,0),(1,1),(2,1.5)]),LineString([(0,2),(1,1),(2,0.5)])]
gdf=gpd.GeoDataFrame({"노선":["A","B"]},geometry=roads,crs="EPSG:3857")
gdf.plot(linewidth=4)
plt.title("교통 노선"); plt.tight_layout(); plt.show()
04
점 크기 지도
출력·활용 설명: 수치 열을 markersize에 연결해 규모 차이를 점 크기로 표현한다.
import geopandas as gpd
import pandas as pd
from shapely.geometry import Point, Polygon, LineString
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
gdf=gpd.GeoDataFrame({"도시":["A","B","C"],"인구":[20,50,80]},geometry=[Point(0,0),Point(1,1),Point(2,0.5)],crs="EPSG:3857")
gdf.plot(markersize=gdf["인구"]*5,alpha=0.7)
plt.title("인구 비례 점 지도"); plt.tight_layout(); plt.show()
05
경계와 점 겹치기
출력·활용 설명: 같은 CRS를 가진 두 공간 자료를 동일한 축에 겹쳐 그린다.
import geopandas as gpd
import pandas as pd
from shapely.geometry import Point, Polygon, LineString
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
area=gpd.GeoDataFrame({"이름":["연구구역"]},geometry=[Polygon([(0,0),(3,0),(3,2),(0,2)])],crs="EPSG:3857")
sites=gpd.GeoDataFrame({"지점":["A","B","C"]},geometry=[Point(0.5,0.5),Point(1.5,1.2),Point(2.5,0.8)],crs="EPSG:3857")
ax=area.plot(facecolor="none",edgecolor="black")
sites.plot(ax=ax,markersize=100)
plt.title("구역 내 관측 지점"); plt.show()
06
버퍼 영역
출력·활용 설명: buffer는 점 주변의 일정 거리 영향권을 다각형으로 생성한다.
import geopandas as gpd
import pandas as pd
from shapely.geometry import Point, Polygon, LineString
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
points=gpd.GeoDataFrame({"시설":["A","B"]},geometry=[Point(0,0),Point(3,0)],crs="EPSG:3857")
buffers=points.copy()
buffers["geometry"]=points.buffer(1.0)
ax=buffers.plot(alpha=0.35)
points.plot(ax=ax,markersize=80)
plt.title("시설 반경 1단위"); plt.show()
07
중심점 표시
출력·활용 설명: centroid로 각 다각형의 기하학적 중심을 구해 표시한다.
import geopandas as gpd
import pandas as pd
from shapely.geometry import Point, Polygon, LineString
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
regions=gpd.GeoDataFrame({"지역":["A","B"]},geometry=[Polygon([(0,0),(2,0),(2,2),(0,2)]),Polygon([(3,0),(5,0),(5,3),(3,3)])],crs="EPSG:3857")
centers=regions.copy()
centers["geometry"]=regions.centroid
ax=regions.plot(facecolor="none",edgecolor="black")
centers.plot(ax=ax,markersize=100)
plt.title("지역 중심점"); plt.show()
08
공간 포함 판정
출력·활용 설명: within으로 각 점이 지정 영역 안에 있는지 불리언 값으로 계산한다.
import geopandas as gpd
import pandas as pd
from shapely.geometry import Point, Polygon, LineString
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
region=Polygon([(0,0),(3,0),(3,3),(0,3)])
points=[Point(1,1),Point(2,2),Point(4,1)]
gdf=gpd.GeoDataFrame({"지점":["A","B","C"]},geometry=points,crs="EPSG:3857")
gdf["영역내부"]=gdf.geometry.within(region)
print(gdf[["지점","영역내부"]])
ax=gpd.GeoSeries([region],crs="EPSG:3857").plot(facecolor="none",edgecolor="black")
gdf.plot(ax=ax,markersize=100)
plt.show()
09
좌표계 변환
출력·활용 설명: 경위도 좌표계를 국내 미터 기반 좌표계로 변환한다. 거리·면적 계산 전 좌표계를 확인해야 한다.
import geopandas as gpd
import pandas as pd
from shapely.geometry import Point, Polygon, LineString
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
gdf=gpd.GeoDataFrame({"도시":["전주"]},geometry=[Point(127.1480,35.8242)],crs="EPSG:4326")
projected=gdf.to_crs("EPSG:5179")
print("경위도:",gdf.geometry.iloc[0])
print("미터 좌표:",projected.geometry.iloc[0])
import geopandas as gpd
import pandas as pd
from shapely.geometry import Point, Polygon, LineString
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
gdf=gpd.GeoDataFrame({"이름":["A","B"]},geometry=[Point(127.14,35.82),Point(127.16,35.83)],crs="EPSG:4326")
gdf.to_file("geopandas_points.geojson",driver="GeoJSON",encoding="utf-8")
print("geopandas_points.geojson 저장 완료")
9
WordCloud
단어 빈도를 글자 크기로 나타내는 텍스트 시각화 도구
01
기본 한글 워드클라우드
출력·활용 설명: 맑은 고딕 경로를 지정해 한글이 네모로 표시되는 문제를 막는다.
from pathlib import Path
import matplotlib.pyplot as plt
from wordcloud import WordCloud
font_path = Path("C:/Windows/Fonts/malgun.ttf")
if not font_path.exists():
raise FileNotFoundError("C:/Windows/Fonts/malgun.ttf 파일을 찾을 수 없습니다.")
text="데이터 시각화 파이썬 정보 과학 데이터 분석 시각화 인공지능 파이썬 데이터"
wc=WordCloud(font_path=str(font_path),width=900,height=500,background_color="white").generate(text)
plt.imshow(wc,interpolation="bilinear"); plt.axis("off"); plt.tight_layout(); plt.show()
02
빈도 딕셔너리
출력·활용 설명: 미리 계산한 단어 빈도를 그대로 사용한다.
from pathlib import Path
import matplotlib.pyplot as plt
from wordcloud import WordCloud
font_path = Path("C:/Windows/Fonts/malgun.ttf")
if not font_path.exists():
raise FileNotFoundError("C:/Windows/Fonts/malgun.ttf 파일을 찾을 수 없습니다.")
freq={"데이터":50,"시각화":40,"파이썬":35,"과학":25,"정보":30,"인공지능":20}
wc=WordCloud(font_path=str(font_path),width=900,height=500,background_color="white").generate_from_frequencies(freq)
plt.imshow(wc); plt.axis("off"); plt.show()
03
최대 단어 수 제한
출력·활용 설명: max_words로 표시할 핵심 단어 수를 제한한다.
from pathlib import Path
import matplotlib.pyplot as plt
from wordcloud import WordCloud
font_path = Path("C:/Windows/Fonts/malgun.ttf")
if not font_path.exists():
raise FileNotFoundError("C:/Windows/Fonts/malgun.ttf 파일을 찾을 수 없습니다.")
text=" ".join(["데이터"]*30+["시각화"]*25+["파이썬"]*20+["분석"]*15+["그래프"]*10+["통계"]*8)
wc=WordCloud(font_path=str(font_path),max_words=5,width=900,height=500,background_color="white").generate(text)
plt.imshow(wc); plt.axis("off"); plt.show()
04
가로형 워드클라우드
출력·활용 설명: 너비를 크게 하고 prefer_horizontal을 1.0으로 설정해 단어를 가로로 배치한다.
from pathlib import Path
import matplotlib.pyplot as plt
from wordcloud import WordCloud
font_path = Path("C:/Windows/Fonts/malgun.ttf")
if not font_path.exists():
raise FileNotFoundError("C:/Windows/Fonts/malgun.ttf 파일을 찾을 수 없습니다.")
freq={"물리학":35,"화학":30,"생물학":28,"지구과학":25,"천문학":20}
wc=WordCloud(font_path=str(font_path),width=1100,height=350,prefer_horizontal=1.0,background_color="white").generate_from_frequencies(freq)
plt.imshow(wc); plt.axis("off"); plt.show()
05
불용어 제거
출력·활용 설명: 조사나 의미가 약한 단어를 stopwords로 제거한다.
from pathlib import Path
import matplotlib.pyplot as plt
from wordcloud import WordCloud
font_path = Path("C:/Windows/Fonts/malgun.ttf")
if not font_path.exists():
raise FileNotFoundError("C:/Windows/Fonts/malgun.ttf 파일을 찾을 수 없습니다.")
text="데이터 는 시각화 를 통해 데이터 의 특징 을 이해 하고 데이터 를 분석 한다"
stopwords={"는","를","의","을","하고","통해"}
wc=WordCloud(font_path=str(font_path),stopwords=stopwords,width=900,height=500,background_color="white").generate(text)
plt.imshow(wc); plt.axis("off"); plt.show()
06
색상표 적용
출력·활용 설명: colormap으로 단어 색상 체계를 지정한다.
from pathlib import Path
import matplotlib.pyplot as plt
from wordcloud import WordCloud
font_path = Path("C:/Windows/Fonts/malgun.ttf")
if not font_path.exists():
raise FileNotFoundError("C:/Windows/Fonts/malgun.ttf 파일을 찾을 수 없습니다.")
freq={"보안":40,"암호화":32,"개인정보":28,"인증":25,"네트워크":22}
wc=WordCloud(font_path=str(font_path),colormap="viridis",width=900,height=500,background_color="white").generate_from_frequencies(freq)
plt.imshow(wc); plt.axis("off"); plt.show()
07
검은 배경
출력·활용 설명: 배경과 색상표를 조합해 천문 자료에 어울리는 시각화를 만든다.
from pathlib import Path
import matplotlib.pyplot as plt
from wordcloud import WordCloud
font_path = Path("C:/Windows/Fonts/malgun.ttf")
if not font_path.exists():
raise FileNotFoundError("C:/Windows/Fonts/malgun.ttf 파일을 찾을 수 없습니다.")
freq={"우주":40,"별":35,"은하":30,"행성":25,"중력":20,"빛":18}
wc=WordCloud(font_path=str(font_path),background_color="black",colormap="plasma",width=900,height=500).generate_from_frequencies(freq)
plt.imshow(wc); plt.axis("off"); plt.show()
08
최소 글자 크기
출력·활용 설명: min_font_size로 지나치게 작은 단어가 생성되지 않도록 한다.
from pathlib import Path
import matplotlib.pyplot as plt
from wordcloud import WordCloud
font_path = Path("C:/Windows/Fonts/malgun.ttf")
if not font_path.exists():
raise FileNotFoundError("C:/Windows/Fonts/malgun.ttf 파일을 찾을 수 없습니다.")
freq={"데이터":100,"시각화":70,"분석":50,"통계":30,"그래프":20,"표":5}
wc=WordCloud(font_path=str(font_path),min_font_size=18,width=900,height=500,background_color="white").generate_from_frequencies(freq)
plt.imshow(wc); plt.axis("off"); plt.show()
09
이미지 파일 저장
출력·활용 설명: 화면 표시 대신 PNG 파일로 저장하여 보고서에 삽입할 수 있다.
from pathlib import Path
import matplotlib.pyplot as plt
from wordcloud import WordCloud
font_path = Path("C:/Windows/Fonts/malgun.ttf")
if not font_path.exists():
raise FileNotFoundError("C:/Windows/Fonts/malgun.ttf 파일을 찾을 수 없습니다.")
freq={"교육":50,"탐구":40,"협업":35,"창의성":30,"문제해결":45}
wc=WordCloud(font_path=str(font_path),width=1200,height=700,background_color="white").generate_from_frequencies(freq)
wc.to_file("wordcloud_09_교육.png")
print("wordcloud_09_교육.png 저장 완료")
10
두 워드클라우드 비교
출력·활용 설명: 서로 다른 텍스트 집단의 핵심어를 같은 화면에서 비교한다.
from pathlib import Path
import matplotlib.pyplot as plt
from wordcloud import WordCloud
font_path = Path("C:/Windows/Fonts/malgun.ttf")
if not font_path.exists():
raise FileNotFoundError("C:/Windows/Fonts/malgun.ttf 파일을 찾을 수 없습니다.")
freq1={"파이썬":50,"데이터":40,"함수":30,"리스트":25}
freq2={"인공지능":50,"학습":40,"예측":30,"모델":25}
fig,axes=plt.subplots(1,2,figsize=(12,5))
for ax,freq,title in zip(axes,[freq1,freq2],["프로그래밍","인공지능"]):
wc=WordCloud(font_path=str(font_path),width=600,height=400,background_color="white").generate_from_frequencies(freq)
ax.imshow(wc); ax.axis("off"); ax.set_title(title)
plt.tight_layout(); plt.show()
10
NetworkX
노드와 간선으로 관계망을 분석·시각화하는 도구
01
기본 무방향 그래프
출력·활용 설명: Graph에 간선을 추가하면 연결된 노드가 자동 생성된다.
import networkx as nx
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
G=nx.Graph(); G.add_edges_from([("A","B"),("A","C"),("B","D"),("C","D")])
nx.draw(G,with_labels=True,node_size=1200,font_family=plt.rcParams["font.family"])
plt.title("기본 연결망"); plt.show()
02
방향 그래프
출력·활용 설명: DiGraph는 화살표 방향이 있는 절차나 의존 관계를 표현한다.
import networkx as nx
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
G=nx.DiGraph(); G.add_edges_from([("자료수집","전처리"),("전처리","분석"),("분석","시각화"),("시각화","보고서")])
pos=nx.spring_layout(G,seed=42)
nx.draw(G,pos,with_labels=True,arrows=True,node_size=1800,font_family=plt.rcParams["font.family"])
plt.title("프로젝트 흐름"); plt.show()
03
가중치 네트워크
출력·활용 설명: 간선 굵기와 숫자로 관계의 강도를 나타낸다.
import networkx as nx
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
G=nx.Graph(); G.add_weighted_edges_from([("A","B",3),("A","C",1),("B","C",2),("C","D",4)])
pos=nx.spring_layout(G,seed=42)
widths=[G[u][v]["weight"] for u,v in G.edges()]
nx.draw(G,pos,with_labels=True,width=widths,node_size=1200)
nx.draw_networkx_edge_labels(G,pos,edge_labels=nx.get_edge_attributes(G,"weight"))
plt.title("협업 횟수"); plt.show()
04
노드 크기 중심성
출력·활용 설명: 연결 중심성이 큰 노드를 더 크게 표시한다.
import networkx as nx
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
G=nx.karate_club_graph()
centrality=nx.degree_centrality(G)
sizes=[500+3000*centrality[n] for n in G.nodes()]
pos=nx.spring_layout(G,seed=42)
nx.draw(G,pos,node_size=sizes,with_labels=True,font_size=8)
plt.title("연결 중심성"); plt.show()
05
최단 경로 강조
출력·활용 설명: shortest_path로 구한 경로의 간선만 굵게 덧그린다.
import networkx as nx
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
G=nx.Graph(); G.add_edges_from([("A","B"),("B","C"),("A","D"),("D","E"),("E","C"),("C","F")])
path=nx.shortest_path(G,"A","F")
path_edges=list(zip(path,path[1:]))
pos=nx.spring_layout(G,seed=42)
nx.draw(G,pos,with_labels=True,node_size=1200)
nx.draw_networkx_edges(G,pos,edgelist=path_edges,width=5)
plt.title("A에서 F까지 최단 경로"); plt.show()
06
이분 그래프
출력·활용 설명: 서로 다른 두 종류의 노드 집합 사이의 관계를 표현한다.
import networkx as nx
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
from networkx.algorithms import bipartite
G=nx.Graph()
students=["민수","지현","서준"]; clubs=["과학","코딩"]
G.add_nodes_from(students,bipartite=0); G.add_nodes_from(clubs,bipartite=1)
G.add_edges_from([("민수","과학"),("민수","코딩"),("지현","과학"),("서준","코딩")])
pos=dict(); pos.update((n,(0,i)) for i,n in enumerate(students)); pos.update((n,(2,i)) for i,n in enumerate(clubs))
nx.draw(G,pos,with_labels=True,node_size=1600,font_family=plt.rcParams["font.family"])
plt.title("학생-동아리 관계"); plt.show()
07
원형 배치
출력·활용 설명: circular_layout은 순환 구조나 동등한 노드를 원형으로 배치한다.
import networkx as nx
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
G=nx.cycle_graph(8)
pos=nx.circular_layout(G)
nx.draw(G,pos,with_labels=True,node_size=1000)
plt.title("순환 네트워크"); plt.show()
08
트리 구조
출력·활용 설명: 계층 구조는 좌표를 직접 지정하면 위에서 아래로 읽기 쉽게 배치할 수 있다.
import networkx as nx
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
G=nx.DiGraph(); G.add_edges_from([("학교","1학년"),("학교","2학년"),("1학년","1반"),("1학년","2반"),("2학년","3반"),("2학년","4반")])
pos={"학교":(0,2),"1학년":(-1,1),"2학년":(1,1),"1반":(-1.5,0),"2반":(-0.5,0),"3반":(0.5,0),"4반":(1.5,0)}
nx.draw(G,pos,with_labels=True,node_size=1800,arrows=True,font_family=plt.rcParams["font.family"])
plt.title("학교 조직 구조"); plt.show()
09
밀도와 연결 요소
출력·활용 설명: 시각화와 함께 밀도 및 연결 요소를 계산해 구조를 정량적으로 해석한다.
import networkx as nx
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
G=nx.Graph(); G.add_edges_from([("A","B"),("B","C"),("D","E")])
print("그래프 밀도:",round(nx.density(G),3))
print("연결 요소:",list(nx.connected_components(G)))
pos=nx.spring_layout(G,seed=42)
nx.draw(G,pos,with_labels=True,node_size=1200)
plt.title("분리된 네트워크"); plt.show()
10
인접행렬 히트맵
출력·활용 설명: 네트워크 연결 상태를 0과 1의 행렬로 변환하여 히트맵으로 표현한다.
import networkx as nx
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib import font_manager
# Windows 한글 글꼴 자동 설정
font_candidates = [
Path("C:/Windows/Fonts/malgun.ttf"),
Path("C:/Windows/Fonts/malgunbd.ttf"),
]
font_path = next((p for p in font_candidates if p.exists()), None)
if font_path:
font_name = font_manager.FontProperties(fname=str(font_path)).get_name()
plt.rcParams["font.family"] = font_name
else:
print("맑은 고딕 글꼴을 찾지 못했습니다. Windows 글꼴 설치 상태를 확인하세요.")
plt.rcParams["axes.unicode_minus"] = False
import pandas as pd
G=nx.Graph(); G.add_edges_from([("A","B"),("A","C"),("B","D"),("C","D")])
matrix=nx.to_pandas_adjacency(G)
plt.figure(figsize=(5,4))
plt.imshow(matrix,cmap="Blues")
plt.xticks(range(len(matrix)),matrix.columns)
plt.yticks(range(len(matrix)),matrix.index)
for i in range(len(matrix)):
for j in range(len(matrix)):
plt.text(j,i,int(matrix.iloc[i,j]),ha="center",va="center")
plt.title("인접행렬"); plt.colorbar(); plt.tight_layout(); plt.show()