공공데이터 포털의 데이터를 사용함.
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개
각 동별 인구 밀집도 계산 하기
인구 밀집도를 계산하려면 해당 지역의 인구와 면적 정보가 필요합니다. 현재 제공된 데이터에는 각 아파트 단지의 세대 수만 포함되어 있습니다.
인구 밀집도를 계산하기 위해서는 다음과 같은 가정을 할 수 있습니다
- 각 세대의 평균 인구 수를 알고 있다면, 이를 세대 수에 곱하여 해당 단지의 총 인구를 추정할 수 있습니다.
- 각 단지의 면적 정보가 필요합니다. 이 정보가 데이터에 없다면, 일반적인 아파트 단지의 평균 면적을 사용하여 추정할 수 있습니다.
저는, 일반적인 아파트 단지의 평균 면적을 사용해서 추정하겠습니다.
- 각 세대의 평균 인구 수는 2.5명으로 가정합니다. (한국의 평균 가구 인원을 참고)
- 일반적인 아파트 단지의 평균 면적은 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
'DataScience' 카테고리의 다른 글
데이터프레임 기본 조작 : 행선택, 열선택, 인덱싱, 슬라이싱 (0) | 2024.08.01 |
---|---|
데이터 전처리 기법: 결측치(NaN) 처리와 이상치(Outlier) 탐지 (0) | 2024.08.01 |
파이썬으로 OpenAI GPT-3 사용하기 (0) | 2024.08.01 |
날씨 데이터 분석 GlobalWeatherRepository (0) | 2023.09.04 |
캐글 API 사용하기 - kaggle.json 파일 얻기 (0) | 2021.02.24 |