Data_10기

데이터 분포 파악

senu 2025. 12. 5. 23:52

데이터의 분포에 따라 사용할 통계 방법이 달라지기 때문에 분석 시작 전에 데이터의 분포를 파악하는 것은 중요하다. 그래서 이전에 기초 프로젝트 때 사용했던 서울 부동산 데이터를 사용해서 분포를 파악하는 코드를 돌려보는 연습을 해보았다.


IQR 방식으로 이상치를 제거하기 전, 물건금액에 대해 평균과 표준편차 그리고 95% 신뢰구간을 구해보는 코드를 작성해보았다.

# 표본 평균과 표본 표준편차 계산
sample_mean = np.mean(df1824['물건금액(만원)'])
sample_std = np.std(df1824['물건금액(만원)'])

# 95% 신뢰구간 계산
conf_interval = stats.t.interval(0.95, len(df1824['물건금액(만원)'])-1, loc=sample_mean, scale=sample_std/np.sqrt(len(df1824['물건금액(만원)'])))

print(f"표본 평균: {sample_mean}")
print(f"95% 신뢰구간: {conf_interval}")

표본 평균: 64247.51294244098

95% 신뢰구간: (np.float64(64086.171352294485), np.float64(64408.85453258748))

 

분포를 히스토그램과 Q-Q plot으로 그려보았다.

# 히스토그램으로 시각화
plt.hist(df1824['물건금액(만원)'], bins=30, edgecolor='black')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Histogram')
plt.show()

# seaborn으로 시각화
sns.histplot(df1824['물건금액(만원)'], bins=30, kde=True)
plt.title("Price Distribution")
plt.show()

# Q-Q plot
stats.probplot(df1824['물건금액(만원)'], dist="norm", plot=plt)
plt.title("Q-Q Plot")
plt.show()

plt.hist (왼쪽) / sns.hist (중앙) / Q-Q plot (오른쪽)

 

이상치 때문에 x축이 길게 나오지만 대부분의 데이터는 왼쪽에 쏠려있는 형태로 나왔고, Q-Q plot도 보면 정규성을 만족하지 않는 결과를 보여주고 있다.

따라서 기초 프로젝트 진행 시 사용했던 이상치 제거 방식을 사용해 이상치를 제거하고 난 후에 분포도 다시 살펴보았다.

 

 

이상치를 제거해도 오른쪽 꼬리가 긴 형태의 그래프가 그려지는 것을 확인할 수 있었다. 금액(부동산 가격, 의료비, 소득 등) 같이 한쪽으로 치우친 데이터는 로그 치환을 하는 경우가 많다. 그 이유는 꼬리가 긴 분포를 가진 데이터는 정규성이나 등분산성이 깨지기 쉽기 때문에 로그 치환을 통해 데이터를 정규에 가깝게 만들고, 회귀모형의 기본 가정(선형성, 등분산성)을 더 잘 충족시킬 수 있기 때문이다.

 

또한 해석도  보다 직관적으로 할 수 있는데, 금액 데이터의 변화는 절대 변화 보다 상대 변화(%)로 해석하는 것이 더 적절한 경우가 많기 때문이다. 로그 치환을 하면 회귀계수 β가 증가율·비율 변화를 의미하게 되어 해석이 용이해진다. 예를들면, 3억 → 4억으로 증가한 변화와 10억 → 11억으로 증가한 변화는 각각 33% 증가, 10% 증가로 차이가 난다. 하지만 로그 치환을 하면 이런 차이가 자동으로 반영되어 '증가율' 단위로 해석된다.

 

서울 부동산 데이터의 물건 금액 데이터를 로그 치환 해 다시 분포 그래프를 그려보았다.

# 로그 치환
log_data = np.log1p(df1824_3['물건금액(만원)'])

# 로그 치환 히스토그램
#plt.hist(log_data, bins=30, edgecolor='black')
#plt.title('Histogram of Log-Transformed Prices')
#plt.show()

# seaborn 히스토그램
sns.histplot(log_data, bins=30, kde=True)
plt.title("Price Distribution")
plt.show()

# Q-Q plot (로그 치환 데이터가 정규분포인지 확인)
stats.probplot(log_data, dist="norm", plot=plt)
plt.title("Q-Q Plot of Log-Transformed Prices")
plt.show()

히스토그램 (왼쪽) / Q-Q plot (오른쪽)

 

로그 치환 후의 분포를 보면, 물건금액 데이터의 꼬리가 줄어들어 전체적으로 훨씬 대칭적이고 정규분포에 가까운 형태로 변한 것을 확인할 수 있었다. 히스토그램에서도 고가 매물의 영향이 완화되어 중심이 비교적 뚜렷해지고, Q-Q plot에서는 점들이 정규분포 기준선에 대부분 밀착해 정규성이 크게 개선된 것을 확인할 수 있었다.

 

의료비 관련한 연구를 제대로 진행해 본 적은 없지만 선행연구를 보면 대부분 로그치환을 사용해 분석을 한 것을 볼 수 있었는데 이런 이유가 있었음을 새삼 다시 정리할 수 있었던 시간이었다. 개념을 배우고 복습을 안 하다 이번에 통계 세션을 통해 복습(?)을 하게 되었는데 새로운 개념같고 새삼 다시 보이는 것들도 신기하고 그런 것 같다.

 

기초 프로젝트 때는 데이터의 도메인이 달라서 그런지 기존에 알았던 지식도 어떻게 적용을 해야될지 아예 감이 안 잡혔는데 앞으로 통계에서 배운 내용을 여러 데이터에 적용해보면서 이번 프로젝트를 준비하면 복습도 되고 좋을 것 같다는 생각이 들었다.