2020년도 GDP 와 인구 지표 (1) - 회귀 분석
인구 지표가 GDP에 대해 얼만큼 설명할 수 있는 지 알아보자
◈분석 절차
1. 데이터끼리 merge 및 전처리 (국가명을 기준으로 합치기)
2. 회귀 모형에 적합하기
3. 변수 선택
4. 회귀식 구하기
1. 데이터 merge 및 Na 값 제외
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