Pandas와 Matplotlib를 이용한 데이터 시각화 예제 (세계 top10 인구 변화)

PandasMatplotlib을 이용하여 세계 상위 10개국의 인구 변화를 line plot으로 시각화하는 예제를 만들어 보도록 하자.

시각화를 위해 jupyter notebook을 사용하였다.

0. 데이터 출처

세계 인구 데이터Kaggle에서 다운로드 받아서 사용할 수 있다.

1. 데이터 준비

import sys
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams.update(
    {
        "font.family": "AppleGothic" if sys.platform == "darwin" else "Malgun Gothic",
        "font.size": 8,
        "figure.figsize": (12, 6),
        "axes.unicode_minus": False,
    }
)

# 데이터의 경로는 상황에 맞게 변경
origin = pd.read_csv("./world_population_data.csv", index_col=0)
origin.head()

출력 결과 확인 (상위 5개)

cca3 country continent 2023 population 2022 population 2020 population 2015 population 2010 population 2000 population 1990 population 1980 population 1970 population area (km²) density (km²) growth rate world percentage
rank
1 IND India Asia 1428627663 1417173173 1396387127 1322866505 1240613620 1059633675 870452165 696828385 557501301 3287590.00 481 0.81% 17.85%
2 CHN China Asia 1425671352 1425887337 1424929781 1393715448 1348191368 1264099069 1153704252 982372466 822534450 9706961.00 151 -0.02% 17.81%
3 USA United States North America 339996563 338289857 335942003 324607776 311182845 282398554 248083732 223140018 200328340 9372610.00 37 0.50% 4.25%
4 IDN Indonesia Asia 277534122 275501339 271857970 259091970 244016173 214072421 182159874 148177096 115228394 1904569.00 148 0.74% 3.47%
5 PAK Pakistan Asia 240485658 235824862 227196741 210969298 194454498 154369924 115414069 80624057 59290872 881912.00 312 1.98% 3.00%

234 rows × 16 columns

2. 데이터 전처리

상위 10개국의 데이터만 추출하고 연도의 컬럼을 reverse(반전) 시킨다.

# rank 순으로 이미 정렬이 되어있기 때문에 따로 처리 없이 인덱스를 cca3(국가코드)로 변경
df = origin.copy().head(10).set_index("cca3")
# 모든 컬럼 반전
df = df[df.columns[::-1]]
df

출력 결과 확인

world percentage growth rate density (km²) area (km²) 1970 population 1980 population 1990 population 2000 population 2010 population 2015 population 2020 population 2022 population 2023 population continent country
cca3
IND 17.85% 0.81% 481 3287590.0 557501301 696828385 870452165 1059633675 1240613620 1322866505 1396387127 1417173173 1428627663 Asia India
CHN 17.81% -0.02% 151 9706961.0 822534450 982372466 1153704252 1264099069 1348191368 1393715448 1424929781 1425887337 1425671352 Asia China
USA 4.25% 0.50% 37 9372610.0 200328340 223140018 248083732 282398554 311182845 324607776 335942003 338289857 339996563 North America United States
IDN 3.47% 0.74% 148 1904569.0 115228394 148177096 182159874 214072421 244016173 259091970 271857970 275501339 277534122 Asia Indonesia
PAK 3.00% 1.98% 312 881912.0 59290872 80624057 115414069 154369924 194454498 210969298 227196741 235824862 240485658 Asia Pakistan
NGA 2.80% 2.41% 246 923768.0 55569264 72951439 95214257 122851984 160952853 183995785 208327405 218541212 223804632 Africa Nigeria
BRA 2.70% 0.52% 26 8515767.0 96369875 122288383 150706446 175873720 196353492 205188205 213196304 215313498 216422446 South America Brazil
BGD 2.16% 1.03% 1329 147570.0 67541860 83929765 107147651 129193327 148391139 157830000 167420951 171186372 172954319 Asia Bangladesh
RUS 1.80% -0.19% 9 17098242.0 130093010 138257420 148005704 146844839 143242599 144668389 145617329 144713314 144444359 Europe Russia
MEX 1.60% 0.75% 66 1964375.0 50289306 67705186 81720428 97873442 112532401 120149897 125998302 127504125 128455567 North America Mexico

3. 데이터 시각화

# filter를 이용하여 컬럼명에 population이 포함된 컬럼만 추출한다.
# 속성 T는 transpose() 메서드에 대한 약어로 행과 열을 바꾼다.
plt.plot(df.filter(like="population").T, marker="o", label=df.index)

# 그래프의 제목
plt.title("연도에 따른 인구수 변화 (세계 인구 top10)")

# x축 라벨
plt.xlabel("연도")

# y축 라벨
plt.ylabel("인구수")

# y축 눈금 설정 (1e8은 1억을 의미하고 이를 15번 반복하면서 15억까지 표시한다.)
plt.yticks([1e8 * i for i in range(1, 16)], [f"{i}억명" for i in range(1, 16)])

# 그리드 표시
plt.grid()

# 범례 표시
plt.legend(title="국가", loc="upper left", bbox_to_anchor=(1, 1))

# 그래프 출력
plt.show()
plt.close()

출력 결과 확인

Alt text

4. 최종 코드

import sys
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams.update(
    {
        "font.family": "AppleGothic" if sys.platform == "darwin" else "Malgun Gothic",
        "font.size": 8,
        "figure.figsize": (12, 6),
        "axes.unicode_minus": False,
    }
)

origin = pd.read_csv("./world_population_data.csv", index_col=0)

df = origin.copy().head(10).set_index("cca3")
df = df[df.columns[::-1]]

plt.plot(df.filter(like="population").T, marker="o", label=df.index)

plt.title("연도에 따른 인구수 변화 (세계 인구 top10)")
plt.xlabel("연도")
plt.ylabel("인구수")

plt.yticks([1e8 * i for i in range(1, 16)], [f"{i}억명" for i in range(1, 16)])
plt.grid()
plt.legend(title="국가", loc="upper left", bbox_to_anchor=(1, 1))
plt.show()
plt.close()

Leave a comment