데이터 분석/머신러닝

2020년도 GDP 와 인구 지표 (1) - 회귀 분석

너굴맨_ 2021. 12. 17. 11:50

인구 지표가 GDP에 대해 얼만큼 설명할 수 있는 지 알아보자

 

◈분석 절차

1. 데이터끼리 merge 및 전처리 (국가명을 기준으로 합치기)

2. 회귀 모형에 적합하기

3. 변수 선택

4. 회귀식 구하기

 

1. 데이터 merge 및 Na 값 제외

 2020년 전세계 인구 지표 (world_population_2020.csv)
2020년 전세계 GDP (gdp_2020.csv)
merge_2020.csv

158 여개의 국가 및 도시에 대한 GDP & 인구지표 데이터 생성

2. 회귀 모형에 적합하기

y (반응변수) : GDP

X (설명변수) : Population (인구수), NetChange (2020년 인구), Density(인구밀도), LandArea(토지면적), Migrants(이주민), FertRate(출산률), MedianAge(중앙 나이), UrbanPop(도시인구비중)

 

- statsmodel의 OLS Regression을 사용하여 아래와 같은 사실을 확인하자.

1. R-square  (설명 계수)  : 설명 계수란 회귀식이 실제 관찰된 값을 얼마나 설명하는 지 의미 -> 설명력

※ 주의할점 : 설명계수는 회귀식의 성능을 나타내는 기준일 뿐 각 변수간의 연관성을 설명하지는 못한다.

2. F-statistic (F값)과 Prob(F-statistic) : 위 회귀식에 대한 통계값으로 F값은 회귀식의 유의성을 나타내며 Prob (F 통계량)값이 0.05 미만이면 위 회귀식은 통계적으로 유의하다는 의미다.

3. 반응 변수들의 P>|t| 값이 0.05 미만일 때 통계적으로 유의하다는 의미

 

- 해석

1. R-Square (설명 계수) 값이 0.808로 GDP 변화의 80%를 설명한다.

2. F값은 90.4, Prob (F값)은 0.05 미만으로 위 회귀식은 유의하다.

3. P>|t| 값이 0.05보다 작은 변수는 Population, Migrants, NetChange가 유의하게 나왔다.

※ 변수 간의 다중공선성이 있는 경우 변수를 추가하거나 뺄 때 P>|t| 값이 바뀐다 -> 위의 변수의 변화가 무조건 GDP 변화에 영향을 미치는 지는 알 수 없다.

 

3. 변수 선택하기

변수 선택방법으로 전진 선택법, 후진 선택법, 단계별 선택법이 있으며 이 분석의 경우 단계별 선택법을 통해 변수를 선택

### 단계별 선택법
## 1. 설명 변수, 반응 변수 설정
y_col = ['GDP']      # 칼럼 명 기입
y = merge_2020['GDP']
x_cols = list(set(merge_2020).difference(set(y_col)))
x_cols.remove('Country')     # 불필요한 문자형 칼럼 제거
x_cols.remove('WorldShare')  # population과 같은 의미이므로 제외

## 2. 변수 설정
selected_x_cols = []
sel_enter = 0.05  # p-value 기준
sel_remove = 0.05  # p-value 값 기준

step_sel_cols = [] # 스텝별로 살아남은 컬럼들
step_adj_rsquared = []  # 스텝별로 R-Square 값
steps = []     # 스텝
step = 0

## 3. 단계별 선택
while len(x_cols) > 0:
    remainder = list(set(x_cols) - set(selected_x_cols))
    pval = pd.Series(index=remainder) ## 변수들의 p-value
    ## 기존에 포함된 변수와 새로운 변수 하나씩 돌아가면서 
    ## 선형 모형을 적합한다.
    for col in remainder: 
        X = merge_2020[selected_x_cols+[col]]
        X = sm.add_constant(X)
        model = sm.OLS(y,X).fit()
        pval[col] = model.pvalues[col]
 
    min_pval = pval.min()
    if min_pval < sel_enter: ## 최소 p-value 값이 기준 값보다 작으면 포함
        selected_x_cols.append(pval.idxmin())
        ## 선택된 변수들에대해서
        ## 어떤 변수를 제거할지 고른다.
        while len(selected_x_cols) > 0:
            selected_X = merge_2020[selected_x_cols]
            selected_X = sm.add_constant(selected_X)
            selected_pval = sm.OLS(y,selected_X).fit().pvalues[1:] ## 절편항의 p-value는 뺀다
            max_pval = selected_pval.max()
            if max_pval >= sel_remove: ## 최대 p-value값이 기준값보다 크거나 같으면 제외
                remove_variable = selected_pval.idxmax()
                selected_variables.remove(remove_variable)
            else:
                break
        
        step += 1
        steps.append(step)
        adj_r_squared = sm.OLS(y,sm.add_constant(merge_2020[selected_x_cols])).fit().rsquared_adj
        step_adj_rsquared.append(adj_r_squared)
        step_sel_cols.append(selected_x_cols.copy())
    else:
        break
fig = plt.figure(figsize=(10,10))
fig.set_facecolor('white')
 
font_size = 15
plt.xticks(steps,[f'step {s}\n'+'\n'.join(step_sel_cols[i]) for i,s in enumerate(steps)], fontsize=12)
plt.plot(steps,step_adj_rsquared, marker='o')
    
plt.ylabel('Adjusted R Squared',fontsize=font_size)
plt.grid(True)
plt.show()

7개의 변수들 중 3개의 변수가 선택되었으며 3개의 변수가 GDP 변화의 80%를 설명한다.

 

4. 회귀식 구하기

위의 결과를 통해 아래와 같은 식으로 표현할 수 있다.

GDP = 0.00001518 * Population + 0.0108 * Migrants - 0.0007 * Netchange

 

- Reference

https://zephyrus1111.tistory.com/65

 

[회귀 분석] 6. 변수 선택법(Variable Selection) with Python

본 포스팅에서는 수식을 포함하고 있습니다. 티스토리 피드에서는 수식이 제대로 표시되지 않을 수 있으니 웹 브라우저 또는 모바일 웹에서 보시기 바랍니다. 안녕하세요~ 꽁냥이에요! 수많은

zephyrus1111.tistory.com

gdp_2020.csv
0.01MB
world_population_2020.csv
0.01MB
merge_2020.csv
0.01MB