본문 바로가기
데이터 분석

세계 GDP 분석(4)

by 너굴맨_ 2021. 11. 2.
더보기

비슷한 GDP, GDP 성장률을 가진 국가끼리 모아보자

2020년도 GDP, GDP growth 별로 모아보자

# GDP growth와 결합을 위해 분석(1)에서 사용한 gdp.csv 호출
gdp = pd.read_csv("C:\\Users\\USER\\Desktop\\Data\\gdp.csv")

gdp_2020 = gdp.loc[:,['Country Name','2020']]

# 컬럼 이름 변경
gdp_2020.rename(columns = {'2020':'GDP_2020'}, inplace = True)
gdp_growth_2020.rename(columns = {'2020':'GDP_Growth_2020'}, inplace = True)

# 데이터 결합
new_data = pd.merge(gdp_growth_2020, gdp_2020, how ='left', left_on='Country Name', right_on='Country Name')

new_data

  • new_data에 대한 plot을 그려보자
X = new_data.iloc[:,[1,2]].values 
m = X.shape[0]  # 집합의 갯수 (266)
n = X.shape[1] # 특징의 개수 (2가지)

plt.scatter(X[:,0],X[:,1],c='black',label='Country')
plt.xlabel('GDP_Growth')
plt.ylabel('GDP (1billion $)')
plt.legend()
plt.title('2020_GDP')
plt.show()

※ 문제발생 및 해결방안

  1. 국가나 도시와 관련 없는 지표값이 포함되어 이후 진행할 KMeans의 Centroid 값에 크게 영향을 미치므로 제거한다.-> 지표를 직접 확인하며 제거해야 하므로 엑셀 시트에서 제거 후 다시 데이터 업로드
  2. NAN 값과 측정되지 않은 값(0으로 표기)이 상당수 포함되어 있으므로 이를 제거한다.
# 문제 1 해결
new_gdp_2020 = pd.read_csv("C:\\Users\\USER\\Desktop\\Data\\gdp_2020.csv")

# 문제 2 해결  (GDP_2020 = 0인 값 제외)
idx = new_gdp_2020[new_gdp_2020['GDP_2020'] == 0].index
new_gdp_2020 = new_gdp_2020.drop(idx)

# 결합
analysis_2020_gdp = pd.merge(gdp_growth_2020, new_gdp_2020, how ='left', left_on='Country Name', right_on='Country Name')

# nan이 존재하는 행 삭제
analysis_2020_gdp = analysis_2020_gdp.dropna(axis=0)

analysis_2020_gdp

위의 과정을 통해 266개인 행이 179로 감소한 것을 확인할 수 있다.

위의 문제를 해결하였으니 다시 진행한다.

# 다시 설정
X = analysis_2020_gdp.iloc[:,[1,2]].values 
m = X.shape[0]  # 집합의 갯수 (179)
n = X.shape[1] # 특징의 개수 (2가지)

plt.scatter(X[:,0],X[:,1],c='blue',label='Country')
plt.xlabel('GDP_Growth')
plt.ylabel('GDP (1billion $)')
plt.legend()
plt.title('2020_GDP')
plt.show()

수정 전 보다 GDP 값의 폭이 줄었으나 미국과 중국의 GDP 값이 다른 국가 및 도시에 비해 너무 커서 분석의 주제인 GDP와 GDP Growth를 가진 국가를 모으는데 방해가 되므로 미국과 중국을 제외하고 다시 진행

 

# 미국 제외
analysis_2020_gdp = analysis_2020_gdp[analysis_2020_gdp['Country Name'] !='United States']
# 중국 제외
analysis_2020_gdp = analysis_2020_gdp[analysis_2020_gdp['Country Name'] !='China']

X = analysis_2020_gdp.iloc[:,[1,2]].values 
m = X.shape[0]  # 집합의 갯수 (177) # 미국, 중국 제외
n = X.shape[1] # 특징의 개수 (2가지)

plt.scatter(X[:,0],X[:,1],c='blue',label='Country')
plt.xlabel('GDP_Growth')
plt.ylabel('GDP (1billion $)')
plt.legend()
plt.title('2020_GDP')
plt.show()

GDP 폭도 상당히 줄었으며 어느정도 분석하는 과정에 있어 문제점이 없다고 판단된다.

- KMeans Cluster 알고리즘으로 군집 형성하기

해야할 일 

  1. 클러스터 수 (k)를 정하기
  2. 반복 수 정하기
  3. 클러스터 중심값을 저장하기 위한 (2, 0)의 2차원 배열 생성
  4. 데이터와 클러스터 중심간의 유클리드 거리 계산하기
  5. 2~4의 과정을 반복하며 K 클러스터 중심 갱신
## 1. 클러스터 수 정하기
import random as rd

k = 4  # 4개의 클러스터

## 2. 반복 수 정하기
n_iter = 300

## 3. 클러스터 중심값을 저장하기 위한 2차원 배열 생성
Centroids=np.array([]).reshape(n,0) # 클러스터 중심 초기화
Centroids # shape=(2, 0)  # 특징의 수

for i in range(k): # 0, 1, 2, 3, 4,  # 군집의 수
    rand=rd.randint(0,m-1) # 0과 177사이 난수 생성
    Centroids=np.c_[Centroids,X[rand]] # 클러스터 중심(열) 추가

Centroids # K개 클러스터 중심 초기값.
## 4. 데이터와 클러스터 중심간의 유클리드 거리 계산하기
# 이를 위해 계산 값을 저장할 배열을 아래와 같이 생성
euclid_dist = np.array([]).reshape(m,0)

# numpy의 broadcast를 사용하여 shape가 다른 배열을 계산
temp_dist = np.sum((X-Centroids[:,0])**2, axis=1)

# 유클리드 거리 배열은 (177,1)이 됨
np.c_[euclid_dist, temp_dist]

반복횟수 만큼 유클리드 거리가 최소가 되는 k 클러스터 할당하여 k 클러스터 중심을 갱신한다.

for i in range(n_iter): # n_iter 반복 횟수
    # 유클리드 거리가 최소가 되는 K 클러스터 할당
    euclid_dist=np.array([]).reshape(m,0)
    for i in range(k):
        temp_dist=np.sum((X-Centroids[:,i])**2,axis=1) 
        euclid_dist=np.c_[euclid_dist,temp_dist]
    min_c =np.argmin(euclid_dist,axis=1)+1 
    # K 클러스터 갱신
    Y={}
    for j in range(k):
        Y[j+1]=np.array([]).reshape(2,0) # Y 딕셔너리 키, 값 할당
    for i in range(m):
        Y[min_c[i]]=np.c_[Y[min_c[i]],X[i]] # Y 딕셔너리 키(K클러스터), 값(GDP, GDP_growth) 할당
    for j in range(k):
        Y[j+1]=Y[j+1].T # 전치행렬
    for j in range(k):
        Centroids[:,j]=np.mean(Y[j+1],axis=0) # K 클러스터 중심 갱신
    Output=Y
# K-평균 클러스터링 결과 가시화
color=['red','blue','green','yellow']
labels=['cluster1','cluster2','cluster3', 'cluster4']
for i in range(k):
    plt.scatter(Output[i+1][:,0],Output[i+1][:,1],c=color[i],label=labels[i])
plt.scatter(Centroids[0,:],Centroids[1,:],s=50,c='black',label='Centroids')
plt.xlabel('GDP_growth')
plt.ylabel('Annual GDP')
plt.legend()
plt.show()

4가지 군집으로 형성된 것을 볼 수 있으며 GDP Growth growth는 군집형성에 크게 기여하지 않았다는 것을 확인할 수 있다. GDP를 정규화시켜 다시 진행할 수는 있으나 분석 목적으로 봤을 때 위와 같이 비슷한 성장세를 가진 국가를 모으는 것이 본래의 취지였기 때문에 그대로 진행하겠다.

 

  • Cluster라는 칼럼을 추가
cluster = pd.Series(min_c)

# 위 cluster를 analysis_2020_gdp과 결합 및 수정
result = np.c_[analysis_2020_gdp, cluster]
result = pd.DataFrame(result)
result.columns = ('Country','GDP_Growth','2020_GDP','Cluster')

result

  • Cluster별 국가목록 확인하기

    위 그래프를 보면 GDP 값이 큰 순서로 cluster를 나열하면 1 > 2> 3> 4 순으로 나타낼 수 있다. (프로그램 실행마다 cluster 순서는 변동됨)
# cluster가 1인 경우 
result.loc[result['Cluster'] == 1]

cluster = 1인 그룹으로 독일, 일본, 프랑스, 미국, 인도가 선택되었으며 위 과정에서 제외한 미국, 중국도 cluster 1 그룹에 포함될 수 있다. ( 견해에 따라 미국, 중국을 cluster 0와 같이 다른 그룹으로 묶을 수도 있음)

 

# cluster가 2인 경우 
result.loc[result['Cluster'] == 2]

cluster =2 그룹에는 캐나다, 호주, 이탈리아, 멕시코 등 10개국이 포함되어 있으며 우리나라인 한국도 포함되어 있다.

 

# cluster가 3인 경우 
result.loc[result['Cluster'] == 3]

# cluster가 4인 경우 
result.loc[result['Cluster'] == 4]

# 결과값 저장하기
result.to_csv("C:\\Users\\USER\\Desktop\\Data\\gdp_cluster.csv")

 


위 분석과정에서 사용한 Kmeans 알고리즘 관련하여 많은 부분을 아래의 사이트에서 참조하여 진행하였습니다.

※ KMeans 관련하여 아래 사이트의 소스 코드를 사용하여 진행하였습니다.

 

- 참조한 사이트

https://blog.daum.net/geoscience/1515

 

파이썬으로 만드는 K-평균 클러스터링 (국립공원 유형 분류)

안녕하세요? 이번 글은 'K-평균 클러스터링(K-means clustering)' 알고리즘을 파이썬으로 작성해보도록 하겠습니다. 기존 모듈이 제공하는 함수를 호출하는 것이 아닌, 알고리즘을 하나하나 코드로 작

blog.daum.net

https://velog.io/@jhlee508/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-K-%ED%8F%89%EA%B7%A0K-Means-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

 

[머신러닝] K-평균(K-Means) 알고리즘

머신러닝 비지도학습에 속하는 K-means 알고리즘은 K개의 군집(Cluster)로 묶는(Clusting) 알고리즘이다.

velog.io

gdp_2020.csv
0.00MB

 

'데이터 분석' 카테고리의 다른 글

서울 생활이동 데이터 분석 (2)  (0) 2021.11.17
서울 생활이동 데이터 분석 (1)  (0) 2021.11.15
세계 GDP 분석 (3)  (0) 2021.11.01
세계 GDP 분석 (2)  (0) 2021.11.01
세계 GDP 분석 (1)  (0) 2021.10.20

댓글