DataScience

서울시 강서구 공동 주택 현황 데이터 분석 (20230905)

Pro.Dev 2023. 9. 8. 11:28
반응형

공공데이터 포털의 데이터를 사용함.

 

https://www.data.go.kr/data/15066129/fileData.do 

 

data = pd.read_csv('/mnt/data/서울특별시 강서구_공동주택 현황_20230905.csv', encoding='cp949')
data.head()
   연번   구분    단 지 명   동명      번지수          도로명주소  우편번호    층수별  동수       평형별  \
0   1  NaN    강변삼천리  염창동    70-20  양천로67길 71-16   7535     15   1     28 32   
1   2   의무  강변한솔솔파크  염창동      300      양천로63길 38  7546  11~25   8     32 33   
2   3   의무  강변힐스테이트  염창동      299      양천로75길 19  7541  11~23   7     24 33   
3   4   의무     관음삼성  염창동  268외3필지        양천로 656  7554     20   3  25 33 43   
4   5   의무    극동상록수  염창동      280     공항대로71길 31  7559     18   2     25 33   

   세대수        준공일자          전화번호            팩스   관리   복도   난방   비고  
0   77  1992-04-11  02-3661-1659  02-3661-1659  NaN  NaN  NaN  NaN  
1  455  2005-09-23  02-3662-0208  02-6738-2168   자치   계단   개별  NaN  
2  417  2005-06-28  02-3664-0041  02-3664-0164   위탁   계단   개별  NaN  
3  350  1997-08-01  02-3665-0619  02-3665-2058   위탁   계단   개별  NaN  
4  256  1999-10-27  02-6095-9734  02-6091-2715   위탁   혼합   개별  NaN

 

데이터는 "서울특별시 강서구의 공동주택 현황"에 대한 내용이며, 주요 칼럼은 다음과 같습니다

  • 연번: 순서 번호
  • 구분: 주택 구분 (예: 의무)
  • 단 지 명: 아파트 단지 이름
  • 동명: 동 이름 (예: 염창동)
  • 번지수, 도로명주소: 주소 정보
  • 우편번호: 우편 번호
  • 층수별: 건물 층수
  • 동수: 건물 동 수
  • 평형별: 아파트 평형 정보
  • 세대수: 아파트 세대 수
  • 준공일자: 건물 준공 날짜
  • 전화번호, 팩스: 연락처 정보
  • 관리: 관리 유형
  • 복도: 복도 유형
  • 난방: 난방 유형
  • 비고: 기타 정보

 

수치데이터 분석

 

data.describe()

 

  • 동수: 평균적으로 단지당 약 4.2개의 동이 있습니다. 최소 1개에서 최대 50개까지의 동이 있습니다.
  • 세대수: 평균적으로 단지당 약 325세대가 있습니다. 가장 작은 단지는 24세대이며, 가장 큰 단지는 2603세대를 가지고 있습니다.
  • 구분:
    • 의무: 160개
    • 연립: 13개
  • 관리:
    • 위탁: 154개
    • 자치: 11개
  • 복도:
    • 계단: 94개
    • 혼합: 43개
    • 복도: 35개
  • 난방:
    • 개별: 93개
    • 지역: 80개

 

 

각 동별 인구 밀집도 계산 하기

 

인구 밀집도를 계산하려면 해당 지역의 인구와 면적 정보가 필요합니다. 현재 제공된 데이터에는 각 아파트 단지의 세대 수만 포함되어 있습니다.

인구 밀집도를 계산하기 위해서는 다음과 같은 가정을 할 수 있습니다

 

  1. 각 세대의 평균 인구 수를 알고 있다면, 이를 세대 수에 곱하여 해당 단지의 총 인구를 추정할 수 있습니다.
  2. 각 단지의 면적 정보가 필요합니다. 이 정보가 데이터에 없다면, 일반적인 아파트 단지의 평균 면적을 사용하여 추정할 수 있습니다.

 

저는, 일반적인 아파트 단지의 평균 면적을 사용해서 추정하겠습니다.

 

  1. 각 세대의 평균 인구 수는 2.5명으로 가정합니다. (한국의 평균 가구 인원을 참고)
  2. 일반적인 아파트 단지의 평균 면적은 10만 m²(약 30만 평)로 가정합니다.

 

아래는 파이썬 코드입니다.

 

# Define the assumptions
average_population_per_household = 2.5
average_apartment_area_m2 = 100000  # in m²

# Calculate total population
total_population = data['세대수'].sum() * average_population_per_household

# Calculate total area
total_area_m2 = len(data) * average_apartment_area_m2

# Calculate population density
population_density = total_population / total_area_m2
population_density

 

grouped_data = data.groupby('동명').agg({
    '세대수': 'sum',
    '연번': 'count'  # Count of 아파트 단지 for each 동
}).rename(columns={'연번': '단지수'})

grouped_data['총인구'] = grouped_data['세대수'] * average_population_per_household
grouped_data['총면적'] = grouped_data['단지수'] * average_apartment_area_m2

grouped_data['인구밀집도'] = grouped_data['총인구'] / grouped_data['총면적']


grouped_data['인구밀집도']
동명
가양1동          0.014550
가양2동          0.029513
가양3동          0.020563
공항동           0.004213
등촌1동          0.003471
등촌2동          0.007586
등촌3동          0.017953
마곡동(가양1동)     0.007600
마곡동(공항동)      0.019915
마곡동(발산1동)     0.030513
마곡동(방화1동)     0.015634
발산1동          0.006933
발산1동(내발산동)    0.002250
방화1동          0.004038
방화2동          0.004705
방화3동          0.013883
염창동           0.005534
우장산동          0.007639
우장산동(내발산동)    0.001187
우장산동(화곡동)     0.014400
화곡1동          0.005039
화곡2동          0.001546
화곡3동          0.007650
화곡4동          0.001422
화곡6동          0.005911
화곡8동          0.002435
화곡본동          0.005775
Name: 인구밀집도, dtype: float64

 

정렬하겠습니다.

 

population_density_text = grouped_data['인구밀집도'].sort_values(ascending=False)
population_density_text

sorted_density = population_density_text.sort_values(ascending=False)
sorted_density

 

동 이름을 영어로 변경한 후에, 시각화 합니다. 

 

korean_to_english = {
    '마곡동(발산1동)': 'Magok-dong(Balsan1-dong)',
    '가양2동': 'Gayang2-dong',
    '가양3동': 'Gayang3-dong',
    '마곡동(공항동)': 'Magok-dong(Airport-dong)',
    '등촌3동': 'Deungchon3-dong',
    '마곡동(방화1동)': 'Magok-dong(Banghwa1-dong)',
    '가양1동': 'Gayang1-dong',
    '우장산동(화곡동)': 'Woojangsan-dong(Hwagok-dong)',
    '방화3동': 'Banghwa3-dong',
    '화곡3동': 'Hwagok3-dong',
    '우장산동': 'Woojangsan-dong',
    '마곡동(가양1동)': 'Magok-dong(Gayang1-dong)',
    '등촌2동': 'Deungchon2-dong',
    '발산1동': 'Balsan1-dong',
    '화곡6동': 'Hwagok6-dong',
    '화곡본동': 'Hwagok-bondong',
    '염창동': 'Yeomchang-dong',
    '화곡1동': 'Hwagok1-dong',
    '방화2동': 'Banghwa2-dong',
    '공항동': 'Airport-dong',
    '방화1동': 'Banghwa1-dong',
    '등촌1동': 'Deungchon1-dong',
    '화곡8동': 'Hwagok8-dong',
    '발산1동(내발산동)': 'Balsan1-dong(Naebalsan-dong)',
    '화곡2동': 'Hwagok2-dong',
    '화곡4동': 'Hwagok4-dong',
    '우장산동(내발산동)': 'Woojangsan-dong(Naebalsan-dong)'
}

sorted_density_english = sorted_density.rename(index=korean_to_english)

plt.figure(figsize=(14, 10))
sns.barplot(y=sorted_density_english.index, x=sorted_density_english.values, palette="viridis", orient="h")
plt.title('Population Density by Dong (명/m²)', fontsize=16)
plt.xlabel('Population Density (명/m²)', fontsize=14)
plt.ylabel('Dong Name', fontsize=14)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)


plt.tight_layout()
plt.show()

 

 

 

현재 이 데이터는 위도, 경도 정보가 없으므로, 지도상에 차트로 시각화 할 수가 없습니다. 

따라서, 구글 맵 API 를 이용하여, "도로명주소" 컬럼의 값을 기반으로, 위도 경도를 얻어와서 새로운 컬럼을 추가합니다.

 

그리고 새로운 csv 파일을 만듭니다.

!pip install googlemaps

import googlemaps

gmaps_key = "자신의 key를 사용합니다."
gmaps = googlemaps.Client(key=gmaps_key)

df = pd.read_csv('서울특별시 강서구_공동주택 현황_20230905_UTF.csv')

lat_list = []
lng_list = []
for address in df['도로명주소'] :
    result = gmaps.geocode(address, language='ko')
    lat_list.append( result[0]['geometry']['location']['lat'] )
    lng_list.append( result[0]['geometry']['location']['lat'] )
    
    
    
df['lat'] = lat_list
df['lng'] = lng_list

df.to_csv('위치포함한 서울 강서구 공동주택 현황.csv')

 

이제는 위도 경도의 정보도 포함한 데이터를 가지고 작업하겠습니다.

 

 

준공일자를 이용해 각 단지의 연식을 구별하여 표시하도록 하겠습니다. 준공일자별로 색상을 다르게 하여 지도에 나타내보겠습니다.

 

 

지도에 표시하고, 이를 HTML 파일로 저장하여 제공하겠습니다.

m = folium.Map(location=[37.55, 126.85], zoom_start=12)

for index, row in location_data.iterrows():
    try:
        construction_year = int(row['준공일자'].split('-')[0])
    except:
        construction_year = current_year
        
    building_age = current_year - construction_year

    # Determine the color based on the age of the building
    if building_age <= 10:
        marker_color = 'green'
    elif building_age <= 20:
        marker_color = 'blue'
    else:
        marker_color = 'red'

    folium.CircleMarker(
        location=(row['lat'], row['lng']),
        radius=8,
        color=marker_color,
        fill=True,
        fill_color=marker_color,
        fill_opacity=0.6,
        popup=f"{row['단 지 명']} ({construction_year}년 준공)"
    ).add_to(m)

# Save map as HTML
map_html_large_markers_path = "/mnt/data/gangseo_gu_apartment_map_large_markers.html"
m.save(map_html_large_markers_path)

map_html_large_markers_path

 

 

각 단지의 준공 연도를 색상으로 구분하였습니다

  • 녹색 (Green): 최근 10년 이내에 준공된 아파트 (2023년 기준, 2014년 이후 준공)
  • 파란색 (Blue): 10년에서 20년 사이에 준공된 아파트 (2004년 ~ 2013년 준공)
  • 빨간색 (Red): 20년 이상 전에 준공된 아파트 (2003년 이전 준공)

 

아래 링크를 누르면, 지도를 확인할 수 있습니다.

 

https://block1-image-test.s3.ap-northeast-2.amazonaws.com/updated_gangseo_gu_apartment_map.html

 

 

 

 

 

 

 

 

 

반응형