AI/ML(모두의 데이터 과학) - 6장 연습문제 : 국내 총생산 vs 알코올 소비량

 

각 국가들의 GDP와 알코올 소비량 관계 분석

6장 연습문제 : 국내 총생산 vs 알코올 소비량


문제 내용

위키피디아에는 1인당 알코올 소비량과 국가별 1인당 국내 총생산 등 다양한 인구통계 데이터가 들어있다. 이 데이터를 사용해서 GDP 기준(평균 이상 vs 평균 이하)과 알코올 소비량 기준(평균 이상 vs 평균 이하)으로 교차 집계하는 프로그램을 짜 보자. 두 기준이 서로 연관되어 있는지 판단해보자.

GDP 자료 : goo.gl/RUiLoa 알코올 소비량 자료 : goo.gl/qZZvNg

자료 만들기

  • 일단 바로 다운로드할 수 있는 방법은 없는 것 같아 필요한 자료를 복사해 엑셀에 붙여넣고 CSV 파일로 생성
  • Pandas로 읽어와 데이터 프레임으로 만든다.
import pandas as pd
import numpy as np

gdp = pd.read_csv("gdp.csv")
alco = pd.read_csv("alchol.csv")

gdp.info()
'''출력
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 196 entries, 0 to 195
Data columns (total 3 columns):
 #   Column             Non-Null Count  Dtype
---  ------             --------------  -----
 0   Rank               196 non-null    object
 1   Country/Territory  196 non-null    object
 2   Int$               196 non-null    object
dtypes: object(3)
memory usage: 4.7+ KB
'''

alco.info()
'''출력
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 189 entries, 0 to 188
Data columns (total 10 columns):
 #   Column                  Non-Null Count  Dtype
---  ------                  --------------  -----
 0   Country                 189 non-null    object
 1   Total                   189 non-null    float64
 2   Recorded consumption    189 non-null    float64
 3   Unrecorded consumption  189 non-null    float64
 4   Beer(%)                 179 non-null    float64
 5   Wine(%)                 179 non-null    float64
 6   Spirits(%)              179 non-null    float64
 7   Other(%)                179 non-null    float64
 8   2020 projection         189 non-null    float64
 9   2025 projection         188 non-null    float64
dtypes: float64(9), object(1)
memory usage: 14.9+ KB
'''
  • GDP.csv에 포함된 GDP 금액 값에 ,가 포함되어 있고 수치형 데이터가 아니므로 이를 처리해준다.
# GDP 컬럼의 값들에 포함된 , 제거
gdp["Int$"] = gdp["Int$"].str.replace(',', '')

# 수치형으로 변환
gdp["Int$"] = pd.to_numeric(gdp["Int$"], errors='coerce')

gdp["Int$"].info()
'''출력
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 196 entries, 0 to 195
Data columns (total 3 columns):
 #   Column             Non-Null Count  Dtype
---  ------             --------------  -----
 0   Rank               196 non-null    object
 1   Country/Territory  196 non-null    object
 2   Int$               196 non-null    int64
dtypes: int64(1), object(2)
memory usage: 4.7+ KB
'''
  • GDP 데이터에 평균값을 기준으로 평균 초과 vs 평균 이하를 구분하는 값을 가진 컬럼을 추가해준다.
gdp_mean = gdp["Int$"].mean()
gdp_mean
'''출력
21701.367346938776
'''

# 각각의 GDP를 GDP 평균(gdp_mean)과 비교하여 평균보다 크면 1을 평균 이하이면 0을 리턴한다.
# 이렇게 만들어진 컬럼을 gdp 데이터프레임에 추가한다.

def mean_division (x, mean) :
    if x > mean:
        return 1
    return 0

gdp["Mean Division"] = gdp["Int$"].apply(lambda x: mean_division(x, gdp_mean))

# 컬럼 이름도 바꿔주자
gdp.columns = ["Rank", "Country", "GDP", "Mean Division(GDP)"]
  • GDP 데이터를 평균 기준으로 나눈 자료를 그래프로 표시해보자. seaborn을 사용했다.
import matplotlib.pyplot as plt
import seaborn as sns

plt.rcParams["figure.figsize"] = (12, 9)
sns.countplot(x="Mean Division(GDP)", data=gdp)

Image

  • 알코올 데이터는 수치형 데이터로 되어있기는 하지만 결측값이 있다. 임의의 값을 넣기는 좀 그러니 행을 제거해버리자.
# 결측치가 있는 행 모두 삭제 처리
alco.dropna()
  • 평균을 구하고 편균을 기준으로 구분한 구분자 컬럼을 추가하고 그래프를 그리는 것 까지 이전과 동일하다.
alco_mean = alco["Total"].mean()

alco["Mean Division"] = alco["Total"].apply(lambda x: mean_division(x, alco_mean))

sns.countplot(x="Mean Division", data=alco)

Image

  • 이제 국가명을 기준으로 두 데이터 프레임을 합쳐보자.
merged_df = pd.merge(gdp, alco, how="outer", on="Country")
  • 마지막으로 GDP 기준 그래프에 알코올 소비량이 비교되도록 그래프를 그려보자
sns.countplot(x="Mean Division(GDP)", hue="Mean Division", data=merged_df)

Image

제대로 한 건가 모르겠다…-.-