[시각화] MZ 세대의 문해력은 정말로 낮을까?¶
1. 분석 배경¶
2. 데이터 분석¶
- KOSIS(https://kosis.kr/) 의 성인문해능력조사
- 성인이 일상생활에서 필요한 문해능력 수준 측정
- 문해 수준을 총 4단계(수준 1 ~ 수준 4)로 나누어 판별
- 수준1(초등 1~2학년 학습 필요 수준)
- 일상생활에 필요한 기본적인 읽기, 쓰기, 셈하기가 불가능한 수준
- 수준2(초등 3~6학년 학습 필요 수준)
- 기본적인 읽기, 쓰기, 셈하기는 가능하지만, 일상생활에 활용은 미흡한 수준
- 수준3(중학 1~3학년 학습 필요 수준)
- 가정 및 여가생활 등 단순한 일상생활에 활용은 가능하지만, 공공 및 경제생활 등 복잡한 일상생활에 활용은 미흡한 수준
- 수준4 이상(중학 학력 이상 수준)
- 일상생활에 필요한 충분한 문해력을 갖춘 수준
- 수준1(초등 1~2학년 학습 필요 수준)
- 통계 설명 자료
In [320]:
# 1. 데이터 통계
## 1-1. 전체 데이터 비율
df_literacy = pd.read_csv(
'https://raw.githubusercontent.com/0525hhgus/Datascience-Study/master/data/literacy_total_level_20221120131800.csv',
encoding="cp949") # 파일명을 영문으로 변경해야 ascii 인코딩 에러가 안뜸
df_literacy.rename(columns=df_literacy.iloc[0],inplace=True)
df_literacy = df_literacy.drop(df_literacy.index[0])
print(df_literacy.shape)
df_literacy
(45, 6)
Out[320]:
응답자특성별(1) | 응답자특성별(2) | 수준1 | 수준2 | 수준3 | 수준4 이상 | |
---|---|---|---|---|---|---|
1 | 전체 | 소계 | 4.5 | 4.2 | 11.4 | 79.8 |
2 | 성별 | 남성 | 2.7 | 3.3 | 10.3 | 83.7 |
3 | 성별 | 여성 | 6.4 | 5.1 | 12.5 | 76.0 |
4 | 연령별 | 18~29세 | 0.2 | 0.5 | 4.0 | 95.3 |
5 | 연령별 | 30~39세 | 0.1 | 0.3 | 4.3 | 95.3 |
6 | 연령별 | 40~49세 | 0.8 | 0.8 | 6.9 | 91.5 |
7 | 연령별 | 50~59세 | 1.9 | 2.3 | 13.0 | 82.8 |
8 | 연령별 | 60~69세 | 5.3 | 7.9 | 22.4 | 64.4 |
9 | 연령별 | 70~79세 | 13.7 | 19.4 | 25.7 | 41.1 |
10 | 연령별 | 80세 이상 | 49.3 | 14.2 | 13.6 | 22.9 |
11 | 학력구분별(1) | 무학 | 66.9 | 16.4 | 8.2 | 8.5 |
12 | 학력구분별(1) | 초졸 | 17.3 | 24.3 | 29.0 | 29.4 |
13 | 학력구분별(1) | 중졸 | 5.0 | 14.0 | 31.2 | 49.8 |
14 | 학력구분별(1) | 고졸 | 1.4 | 2.0 | 13.2 | 83.4 |
15 | 학력구분별(1) | 대졸 이상 | 0.0 | 0.4 | 3.9 | 95.7 |
16 | 학력구분별(2) | 중졸 미만 | 35.5 | 21.4 | 21.4 | 21.7 |
17 | 학력구분별(2) | 중졸 이상 | 1.1 | 2.3 | 10.3 | 86.4 |
18 | 월 가구소득별 | 100만원 미만 | 34.3 | 20.3 | 15.7 | 29.7 |
19 | 월 가구소득별 | 100~299만원 | 6.6 | 8.9 | 20.3 | 64.2 |
20 | 월 가구소득별 | 300~399만원 | 2.9 | 3.1 | 13.3 | 80.7 |
21 | 월 가구소득별 | 400~499만원 | 1.5 | 1.6 | 7.8 | 89.1 |
22 | 월 가구소득별 | 500만원 이상 | 1.6 | 1.0 | 5.8 | 91.6 |
23 | 경제활동상태별 | 취업 | 2.2 | 2.9 | 10.0 | 84.9 |
24 | 경제활동상태별 | 비취업 | 0.2 | 0.9 | 4.9 | 94.1 |
25 | 경제활동상태별 | 비경제활동 | 13.2 | 9.5 | 18.4 | 58.8 |
26 | 직업별 | 소계 | 2.2 | 2.9 | 10.0 | 84.9 |
27 | 직업별 | 관리직 전문가 | 0.0 | 0.5 | 2.4 | 97.1 |
28 | 직업별 | 사무직 | 0.1 | 0.1 | 2.7 | 97.2 |
29 | 직업별 | 서비스 판매 종사자 | 1.6 | 2.4 | 11.2 | 84.8 |
30 | 직업별 | 기술직 노무종사자 | 3.3 | 5.1 | 17.4 | 74.1 |
31 | 직업별 | 농림어업종사자 | 17.2 | 17.3 | 21.4 | 44.1 |
32 | 직업별 | 군인 및 기타 | 2.8 | 0.0 | 10.1 | 87.2 |
33 | 고용형태별 | 소계 | 2.2 | 2.9 | 10.0 | 84.9 |
34 | 고용형태별 | 임금근로자 | 1.0 | 1.3 | 7.4 | 90.4 |
35 | 고용형태별 | 비임금근로자 | 4.3 | 5.5 | 14.2 | 76.1 |
36 | 지역별 | 서울 및 광역시 | 4.4 | 4.2 | 11.0 | 80.3 |
37 | 지역별 | 중소도시 | 3.6 | 3.6 | 11.4 | 81.3 |
38 | 지역별 | 농산어촌 | 12.1 | 8.3 | 14.1 | 65.5 |
39 | 권역별 | 서울 | 3.5 | 3.1 | 7.8 | 85.6 |
40 | 권역별 | 경인권 | 1.8 | 2.2 | 14.2 | 81.8 |
41 | 권역별 | 충청권 | 4.7 | 7.4 | 9.6 | 78.2 |
42 | 권역별 | 전라권 | 2.9 | 2.9 | 6.7 | 87.5 |
43 | 권역별 | 대구권 | 7.4 | 8.0 | 16.1 | 68.5 |
44 | 권역별 | 부산권 | 8.9 | 6.0 | 11.8 | 73.3 |
45 | 권역별 | 기타(제주강원) | 10.1 | 3.9 | 11.1 | 74.9 |
In [321]:
## 1-2. 조사 추정 인구 데이터
df_literacy_population = pd.read_csv(
'https://raw.githubusercontent.com/0525hhgus/Datascience-Study/master/data/literacy_population_20221120135004.csv',
encoding="cp949")
df_literacy_population.rename(columns=df_literacy_population.iloc[0],inplace=True)
df_literacy_population = df_literacy_population.drop(df_literacy_population.index[0]).transpose()
df_literacy_population.rename(columns=df_literacy_population.iloc[0],inplace=True)
df_literacy_population = df_literacy_population.drop(df_literacy_population.index[:2])
df_literacy_population
Out[321]:
전체 | 수준1 | 수준2 | 수준3 | 수준4 이상 | |
---|---|---|---|---|---|
추정인구 (명) | 44081271 | 2001428 | 1855661 | 5039367 | 35184815 |
In [322]:
# 데이터를 수치형으로 변환
df_literacy['수준1'] = df_literacy['수준1'].astype('float')
df_literacy['수준2'] = df_literacy['수준2'].astype('float')
df_literacy['수준3'] = df_literacy['수준3'].astype('float')
df_literacy['수준4 이상'] = df_literacy['수준4 이상'].astype('float')
df_literacy.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 45 entries, 1 to 45
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 응답자특성별(1) 45 non-null object
1 응답자특성별(2) 45 non-null object
2 수준1 45 non-null float64
3 수준2 45 non-null float64
4 수준3 45 non-null float64
5 수준4 이상 45 non-null float64
dtypes: float64(4), object(2)
memory usage: 2.5+ KB
In [323]:
# 조사 비율 데이터와 조사 추정 전체 인구 데이터를 곱함 -> 인구수 데이터로 변환
df_literacy['수준1_인구'] = df_literacy['수준1']*int(df_literacy_population['전체'][0])
df_literacy['수준2_인구'] = df_literacy['수준2']*int(df_literacy_population['전체'][0])
df_literacy['수준3_인구'] = df_literacy['수준3']*int(df_literacy_population['전체'][0])
df_literacy['수준4 이상_인구'] = df_literacy['수준4 이상']*int(df_literacy_population['전체'][0])
In [324]:
## 1-3. 연령대별 문해력 수준에 대한 인구 데이터 추출
df_literacy_age = df_literacy[df_literacy['응답자특성별(1)'] == '연령별'][['응답자특성별(2)', '수준1_인구','수준2_인구', '수준3_인구', '수준4 이상_인구']]
df_literacy_age
Out[324]:
응답자특성별(2) | 수준1_인구 | 수준2_인구 | 수준3_인구 | 수준4 이상_인구 | |
---|---|---|---|---|---|
4 | 18~29세 | 8.816254e+06 | 22040635.5 | 1.763251e+08 | 4.200945e+09 |
5 | 30~39세 | 4.408127e+06 | 13224381.3 | 1.895495e+08 | 4.200945e+09 |
6 | 40~49세 | 3.526502e+07 | 35265016.8 | 3.041608e+08 | 4.033436e+09 |
7 | 50~59세 | 8.375441e+07 | 101386923.3 | 5.730565e+08 | 3.649929e+09 |
8 | 60~69세 | 2.336307e+08 | 348242040.9 | 9.874205e+08 | 2.838834e+09 |
9 | 70~79세 | 6.039134e+08 | 855176657.4 | 1.132889e+09 | 1.811740e+09 |
10 | 80세 이상 | 2.173207e+09 | 625954048.2 | 5.995053e+08 | 1.009461e+09 |
In [325]:
## 1-4. 성별 문해력 수준에 대한 인구 데이터 추출
df_literacy_sex = df_literacy[df_literacy['응답자특성별(1)'] == '성별'][['응답자특성별(2)', '수준1_인구','수준2_인구', '수준3_인구', '수준4 이상_인구']]
df_literacy_sex
Out[325]:
응답자특성별(2) | 수준1_인구 | 수준2_인구 | 수준3_인구 | 수준4 이상_인구 | |
---|---|---|---|---|---|
2 | 남성 | 119019431.7 | 145468194.3 | 454037091.3 | 3.689602e+09 |
3 | 여성 | 282120134.4 | 224814482.1 | 551015887.5 | 3.350177e+09 |
In [326]:
## 1-5. 직업별 문해력 수준에 대한 인구 데이터 추출
df_literacy_job = df_literacy[df_literacy['응답자특성별(1)'] == '직업별'][['응답자특성별(2)', '수준1_인구','수준2_인구', '수준3_인구', '수준4 이상_인구']]
df_literacy_job
Out[326]:
응답자특성별(2) | 수준1_인구 | 수준2_인구 | 수준3_인구 | 수준4 이상_인구 | |
---|---|---|---|---|---|
26 | 소계 | 96978796.2 | 127835685.9 | 440812710.0 | 3.742500e+09 |
27 | 관리직 전문가 | 0.0 | 22040635.5 | 105795050.4 | 4.280291e+09 |
28 | 사무직 | 4408127.1 | 4408127.1 | 119019431.7 | 4.284700e+09 |
29 | 서비스 판매 종사자 | 70530033.6 | 105795050.4 | 493710235.2 | 3.738092e+09 |
30 | 기술직 노무종사자 | 145468194.3 | 224814482.1 | 767014115.4 | 3.266422e+09 |
31 | 농림어업종사자 | 758197861.2 | 762605988.3 | 943339199.4 | 1.943984e+09 |
32 | 군인 및 기타 | 123427558.8 | 0.0 | 445220837.1 | 3.843887e+09 |
3. 데이터 시각화¶
In [347]:
# 시각화 데이터셋 생성용 함수
def visual_dataset(df, target_col):
data_list = []
level_col = ['수준1_인구','수준2_인구', '수준3_인구', '수준4 이상_인구']
for i in range(df[df['응답자특성별(1)'] == target_col].shape[0]):
col_data = df[df['응답자특성별(1)'] == target_col].iloc[i]
for c in level_col:
data_list.append([col_data['응답자특성별(2)'], c, col_data[c[:-3]], col_data[c]])
return pd.DataFrame(data_list, columns=[target_col, "수준", "수준(비율)", "인구"])
In [348]:
visual_age = visual_dataset(df_literacy, '연령별')
visual_age
Out[348]:
연령별 | 수준 | 수준(비율) | 인구 | |
---|---|---|---|---|
0 | 18~29세 | 수준1_인구 | 0.2 | 8.816254e+06 |
1 | 18~29세 | 수준2_인구 | 0.5 | 2.204064e+07 |
2 | 18~29세 | 수준3_인구 | 4.0 | 1.763251e+08 |
3 | 18~29세 | 수준4 이상_인구 | 95.3 | 4.200945e+09 |
4 | 30~39세 | 수준1_인구 | 0.1 | 4.408127e+06 |
5 | 30~39세 | 수준2_인구 | 0.3 | 1.322438e+07 |
6 | 30~39세 | 수준3_인구 | 4.3 | 1.895495e+08 |
7 | 30~39세 | 수준4 이상_인구 | 95.3 | 4.200945e+09 |
8 | 40~49세 | 수준1_인구 | 0.8 | 3.526502e+07 |
9 | 40~49세 | 수준2_인구 | 0.8 | 3.526502e+07 |
10 | 40~49세 | 수준3_인구 | 6.9 | 3.041608e+08 |
11 | 40~49세 | 수준4 이상_인구 | 91.5 | 4.033436e+09 |
12 | 50~59세 | 수준1_인구 | 1.9 | 8.375441e+07 |
13 | 50~59세 | 수준2_인구 | 2.3 | 1.013869e+08 |
14 | 50~59세 | 수준3_인구 | 13.0 | 5.730565e+08 |
15 | 50~59세 | 수준4 이상_인구 | 82.8 | 3.649929e+09 |
16 | 60~69세 | 수준1_인구 | 5.3 | 2.336307e+08 |
17 | 60~69세 | 수준2_인구 | 7.9 | 3.482420e+08 |
18 | 60~69세 | 수준3_인구 | 22.4 | 9.874205e+08 |
19 | 60~69세 | 수준4 이상_인구 | 64.4 | 2.838834e+09 |
20 | 70~79세 | 수준1_인구 | 13.7 | 6.039134e+08 |
21 | 70~79세 | 수준2_인구 | 19.4 | 8.551767e+08 |
22 | 70~79세 | 수준3_인구 | 25.7 | 1.132889e+09 |
23 | 70~79세 | 수준4 이상_인구 | 41.1 | 1.811740e+09 |
24 | 80세 이상 | 수준1_인구 | 49.3 | 2.173207e+09 |
25 | 80세 이상 | 수준2_인구 | 14.2 | 6.259540e+08 |
26 | 80세 이상 | 수준3_인구 | 13.6 | 5.995053e+08 |
27 | 80세 이상 | 수준4 이상_인구 | 22.9 | 1.009461e+09 |
In [350]:
# 2-1. 연령대별 문해력 수준에 대한 인구 수 시각화
## 막대그래프와 선그래프로 시각화
# 시각화 환경 설정
sns.set(font="NanumGothic", font_scale=0.85,
context="talk",
palette="pastel",
style="dark")
fig, ax1 = plt.subplots(figsize=(20, 12))
ax1.grid(axis='y', c='lightgray') # 가로 그리드 설정
ax2 = ax1.twiny() # y축(백만) 공유
sns.barplot(data=visual_age, x='연령별', y='인구', hue='수준', alpha=0.7, ci=None, ax=ax1) # 바 차트
sns.lineplot(data=visual_age, x='연령별', y='인구', hue='수준', ci=None, ax=ax2) # 라인 차트
ax1.legend([],[], frameon=False) # 바 차트 범례 삭제
ax2.axes.xaxis.set_visible(False) # 라인 차트 y축 라벨 삭제
fig.suptitle('연령별 문해력 수준에 대한 인구 수', fontsize=20) # 제목
Out[350]:
Text(0.5, 0.98, '연령별 문해력 수준에 대한 인구 수')
- MZ(18~39세) 세대의 문해력은 높다!
In [429]:
# 2-2. 성별 문해력 수준에 대한 비율 시각화
## 파이차트 활용
visual_sex = visual_dataset(df_literacy, '성별')
sex_catg = visual_sex['성별'].unique()
fig, axs = plt.subplots(ncols=len(sex_catg), figsize=(14,7),
gridspec_kw={'wspace':0.1},
constrained_layout=True)
for i in range(len(sex_catg)):
pie_data = visual_sex[visual_sex['성별'] == sex_catg[i]]
axs[i].pie(x=pie_data['수준(비율)'], autopct='%.0f%%')
axs[i].set_title(sex_catg[i])
fig.legend(pie_data['수준'])
fig.suptitle('성별 문해력 수준에 대한 인구 분포',fontweight ="bold")
Out[429]:
Text(0.5, 0.98, '성별 문해력 수준에 대한 인구 분포')
- 남성이 여성보다 문해력이 높은 편이다.
In [440]:
# 2-2. 직업별 문해력 수준에 대한 인구 시각화
## 히트맵 활용
visual_job = visual_dataset(df_literacy, '직업별')
visual_job = visual_job[visual_job['직업별'] != '소계']
visual_job_pivot = visual_job.pivot_table(index="직업별", columns="수준", values="인구", aggfunc="sum")
plt.figure(figsize=(20, 12))
sns.heatmap(visual_job_pivot, cmap = "bwr", annot=True, fmt=".0f")
Out[440]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fb81c304f10>
- 전반적으로 문해력이 높지만, 농림어업종사자가 문해력이 낮은 편에 속함
In [442]:
df_reading = pd.read_csv(
'https://raw.githubusercontent.com/0525hhgus/Datascience-Study/master/data/amount_of_reading_adult_20221120132043.csv',
encoding="cp949")
df_reading.rename(columns=df_reading.iloc[0],inplace=True)
df_reading = df_reading.drop(df_reading.index[0])
print(df_reading.shape)
df_reading
(16, 5)
Out[442]:
통계분류(1) | 통계분류(2) | 사례수 | 전체 평균 | 독서자 평균 | |
---|---|---|---|---|---|
1 | 전체 | 소계 | 6000 | 4.5 | 9.5 |
2 | 성별 | 남성 | 2991 | 4.5 | 9.3 |
3 | 성별 | 여성 | 3009 | 4.5 | 9.6 |
4 | 연령별 | 19~29세 | 1016 | 8.5 | 10.8 |
5 | 연령별 | 30~39세 | 964 | 6.8 | 9.9 |
6 | 연령별 | 40~49세 | 1123 | 4.9 | 9.9 |
7 | 연령별 | 50~59세 | 1173 | 2.6 | 7.3 |
8 | 연령별 | 60세 이상 | 1724 | 1.9 | 7.8 |
9 | 학력별 | 중졸 이하 | 900 | 0.6 | 5.2 |
10 | 학력별 | 고졸/고퇴 | 2136 | 2.4 | 7.6 |
11 | 학력별 | 대재 이상 | 2964 | 7.1 | 10.3 |
12 | 가구소득별 | 200만원 미만 | 715 | 1.6 | 7.7 |
13 | 가구소득별 | 200~300만원 미만 | 888 | 2.9 | 9.4 |
14 | 가구소득별 | 300~400만원 미만 | 1412 | 4.3 | 9.4 |
15 | 가구소득별 | 400~500만원 미만 | 1521 | 5.1 | 9.4 |
16 | 가구소득별 | 500만원 이상 | 1464 | 6.4 | 9.8 |
In [445]:
df_reading['사례수'] = df_reading['사례수'].astype('float')
df_reading['전체 평균'] = df_reading['전체 평균'].astype('float')
df_reading['독서자 평균'] = df_reading['독서자 평균'].astype('float')
df_reading.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 16 entries, 1 to 16
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 통계분류(1) 16 non-null object
1 통계분류(2) 16 non-null object
2 사례수 16 non-null float64
3 전체 평균 16 non-null float64
4 독서자 평균 16 non-null float64
dtypes: float64(3), object(2)
memory usage: 768.0+ bytes
In [469]:
# 1. 연령대별 독서량 사례수 시각화
df_reading_count_pivot = df_reading[df_reading['통계분류(1)'] == '연령별'].pivot_table(index="통계분류(2)", values="사례수")
df_reading_count_pivot.index.name='연령대'
sns_reading = sns.barplot(data=df_reading_count_pivot.reset_index(), x='연령대', y='사례수', alpha=0.7, ci=None)
sns_reading.grid(axis='y', c='lightgray')
plt.suptitle('연령대별 독서량 사례수',fontweight ="bold")
Out[469]:
Text(0.5, 0.98, '연령대별 독서량 사례수')
In [468]:
# 2. 연령대별 독서량
df_reading_mean_pivot = df_reading[df_reading['통계분류(1)'] == '연령별'].pivot_table(index="통계분류(2)", values="전체 평균")
df_reading_mean_pivot.index.name='연령대'
sns_reading_mean = sns.lineplot(data=df_reading_mean_pivot.reset_index(), x='연령대', y='전체 평균', marker='o', ci=None) # 라인 차트
sns_reading_mean.grid(axis='y', c='lightgray')
- 독서량도 MZ세대가 많은 편이다.
- 결론: MZ(18~39세) 세대의 문해력은 높다.
- 추가로 확인이 필요한 가설
- MZ세대는 SNS 활동이 활발하여, 소수의 사례(문해력 논란)가 돋보이는 것일까?
- 세대 간 사용하는 언어의 차이로 인해 발생한 문제일까?
'IT > 데이터분석' 카테고리의 다른 글
[시각화][애니메이션] 지하철은 내가 탈 때만 붐비는 걸까? - 서울 지하철 시간대별 혼잡도 분석 (0) | 2024.03.01 |
---|---|
[시각화][애니메이션] 유튜버의 미래는 밝을까? - 2024 문화여가활동 분석 (0) | 2024.03.01 |