Post

스타벅스입지전략(2) - 공공 데이터 수집

01. 서울시 통계 정보 : 공공 데이터 수집 및 EDA

1. 소개

이 포스트에서는 서울시 공공 데이터를 수집하고, 이를 바탕으로 데이터 탐색적 분석(EDA)을 수행한다. 특히, 서울시의 주민등록 인구 통계와 사업체 현황 통계를 수집하여 이를 분석하는 과정을 보여준다. (작년에 한 프로젝트라서 작년데이터긴 하다 ㅎㅎ;)

2. 데이터 링크

3. EDA

3-1 서울시 주민등록 인구 데이터

  • 데이터를 확인해보자
1
2
3
4
import pandas as pd

sgg_pop_df = pd.read_csv('./files/report.txt', sep='\t', header=1)
sgg_pop_df

alt text

  • 데이터를 불러온 후 sgg_pop_df를 출력해 데이터를 확인할 수 있다. 이 데이터에는 구별 인구 데이터가 포함되어 있으며, 추후 분석을 위해 컬럼명을 영어로 변경한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  columns = {
    '시점': 'GIGAN',
    '동별(1)': 'SUM',
    '동별(2)': 'JACHIGU',
    '소계': 'SEDAE',
    '소계.1': 'GYE_1',
    '남자': 'NAMJA_1',
    '여자': 'YEOJA_1',
    '소계.2': 'GYE_2', # 한국인
    '남자.1': 'NAMJA_2',
    '여자.1': 'YEOJA_2',
    '소계.3': 'GYE_3', # 등록외국인
    '남자.2': 'NAMJA_3',
    '여자.2': 'YEOJA_3',
    '소계.4': 'SEDAEDANGINGU',
    '소계.5': 'N_65SEISANGGORYEONGJA'
  }
sgg_pop_df.rename(columns = columns, inplace = True)
sgg_pop_df.head()
  • 여기서는 각 컬럼의 의미를 파악해 적절한 영문명으로 수정한다.
1
  sgg_pop_df.info()
  • 결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 26 entries, 0 to 25
Data columns (total 15 columns):
 #   Column                 Non-Null Count  Dtype  
---  ------                 --------------  -----  
 0   GIGAN                  26 non-null     object 
 1   SUM                    26 non-null     object 
 2   JACHIGU                26 non-null     object 
 3   SEDAE                  26 non-null     int64  
 4   GYE_1                  26 non-null     int64  
 5   NAMJA_1                26 non-null     int64  
 6   YEOJA_1                26 non-null     int64  
 7   GYE_2                  26 non-null     int64  
 8   NAMJA_2                26 non-null     int64  
 9   YEOJA_2                26 non-null     int64  
 10  GYE_3                  26 non-null     int64  
 11  NAMJA_3                26 non-null     int64  
 12  YEOJA_3                26 non-null     int64  
 13  SEDAEDANGINGU          26 non-null     float64
 14  N_65SEISANGGORYEONGJA  26 non-null     int64  
dtypes: float64(1), int64(11), object(3)
memory usage: 3.2+ KB

  • 마지막으로 ‘소계’ 데이터를 제외하고 구별 데이터를 선택한다.
1
2
3
4
  # 참고용
  condition = sgg_pop_df['JACHIGU'] != '소계'
  sgg_pop_df_selected = sgg_pop_df[condition]
  sgg_pop_df_selected.head()
  • 필요한 컬럼 명 변경한다.
1
2
3
4
5
# 데이터프레임의 칼럼명 변경
sgg_pop_df_final.columns = ['시군구명', '주민등록인구']
sgg_pop_df_final.info()
sgg_pop_df_final.head()

  • 저장
1
2
sgg_pop_df_final.to_excel('./files/sgg_pop.xlsx', index=False)

3-2 서울시 사업체현황

마찬가지로 똑같은 작업을 하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 데이터를 불러와 컬럼명을 변경한다
sgg_biz_df = pd.read_csv('./files/report1.txt', sep='\t', header=3)

columns = {
    '시점': 'GIGAN',
    '동별(1)': 'GIGAN',
    '동별(2)': 'JACHIGU',
    '동별(3)': 'DONG',
    '소계': 'SAEOPCHESU_1',
    '여성대표자': 'YEOSEONGDAEPYOJA',
    '소계.1': 'GYE',
    '': 'NAM',
    '': 'YEO'
}

sgg_biz_df.rename(columns = columns, inplace = True)

# 시군구별 사업체 현황 데이터를 '소계' 기준으로 필터링한다
condition = sgg_biz_df['DONG'] == '소계'
sgg_biz_df_selected = sgg_biz_df[condition]

# 필요 없는 칼럼을 제거하고, 필요한 칼럼을 새롭게 지정한다
columns = ['JACHIGU', 'GYE', 'SAEOPCHESU_1']
sgg_biz_df_final = sgg_biz_df_selected[columns]
sgg_biz_df_final.columns = ['시군구명', '종사자수', '사업체수']

# 데이터프레임의 인덱스를 초기화한다
sgg_biz_df_final = sgg_biz_df_final.reset_index(drop=True)

# 엑셀 파일로 저장한다
sgg_biz_df_final.to_excel('./files/sgg_biz.xlsx', index=False)
This post is licensed under CC BY 4.0 by the author.