[Python/파이썬] 미국 경제 데이터로 배우는 머신러닝 <K-평균>

2025. 1. 9. 12:46·Coding & Data Analysis/Python

이 글은..

머신러닝의 분류 중 비지도학습에 해당하는 분석법인 "K-평균(K-Means)" 를 활용하여 R의 라이브러리인

ggplot2 의 economics 데이터를 분석합니다. 이론적인 내용부터 코드 설명까지 전부 다룹니다. 

최종 결과는 지출에 따른 저축 비율을 바탕으로 미국 인구를 4개의 집단으로 나누고 시각화합니다.

분류와 회귀를 모두 활용하여 데이터에 대한 인사이트를 얻을 수 있습니다.

 

 

데이터

R의 ggplot2 라이브러리의 "economics" 데이터를 활용했습니다. 

https://ggplot2.tidyverse.org/reference/economics.html

 

US economic time series — economics

This dataset was produced from US economic time series data available from https://fred.stlouisfed.org/. economics is in "wide" format, economics_long is in "long" format.

ggplot2.tidyverse.org

 

 

K-평균 (K-Means Method)

간단하게 설명하면 "비지도학습의 분류 분석" 이라고 보면 된다. 지도학습에는 로지스틱 회귀가 있다.

미리 분류된 학습 데이터를 바탕으로 차후 데이터를 분류하는 구조이다.

비지도학습이란, 데이터를 주고 나서 기계가 알아서 특정한 인사이트를 찾아내는 것을 의미한다.

K평균은 비지도학습을 통해 데이터를 일정한 기준으로 분류하는 분석 방법이고,

이를 "군집분석(Clustering)" 이라고 한다.

 

K-Means의 절차는 다음과 같다.

  1. 데이터를 몇 개의 군집으로 나눌지를 의미하는 K를 정한다.
  2. 여러 데이터 중 하나를 중심점으로 정한다.
  3. 2번의 데이터에서 가장 먼 데이터들을 다른 중심점으로 정한다.
  4. 중심점들을 기준으로 가장 가까운 데이터들끼리 묶는다.
  5. 묶인 데이터들의 평균을 구하고, 그 평균으로 중심점을 이동한다.
  6. 중심점이 이동하지 않을때까지 4번과 5번 절차를 반복한다.

 

코드1

import os
os.environ['OMP_NUM_THREADS'] = '3'

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.read_csv("C:/Users/준희/Desktop/Data Analysis/Data/economics.csv")
df.drop(columns = 'Unnamed: 0', inplace = True)
df.head()

X = df[df.columns[[1,3]]].values.reshape(-1,2)
X

위의 os.environ 코드는 이후 K-Means 를 활용하는 경우 발생하는 메모리 낭비를 방지한다.

비지도학습의 특징 중 하나는, 학습에 필요한 데이터가 독립변수 하나라는 것!

실제 분류는 기계가 알아서 수행하는 것이기에, 우리는 투입만 해주면 된다.

전체 데이터를 집어넣고, 분류 결과가 출력되는 방식.

 

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X = scaler.fit_transform(X)

데이터 전처리를 수행한다. 특히 K-Means 에서는 데이터 간의 거리가 핵심적인 요소로 작용하기에

Scaler 를 통해 X축과 Y축의 단위를 표준화하는 것이 시각화의 관건.

 

 

엘보우 방법

그렇다면, 처음에 K는 임의로 결정하는 걸까? 아니다.

K값은 너무 많거나 적으면 군집분석의 의미 자체가 퇴색되기에 적절한 값을 찾는 것이 중요하다. 

그래서 사용할 수 있는 방법 중 하나가 "엘보우 방법(Elbow Method)" 이다.

엘보우 방법의 그래프. X축은 K값, Y축은 중심점으로부터의 거리제곱합.

 

K값이 늘어날수록 Y축(중심점으로부터의 거리 제곱합)의 값이 감소한다는 것을 보여주는 그래프이다.

적당한 값을 구하려면, 크지 않으면서도 거리를 대폭 줄여서 군집을 명확하게 구분해주는 점을 고른다.

이 데이터에서는 k = 4 정도가 적절해 보인다.

from sklearn.cluster import KMeans
inertia_list = [] 
for k in range(1,11) :
    kmeans = KMeans(n_clusters = k, init = 'k-means++')
    kmeans.fit(X)
    inertia_list.append(kmeans.inertia_)

plt.figure(figsize = (5,3))
plt.scatter(range(1,11), inertia_list)
plt.plot(range(1,11),inertia_list)
plt.title('Elbow Method')
plt.show()

KMeans 를 임포트해서 모델을 만든다. n_clusters 는 클러스터의 수를 설정하는 k값을 의미한다.

init = 'k-means++' 는 기본값으로 생각하면 된다. 이것 외에도 다양한 k평균의 방법이 있다.

학습을 시킨 모델에서 kmeans.inerita_ (거리제곱합) 을 빈 리스트에 추가하는 for 문을 사용한다.

 

코드2

K = 4
kmeans = KMeans(n_clusters = K, init = 'k-means++')
y_kmeans = kmeans.fit_predict(X)

구한 k값을 통해 모델을 재생성하고 나서, 예측한 값을 y_kmeans 로 저장한다.

# 출력
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1])

y_kmeans 의 일부. 데이터를 4개 (0,1,2,3) 의 군집으로 분류하여 array에 순서대로 저장한다.

 

centers = kmeans.cluster_centers_
centers
# 출력
array([[ 1.68836454, -0.48986815],
       [-0.99919416,  1.10892727],
       [ 0.91009402, -1.32067803],
       [-0.19490833, -0.21371173]])

중심점 4개의 좌표를 저장한 값이다.

 

number = [4,1,3,2]
for cl in range(K) :
    plt.scatter(X[y_kmeans == cl,0], X[y_kmeans == cl,1], ec = 'black', alpha = 0.5)
    plt.scatter(centers[cl,0], centers[cl,1], s = 150, c = 'yellow', ec = 'black', marker = 's')
    plt.text(centers[cl,0], centers[cl,1], number[cl], ha = 'center', va = 'center')
plt.grid(axis = 'x', ls = ':')
plt.xlabel('expences')
plt.ylabel('savings')
plt.title('4 levels of savings ~ expences (standard)')
plt.show()

for 문을 활용하여 데이터의 분포와 번호를 작성하는 코드이다.

  • X[y_kmeans == cl,0] : braket 안의 코드는 불리언 배열으로 리턴되고, 이는 해당 값만 구해준다.
  • numbers 의 배열이 일반적이지 않은 이유는 y_kmeans 의 순서가 일반적이지 않기 때문이다.

4개로 분류된 미국 사람들의 경제 데이터. 지출이 낮은 사람부터 높은 사람까지.

 

리버스 스케일링 & 회귀분석

X_org = scaler.inverse_transform(X)
centers_org = scaler.inverse_transform(centers)
print(X_org[range(5)])
print(centers_org)

scaler.inverse_transform 을 통해 표준화된 데이터를 원복시킨다.

결국엔 인사이트 도출을 위해서는 직관적인 원래 데이터가 필요한 순간도 있다.

 

sorted_idx = np.argsort(X_org[:,0])
X_p = X_org[sorted_idx,0]
y_p = X_org[sorted_idx,1]

from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree = 2)
X_2deg = poly_reg.fit_transform(X_p.reshape(-1,1))

from sklearn.linear_model import LinearRegression
p_reg = LinearRegression()
p_reg.fit(X_2deg,y_p)

회귀 분석 그래프까지 추가하기 위해 다항회귀 코드 작성중..

 

plt.figure(dpi=130)
number = [4,1,3,2]
for cl in range(K) :
    plt.scatter(X_org[y_kmeans == cl,0], X_org[y_kmeans == cl,1], ec = 'black', alpha = 0.7)
plt.plot(X_p,p_reg.predict(X_2deg), lw = 25, c = 'gray', alpha = 0.5)
plt.grid(axis = 'x', ls = ':')
plt.xlabel('expences')
plt.ylabel('savings')
plt.title('4 levels of savings ~ expences (in america)')
plt.show()

최종 코드! plt.plot 을 통해 전반적인 추세선과 plt.figure로 크기와 해상도를 높인다.

디자인적으로 추천할 코드는 plt.plot의 lw와 alpha를 조절하는 것이다.

두껍고 반투명한 추세선은 그래프의 직관성을 한층 더 올려준다.

 

최종 결과

K평균과 다항회귀분석을 통해 그래프의 분류 및 추세분석을 수행했다.

  • 마지막 그룹을 제외한 3개의 그룹은 지출 - 저금의 반비례를 따른다.
  • 하지만 가장 지출이 많은 그룹부터는 다시 상승세를 띈다.

 

관련 포스팅

https://skrrdevlog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-airquality-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%85%8B%EC%9C%BC%EB%A1%9C-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%B0%B0%EC%9A%B0%EA%B8%B0-%EB%8B%A4%ED%95%AD-%ED%9A%8C%EA%B7%80

 

[파이썬] airquality 데이터셋으로 머신러닝 배우기 <다항 회귀>

데이터이번엔 선형성이 강하지 않은 새로운 데이터를 사용해보고 싶었다. 파이썬에서 결측치 처리도 해볼겸..R의 airquality 데이터는 결측치를 포함하고 있고, 약한 선형성을 띄기에 ML을 연습하

skrrdevlog.tistory.com

https://skrrdevlog.tistory.com/entry/Python-%EB%AF%B8%EA%B5%AD-%EA%B2%BD%EC%A0%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%85%8B%EC%9C%BC%EB%A1%9C-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%B0%B0%EC%9A%B0%EA%B8%B0-1

 

[파이썬] 미국 경제 데이터셋으로 머신러닝 배우기 <선형회귀>

데이터R의 ggplot2 라이브러리의 "economics" 데이터를 활용했습니다. https://ggplot2.tidyverse.org/reference/economics.html US economic time series — economicsThis dataset was produced from US economic time series data available from h

skrrdevlog.tistory.com

 

'Coding & Data Analysis > Python' 카테고리의 다른 글

[파이썬/머신러닝] RandomForest 와 GradientBoosting  (0) 2025.01.17
[파이썬/Python] Seaborn + Matplotlib 으로 시각화 총정리 (1)  (0) 2025.01.12
[파이썬] iris 데이터셋으로 머신러닝 배우기 <로지스틱 회귀>  (1) 2025.01.07
[오답노트] Python에서 for 문으로 matplotlib 그래프 겹치기 w. 머신러닝  (1) 2025.01.05
[파이썬] airquality 데이터셋으로 머신러닝 배우기 <다항 회귀>  (1) 2025.01.04
'Coding & Data Analysis/Python' 카테고리의 다른 글
  • [파이썬/머신러닝] RandomForest 와 GradientBoosting
  • [파이썬/Python] Seaborn + Matplotlib 으로 시각화 총정리 (1)
  • [파이썬] iris 데이터셋으로 머신러닝 배우기 <로지스틱 회귀>
  • [오답노트] Python에서 for 문으로 matplotlib 그래프 겹치기 w. 머신러닝
흑석동사는시골쥐
흑석동사는시골쥐
문과 경영학도 숫자 배우기 프로젝트
  • 흑석동사는시골쥐
    NaN
    흑석동사는시골쥐
  • 전체
    오늘
    어제
  • 링크

    • 독서 일지
    • 올리고 싶은 거 올려요
    • 분류 전체보기 (75)
      • Coding & Data Analysis (52)
        • Python (23)
        • R (21)
        • Excel & Data (2)
        • Git & Github (4)
        • Certificate (2)
      • Project (15)
        • 일자리 스크래핑 서비스 (8)
        • 최적의 인스타 피드 (2)
        • 주식 & 비트코인 분석 (5)
      • Economics (1)
        • 경제기사 스크랩 (1)
      • Records & Thoughts (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 공지사항

  • 인기 글

  • 태그

    파이썬
    데이터분석
    머신러닝
    시각화
    r
    심장병 데이터
    개발
    AI반도체
    프로그래밍
    웹스크래퍼
    주가분석
    비전공자
    다항회귀
    지도
    동아리
    Python
    자격증
    FLASK
    전처리
    기초
    git
    코랩
    엔비디아
    주식
    Colab
    matplotlib
    ADSP
    데이터수집
    데이터
    adsp공부법
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
흑석동사는시골쥐
[Python/파이썬] 미국 경제 데이터로 배우는 머신러닝 <K-평균>
상단으로

티스토리툴바