TIL
2021-04-05 (월) : 데이터 분석 본문
20210405(월)
1. 학습 날짜 : 20210405(월)
2. 학습 시간 :
3. 학습 주제 : 데이터분석
4. 동료 학습 방법 : 개인
5. 학습 목표 : 데이터분석 책 + 데이터분석 실습
6. 학습 내용 :
0. 실제 코딩에 사용한 시간 :
8시간
오늘 목표
- 동네 인구 구조의 시각화
경기도 화성시의 인구 데이터 다루기
어느정도 데이터의 시각화와 데이터 파일을 다룰 수 있다고 판단해서 아래 링크의 기사 - 화성시 인구 90만명 돌파 눈앞.. -을 보고, 화성시의 인구 데이터를 시각화해서 인터넷 커뮤니티에 올려보자고 생각했다.
https://theqoo.net/index.php?mid=square&filter_mode=normal&document_srl=1919629530
주제는 화성시 인구 90만명 돌파,
소주제는,
- 화성시 인구 90만명 중 동탄신도시의 인구가 월등하게 많다고 들었었는데 그것이 사실인가?
- 각 행정구역의 토지면적과 인구 비 계산, 시각화.
어느 지역의 인구 밀집도가 높은가? - 동탄신도시의 인구 변화 추이 - 시간에 따라
- 동탄신도시 인구의 연령대
- 1동탄과 2동탄의 인구 연령대 비교
- 1동탄과 2동탄의 인구 변화 추이 비교
목표
- 화성시 인구 90만명 중 동탄신도시(1,2) 와 타 지역 간 인구 수 비교
- 화성시 갑 을 병 정, 지역의 인구 수 비교
- 각 행정구역의 토지면적과 인구 비 계산.
- 동탄신도시의 인구변화 추이 : (동탄1신도시는 2007년 시범입주, 동탄2신도시는 아마 2016~8년 시범입주.)
- 동탄신도시 인구의 연령대 비교 : 2021년 기준, 2008년 ~ 2021년 기준
- 1동탄과 2동탄의 인구 비교.
2021년 기준 화성시 인구 90만명 중 동탄신도시1,2 와 타 지역 인구 수 비교
*설계 : *
- 사용할 데이터 :
행정안전부 공공 인구 데이터 - https://jumin.mois.go.kr/index.jsp 중 2021년 3월 주민등록 인구 및 세대현황 데이터. 중 2021년 3월 총 인구수, 3월 세대 수.
- 비교 데이터 : 화성시 선거구 재배치 기준, 갑 을 병 정 지역.
set_1 = ['우정', '향남', '남양', '마도', '송산', '서신', '팔탄', '장안', '양감', '새솔']
set_2 = ['비봉', '봉담', '매송', '기배', '화산', '진안']
set_3 = ['병점1동', '병점2동', '반월', '동탄1동', '동탄2동', '동탄3동']
set_4 = ['동탄4동', '동탄5동', '동탄6동', '동탄7동', '동탄8동']
set1 + set2 vs set3 + set4 인구 수 비교.
- 시각화 방법 1 : 각각의 지역에 대한 총 인구수를 막대그래프로 나타낸다.
- 고려할 점 : x축 잘 나타내기. 한글 안깨지게 하기.
- 시각화 방법 2 : 선거구 1, 2와 선거구 3, 4읜 인구 수를 파이그래프로 나타낸다.
- 시각화 방법 3 : 선거구 3, 4의 인구 데이터를 각각 파이그래프로 나타낸다.
과정
plt.bar(np.arange(len(total_list)), total_list, tick_label=city_list)
에서
**ValueError**: operands could not be broadcast together with remapped shapes [original->remapped]: (29,) and requested shape (30,)
와 같은 에러
에러 발생 이유 :
set과 city_list 간 개수 차이가 존재했다.
해결 : set_K의 지역을 조정

문제 : x축의 라벨들이 겹쳐보임.
해결 : xticks의 font를 줄이고, 막대그래프의 width를 0.3으로 조정했다.



정규표현식을 사용해서 모든 숫자를 지웠는데, 동탄n동
의 n
까지 다 지워졌다,
원하는것은 모든 숫자를 지우는것이 아닌, 지역코드 (숫자..)
를 지우는 것.

regex '\(.*'
를 사용해서 괄호시작부부터 뒷부분까지 싹 없애주었다.
선거구 별 인구 비율


화성시 인구 90만명 중 동탄신도시(1,2) 와 타 지역 간 인구 수 비교


화성시 인구밀집도 분석
regex 사용한 파싱
city_str = re.sub(r'\(.*', '', row[0])
city_str = re.sub(r'\_\_\_', '', city_str)
city_str = re.sub(r'읍|면|동$', '', city_str)
전체 코드
import csv
import matplotlib.pyplot as plt
import re
import numpy as np
f_area = open('.\\SocialLandArea.csv', mode='r', encoding='utf-8')
f_pop = open('.\\pop.csv')
read_area = csv.reader(f_area)
read_pop = csv.reader(f_pop)
next(read_area)
next(read_area)
next(read_area)
data = []
data_string = ''
data_pop = 0.0
data_area = 0.0
city_string = []
for row in read_area :
if '화성시' in row[0] :
break
for i in range(28) :
row = next(read_area)
city_str = re.sub(r'\(.*', '', row[0])
city_str = re.sub(r'\_\_\_', '', city_str)
city_str = re.sub(r'읍|면|동$', '', city_str)
city_string.append(city_str)
row[0] = city_str
row[1] = float(row[1])
print(row)
data.append(row)
for row in read_pop :
if '화성' in row[0] :
break
for i in range(28) :
row = next(read_pop)
row[0] = row[0].replace('경기도 화성시 ', '')
row[0] = re.sub(r'\(.*', '', row[0])
for j in range(28) :
if data[j][0] in row[0] :
data_pop = int(row[1].replace(',',''))
data[j].append(data_pop)
break
print('[지역', 'km^2', '총인구수', '인구수 / 면적]')
for i in range(28) :
data[i].append(round((data[i][2] / data[i][1]), 2))
print(data[i])
data_ratio_str = []
data_ratio = []
data_ratio_city = []
for i in range(28) :
data_ratio_str.append(str(data[i][3]))
data_ratio.append(data[i][3])
data_ratio_city.append(data[i][0])
plt.rc('font', family='Malgun Gothic')
plt.figure(figsize=(15,10))
plt.title("2019년 면적 기준 2021년 3월 화성시 면적대비 인구수(밀집도)")
plt.pie(data_ratio, labels=data_ratio_str, autopct='%4.2f%%')
plt.legend(city_string)
plt.axis('equal')
plt.savefig('.\\g_pop_per_area.jpg')
plt.show()
### 세대 수 ###
plt.rc('font', family='Malgun Gothic')
plt.figure(figsize=(15,10))
plt.title("2019년 면적 기준 2021년 3월 화성시 면적대비 인구수(밀집도)")
plt.xlabel('화성시 지역')
plt.ylabel('면적대비 인구수')
plt.xticks(rotation=45)
plt.bar(np.arange(len(data_ratio)), data_ratio, tick_label=data_ratio_city, width=0.5)
plt.savefig('.\\g_pop_per_area.jpg')
plt.show()
결과 :
[지역 km^2 총인구수 인구수 / 면적]
['봉담', 42.75, 81903, 1915.86]
['우정', 61.67, 17378, 281.79]
['향남', 50.01, 86960, 1738.85]
['남양', 67.38, 42026, 623.72]
['매송', 27.27, 7085, 259.81]
['비봉', 38.55, 5830, 151.23]
['마도', 31.89, 6952, 218.0]
['송산', 58.36, 10901, 186.79]
['서신', 43.27, 7108, 164.27]
['팔탄', 50.95, 9943, 195.15]
['장안', 67.66, 10268, 151.76]
['양감', 31.06, 3972, 127.88]
['정남', 40.67, 11432, 281.09]
['진안', 6.87, 43916, 6392.43]
['병점1', 1.45, 28987, 19991.03]
['병점2', 1.04, 24402, 23463.46]
['반월', 3.96, 32392, 8179.8]
['기배', 4.23, 13626, 3221.28]
['화산', 11.61, 23269, 2004.22]
['동탄2', 2.15, 35650, 16581.4]
['동탄1', 5.1, 51406, 10079.61]
['동탄3', 2.06, 42182, 20476.7]
['동탄4', 4.24, 53078, 12518.4]
['동탄5', 11.41, 43156, 3782.3]
['새솔', 1.45, 21790, 15027.59]
['동탄7', 14.68, 84662, 5767.17]
['동탄6', 9.49, 32264, 3399.79]
['동탄8', 6.54, 28327, 4331.35]


결과 해석 :
동탄신도시가 가장 면적대비 인구수가 클 것으로 예상했는데, 실제로는 그렇지 않았고 ,병점2동이 가장 컸다.
단순 인구수로 따지면 동탄이 병점동보다는 인구수가 많앗으나, 병점동이 인구수에 비해서 땅덩어리가 굉장히 좁았다..
동탄신도시의 인구변화 추이 :
- 1동탄 (동탄 1,2,3동)의 인구 변화 추이 :
- 2008 ~ 2020
- 2동탄
- 동탄 4동 : 2015년
- 동탄 5동 : ...
사실, 1동탄, 2동탄 나눌 것 없이 처음부터 빈 공간은 0으로 설정해놓고 그래프 그리면 될듯..?
import csv
import numpy as np
import matplotlib.pyplot as plt
import re
f1 = open('.\\08_10_dongtan.csv')
f2 = open('.\\11_20_dongtan.csv')
dongtan_08 = csv.reader(f1)
dongtan_11 = csv.reader(f2)
years = []
dongtan_pop = [[],[],[],[],[],[],[],[]]
temp_num = 0
next(dongtan_08)
next(dongtan_11)
## init years
for i in range(2008, 2021) :
years.append(i)
for i in range(5) :
for j in range(3) :
dongtan_pop[i + 3].append(0)
j = 0
num = 0
for row in dongtan_08 :
if '동탄' in row[0] and ('동탄면' not in row[0]) :
for i in range(3) :
if row[i * 3 + 1] == '' :
num = 0
else :
num = int(row[i * 3 + 1].replace(',',''))
dongtan_pop[j].append(num)
j += 1
j = 0
for row in dongtan_11 :
if '동탄' in row[0] and ('동탄면' not in row[0]) :
for i in range(10) :
if row[i * 3 + 1] == '' :
num = 0
else :
num = int(row[i * 3 + 1].replace(',',''))
dongtan_pop[j].append(num)
j += 1
plt.rc('font', family='Malgun Gothic')
plt.figure(figsize=(15,10))
plt.title("동탄신도시 인구변화 추이")
for i in range(8) :
plt.plot(dongtan_pop[i], label=(str(i + 1) + '동탄'))
plt.xticks(range(13), range(2008, 2021))
plt.legend()
plt.savefig('.\\g_dongtan_pop_shift.jpg')
plt.show()

csv파일 두 개 (2008~2010, 2011 ~ 2020)년 별 그래프로 동탄신도시 인구변화 추이를 체크했다.
행정구역 상 개편이 통계자료에 반영이 되었는지는 모른다.
한 때, 화성시에 살았던 사람으로, 그냥 ... 궁금했엇다.
본 정말 나노 프로젝트를 진행하면서 아쉬웠던 점은, 엑셀의 표그리기 , 그래프 그리기 기능을 사용하면 더 빨리, 효율적으로 그릴 수 있었을 것 같은데,
굳이 python을 사용해서 그래프를 그려야 했던 이유가 뭐였을까.. 싶다.
추후 도움이 되겠지만서도.. 이 과제를 진행하면서, 굳이..? 라는 의문점이 남기는 한다.
학습에 도움된 사이트 :
오늘 발견한 문제와 해결방안:
7. 학습 총평 :
- 정규표현식의 공부를 해야함을 절실히 느꼈다. 막상 정규표현식을 적용시키려니, 안다고 생각했었는데, 사실은, 모르고 있었다..
8. 다음 학습 계획 :
- 선형대수학.
- 모두의 데이터분석 책 완독.
- 정규표현식에 익숙해지기
'2021 > 일일 기록' 카테고리의 다른 글
2021 05 27 (수) (0) | 2021.05.26 |
---|---|
2021 05 24(월) (0) | 2021.05.24 |
2021-04-02(금) : 데이터 분석 (0) | 2021.04.02 |
2021-03-31(수) : 데이터분석, cub 진행 상황 (0) | 2021.04.01 |
2021-03-30 : 데이터분석 (0) | 2021.03.30 |