📊 데이터 시각화 심화형 5지선다 평가

에러와 경고 없이 실행되는 코드 + 실제 그래프 + 코드 관련 심화형 5지선다 + 상세 풀이

실행 안정성 안내
모든 예제는 matplotlib의 한글 폰트와 마이너스 기호 설정을 포함합니다. 그래프 코드는 pandas, matplotlib, numpy만 사용하여 실행 오류와 경고를 최소화했습니다.
선그래프

1. 하루 시간대별 기온 변화

핵심 개념: 시간에 따른 변화, 평균선, 주석

🐍 에러와 경고 없이 실행되는 파이썬 코드
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 한글 깨짐 방지 + 마이너스 기호 깨짐 방지
plt.rcParams["font.family"] = "NanumGothic"
plt.rcParams["axes.unicode_minus"] = False

# 그래프가 잘리지 않도록 설정
plt.rcParams["figure.dpi"] = 130

df = pd.DataFrame({
    "시간": ["06시", "09시", "12시", "15시", "18시", "21시"],
    "기온": [12, 15, 21, 24, 20, 16]
})

plt.figure(figsize=(7.8, 4.8))
plt.plot(df["시간"], df["기온"],
         marker="o", linewidth=3, markersize=8,
         label="기온 변화")
plt.axhline(df["기온"].mean(), linestyle="--", label="평균 기온")
plt.annotate("최고 기온", xy=("15시", 24), xytext=("12시", 25),
             arrowprops=dict(arrowstyle="->"))
plt.title("하루 시간대별 기온 변화")
plt.xlabel("시간")
plt.ylabel("기온(℃)")
plt.grid(True, linestyle=":", alpha=0.5)
plt.legend()
plt.tight_layout()
plt.show()
🖼️ 코드가 출력한 실제 그래프
하루 시간대별 기온 변화
🎯 코드 관련 심화형 5지선다형 문제

이 그래프에서 평균선과 주석을 함께 사용한 이유로 가장 적절한 것은?

정답: 1번
상세 풀이: 평균선은 전체 기준을 제공하고, 주석은 15시의 최고 기온을 강조합니다.
막대그래프

2. 과목별 평균 점수 비교

핵심 개념: 항목 비교, 기준선, 값 라벨

🐍 에러와 경고 없이 실행되는 파이썬 코드
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 한글 깨짐 방지 + 마이너스 기호 깨짐 방지
plt.rcParams["font.family"] = "NanumGothic"
plt.rcParams["axes.unicode_minus"] = False

# 그래프가 잘리지 않도록 설정
plt.rcParams["figure.dpi"] = 130

df = pd.DataFrame({
    "과목": ["국어", "수학", "영어", "과학", "정보"],
    "평균점수": [84, 92, 88, 95, 90]
})

plt.figure(figsize=(7.8, 4.8))
bars = plt.bar(df["과목"], df["평균점수"],
               edgecolor="black", hatch="//", label="평균점수")
plt.axhline(90, linestyle="--", label="90점 기준선")

for bar in bars:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2, height + 1,
             f"{height:g}", ha="center")

plt.title("과목별 평균 점수 비교")
plt.xlabel("과목")
plt.ylabel("평균점수")
plt.ylim(0, 105)
plt.grid(True, axis="y", linestyle=":", alpha=0.5)
plt.legend()
plt.tight_layout()
plt.show()
🖼️ 코드가 출력한 실제 그래프
과목별 평균 점수 비교
🎯 코드 관련 심화형 5지선다형 문제

90점 기준선을 기준으로 바르게 해석한 것은?

정답: 1번
상세 풀이: 수학 92, 과학 95, 정보 90은 기준선 90점 이상입니다.
원그래프

3. 스마트폰 사용 목적 비율

핵심 개념: 전체 중 비율, autopct

🐍 에러와 경고 없이 실행되는 파이썬 코드
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 한글 깨짐 방지 + 마이너스 기호 깨짐 방지
plt.rcParams["font.family"] = "NanumGothic"
plt.rcParams["axes.unicode_minus"] = False

# 그래프가 잘리지 않도록 설정
plt.rcParams["figure.dpi"] = 130

df = pd.DataFrame({
    "사용목적": ["공부", "게임", "영상 시청", "메신저", "기타"],
    "비율": [25, 20, 30, 15, 10]
})

plt.figure(figsize=(6.2, 6.2))
plt.pie(df["비율"], labels=df["사용목적"],
        autopct="%1.1f%%", startangle=90,
        wedgeprops={"edgecolor": "white"})
plt.title("스마트폰 사용 목적 비율")
plt.tight_layout()
plt.show()
🖼️ 코드가 출력한 실제 그래프
스마트폰 사용 목적 비율
🎯 코드 관련 심화형 5지선다형 문제

이 원그래프에 대한 설명으로 가장 적절한 것은?

정답: 1번
상세 풀이: 비율 값 중 영상 시청 30이 가장 크므로 가장 큰 조각으로 표현됩니다.
히스토그램

4. 학생들의 수면 시간 분포

핵심 개념: 분포, bins, 평균선

🐍 에러와 경고 없이 실행되는 파이썬 코드
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 한글 깨짐 방지 + 마이너스 기호 깨짐 방지
plt.rcParams["font.family"] = "NanumGothic"
plt.rcParams["axes.unicode_minus"] = False

# 그래프가 잘리지 않도록 설정
plt.rcParams["figure.dpi"] = 130

df = pd.DataFrame({
    "수면시간": [5.5, 6, 6, 6.5, 7, 7, 7, 7.5, 8, 8, 8.5,
              6.5, 7.2, 6.8, 7.1, 5.8, 6.3, 7.7, 8.1, 6.9]
})

plt.figure(figsize=(7.8, 4.8))
plt.hist(df["수면시간"], bins=6, edgecolor="black")
plt.axvline(df["수면시간"].mean(), linestyle="--", label="평균 수면시간")
plt.title("학생들의 수면 시간 분포")
plt.xlabel("수면 시간")
plt.ylabel("학생 수")
plt.grid(True, axis="y", linestyle=":", alpha=0.5)
plt.legend()
plt.tight_layout()
plt.show()
🖼️ 코드가 출력한 실제 그래프
학생들의 수면 시간 분포
🎯 코드 관련 심화형 5지선다형 문제

히스토그램에서 bins=6의 의미로 가장 적절한 것은?

정답: 1번
상세 풀이: 히스토그램은 수치 데이터를 구간으로 나누고 각 구간에 속한 데이터 개수를 보여줍니다.
산점도

5. 공부 시간과 시험 점수의 관계

핵심 개념: 두 변수 관계, 추세선

🐍 에러와 경고 없이 실행되는 파이썬 코드
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 한글 깨짐 방지 + 마이너스 기호 깨짐 방지
plt.rcParams["font.family"] = "NanumGothic"
plt.rcParams["axes.unicode_minus"] = False

# 그래프가 잘리지 않도록 설정
plt.rcParams["figure.dpi"] = 130

df = pd.DataFrame({
    "공부시간": [1, 2, 2.5, 3, 4, 4.5, 5, 6, 6.5, 7, 8],
    "시험점수": [50, 55, 58, 65, 70, 72, 78, 83, 85, 90, 94]
})

plt.figure(figsize=(7.8, 4.8))
plt.scatter(df["공부시간"], df["시험점수"], s=80, alpha=0.8)
z = np.polyfit(df["공부시간"], df["시험점수"], 1)
p = np.poly1d(z)
plt.plot(df["공부시간"], p(df["공부시간"]), linestyle="--", label="추세선")

plt.title("공부 시간과 시험 점수의 관계")
plt.xlabel("공부 시간")
plt.ylabel("시험 점수")
plt.grid(True, linestyle=":", alpha=0.5)
plt.legend()
plt.tight_layout()
plt.show()
🖼️ 코드가 출력한 실제 그래프
공부 시간과 시험 점수의 관계
🎯 코드 관련 심화형 5지선다형 문제

이 산점도와 추세선에 대한 해석으로 가장 적절한 것은?

정답: 1번
상세 풀이: 점들이 오른쪽 위로 증가하고 추세선도 상승하므로 양의 관계를 해석할 수 있습니다.
가로 막대그래프

6. 동아리별 회원 수 비교

핵심 개념: barh, 정렬 후 비교, 값 라벨

🐍 에러와 경고 없이 실행되는 파이썬 코드
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 한글 깨짐 방지 + 마이너스 기호 깨짐 방지
plt.rcParams["font.family"] = "NanumGothic"
plt.rcParams["axes.unicode_minus"] = False

# 그래프가 잘리지 않도록 설정
plt.rcParams["figure.dpi"] = 130

df = pd.DataFrame({
    "동아리": ["코딩", "과학", "수학", "로봇", "천문"],
    "회원수": [28, 24, 18, 22, 15]
})

df = df.sort_values("회원수")

plt.figure(figsize=(7.8, 4.8))
bars = plt.barh(df["동아리"], df["회원수"], edgecolor="black")
for bar in bars:
    width = bar.get_width()
    plt.text(width + 0.5, bar.get_y() + bar.get_height()/2,
             f"{int(width)}명", va="center")

plt.title("동아리별 회원 수 비교")
plt.xlabel("회원 수")
plt.ylabel("동아리")
plt.grid(True, axis="x", linestyle=":", alpha=0.5)
plt.tight_layout()
plt.show()
🖼️ 코드가 출력한 실제 그래프
동아리별 회원 수 비교
🎯 코드 관련 심화형 5지선다형 문제

가로 막대그래프에서 회원수 라벨을 get_width()로 표시한 이유는?

정답: 1번
상세 풀이: barh에서 데이터 값은 막대의 가로 길이로 표현되므로 get_width()로 값을 가져옵니다.
누적 막대그래프

7. 요일별 공부 시간 구성

핵심 개념: bottom, 구성 비교

🐍 에러와 경고 없이 실행되는 파이썬 코드
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 한글 깨짐 방지 + 마이너스 기호 깨짐 방지
plt.rcParams["font.family"] = "NanumGothic"
plt.rcParams["axes.unicode_minus"] = False

# 그래프가 잘리지 않도록 설정
plt.rcParams["figure.dpi"] = 130

df = pd.DataFrame({
    "요일": ["월", "화", "수", "목", "금"],
    "수업공부": [2.0, 2.5, 2.0, 3.0, 2.5],
    "자율공부": [1.0, 1.5, 2.0, 1.0, 2.5]
})

plt.figure(figsize=(7.8, 4.8))
plt.bar(df["요일"], df["수업공부"], label="수업공부", edgecolor="black")
plt.bar(df["요일"], df["자율공부"],
        bottom=df["수업공부"], label="자율공부", edgecolor="black")

plt.title("요일별 공부 시간 구성")
plt.xlabel("요일")
plt.ylabel("공부 시간")
plt.grid(True, axis="y", linestyle=":", alpha=0.5)
plt.legend()
plt.tight_layout()
plt.show()
🖼️ 코드가 출력한 실제 그래프
요일별 공부 시간 구성
🎯 코드 관련 심화형 5지선다형 문제

누적 막대그래프에서 bottom=df['수업공부']의 역할은?

정답: 1번
상세 풀이: bottom 옵션은 두 번째 막대가 어디에서 시작할지 정합니다. 그래서 자율공부가 수업공부 위에 쌓입니다.
상자그림

8. 반별 시험 점수 분포

핵심 개념: 중앙값, 사분위수, 분포 비교

🐍 에러와 경고 없이 실행되는 파이썬 코드
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 한글 깨짐 방지 + 마이너스 기호 깨짐 방지
plt.rcParams["font.family"] = "NanumGothic"
plt.rcParams["axes.unicode_minus"] = False

# 그래프가 잘리지 않도록 설정
plt.rcParams["figure.dpi"] = 130

df = pd.DataFrame({
    "1반": [78, 82, 85, 90, 92, 88, 76, 95],
    "2반": [70, 75, 80, 82, 84, 86, 88, 90],
    "3반": [60, 68, 72, 85, 87, 91, 94, 98]
})

plt.figure(figsize=(7.8, 4.8))
plt.boxplot([df["1반"], df["2반"], df["3반"]],
            labels=["1반", "2반", "3반"], patch_artist=True)
plt.title("반별 시험 점수 분포")
plt.xlabel("반")
plt.ylabel("점수")
plt.grid(True, axis="y", linestyle=":", alpha=0.5)
plt.tight_layout()
plt.show()
🖼️ 코드가 출력한 실제 그래프
반별 시험 점수 분포
🎯 코드 관련 심화형 5지선다형 문제

상자그림을 사용하는 가장 적절한 이유는?

정답: 1번
상세 풀이: 상자그림은 중앙값, 사분위 범위, 데이터의 퍼짐을 한 번에 비교할 수 있습니다.
히트맵

9. 학생별 과목 점수 히트맵

핵심 개념: 행렬형 데이터, colorbar, 값 표시

🐍 에러와 경고 없이 실행되는 파이썬 코드
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 한글 깨짐 방지 + 마이너스 기호 깨짐 방지
plt.rcParams["font.family"] = "NanumGothic"
plt.rcParams["axes.unicode_minus"] = False

# 그래프가 잘리지 않도록 설정
plt.rcParams["figure.dpi"] = 130

df = pd.DataFrame({
    "국어": [88, 92, 75, 95, 81],
    "수학": [91, 85, 80, 90, 88],
    "영어": [84, 96, 78, 93, 86],
    "과학": [90, 89, 82, 97, 85]
}, index=["민준", "서연", "지후", "하은", "도윤"])

plt.figure(figsize=(7.8, 4.8))
plt.imshow(df.values, aspect="auto")
plt.xticks(range(len(df.columns)), df.columns)
plt.yticks(range(len(df.index)), df.index)
plt.colorbar(label="점수")

for i in range(df.shape[0]):
    for j in range(df.shape[1]):
        plt.text(j, i, df.iloc[i, j], ha="center", va="center")

plt.title("학생별 과목 점수 히트맵")
plt.xlabel("과목")
plt.ylabel("학생")
plt.tight_layout()
plt.show()
🖼️ 코드가 출력한 실제 그래프
학생별 과목 점수 히트맵
🎯 코드 관련 심화형 5지선다형 문제

히트맵에서 colorbar의 역할로 가장 적절한 것은?

정답: 1번
상세 풀이: 히트맵은 값의 크기를 색으로 표현하므로 colorbar는 색과 수치의 대응 관계를 설명합니다.
인포그래픽

10. 하루 생활 데이터 인포그래픽

핵심 개념: 핵심 수치 요약, axis off, text

🐍 에러와 경고 없이 실행되는 파이썬 코드
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 한글 깨짐 방지 + 마이너스 기호 깨짐 방지
plt.rcParams["font.family"] = "NanumGothic"
plt.rcParams["axes.unicode_minus"] = False

# 그래프가 잘리지 않도록 설정
plt.rcParams["figure.dpi"] = 130

df = pd.DataFrame({
    "항목": ["공부 시간", "수면 시간", "스마트폰 사용", "걸음 수"],
    "값": [5.5, 7.0, 2.5, 8420],
    "단위": ["시간", "시간", "시간", "보"]
})

fig = plt.figure(figsize=(8.5, 5.2))
ax = fig.add_axes([0, 0, 1, 1])
ax.axis("off")

plt.text(0.5, 0.9, "하루 생활 데이터 인포그래픽",
         ha="center", fontsize=20, weight="bold")

positions = [(0.2, 0.62), (0.5, 0.62), (0.8, 0.62), (0.5, 0.28)]
for (x, y), row in zip(positions, df.itertuples()):
    plt.text(x, y, row.항목, ha="center", fontsize=14)
    plt.text(x, y - 0.12, f"{row.값:g}{row.단위}",
             ha="center", fontsize=24, weight="bold")

plt.show()
🖼️ 코드가 출력한 실제 그래프
하루 생활 데이터 인포그래픽
🎯 코드 관련 심화형 5지선다형 문제

이 코드에서 ax.axis('off')를 사용하는 이유로 가장 적절한 것은?

정답: 1번
상세 풀이: 인포그래픽은 축보다 핵심 수치 전달이 중요하므로 axis('off')로 좌표축을 숨깁니다.