본문 바로가기
데이터 분석

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

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

우리 학급에는 초등학교 남학생이 더 많다.

남자가 12명, 여자가 11명.

 

그리고 복도를 돌아다닐 때도, 학교 밖을 돌아다닐 때도,

남학생이 여학생보다 더 많이 보인다.

 

이건 진실일까, 혹은 나의 착각일까?

 

결론부터 말하자면, 진실이기도 하고, 착각이기도 하다


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

 

"학교알리미"의 "공개용 데이터"에서

2023학년도 성별 학생수

데이터를 가져왔다.

 

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

'시도교육청', '지역교육청', '지역', '정보공시 학교코드', '학교명', '학교급코드', '설립구분', '제외여부', '제외사유', '1학년(남)', '1학년(여)', '2학년(남)', '2학년(여)', '3학년(남)', '3학년(여)', '4학년(남)', '4학년(여)', '5학년(남)', '5학년(여)', '6학년(남)', '6학년(여)', '특수학급(남)', '특수학급(여)', '순회학급(남)', '순회학급(여)', '계(남)', '계(여)', '총계'

 

속성이 너무 많다.

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

'지역', '계(남)', '계(여)', '총계'

 

파생변수 만들기|

 

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

'지역 1단계', '지역 2단계', '남-여'

 

조금 더 설명을 해보자면,

"서울특별시 서초구"라는 '지역'은 

'지역 1단계'는 '서울특별시'

'지역 2단계'는 '서초구'

가 들어간다.

 

'남-여'는 학교별 남학생 수 - 여학생 수이다.

 

데이터 정제하기

 

가져온 데이터에는 '지역'이 비어있는 학교가 25개가 존재했다.

총 6307개의 학교 중 25개의 데이터는 없어도 무방하다고 생각했기에 이 학교들은 데이터 분석에서 제거했다.

 

데이터 분석하기(1)

 

남학생-여학생 수의 합을 살펴보니

62,561명이었다.

 

전국으로 살펴보았을 때,

남학생이 여학생보다 62,561명이나 차이가 나는 것이다.

 

처음에 내가 느꼈던,

남학생이 더 많다고 느낀 건 진실이었다.

(여기서, 2023년도에 학교를 다니고 있는 학생들, 즉 2006~2011년도 출생 학생들이 출생했을 때는 과연 그 수가 어떠한지도 추가로 살펴보고 싶었다. 이는 다음 글로 작성해보겠다)

 

데이터 분석하기(2)

 

그러면,

초등학교 중에서 남학생이 더 많은 학교가 많을까, 여학생이 더 많은 학교가 많을까?

아마 남학생이 더 많은 학교일 것이다.

 

그런데 그 구체적인 비율이 궁금해져 원그래프로 그려보았다.

그랬더니 그 비율은 아래와 같았다.

 참고로, 남학생과 여학생의 성비가 완벽하게 같은 학교는 3.0%, 191개의 학교였다.


추가로 궁금한 내용 분석하기

 

 분석을 하다보니 다음의 내용도 추가로 궁금해졌다.

 남학생이 유독 많은 학교 혹은 여학생이 유독 많은 학교, 즉 성비 차이가 뚜렷한 학교는 어느 지역에 모여있을까?

 

#성비 차이가 뚜렷한(크게 나는) 학교 판별 방법
(남학생 수 - 여학생 수)차이가 큰 학교부터 작은 학교까지 순서를 쭉 매긴다.
이해를 위해 100개의 학교가 있다고 생각해보자.

이 중
25위의 학교는 3사분위,
50위의 학교는 2사분위,
75위의 학교는 1사분위
라고 지칭한다.

각 분위에 해당하는 (남학생 수 - 여학생 수)의 값을 보면
3사분위 수 = 20명
2사분위 수 = 6명
1사분위 수 = -2명
이다.
여기서 (3사분위 수 - 1사분위 수)를 IQR이라고 지칭한다.

성비 차이가 크게 난다는 것은
3사분위 수 + 1.5*IQR을 초과하는 값,
1사분위 수 - 1.5*IQR의 미만
을 뜻한다.

 위와 같은, 성비 차이가 뚜렷한 학교들의 지역별 개수를 살펴보면,

 

 

 경기도에 이러한 학교가 많은 것으로 보인다.

 

 하지만,

 애초에 경기도는 전국에서 학교 수가 가장 많은 지역이다.

 그러니, 당연히 성비 차이가 뚜렷한 학교도 더 많은 것이 아닐까?

 

 (성비가 뚜렷한 초등학교 수 / 지역별 학교 수)를 해야 제대로 된 값을 알 수 있다.

 그랬더니, 성비가 뚜렷한 초등학교는 "서울특별시"가 가장 많았다.

 

 이러한 학교는 "서울특별시"에 총 90개의 학교가 있는데,

 남학생이 뚜렷히 더 많은 학교66개,

 여학생이 뚜렷히 더 많은 학교24개

 이다.

 

 


최종 결론

 

 전국적으로 보았을 때, 남학생보다 여학생의 수가 더 많다.

 따라서 남학생이 더 많이 보인다고 생각할 수 있다.

 

 하지만,

 내가 근무하고 있는 서울의 24개의 학교에서는 여학생의 수가 더 많다.

 따라서 특정 학교에서는 여학생이 더 많이 보일 것이다.

 


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

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

 

https://colab.research.google.com/drive/1-9yH76i8uTVtfkTgvJuRlqae7it6Q8qg?usp=sharing 

 

230801_2023학생 평균.ipynb

Colaboratory notebook

colab.research.google.com

 

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

!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf

#한글 폰트 출력 가능하도록 설정
from matplotlib import rc
## 기본 글꼴을 NanumGothic으로 변경
rc('font', family='NanumGothic')

#활용할 라이브러리
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

pd.set_option("display.max_columns", None) #데이터 열 모두 보기 설정
#분석할 데이터 불러오기
df = pd.read_csv("https://raw.githubusercontent.com/RaccoonTeacher/tistory/main/2023_students.csv")
#활용할 속성만 추출
df = df[['지역', '계(남)', '계(여)', '총계']]
#파생변수 생성
df["지역_1단계"] = df["지역"].str.split().str[0] #"서울특별시 서초구"의 경우 "서울특별시"만 표시되도록
df["지역_2단계"] = df["지역"].str.split().str[1] #"서울특별시 서초구"의 경우 "서초구"만 표시되도록
df["남-여"] = df["계(남)"] - df["계(여)"] # 남-여학생 수 출력

#Null 값(비어있는 값) 처리
df.isnull().sum() #실행 결과 "지역"열 값이 비어있는 행이 25개
df_pre = df.loc[~df["지역"].isnull()] #"지역"열 값이 비어있는 행 삭제

print("남학생-여학생 수의 합 :", df["남-여"].sum())

#"남, 여 차이 학교 비율" 원그래프 그리기
a = df_pre.loc[df_pre["남-여"]>0].shape[0]
b = df_pre.loc[df_pre["남-여"]<0].shape[0]
c = df_pre.loc[df_pre["남-여"]==0].shape[0]

plt.pie([a, b, c], autopct='%.1f%%') #비율 표시(소수점 첫번째까지)
plt.legend(["남>여", "남=여", "남<여"], loc="upper right") #범례 오른쪽 위 설정
plt.title("남, 여 차이 초등학교 비율") #제목 설정
plt.show()

#"지역별 성비 차이가 뚜렷한 초등학교 표시"
##이상치 탐색
subtract_q1, subtract_q3 = np.quantile(df_pre["남-여"], [0.25, 0.75])
subtract_iqr = subtract_q3 - subtract_q1
df_pre_subtract_outlier = df_pre.loc[(df_pre["남-여"] > (subtract_q3+subtract_iqr*1.5)) | (df_pre["남-여"] < (subtract_q1-subtract_iqr*1.5))]
##그래프 출력(성비 차이가 뚜렷한 초등학교 개수)
result_subtract = df_pre_subtract_outlier.value_counts("지역_1단계").sort_values(ascending=False)
plt.bar(result_subtract.index, result_subtract)
plt.xticks(rotation=45)
plt.title("성비가 뚜렷한 초등학교 개수")
plt.show()
#그래프 출력(지역별 초등학교 수)
plt.bar(df_pre.value_counts("지역_1단계").index, df_pre.value_counts("지역_1단계"))
plt.xticks(rotation=45)
plt.title("지역별 학교 수")
plt.show()
##그래프 출력(성비 차이가 뚜렷한 초등학교 비율)
result_subtract = (df_pre_subtract_outlier.value_counts("지역_1단계") / df_pre.value_counts("지역_1단계")).sort_values(ascending=False)
plt.bar(result_subtract.index, result_subtract)
plt.xticks(rotation=45)
plt.title("성비가 뚜렷한 초등학교 비율")
plt.show()

 

반응형

댓글