비슷한 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()
※ 문제발생 및 해결방안
- 국가나 도시와 관련 없는 지표값이 포함되어 이후 진행할 KMeans의 Centroid 값에 크게 영향을 미치므로 제거한다.-> 지표를 직접 확인하며 제거해야 하므로 엑셀 시트에서 제거 후 다시 데이터 업로드
- 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
위의 문제를 해결하였으니 다시 진행한다.
# 다시 설정
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 알고리즘으로 군집 형성하기
해야할 일
- 클러스터 수 (k)를 정하기
- 반복 수 정하기
- 클러스터 중심값을 저장하기 위한 (2, 0)의 2차원 배열 생성
- 데이터와 클러스터 중심간의 유클리드 거리 계산하기
- 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
[머신러닝] K-평균(K-Means) 알고리즘
머신러닝 비지도학습에 속하는 K-means 알고리즘은 K개의 군집(Cluster)로 묶는(Clusting) 알고리즘이다.
velog.io
'데이터 분석' 카테고리의 다른 글
서울 생활이동 데이터 분석 (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 |
댓글