지하철 데이터 다루기

지하철은 위도, 경도 데이터 밖에 없다. 그래서 반경 내 갯수로 상관관계를 그려봤다. 오래 걸려서 1/100 샘플링으로 진행함. 모델링때만 원본데이터로 해야지.

image-20241010025809769

deposit과의 상관관계:
deposit              1.000000
subway_count_10km    0.458587
subway_count_15km    0.454826
subway_count_5km     0.432555
subway_count_20km    0.414162
subway_count_3km     0.414035

위의 상위 5개를 사용하는게 나을듯.


근데 생각해보니까 어차피 지하철은 집 앞에 하나만 있어도 그거 타고 다른데 갈 수 있어서

image-20241010030300072

  • 1km내외에 5개의 지하철이 있음
  • 200m앞에 지하철역이 하나 있지만 1km내에 다른 지하철역은 없음

후자가 더 낫지 않으려나?

그래서 약간 feature를 다르게 줘서 다시 돌려봤다.

image-20241010031424848

deposit과의 상관관계:
deposit                          1.000000
weighted_subway_score            0.460537
subway_density_10km              0.458587
subway_count_10km                0.458587
subway_count_15km                0.454826
subway_count_5km                 0.432555
subway_count_20km                0.414162
subway_count_3km                 0.414035
nearest_subway_distance         -0.210605
avg_3_nearest_subway_distance   -0.250976

weighted_subway_score: 이 특성은 모든 지하철역의 영향을 고려하되, 거리에 따라 가중치를 다르게 주는 방식으로 계산됩니다.

계산 방법:

  1. 각 아파트에서 모든 지하철역까지의 거리를 계산합니다.
  2. 각 거리에 대해 1 / (1 + 거리)의 가중치를 적용합니다.
  3. 모든 가중치의 합을 구합니다.

특징:

  • 가까운 지하철역에 더 높은 가중치를 줍니다.
  • 먼 지하철역도 약간의 영향을 미칩니다.
  • 전체적인 지하철 네트워크의 접근성을 하나의 숫자로 표현합니다.

예를 들어, 아파트 근처에 여러 개의 지하철역이 있으면 점수가 높아지고, 지하철역이 멀리 있거나 적으면 점수가 낮아집니다.

b. subway_density_10km: 이 특성은 10km 반경 내의 지하철역 밀도를 나타냅니다.

계산 방법:

  1. 10km 반경 내의 지하철역 수를 세어 subway_count_10km를 구합니다.
  2. 이를 10km 반경의 원 면적 (π * 10^2)로 나눕니다.

가중치를 둔 피쳐들이 약간이나마 높게 나왔다. 그리고

  • nearest_subway_distance
  • avg_3_nearest_subway_distance

이 두개는 거리가 멀어질수록(커질수록) 전세가 싸져서 음의 상관관계를 보여서 양의 상관관계를 두가지로 나누어서 다시 보았다.

  1. 역수

    inverse_avg_3_nearest_subway_distance 0.304184 inverse_nearest_subway_distance 0.184459

  2. 10km를 최대 거리로 설정하고 현재 거리를 뺀 값을 사용(가장 가까운 거리가 2km라면 이 값은 8이 댐)

    proximity_avg_3_nearest_subway 0.266780 proximity_nearest_subway 0.222808

둘 다 값은 1개,3개의 지하철을 대변하는거라 그런가 낮았다.

지하철 마무리

weighted_subway_score            0.460537
subway_density_10km              0.458587
subway_count_10km                0.458587
subway_count_15km                0.454826
subway_count_5km                 0.432555

이 정도 쓰면 댈듯


금리 데이터 다루기

이 데이터는 월별데이터와 금리만 나와있기에 지금까지 다룬것처럼은 못 다룰 것 같다.

금리와 집값을 시계열로 해서 봤다.

계약의 평균가격

image-20241010035648814

계약의 중앙값가격

image-20241010035657453

이거 하면서 느낀 건데 deposit의 이상치를 제거하고 가는게 낫지 않을까? 생각되었다.

그래서 우선 Deposit을 박스플롯, Scatter 플롯화하면

image-20241010040556641

def remove_outliers_iqr(df, column):
       Q1 = df[column].quantile(0.25)
       Q3 = df[column].quantile(0.75)
       IQR = Q3 - Q1
       lower_bound = Q1 - 1.5 * IQR
       upper_bound = Q3 + 1.5 * IQR
       
       return df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]

# 이상치 제거
df_clean = remove_outliers_iqr(df, 'deposit')

print(f"원본 데이터 크기: {len(df)}")
print(f"정제된 데이터 크기: {len(df_clean)}")
  • 원본 데이터 크기: 1717611
  • 정제된 데이터 크기: 1645615

생각해보면 이상치제거하는김에 할만한 열 다하는게 맞지 않나?

아 자꾸 생각안하고 해서 일 두번씩하는 기분이다.

deposit, area_m2, floor 3개의 열만 이상치 제거하였다.

df_clean2 = remove_outliers_iqr(df_clean, 'area_m2')

df_clean3 = df_clean2[(df_clean2['floor'] >= 0) & (df_clean2['floor'] < 100)]
  • 원본 데이터 크기: 1556835
  • 정제된 데이터 크기: 1556786

다시 하나하나 돌아보면.. 중복제거, 이상치제거 했고


Train 데이터 다루기

image-20241010044426578

Correlation with deposit:
deposit                1.000000
area_m2                0.514380
longitude              0.155119

area_m2를 제외하면 거의 없다시피하다.

그래서

  • area_floor_interaction: area_m2 * floor
  • built_year_area_interaction: built_year * area_m2

두 개 추가했는데 이건 직접 곱한거라 더 나중에 걸리려나? 한번 나중에 중요도고르면서 생각해봐야지.

Correlation with deposit:
deposit                        1.000000
built_year_area_interaction    0.515937
area_m2                        0.514380
area_floor_interaction         0.308536

피쳐 엔지니어링 했고

할게

정규화? 클러스터링? 필요한가?

정규화/표준화가 필요한 특성:

  • area_m2: 면적의 범위가 다양할 수 있으므로 정규화하면 좋습니다.
  • age: 건물 나이의 범위가 넓을 수 있으므로 정규화하면 좋습니다.
  • 저번에 다룬 공원, 학교데이터들의 반경 개수나 가까운 거리같은 데이터

정규화해서 한거 안한거 체크해서 누가 괜찮은가 함 봐보고

지리적 클러스터링:

  • latitude와 longitude를 사용하여 지역을 클러스터링하고, 각 클러스터의 평균 deposit을 새로운 특성으로 사용할 수 있습니다.

얘도 좀 재밌을 거 같은데 한번 해보고