콘텐츠로 이동

데이터와 시각화 II: 인사이트 도출

코스 개요

이 코스에서 학생들은 전문적인 데이터 분석 도구를 사용하여 실전 데이터에서 인사이트를 도출합니다. 지도 시각화로 공간 데이터를 표현하고, 인터랙티브 그래프로 데이터를 탐색하며, 현실 세계의 "지저분한 데이터(Dirty Data)"를 다루는 방법을 배웁니다. 궁극적으로 데이터를 설득력 있는 이야기로 변환하는 스토리텔링 능력을 기릅니다.

예상 소요 시간: 16~32시간

소요 시간은 학생의 학년, 사전 경험, 학습 속도에 따라 크게 달라집니다. 또한 기본 개념만 익히고 넘어가는 경우와 추가 실습 문제나 창의적 프로젝트를 더 진행하는 경우에 따라서도 차이가 납니다. 위 시간은 평균적인 범위이며, 자녀의 페이스에 맞추어 유연하게 진행하시기 바랍니다.

어떤 능력을 키우게 되나요?

"데이터에서 인사이트를 발견하고 전달하는 능력"을 훈련합니다. 단순히 그래프를 그리는 것을 넘어, 데이터에 "질문"을 던지고 답을 찾는 탐색적 분석 능력을 기릅니다. 또한 발견한 인사이트를 청중에게 효과적으로 전달하는 데이터 스토리텔링 기술을 배웁니다.

어떤 원리를 배우나요?

  • (탐색적 분석) 인터랙티브 시각화로 데이터를 자유롭게 탐색하며 숨겨진 패턴을 발견합니다. 가설 없이 데이터가 말하는 이야기를 듣는 방법입니다.
  • (실전 데이터) 현실 세계의 데이터는 결측치, 이상치, 형식 불일치로 가득합니다. Dirty Data를 정제하고 분석하는 실무 능력을 기릅니다.
  • (커뮤니케이션) 숫자와 그래프를 설득력 있는 이야기로 변환합니다. 청중이 누구인지에 따라 다른 시각화 전략을 선택하는 법을 배웁니다.
AI 시대 사고력: 컴퓨팅 (문제해결) | 데이터 기반 | 확률적 사고력

고급 데이터 분석 사고력

스킬 설명 활동 예시
🗺️ 공간 분석 위치 데이터의 패턴 발견 UFO 목격 핫스팟 지도
🔍 탐색적 분석 가설 없이 데이터 탐색 인터랙티브 그래프로 패턴 발견
🧹 데이터 정제 Dirty Data 처리 결측치 처리, 이상치 제거
📖 스토리텔링 데이터로 이야기 전달 발표용 대시보드 제작

수학적 연결고리

수학 개념 프로그래밍 적용 학습 효과
좌표 평면 위도/경도로 지도 위 위치 표시 (x, y) 좌표 개념 확장
통계 평균, 중앙값, 분포 분석 데이터 요약의 기초
비율과 백분율 구성비, 변화율 계산 전체 대비 부분의 크기
상관관계 두 변수 간의 관계 분석 상관 ≠ 인과 이해

데이터 스토리텔링 프로세스

flowchart LR
    A[1. 탐색] --> B[2. 발견]
    B --> C[3. 분석]
    C --> D[4. 시각화]
    D --> E[5. 전달]

미디어 리터러시

그래프를 볼 때 확인할 것:
- Y축이 0부터 시작하는가? (왜곡 가능성)
- 표본 크기는 충분한가?
- 상관관계 ≠ 인과관계
- 데이터 출처는 신뢰할 수 있는가?
💻 코드 예시 & 시각화

예시 1: 지도 시각화 - Folium

import folium

# 서울 중심 지도 생성
map = folium.Map(
    location=[37.5665, 126.9780],  # 서울 좌표
    zoom_start=12
)

# 마커 추가
locations = [
    [37.5796, 126.9770, "경복궁"],
    [37.5512, 126.9882, "남산타워"],
    [37.5662, 126.9785, "광화문"]
]

for loc in locations:
    folium.Marker(
        location=[loc[0], loc[1]],
        popup=loc[2],
        icon=folium.Icon(color='red')
    ).add_to(map)

map.save("seoul_map.html")

실행 결과 (지도):

┌─────────────────────────────┐
│     🔴 경복궁              │
│         ╲                  │
│          ╲   서울 지도     │
│    🔴 광화문               │
│              ╲             │
│               ╲            │
│                🔴 남산타워 │
└─────────────────────────────┘


예시 2: 인터랙티브 그래프 - Plotly

import plotly.express as px

# 데이터
df = px.data.gapminder()
df_2007 = df[df['year'] == 2007]

# 인터랙티브 산점도
fig = px.scatter(
    df_2007,
    x='gdpPercap',
    y='lifeExp',
    size='pop',
    color='continent',
    hover_name='country',
    title='GDP vs 기대수명 (2007)'
)
fig.show()

특징: - 마우스 호버로 상세 정보 확인 - 확대/축소로 세부 탐색 - 범례 클릭으로 필터링


예시 3: 코로플레스 지도 - 지역별 데이터

import folium

# 서울 구별 인구 데이터
population = {
    "강남구": 550000,
    "서초구": 440000,
    "송파구": 680000,
    # ...
}

# 색상으로 인구 표현
# 인구가 많을수록 진한 색

시각화 결과:

서울시 구별 인구 밀도
┌─────────────────────┐
│ ░░░ 은평  ▒▒ 강북   │
│ ░░░ 서대문 ▒▒ 성북  │  ░ 낮음
│ ▒▒▒ 마포  ███ 강남  │  ▒ 중간
│ ▒▒▒ 영등포 ███ 송파 │  █ 높음
└─────────────────────┘


🎮 실습 연습

연습 1: 지도 만들기

Python으로 대한민국 지도를 만들어보세요!

미션: 지도를 생성하고 마커를 추가해보세요

from leaflet_python import Map, CITIES

# 대한민국 중심 지도 생성
m = Map(center=[36.5, 127.5], zoom=7)

# 서울에 마커 추가
m.add_marker(
    CITIES["서울"],
    popup="서울특별시",
    tooltip="수도"
)

# TODO: 부산에도 마커를 추가해보세요!
# m.add_marker(CITIES["부산"], popup="부산광역시")

m.show()

연습 2: 원형 마커로 인구 표시

원의 크기로 도시 인구를 표현해보세요!

미션: 인구에 비례하는 원형 마커를 추가하세요

from leaflet_python import Map, CITIES

m = Map(center=[36.5, 127.5], zoom=7)

# 도시별 인구 데이터 (만 명)
cities = [
    {"name": "서울", "pop": 950},
    {"name": "부산", "pop": 340},
    {"name": "대구", "pop": 240},
    {"name": "인천", "pop": 295},
    {"name": "제주", "pop": 68},
]

# 인구 비례 원형 마커
for city in cities:
    if city["name"] in CITIES:
        m.add_circle(
            center=CITIES[city["name"]],
            radius=city["pop"] * 50,
            color='blue',
            fill=True,
            fill_opacity=0.5,
            popup=f"{city['name']}: {city['pop']}만명"
        )

m.show()

연습 3: 데이터 필터링

빈칸을 채워서 데이터를 필터링하세요!


연습 4: 데이터 정렬과 통계

빈칸을 채워서 데이터를 정렬하고 통계를 계산하세요!


연습 5: 산점도 그래프

빈칸을 채워서 산점도를 완성하세요!


📝 빈칸 채우기 연습

지도 시각화:

  • 지도 생성: Map(center=[위도, 경도], =7)
  • 마커 추가: m.add_ (좌표, popup='텍스트')
  • 원 추가: m.add_ (center=좌표, radius=반지름)
  • 지도 표시: m. ()

데이터 분석:

  • 리스트 필터링: [x for x in data if ]
  • 정렬: sorted(data, key=lambda x: x[ ])
  • 합계: (리스트)
  • 평균: sum(리스트) / (리스트)

🎯 퀴즈

퀴즈 1: 지도 시각화
지역별 인구 밀도를 색상으로 표현하려면 어떤 지도가 좋을까요?
퀴즈 2: 데이터 스토리텔링
효과적인 데이터 스토리텔링에 필요하지 않은 것은?
퀴즈 3: 상관관계
"아이스크림 판매량이 증가하면 익사 사고도 증가한다"는 데이터가 있습니다. 올바른 해석은?

🧪 파트 1: 데이터 구조 연습

연습 1-1: 딕셔너리 완성하기

빈칸을 채워서 부산 정보 딕셔너리를 완성하세요!


연습 1-2: 리스트에 데이터 추가

빈칸을 채워서 데이터를 추가하세요!


연습 1-3: 중첩 딕셔너리 접근

빈칸을 채워서 중첩 딕셔너리에서 값을 가져오세요!


🧪 파트 2: 데이터 분석 연습

연습 2-1: 리스트 컴프리헨션으로 필터링

빈칸을 채워서 영화를 필터링하세요!


연습 2-2: 데이터 정렬하기

빈칸을 채워서 데이터를 정렬하세요!


연습 2-3: 최대값과 최소값 찾기

빈칸을 채워서 최대/최소값을 찾으세요!


연습 2-4: 평균 계산하기

빈칸을 채워서 타입별 평균 파워를 계산하세요!


🧪 파트 3: 시각화 연습

연습 3-1: 막대 그래프 완성하기

빈칸을 채워서 막대 그래프를 완성하세요!


연습 3-2: 꺾은선 그래프 완성하기

빈칸을 채워서 꺾은선 그래프를 완성하세요!


연습 3-3: 원 그래프 완성하기

빈칸을 채워서 원 그래프를 완성하세요!


연습 3-4: 산점도 완성하기

빈칸을 채워서 산점도를 완성하세요!


🧪 파트 4: 지도 시각화 연습

연습 4-1: 여러 마커 추가하기

반복문으로 여러 마커를 지도에 추가해보세요!

미션: 여러 도시에 마커를 추가하세요

from leaflet_python import Map, CITIES

m = Map(center=[36.5, 127.5], zoom=7)

# 방문할 도시 목록
cities_to_visit = ['서울', '부산', '대구', '광주', '대전']

# 반복문으로 마커 추가
for city in cities_to_visit:
    if city in CITIES:
        m.add_marker(
            CITIES[city],
            popup=f"{city}",
            tooltip="클릭하세요"
        )

m.show()

연습 4-2: 조건에 따른 색상 변경

인구에 따라 다른 색상의 원을 표시해보세요!

미션: 인구에 따라 색상을 다르게 표시하세요

from leaflet_python import Map, CITIES

m = Map(center=[36.5, 127.5], zoom=7)

# 도시별 인구 데이터
cities = [
    {"name": "서울", "pop": 950},
    {"name": "부산", "pop": 340},
    {"name": "대구", "pop": 240},
    {"name": "인천", "pop": 295},
    {"name": "광주", "pop": 145},
]

# 인구에 따른 색상 결정
for city in cities:
    if city["name"] in CITIES:
        # 인구 500만 이상: 빨강, 300만 이상: 주황, 그 외: 파랑
        if city["pop"] >= 500:
            color = 'red'
        elif city["pop"] >= 300:
            color = 'orange'
        else:
            color = 'blue'

        m.add_circle(
            center=CITIES[city["name"]],
            radius=city["pop"] * 30,
            color=color,
            fill=True,
            fill_opacity=0.5,
            popup=f"{city['name']}: {city['pop']}만명"
        )

m.show()

연습 4-3: 선으로 경로 연결하기

도시들을 선으로 연결해보세요!

미션: 도시들을 선으로 연결하세요

from leaflet_python import Map, CITIES

m = Map(center=[36.5, 127.5], zoom=7)

# 여행 경로
route = ['서울', '대전', '대구', '부산']

# 경로를 좌표 리스트로 변환
route_coords = [CITIES[city] for city in route if city in CITIES]

# 선으로 연결
m.add_line(route_coords, color='red', weight=3)

# 각 도시에 마커 추가
for i, city in enumerate(route):
    if city in CITIES:
        m.add_marker(
            CITIES[city],
            popup=f"{i+1}. {city}"
        )

m.show()

🐛 파트 5: 디버깅 연습

디버깅 1: 딕셔너리 키 오류

_____를 올바른 키 이름으로 바꿔서 오류를 수정하세요!


디버깅 2: 리스트 인덱스 오류

_____를 올바른 인덱스로 바꿔서 오류를 수정하세요!


디버깅 3: 그래프 데이터 길이 불일치

_____를 채워서 데이터 개수를 맞추세요!


디버깅 4: 람다 함수 키 오류

_____를 올바른 키 이름으로 바꾸세요!


📝 추가 빈칸 채우기 연습

딕셔너리 사용:

  • 딕셔너리 생성: data =
  • 값 접근: data[ ]
  • 키 존재 확인: if '키' data:
  • 모든 키: data. ()

데이터 처리:

  • 필터링: [x for x in data if ]
  • 정렬: sorted(data, =lambda x: x['값'])
  • 최대값: (data, key=lambda x: x['값'])
  • 합계: ([d['값'] for d in data])

matplotlib 그래프:

  • 막대 그래프: plt. (x, y)
  • 꺾은선: plt. (x, y)
  • 원 그래프: plt. (values, labels=labels)
  • 산점도: plt. (x, y)

🎯 추가 퀴즈

퀴즈 4: 딕셔너리
딕셔너리에서 '나이'라는 키의 값을 가져오는 올바른 코드는?
퀴즈 5: 리스트 컴프리헨션
numbers = [1, 2, 3, 4, 5]에서 짝수만 선택하는 코드는?
퀴즈 6: 정렬
리스트를 내림차순(큰 것부터)으로 정렬하려면?
퀴즈 7: 지도 좌표
지도에서 서울(위도 37.5, 경도 127.0)을 나타내는 올바른 좌표 형식은?
퀴즈 8: 그래프 선택
시간에 따른 변화 추이를 보여주기에 가장 적합한 그래프는?

1. 지도 시각화 (Python)

항목 내용
무엇을 배우나요? 지리 데이터를 지도 위에 표현하기
핵심 개념 좌표계, GeoJSON, 코로플레스 지도

지도 시각화는 지리적 데이터를 시각적으로 표현하는 강력한 방법입니다. 학생들은 위도와 경도가 어떻게 위치를 나타내는지 배웁니다. 마커, 팝업, 다각형 등을 사용하여 정보를 지도 위에 표시합니다. GeoJSON 형식으로 지역 경계를 표현하고, 코로플레스 지도로 데이터를 색상으로 표현합니다. 이 기술은 날씨 앱, 배달 서비스, 선거 결과 시각화 등 실제 애플리케이션에서 널리 사용됩니다.


2. UFO 목격 데이터 연구소

항목 내용
무엇을 배우나요? 실제 UFO 목격 데이터 분석
핵심 개념 지도 시각화, 시계열 분석, 패턴 발견

실제 UFO 목격 신고 데이터를 분석합니다. 학생들은 지도 위에 UFO 목격 지점을 표시하고, 시간별/계절별 트렌드를 분석하며, UFO 모양별 분포를 시각화합니다. 흥미로운 주제를 통해 데이터 분석의 전체 과정을 경험합니다.

미션 분석 주제
UFO 목격 지도 위치 기반 시각화
시간별 트렌드 시계열 분석
UFO 모양 분석 카테고리 분석
계절별 패턴 주기성 발견
지역별 핫스팟 밀도 분석

3. 포켓몬 데이터 연구소

항목 내용
무엇을 배우나요? 게임 데이터 분석과 전략 수립
핵심 개념 다변량 분석, 비교 분석, 최적화

포켓몬 스탯 데이터를 분석합니다. "가장 강한 타입은?", "공격형 vs 방어형 포켓몬?", "전설의 포켓몬은 정말 강한가?" 같은 질문에 데이터로 답합니다. 학생들은 게임 밸런싱의 원리를 이해하고 데이터 기반 전략을 수립하는 방법을 배웁니다.

미션 분석 주제
타입별 능력치 그룹 비교 분석
세대별 변화 시계열 트렌드
전설 vs 일반 통계적 비교
최적 팀 구성 다변량 최적화

4. 할리우드 브랜드 전쟁

항목 내용
무엇을 배우나요? 영화 산업 데이터 분석
핵심 개념 비즈니스 분석, ROI, 트렌드 예측

영화 흥행 데이터를 분석합니다. "어떤 장르가 가장 수익성이 높은가?", "시리즈물 vs 오리지널?", "배우의 흥행 영향력?" 같은 비즈니스 질문을 탐구합니다. 학생들은 데이터 기반 의사결정의 실제 사례를 경험합니다.

미션 분석 주제
장르별 수익성 ROI 분석
스튜디오 경쟁 시장 점유율
시즌별 개봉 타이밍 전략
예산 vs 흥행 투자 효율성

데이터 스토리텔링이란?

숫자를 이야기로

데이터 스토리텔링은 단순히 그래프를 보여주는 것이 아니라, 청중이 행동하게 만드는 이야기를 구성하는 것입니다.

나쁜 예 좋은 예
"매출이 15% 증가했습니다" "우리 팀의 새 전략이 효과를 냈습니다. 매출이 15% 증가했고, 이 추세라면 연말 목표를 초과 달성할 수 있습니다."
그래프만 보여줌 핵심 포인트 강조 + 맥락 제공 + 다음 행동 제안

효과적인 데이터 스토리텔링의 3요소:

  1. 맥락 (Context) - 왜 이 데이터가 중요한가?
  2. 인사이트 (Insight) - 데이터가 말하는 핵심은 무엇인가?
  3. 행동 (Action) - 청중은 무엇을 해야 하는가?

이 코스를 마치면...

학습 성과

학생들은 다음 능력을 갖추게 됩니다:

  • 지도 위에 데이터를 시각화할 수 있음 (Folium)
  • 인터랙티브 그래프로 데이터를 탐색할 수 있음 (Plotly)
  • 실전 Dirty Data를 정제하고 분석할 수 있음
  • 데이터에서 인사이트를 발견할 수 있음
  • 발견한 인사이트를 설득력 있게 전달할 수 있음
  • 그래프를 비판적으로 평가하는 미디어 리터러시
  • 데이터 기반 의사결정의 원리를 이해함