TIL(Today I Learned)

[2025/01/22]내일배움캠프 QA/QC 1기 - 25일차

essay2892 2025. 1. 22. 19:56

코드카타(https://essay2892.tistory.com/80)

 

통계학 복습


 

통계분석 실습

📕국가별 기대 수명 데이터 분석

 

분석 목표

본 분석의 목표는 세계 각국의 기대수명(Life Expectancy)에 영향을 미치는 요소를 파악하는 것입니다. 특히 **GDP(국내총생산)**과의 관계를 분석하여, 또한 선진국(Developed)과 개발도상국(Developing) 간의 기대수명 차이를 통계적으로 검증하고, 회귀 분석을 통해 기대수명 예측 모델을 구축하는 것이 주요 목표입니다.

 

데이터 설명

이 데이터는 세계보건기구(WHO)에서 제공한 국가별 기대수명 데이터로, 주요 변수는 다음과 같습니다

  • Country: 국가명
  • Year: 연도 (2000-2015)
  • Status: 국가 상태 ('Developed' 또는 'Developing')
  • Life expectancy: 기대수명 (종속변수)
  • GDP: 1인당 국내총생산(경제 수준을 평가하는 주요 변수)
  • 기타 건강 관련 변수(BMI, 의료 지출, 교육 수준 등) 
더보기
# 1. 필요한 라이브러리 불러오기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import ttest_ind, pearsonr
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
 
# 2. 데이터 불러오기 및 전처리
df = pd.read_csv('Life Expectancy Data.csv')
df = df.dropna()
df.head(3)
#

 

df.info()
#

 

# 3. 개발 상태별 기대수명 비교 (통계적 가설 검정 준비)

d_ed = df[df['Status'] == 'Developed']['Life expectancy ']
d_ing = df[df['Status'] == 'Developing']['Life expectancy ']
# 'Life expectancy'가 아닌 'Life expectancy '...
 
# 4. 독립표본 t-검정 수행
t_statistic, pvalue = ttest_ind(d_ed, d_ing)
print(f'statistic :{t_statistic : .3f}\npvalue :{pvalue : .3f}')
if pvalue < 0.05 :
    print('\npvalue가 0.05보다 작으므로 귀무가설을 기각, 유의하다.')
else :
    print('\npvalue가 0.05보다 크므로 귀무가설을 채택, 유의하지 않다.')
#
statistic : 20.042
pvalue : 0.000
 
pvalue가 0.05보다 작으므로 귀무가설을 기각, 유의하다.
 
# 5. 기대 수명 분포 시각화
plt.figure(figsize = (10,6))
sns.histplot(d_ed, kde=True, color = 'lightcoral', label = '개발도상국')
sns.histplot(d_ing, kde = True, color = 'green', label = '선진국')
plt.xlabel('기대수명')
plt.ylabel('빈도')
plt.legend()
plt.title('선진국과 개발도상국의 기대수명 분포')
plt.show()
#
 
# 6. 기대수명과 GDP의 상관관계 분석
corr, p_val = pearsonr(df['Life expectancy '], df['GDP'])
print(f'상관계수 :{corr : .3f}\np-value :{p_val : .3f}')
if p_val < 0.05 :
    print('\npvalue가 0.05보다 작기 때문에 유의미함')
else :
    print('\npvalue가 0.05보다 크기 때문에 유의미하지 않음')
#
상관계수 : 0.441
p-value : 0.000
 
pvalue가 0.05보다 작기 때문에 유의미함
 
# 7. 기대수명 vs GDP 산점도 시각화
plt.figure(figsize=(10,6))
sns.scatterplot(data = df, x = 'GDP', y = 'Life expectancy ', alpha = 0.7, color = 'slateblue')
plt.xlabel('GDP')
plt.ylabel('기대수명')
plt.title('GDP와 기대수명의 상관관계')
plt.show()
#

 

# 8. 분석 결과 출력
print(f't검정통계량 :{t_statistic :.3f}')
print(f'pvalue :{pvalue : .3f}')
print(f'\n피어슨 상관계수 :{corr : .3f}')
print(f'pvlaue :{p_val : .3f}')
#
t검정통계량 :20.042
pvalue : 0.000
 
피어슨 상관계수 : 0.441
pvlaue : 0.000
 
t검정  
- 귀무가설 : 선진국과 개발도상국의 평균 기대수명은 차이가 없다.  
- 대립가설 : 선진국과 개발도상국의 평균 기대수명은 차이가 있다.  
- t검정통계량이 매우 크므로 두 그룹간 평균 차이가 크다
- pvalue가 유의수준 0.05보다 작기 때문에 선진국과 개발도상국의 평균 기대수명은 유의미한 차이가 존재한다. 즉, 귀무가설을 기각한다.
 
상관분석  
- GDP와 기대수명은 0.441의 양의 상관계수를 가진다. (높은 값은 아님)  
- pvalue가 0.05보다 훨씬 작기 때문에 상관관계가 통계적으로 유의하다. (우연이 아니다)
 
# 9. 선형 회귀 분석
X = df[['GDP']]
y = df[['Life expectancy ']]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model_lr = LinearRegression()
model_lr.fit(X_train, y_train)
y_pred = model_lr.predict(X_test)
 
# 10. 회귀 모델 평가
life_mse = mean_squared_error(y_test, y_pred)
life_r2 = r2_score(y_test, y_pred)
print(f'평균 제곱 오차 :{life_mse : .3f}')
print(f'결정계수 :{life_r2 : .3f}')
#
평균 제곱 오차 : 57.837
결정계수 : 0.186
 
# 11. 최종 결과 출력
평균 제곱 오차  
- MSE는 값이 작을수록 정확도가 높다. (0에 가까울수록 좋음)  
- 57.837은 높은 값이므로 모델의 예측 오차가 크다.  
 
결정계수
- 결정계수는 설명력이라고도 하며, 1에 가까울수록 모델이 정확함.  
- 이 모델의 결졍계수는 0.186이라는 작은 값이므로 모델의 오차가 크다는 것을 의미.
- (GDP 외에도 기대수명에 영향을 미치는 요인이 많다는 것을 시사한다고 함.)
 
t검정  
- 귀무가설 : 선진국과 개발도상국의 평균 기대수명은 차이가 없다.  
- 대립가설 : 선진국과 개발도상국의 평균 기대수명은 차이가 있다.  
- t검정통계량이 매우 크므로 두 그룹간 평균 차이가 크다
- pvalue가 유의수준 0.05보다 작기 때문에 선진국과 개발도상국의 평균 기대수명은 유의미한 차이가 존재한다. 즉, 귀무가설을 기각한다.
 
상관분석  
- GDP와 기대수명은 0.441의 양의 상관계수를 가진다. (높은 값은 아님)  
- pvalue가 0.05보다 훨씬 작기 때문에 상관관계가 통계적으로 유의하다. (우연이 아니다)

 

통계학 라이브세션 5회 + 머신러닝 오프닝 세션 1회

더보기

테블로, 스팟파이어 - 실제 사용하는 시각화 툴
데이터 탐색/시각화시 이상치 탐색이 굉장히 중요
adj. r-squared : 다중회귀에서 주로 확인. 데이터가 많아질수록 R-squared 값이 높아질 수 있기 때문
AIC, BIC 낮을수록 좋음
Log-Likeihood : 높을수록 좋음
선형회귀 시작점 = 산점도