[오늘의 문제] 데이터 시각화

shlim55·2025년 11월 21일

코딩테스트

목록 보기
180/223

꺾은 선 그래프로 날씨 정보 표현하기

일별 기온의 변화량을 효과적으로 살펴보기 위해서는 막대 그래프보다 꺾은 선 그래프가 더 유용합니다.

plt.plot 함수를 이용해 꺾은 선 그래프를 만들어보도록 하겠습니다.

지시사항

  1. 1일부터 31일까지의 기온을 표현해야 하므로, 꺾은선 그래프의 지점은 총 31개가 필요합니다.
x = range(31)
  1. 이제는 꺾은선의 높이를 설정할 기온 데이터가 필요합니다. 이 값은 코드에 미리 작성되어 있습니다.

데이터가 모두 준비되었으니, 꺾은선 그래프를 그려 보겠습니다.

내가 한 풀이

# 1. 라이브러리를 불러오세요.
import pandas as pd
import matplotlib.pyplot as plt
# 2. 31개의 데이터를 리스트 형태로 정의하세요.


temperatures = [
    31.0, 31.8, 25.7, 23.1, 26.9, 30.1,
    29.1, 29.8, 29.2, 29.2, 27.5, 32.5,
    31.5, 33.5, 34.5, 35.2, 32.8, 34.1,
    30.5, 31.8, 35.3, 35.9, 35.8, 36.5,
    35.4, 35.4, 35.7, 34.7, 33.3, 35.4,
    34.3,
]
# 1. 1일부터 31일까지의 기온을 표현해야 하므로, 꺾은선 그래프의 지점은 총 31개가 필요합니다.
x = range(31)

# 2. 이제는 꺾은선의 높이를 설정할 기온 데이터가 필요합니다. 이 값은 코드에 미리 작성되어 있습니다


# 꺾은선 그래프를 그립니다.
plt.xlabel("일")
plt.ylabel("기온")
plt.plot(x, temperatures)

막대 그래프로 날씨 정보 표현하기

2021년 7월 1일부터 31일까지의 서울시의 일별 최고기온을 막대 그래프로 그려보겠습니다.

지시사항

  1. 먼저, 각 막대의 위치를 결정할 x축 리스트를 생성해야 합니다. 막대의 위치는 0부터 1씩 증가하는 정수로 선언됩니다. 즉, 10개의 막대를 빈 칸 없이 그리고 싶다면 0부터 9까지의 리스트를 생성하면 됩니다.
  • 1일부터 31일까지의 기온을 표현해야 하므로 막대는 31개가 필요합니다.
x = range(31)
  1. 이제는 막대의 높이를 설정할 기온 데이터가 필요합니다. 이 값은 코드에 미리 작성되어 있습니다.

데이터가 모두 준비되었으니, 막대 그래프를 그려봅시다!

내가 한 풀이

import matplotlib.pyplot as plt

# 각 막대의 위치를 결정할 리스트를 생성합니다.
x = range(31)

# 각 일 별 최고기온입니다.
# 2. 이제는 막대의 높이를 설정할 기온 데이터가 필요합니다. 이 값은 코드에 미리 작성되어 있습니다.
temperatures = [
    31.0, 31.8, 25.7, 23.1, 26.9, 30.1,
    29.1, 29.8, 29.2, 29.2, 27.5, 32.5,
    31.5, 33.5, 34.5, 35.2, 32.8, 34.1,
    30.5, 31.8, 35.3, 35.9, 35.8, 36.5,
    35.4, 35.4, 35.7, 34.7, 33.3, 35.4,
    34.3,
]


# 막대 그래프를 그립니다.
plt.bar(x, temperatures)

OECD 자동차 재고 그래프

Matplotlib를 이용하여 데이터 자료를 시각화하려고 합니다.

OECDGas.csv파일 내의 컬럼에 대한 설명은 다음과 같습니다.

컬럼 명	형식	내용
country	문자	나라 이름
year	숫자	년도
gas	숫자	자동차 1대 기준 휘발류 소비량
income	숫자	1인 기준 실질 소득
price	숫자	휘발류 가격
cars	숫자	1인 기준 자동차 재고

지시사항을 참고하여 코드를 작성하세요.

지시사항

  1. OECDGas.csv 파일을 pandas 라이브러리를 이용하여 불러옵니다.
  2. 꺾은선 그래프를 그려 데이터를 시각화합니다.
  • x 축: country가 "Turkey"인 경우의 year로 설정합니다.
  • y 축: country가 "Turkey"인 경우의 cars로 설정합니다.

내가 한 풀이

import matplotlib.pyplot as plt
import pandas as pd

fig, ax = plt.subplots()

# 데이터를 읽으세요.
df = pd.read_csv('OECDGas.csv')
# - x 축: country가 "Turkey"인 경우의 year로 설정합니다.
# - y 축: country가 "Turkey"인 경우의 cars로 설정합니다.
print(df.head()) # country 범주형 데이터
# country 컬럼의 각 고유 값의 빈도를 확인
print(df['country'].value_counts())
# 아하! 여러 나라들이 담겨있구나!
# 그 중에서 터키 나라를 원하는구나
# country가 Turkey인 행을 필터링 
x = df[df['country'] == 'Turkey']['year'] # 그중에서 연도컬럼 추출 
y = df[df['country'] == 'Turkey']['cars'] # 1인 기준 자동차 재고 컬럼 추출

# 그래프를 그리고 출력하세요!
plt.plot(x, y) # 주피터에선 show 없이 그래프 출력 가능 단, 여러개일 때는 show 사용

# 1. 문제(하고자 하는 것)을 정확히 파악할 것
# 2. 데이터의 대략적인 정보를 파악해야 함 (데이터 살펴보기) 
# 3. 이 문제에 필요한 x 데이터와 y 데이터를 정의하고 추출 
# 4. 이 문제에 맞는 시각화 유형을 선택하고, 그리면 됨 

country year gas income price cars
0 Austria 1960 4.173244 -6.474277 -0.334548 -9.766840
1 Austria 1961 4.100989 -6.426006 -0.351328 -9.608622
2 Austria 1962 4.073177 -6.407308 -0.379518 -9.457257
3 Austria 1963 4.059509 -6.370679 -0.414251 -9.343155
4 Austria 1964 4.037689 -6.322247 -0.445335 -9.237739
country
Austria 19
Belgium 19
Canada 19
Denmark 19
France 19
Germany 19
Greece 19
Ireland 19
Italy 19
Japan 19
Netherlands 19
Norway 19
Spain 19
Sweden 19
Switzerland 19
Turkey 19
UK 19
USA 19
Name: count, dtype: int64

월드컵 우승국가 시각화

“월드컵 우승국들의 현황은 어떻게 될까?”

역대 월드컵 우승국가들에 대한 정보가 담긴 CSV 파일이 있습니다. 앞서 배운 그래프들을 활용해서 월드컵 우승 빈도가 가장 높은 국가가 어디인지 시각화를 통해서 알아봅시다.

월드컵 우승국 데이터가 CSV 파일로 저장되어 있어요. 우리는 CSV 파일을 읽어서 월드컵 우승국들의 빈도를 그래프로 시각화해보고자 합니다!

월드컵 국가 별 우승 횟수를 딕셔너리로 저장하여 해당 데이터를 출력하고, 딕셔너리 데이터를 입력하여 그래프를 출력해야 합니다.

WorldCups.csv 파일의 변수를 직접 확인해보세요.

변수명	의미
Year	개최연도
Country	개최국
Winner	우승국
Runners-Up	2위 국가
Third	3위 국가
Fourth	5위 국가
GoalsScored	득점 수
QualifiedTeams	참가국
MatchesPlayed	경기 수
Attendance	관중 수

지시사항

  1. 월드컵 데이터에서 “우승국”을 의미하는 컬럼을 가져와 winners 변수에 저장합니다.

  2. 국가별 우승 횟수를 딕셔너리로 나타내야 합니다. winners에는 역대 월드컵 국가들이 저장되어 있으므로, 반복문을 통해 winners를 순회하며 딕셔너리에 추가시킵니다.

  • 딕셔너리에 현재 국가가 존재하면 1씩 증가
  • 딕셔너리에 현재 국가가 없으면 해당 국가에 대해 1로 초기화
  1. X축은 우승국, Y축은 우승 횟수를 나타내는 막대 그래프를 그려봅시다!
  • X 라벨은 'Country'
  • Y 라벨은 'Number'

출력 예시

{'Uruguay': 2, 'Italy': 4, 'Germany FR': 3, 'Brazil': 5, 'England': 1, 'Argentina': 2, 'France': 1, 'Spain': 1, 'Germany': 1}

내가 한 풀이

import pandas as pd
from matplotlib import pyplot as plt

plt.rcParams['font.family'] ='Malgun Gothic'
plt.rcParams["axes.unicode_minus"] = False

# CSV 파일을 읽어서 시각화 해보세요
df = pd.read_csv('WorldCups.csv')

winners = df.loc[ :,'Winner'] # 읽어온 데이터 프레임 중 "우승국"을 의미하는 컬럼을 추출세요.
# 이렇게 설정해야 i의 값이 우승국가 명
winner_dict = {}  # 국가 별 우승 횟수를 나타내는 딕셔너리 입니다.
print("위너 딕셔너리", winner_dict)

for i in winners:  # 우승국을 반복문으로 읽으며, 해당 국가의 우승 횟수를 1씩 증가시킵니다.
    # print(f"{i}의 값은?")
    if i in winner_dict: # 키값이 0,1,2,3.. 이고 밸류값이 국가인 딕셔너리 
        # 반복문안에서 키, 밸류값을 채우는 형태
        winner_dict[i] += 1
        # i(우승국)가 이미 winner_dict에 있다면, value를 1 증가시킵니다.
    else:
        winner_dict[i] = 1
        # i(우승국)가 winner_dict에 최초로 등장한다면, value를 1로 설정합니다.

# 결과 딕셔너리를 출력합니다.
print("결과 위너 딕셔너리",winner_dict)

X = list(winner_dict.keys())  # X축 변수, 즉 우승국을 나타냅니다.
Y = list(winner_dict.values())  # Y축 변수, 즉 우승 횟수를 나타냅니다.


# 막대 그래프를 그려봅시다
fig, ax = plt.subplots(figsize=(8, 8))
ax.set_title('나라별 우승 횟수')
ax.bar(X,Y)
ax.set_xlabel('나라')
ax.set_xlabel('우승횟수')

위너 딕셔너리 {}
결과 위너 딕셔너리 {'Uruguay': 2, 'Italy': 4, 'Germany FR': 3, 'Brazil': 5, 'England': 1, 'Argentina': 2, 'France': 1, 'Spain': 1, 'Germany': 1}
Text(0.5, 0, '우승횟수')

서울시 지역 구분별 인구수 비교 및 시각화

2023년 서울시의 지역, 연령별 인구수 데이터를 다양한 그래프를 통해 시각화하고 비교합니다.

2023년 서울시 지역구별 인구수 데이터가 data_seoul_population.csv 으로 저장되어 있습니다. 서울시 인구수 데이터가 데이터프레임 형태로 불려와 df에 저장되어 있습니다.

서울시의 각 구를 키로, 위치에 따른 지역 구분을 값으로 가지는 딕셔너리 area가 있습니다.

아래 지시사항을 따라 데이터를 가공하고 시각화하는 과정을 수행하세요.

지시사항

  1. 데이터프레임 df에 “지역구분” 컬럼을 생성하고 “지역구”컬럼을 활용하여 각 구별로 맞는 지역구분 값을 저장하세요. (딕셔너리 area를 활용하세요)

  2. groupby()를 활용하여 “지역구분”을 기준으로 “10대 미만”과 “10대” 컬럼 각각의 합을 정리한 데이터프레임을 df2에 저장하세요.

  3. df2를 활용하여 “지역구분” 별 “10대”인구수 총 합을 막대그래프로 그려보세요.

내가 한 풀이

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

plt.rcParams['font.family'] = 'NanumGothic'
plt.rcParams['axes.unicode_minus'] = False  # 음수 기호 깨짐 방지

# 데이터프레임 df에 서울시 인구수 데이터 저장
df = pd.read_csv('data_seoul_population.csv')

# 지역구와 지역 구분이 mapping되어있는 dictionary
area = {"은평구": "서북권", "서대문구": "서북권", "마포구": "서북권", "종로구": "도심권", "중구": "도심권", "용산구": "도심권", "동대문구": "동북권", "성동구": "동북권", "성북구": "동북권", "중랑구": "동북권", "광진구": "동북권", "강북구": "동북권", "도봉구": "동북권", "노원구": "동북권", "강서구": "강서", "양천구": "강서", "구로구": "강서", "영등포구": "영등포", "구로구": "영등포", "금천구": "영등포", "동작구": "영등포", "관악구": "영등포", "강남구": "동남권(강남)", "서초구": "동남권(강남)", "송파구": "동남권(강남)", "강동구": "동남권(강남)"}

# 지시사항1
df["지역구분"] = df['지역구'].map(area) 
print(df["지역구분"])
# # 지시사항2
df2 = df.groupby('지역구분')[["10대 미만", "10대"]].sum() # groupby()를 활용하여 “지역구분”을 기준으로 “10대 미만”과 “10대” 컬럼 각각의 합을 정리한 데이터프레임을 df2에 저장하세요.

# # 지시사항3
# Hint: df2.index를 통해 df2의 index인 "지역구분"을 불러올 수 있습니다
# # df2.index('지역구분')

# # 올바르게 지시사항을 수행했는지 확인해보세요
print(df2)

fig, ax = plt.subplots(figsize=(8, 8))
ax.set_title('서울시 지역 구분별 인구수 비교')
ax.bar(df2.index, df2['10대'])
ax.set_xlabel('지역')
ax.set_ylabel('합')

0 종로구
1 중구
2 용산구
3 성동구
4 광진구
5 동대문구
6 중랑구
7 성북구
8 강북구
9 도봉구
10 노원구
11 은평구
12 서대문구
13 마포구
14 양천구
15 강서구
16 구로구
17 금천구
18 영등포구
19 동작구
20 관악구
21 서초구
22 강남구
23 송파구
24 강동구
Name: 지역구, dtype: object

붓꽃 꽃잎 길이 그래프

Seaborn을 이용하여 데이터 자료를 시각화하려고 합니다.

붓꽃의 정보가 담긴 iris.csv 파일 내의 칼럼에 대한 설명은 다음과 같습니다.

컬럼명형식내용
sepal_length숫자꽃받침 길이
sepal_width숫자꽃받침 너비
petal_length숫자꽃잎 길이
petal_width숫자꽃잎 너비
species문자꽃의 종류

지시사항을 참고하여 코드를 작성하세요.

지시사항

  1. iris.csv 파일을 pandas 라이브러리를 이용하여 불러옵니다.
  2. seaborn 을 사용해 히스토그램 그래프를 그려 데이터를 시각화합니다.
  • x 축: petal_length 를 기준으로 설정합니다.
  • 구간을 10개로 나누어 그래프를 그립니다.

내가 한 풀이

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

fig, ax = plt.subplots()

# 지시사항을 참고하여 코드를 작성하세요.

# 1. iris.csv 파일을 pandas 라이브러리를 이용하여 불러옵니다.
df = pd.read_csv('iris.csv')
df
# 2. seaborn 을 사용해 히스토그램 그래프를 그려 데이터를 시각화합니다.
sns.histplot(data=df, x = df['petal_length'], bins=10)
# - x 축: petal_length 를 기준으로 설정합니다.
# - 구간을 10개로 나누어 그래프를 그립니다.

# 히스토그램을 그려보세요

<Axes: xlabel='petal_length', ylabel='Count'>

식당별 메뉴 데이터 시각화

주어지는 “food.csv”에는 식당별 메뉴의 영양 성분과 칼로리에 대한 정보가 저장되어 있습니다.

변수의미설명
restaurant식당Text
item음식Text
calories칼로리Numeric
total_fat총 지방Numeric
sat_fat포화지방Numeric
trans_fat트랜스지방Numeric
cholesterol콜레스테롤Numeric
sodium나트륨Numeric
total_carb총 탄수화물Numeric
fiber식이섬유Numeric
sugarNumeric
protein단백질Numeric

지시사항과 기본적으로 주어진 코드의 주석을 참고하여 None 부분을 채워 함수를 완성하세요.

지시사항

  1. make_bar(df: pd.DataFrame) : 막대 그래프 그리기
  • 인자로 전달받은 df는 food.csv 데이터입니다.
  • 식당(restaurant)에 따른 평균 칼로리(calories)에 대한 막대 그래프를 그립니다.
  • x축에는 식당(restaurant), y축에는 평균 칼로리(calories)로 그래프를 작성합니다.
  • 인덱스를 값으로 추출하는 방법은 다음과 같습니다.
df.index​
  • x축과 y축에 각각 Restaurant와 Average Calories의 라벨을 달아 출력합니다.

내가 한 풀이

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd

# 시각화 한글 깨짐 방지 설정
plt.rcParams['font.family'] ='Malgun Gothic'
plt.rcParams["axes.unicode_minus"] = False

def make_bar(df: pd.DataFrame):
    """matplotlib.pyplot 라이브러리를 이용해 레스토랑 별 평균 칼로리를 bar 그래프로 그립니다."""
    
    # df = pd.read_csv('food.csv')
    y = df.groupby('restaurant')['calories'].mean()
    x = y.index
   
    # x,y를 이용해 그래프를 그립니다.   
    fig, ax = plt.subplots(figsize=(8, 8))
    ax.set_title('식당별 메뉴 데이터')
    ax.bar(x, y)
    ax.set_xlabel('식당')
    ax.set_ylabel('평균 칼로리')
    return x, y

# 데이터 불러오기
df = pd.read_csv('food.csv')

# 식당별 평균 칼로리 막대 그래프 그리기
make_bar(df)

(Index(['Arbys', 'Burger King', 'Chick Fil-A', 'Dairy Queen', 'Mcdonalds',
'Sonic', 'Subway', 'Taco Bell'],
dtype='object', name='restaurant'),
restaurant
Arbys 532.727273
Burger King 576.000000
Chick Fil-A 352.000000
Dairy Queen 520.238095
Mcdonalds 640.350877
Sonic 631.698113
Subway 503.020833
Taco Bell 443.652174
Name: calories, dtype: float64)

항공편 데이터 시각화

데이터를 불러오고 데이터 간의 상관관계를 분석합니다.

주어지는 "airplane.csv"에는 항공편에 대한 정보를 포함하고 있습니다.

컬럼명의미
airline항공사
flight항공편 번호
source_city출발지 도시
departure_time출발 시간
stops경유지 수
arrival_time도착 시간
destination_city도착지 도시
class항공편 등급
duration소요 시간 (시간 단위)
days_left출발까지 남은 일수
price가격

지시사항과 기본적으로 주어진 코드의 주석을 참고하여 None 부분을 채워 함수를 완성하세요.

지시사항

  1. make_plot(df: pd.DataFrame) : 선 그래프 그리기
  • 인자로 전달받은 df는 airplane.csv 데이터입니다.
  • 출발까지 남은 일수(days_left)에 따른 평균 가격(price)에 대한 그래프를 그립니다.
  • x축에는 출발까지 남은 일수(days_left), y축에는 평균 가격(price)로 그래프를 작성합니다.
  • 인덱스를 값으로 추출하는 방법은 다음과 같습니다.
df.index​
  • x축과 y축에 각각 "days_left"와 "mean_price"의 라벨을 달아 출력합니다.

내가 한 풀이

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd

def make_plot(df: pd.DataFrame):
    """matplotlib.pyplot 라이브러리를 이용해 출발까지 남은 일수에 따른 평균 가격을 plot 그래프로 그립니다."""

    # df = None
     # x,y를 이용해 그래프를 그리고 출력해봅시다.
    # - 출발까지 남은 일수(days_left)에 따른 평균 가격(price)에 대한 그래프를 그립니다.
    # - x축에는 출발까지 남은 일수(days_left), y축에는 평균 가격(price)로 그래프를 작성합니다.
    # - 인덱스를 값으로 추출하는 방법은 다음과 같습니다.
    y = df.groupby('days_left')['price'].mean()
    x = y.index
    fig, ax = plt.subplots(figsize=(8, 8))
    ax.set_title('식당별 메뉴 데이터')
    ax.plot(x, y)
    ax.set_xlabel('식당')
    ax.set_ylabel('평균 칼로리')

    return x, y

# 데이터 불러오기
df = pd.read_csv('airplane.csv')

# 출발까지 남은 일수에 따른 평균 가격 그래프 그리기
make_plot(df)

(Index([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
dtype='int64', name='days_left'),
days_left
1 21581.954223
2 30283.758305
3 28988.829866
4 25690.122716
5 26763.257762
6 24945.814842
7 25606.468566
8 25080.042701
9 25716.509030
10 25504.164401
11 22983.308898
12 22526.716779
13 22531.186519
14 22732.086155
.
.

profile
Normal Programmer

0개의 댓글