본문 바로가기
데이터 분석

우리나라 성비는 어떻게 변했을까?

by 너구리선생님 2023. 8. 3.
반응형

지난 시간에 

초등학교에는 남학생이 더 많을까, 여학생이 더 많을까

를 주제로 데이터 분석을 했다.

https://aigoamigo.tistory.com/105

 

초등학교에는 남학생이 더 많을까, 여학생이 더 많을까

우리 학급에는 초등학교 남학생이 더 많다. 남자가 12명, 여자가 11명. 그리고 복도를 돌아다닐 때도, 학교 밖을 돌아다닐 때도, 남학생이 여학생보다 더 많이 보인다. 이건 진실일까, 혹은 나의

aigoamigo.tistory.com

 

그러던 중 우리나라 성비는 어떻게 변화해왔는지 살펴보고 싶었다.

 

우리나라 성비 변화는 인터넷을 통해 쉽게 찾아볼 수 있었으나,

2022년까지 최신의 데이터를 직접 구해보고 싶어서 분석을 진행해보았다.


데이터 가져오기 및 살펴보기

KOSIS에서 "인구동태건수 및 동태율 추이" 데이터를 가져왔다.

 

위 데이터에는 아래와 같은 속성들이 포함되어 있다.

'출생아수(명)', '사망자수(명)', '자연증가건수(명)', '조출생률(천명당)', '조사망률(천명당)', '자연증가율(천명당)', '합계출산율(명)', '출생성비(명)', '영아사망률(출생아 천명당)', '혼인건수(건)', '조혼인율(천명당)', '이혼건수(건)', '조이혼율(천명당)', '기대수명(출생시 기대여명)', '기대수명(출생시 기대여명) - 남', '기대수명(출생시 기대여명) - 여'

 

속성이 너무 많다.

위 속성 중 나에게 필요한 속성만 추려보았다.

"출생아수(명)", "출생성비(명)"

 

파생변수 만들기

 

위 속성을 바탕으로 추가적으로 몇가지 속성을 만들었다(파생변수 생성).

"출생성비(비율)", "출생남아수", "출생여아수"

조금 더 설명을 해보자면,

"출생성비(비율)"

{"출생성비(명)" / "출생성비(명)" +100}

으로 계산했다.

 

이를 바탕으로

"출생남아수""출생여아수"를 구했다.

 

"출생남아수"

{출생아수(명)*출생성비(비율)}

로 구했고,

 

"출생여아수"

{출생아수(명)-출생남아수}

고 구했다.

 

데이터 분석 및 결론

 

결과는

우리나라 성비는 꾸준히, 여전히 100 이상이다.
하지만 그 성비는 점차 100에 수렴해가는 모습을 보였다.

 

조금 더 보충 설명을 하자면,
성비가 105라는 말은, 여자가 100명일 때 남자는 105명이라는 뜻이다.

 

 

 이렇게 분석을 마치고 나니,

 아이가 태어날 때, 남자가 더 많이 태어나는 것은 자연스러운 것인가

 라는 의문이 들었다.

 

 이를 위해서는 전세계 성비 데이터가 필요하다고 생각했다.

 그래서 다음 글은 전세계 성비는 어떻게 변했을까?

 를 주제로 글을 써보고자 한다.


이 분석은 Colaboratory에서 Python을 활용해 진행했다.

구체적인 코드를 보고 실습도 해보고 싶다면, 아래의 링크로 이동하면 된다.

 

https://colab.research.google.com/drive/1b4VUyYWqDNbYAH6ewNnSmsVdhXsGaoty?usp=sharing 

 

230803_population_Kor.ipynb

Colaboratory notebook

colab.research.google.com

 

보기 편하도록 여기에도 코드를 남겨본다.

#한글 출력 가능 하도록 설정
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf

import pandas as pd
pd.set_option('display.max_rows', None)
#우리 나라 성비
##df_kor = pd.read_csv("https://raw.githubusercontent.com/RaccoonTeacher/tistory/main/2023_Population_Korea.csv", encoding="cp949")
##오류 발생 : 'utf-8' codec can't decode byte 0xb1 in position 1: invalid start byte 
df_kor = pd.read_csv("https://raw.githubusercontent.com/RaccoonTeacher/tistory/main/2023_Population_Korea.csv", encoding="cp949")

#행, 열 바꾸기
df_kor = df_kor.transpose()

#첫번째 행을 열 이름 설정
df_kor.columns = df_kor.iloc[0]
df_kor = df_kor.drop(index="기본항목별")

#필요한 열만 추출
df_kor_pre = df_kor.loc[:, ["출생아수(명)", "출생성비(명)"]]

#출생 남아, 여아 수 산출
df_kor_pre["출생성비(명)"] = df_kor_pre["출생성비(명)"].astype(float)
df_kor_pre["출생아수(명)"] = df_kor_pre["출생아수(명)"].astype(int)
df_kor_pre["출생성비(비율)"] = df_kor_pre["출생성비(명)"][0] / (df_kor_pre["출생성비(명)"][0] + 100)
df_kor_pre["출생남아수"]=(df_kor_pre["출생아수(명)"] * df_kor_pre["출생성비(비율)"]).astype(int)
df_kor_pre["출생여아수"]=df_kor_pre["출생아수(명)"]-df_kor_pre["출생남아수"]

#꺾은선 그래프 그리기
#한글 폰트 출력 가능하도록 설정
import matplotlib.pyplot as plt
from matplotlib import rc
## 기본 글꼴을 NanumGothic으로 변경
rc('font', family='NanumGothic')
plt.plot(df_kor["출생성비(명)"])
plt.xticks(rotation=45)
plt.title("한국 성비")
plt.ylim([104, 110])
plt.show()
반응형

댓글