Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
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
Archives
Today
Total
관리 메뉴

TIL

2021-04-05 (월) : 데이터 분석 본문

2021/일일 기록

2021-04-05 (월) : 데이터 분석

ililillllllliilli 2021. 4. 6. 00:15

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만명 돌파,

소주제는,

  1. 화성시 인구 90만명 중 동탄신도시의 인구가 월등하게 많다고 들었었는데 그것이 사실인가?
  2. 각 행정구역의 토지면적과 인구 비 계산, 시각화.
    어느 지역의 인구 밀집도가 높은가?
  3. 동탄신도시의 인구 변화 추이 - 시간에 따라
  4. 동탄신도시 인구의 연령대
  5. 1동탄과 2동탄의 인구 연령대 비교
  6. 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의 지역을 조정



image-20210405140449031

문제 : x축의 라벨들이 겹쳐보임.

해결 : xticks의 font를 줄이고, 막대그래프의 width를 0.3으로 조정했다.



image-20210405141157430image-20210405142027891image-20210405151600935

정규표현식을 사용해서 모든 숫자를 지웠는데, 동탄n동n까지 다 지워졌다,

원하는것은 모든 숫자를 지우는것이 아닌, 지역코드 (숫자..)를 지우는 것.

image-20210405152909302

regex '\(.*'를 사용해서 괄호시작부부터 뒷부분까지 싹 없애주었다.

선거구 별 인구 비율

image-20210405144817545image-20210405144835365



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

image-20210405155254100image-20210405155310355



화성시 인구밀집도 분석


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]
image-20210405182251755image-20210405182308224



결과 해석 :

동탄신도시가 가장 면적대비 인구수가 클 것으로 예상했는데, 실제로는 그렇지 않았고 ,병점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()

image-20210406000713627

csv파일 두 개 (2008~2010, 2011 ~ 2020)년 별 그래프로 동탄신도시 인구변화 추이를 체크했다.


행정구역 상 개편이 통계자료에 반영이 되었는지는 모른다.


한 때, 화성시에 살았던 사람으로, 그냥 ... 궁금했엇다.


본 정말 나노 프로젝트를 진행하면서 아쉬웠던 점은, 엑셀의 표그리기 , 그래프 그리기 기능을 사용하면 더 빨리, 효율적으로 그릴 수 있었을 것 같은데,

굳이 python을 사용해서 그래프를 그려야 했던 이유가 뭐였을까.. 싶다.


추후 도움이 되겠지만서도.. 이 과제를 진행하면서, 굳이..? 라는 의문점이 남기는 한다.




학습에 도움된 사이트 :


사이트 주제 : 사이트
정규표현식으로 문자열에서 숫자 제거 https://www.delftstack.com/ko/howto/python/remove-numbers-from-string-python/
정규표현식 https://medium.com/@originerd/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-%EC%A2%80-%EB%8D%94-%EA%B9%8A%EC%9D%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-5bd16027e1e0
정규표현식으로 문자열 제거 https://www.delftstack.com/ko/howto/python/remove-certain-characters-from-string-python/#re.sub%25EB%25A9%2594%25EC%2584%259C%25EB%2593%259C%25EB%25A5%25BC-%25EC%2582%25AC%25EC%259A%25A9%25ED%2595%2598%25EC%2597%25AC-python%25EC%259D%2598-%25EB%25AC%25B8%25EC%259E%2590%25EC%2597%25B4%25EC%2597%2590%25EC%2584%259C-%25ED%258A%25B9%25EC%25A0%2595-%25EB%25AC%25B8%25EC%259E%2590-%25EC%25A0%259C%25EA%25B1%25B0
데이터 시각화 https://wikidocs.net/92095
matplotlib 데이터 시각화 공식문서 https://matplotlib.org/stable/api/text_api.html#matplotlib.text.Text

오늘 발견한 문제와 해결방안:

  •  

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
Comments