Final Project, Diana Aldoshyna¶
Дослідження на базі даних про населення села Дунаєць у 1778 та 1897 роках.
Моя робота має 5 візуалізацій по 3 основним темам:
Тема 1: статево-віковий розподіл населення (1778 та 1897 роки)¶
- Візуалізація 1: статево-вікова піраміда по 1778 року
- Візуалізація 2: статево-вікова піраміда по 1897 року
Тема 2: розподіл населення за соціальним статусом (1778 та 1897 роки)¶
- Візуалізація 3: гістограма для порівняння розподілу населення за соціальним статусом у 1778 та 1897 роках
Тема 3: здобування освіти людьми з різним соціальним статусом та статевою приналежністю (1897 рік)¶
- Візуалізація 4: гістограма, що демонструє, які типи освіти були найпоширенішими у 1897 році, а також соціальний статус людей, що її здобували
- Візуалізація 5: кругова діаграма для порівняння розподілу людей, що здобували освіту, за статевою приналежністю
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import altair as alt
Спочатку я прочитала файл "2.2_Дунаєць_1778.xlsx - База.csv" (та трохи відредагувала його, аби отримати правильні назви колонок) та файл "2.1_Дунаєць.xlsx - База людей.csv". При цьому також одразу відкинула колонки, з якими не працюватиму у майбутньому:
# Читаємо файл за 1778 рік (з неправильними назвами колонок)
dunaec_1778_raw = pd.read_csv('2.2_Дунаєць_1778.xlsx - База.csv', header=None)
# Створюємо правильні назви колонок та вставляємо їх у датафрейм df_1778
headers = dunaec_1778_raw.iloc[3]
headers.iloc[0] = 'Аркуш'
headers.iloc[4] = 'Чоловіки, Число людей наскрізне'
headers.iloc[5] = 'Жінки, Число людей наскрізне'
headers.iloc[6] = 'Чоловіки, Число людей джерело'
headers.iloc[7] = 'Жінки, Число людей джерело'
df_1778 = dunaec_1778_raw.iloc[4:].copy()
df_1778.columns = headers
df_1778.reset_index()
# Лишаємо лише потрібні колонки
df_1778 = df_1778[['Чоловіки, Число людей наскрізне', 'Жінки, Число людей наскрізне', 'Імʼя', 'По-батькові', 'Прізвище', 'Родиний статус', 'Соціальний статус', 'Вік']]
df_1778
| 3 | Чоловіки, Число людей наскрізне | Жінки, Число людей наскрізне | Імʼя | По-батькові | Прізвище | Родиний статус | Соціальний статус | Вік |
|---|---|---|---|---|---|---|---|---|
| 4 | 1 | NaN | Федор | Кондратьев | Лукашевич | господар | духовные | 44 |
| 5 | NaN | 1 | Варвара | Симева | NaN | жена | духовные | 35 |
| 6 | NaN | 2 | Анна | NaN | NaN | дочь | духовные | 17 |
| 7 | 2 | NaN | Тимофей | NaN | NaN | сын | духовные | 15 |
| 8 | 2 | NaN | Пантелеймон | NaN | NaN | сын | духовные | 14 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1596 | 824 | NaN | Леонтий | Афанасиев | NaN | двоюродный брат Александра | бездворные | 25 |
| 1597 | NaN | 770 | Мотрона | Михайлова | NaN | жена его | бездворные | 22 |
| 1598 | 825 | NaN | Герасим | Фомик | Мерник | господар | бездворные | 43 |
| 1599 | NaN | 771 | Агафия | Максимова | NaN | жена его | бездворные | 42 |
| 1600 | 826 | NaN | Лукьян | NaN | NaN | NaN | бездворные | 14 |
1597 rows × 8 columns
# Читаємо файл за 1897 рік
df_1897 = pd.read_csv('2.1_Дунаєць.xlsx - База людей.csv')
# Лишаємо лише потрібні колонки
df_1897 = df_1897[['Пол', 'Возраст', 'Сословие, состояние или звание', 'Обучение']]
df_1897 = df_1897
df_1897
| Пол | Возраст | Сословие, состояние или звание | Обучение | |
|---|---|---|---|---|
| 0 | m | 32 | cossack | rural school |
| 1 | f | 28 | cossack | NaN |
| 2 | f | 5 | cossack | NaN |
| 3 | m | 1 | cossack | NaN |
| 4 | m | 70 | cossack | NaN |
| ... | ... | ... | ... | ... |
| 1547 | m | 3 | peasant-owner | NaN |
| 1548 | NaN | NaN | NaN | NaN |
| 1549 | NaN | NaN | NaN | NaN |
| 1550 | NaN | NaN | NaN | NaN |
| 1551 | NaN | NaN | NaN | NaN |
1552 rows × 4 columns
Візуалізація 1: статево-вікова піраміда по 1778 року¶
У якості перших двох візуалізацій, я вирішила створити дві статево-вікові піраміди для населення 1778 та 1897 років відповідно. Хотіла таким чином побачити тренди у змінах статево-вікового складу населення за цей час.
Спочатку відредагувала відповідні колонки в датасеті 1778 року:
# Створюємо колонку 'Стать' у df_1778
def get_gender(gender):
if type(gender) == float:
return 'Жінка'
else:
return 'Чоловік'
df_1778['Стать'] = df_1778.apply(lambda row: get_gender(row['Чоловіки, Число людей наскрізне']), axis=1)
# Перекодовуємо колонку 'Вік', аби дані у ній були типу Int. У колонці відсутні будь-які нечислові значення, тому тут все просто
df_1778['Вік'] = pd.to_numeric(df_1778['Вік']).astype('Int64')
# Бачимо, що обидві колонки 'Стать' та 'Вік' повністю заповнені і не мають None, тому чистити нічого не треба
df_1778
| 3 | Чоловіки, Число людей наскрізне | Жінки, Число людей наскрізне | Імʼя | По-батькові | Прізвище | Родиний статус | Соціальний статус | Вік | Стать |
|---|---|---|---|---|---|---|---|---|---|
| 4 | 1 | NaN | Федор | Кондратьев | Лукашевич | господар | духовные | 44 | Чоловік |
| 5 | NaN | 1 | Варвара | Симева | NaN | жена | духовные | 35 | Жінка |
| 6 | NaN | 2 | Анна | NaN | NaN | дочь | духовные | 17 | Жінка |
| 7 | 2 | NaN | Тимофей | NaN | NaN | сын | духовные | 15 | Чоловік |
| 8 | 2 | NaN | Пантелеймон | NaN | NaN | сын | духовные | 14 | Чоловік |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1596 | 824 | NaN | Леонтий | Афанасиев | NaN | двоюродный брат Александра | бездворные | 25 | Чоловік |
| 1597 | NaN | 770 | Мотрона | Михайлова | NaN | жена его | бездворные | 22 | Жінка |
| 1598 | 825 | NaN | Герасим | Фомик | Мерник | господар | бездворные | 43 | Чоловік |
| 1599 | NaN | 771 | Агафия | Максимова | NaN | жена его | бездворные | 42 | Жінка |
| 1600 | 826 | NaN | Лукьян | NaN | NaN | NaN | бездворные | 14 | Чоловік |
1597 rows × 9 columns
Далі я створила статево-вікову піраміду для населення 1778 року:
num_male = df_1778[df_1778['Стать'] == 'Чоловік'].shape[0]
num_female = df_1778[df_1778['Стать'] == 'Жінка'].shape[0]
male = alt.Chart(df_1778) \
.transform_filter(alt.datum['Стать'] == 'Чоловік') \
.mark_bar() \
.encode(
alt.X('count()').sort('descending').title('Кількість людей'),
alt.Y('Вік:O').sort('descending').axis(None),
tooltip=['Вік:O', 'count()']) \
.properties(height=600, title=f'Чоловіки, {num_male} всього') \
.interactive()
female = alt.Chart(df_1778) \
.transform_filter(alt.datum['Стать'] == 'Жінка') \
.mark_bar(color='#8b9dc3') \
.encode(
alt.X('count()').title('Кількість людей'),
alt.Y('Вік:O').sort('descending').axis(None),
tooltip=['Вік:O', 'count()']) \
.properties(height=600, title=f'Жінки, {num_female} всього') \
.interactive()
age_scale = alt.Chart(df_1778) \
.mark_text(size=9) \
.encode(
alt.Y('Вік:O').sort('descending').axis(None),
alt.Text('Вік:O')) \
.properties(height=600)
title = {
'text': 'Статево-вікова піраміда населення села Дунаєць, 1778 рік\n',
'fontSize': 17,
'anchor': 'middle',
'fontWeight': 'bold'
}
alt.concat(male, age_scale, female, spacing=1, title=title).resolve_scale(y='shared')
Мої коментарі до статево-вікової піраміди 1778 року ↑
- Серед населення старшого віку (>40 років) помітно переважають чоловіки, що суперечить сучасним трендам в Україні та у світі.
- В цілому по чисельності дещо переважає чоловіче населення (828 чоловіків, 769 жінок), що також суперечить сучасному стану в Україні.
Візуалізація 2: статево-вікова піраміда по 1897 року¶
Я відредагувала і переклала відповідні колонки в датасеті 1897 року:
# Перекладаємо назви колонок у df_1897 українською
df_1897.rename(columns={'Пол': 'Стать',
'Возраст': 'Вік',
'Сословие, состояние или звание': 'Соціальний статус',
'Обучение': 'Освіта',}, inplace=True)
# Перекодовуємо колонку 'Вік', аби дані у ній були типу Int. У колонці є текстові дані ('2 months', '6 months', '4 months', 'less then 1 month', '5 months', '3 months', '8 months', '3 days', '1 month', '7 months', '9 months', '10 months', '2 weeks'), але усі вони мають на увазі вік дитини менше 1 року, тому перекодовуємо їх усі як 0
df_1897['Вік'] = pd.to_numeric(df_1897['Вік'], errors='coerce').fillna(0).astype('int64')
# Перекладаємо елементи колонки 'Стать' українською
gender = {'m': 'Чоловік', 'f': 'Жінка'}
df_1897['Стать'] = df_1897['Стать'].map(gender)
# Колонка 'Стать' має одне значення None, тож в рамках статево-вікової піраміди нам доведеться прибрати з датасету цю небінарну особу:)
df_1897 = df_1897[~df_1897['Стать'].isna()]
df_1897
| Стать | Вік | Соціальний статус | Освіта | |
|---|---|---|---|---|
| 0 | Чоловік | 32 | cossack | rural school |
| 1 | Жінка | 28 | cossack | NaN |
| 2 | Жінка | 5 | cossack | NaN |
| 3 | Чоловік | 1 | cossack | NaN |
| 4 | Чоловік | 70 | cossack | NaN |
| ... | ... | ... | ... | ... |
| 1543 | Жінка | 30 | peasant-owner | NaN |
| 1544 | Жінка | 9 | peasant-owner | NaN |
| 1545 | Чоловік | 7 | peasant-owner | NaN |
| 1546 | Чоловік | 5 | peasant-owner | NaN |
| 1547 | Чоловік | 3 | peasant-owner | NaN |
1545 rows × 4 columns
Далі я створила саму статево-вікову піраміду для населення 1897 року:
num_male = df_1897[df_1897['Стать'] == 'Чоловік'].shape[0]
num_female = df_1897[df_1897['Стать'] == 'Жінка'].shape[0]
male = alt.Chart(df_1897) \
.transform_filter(alt.datum['Стать'] == 'Чоловік') \
.mark_bar() \
.encode(
alt.X('count()').sort('descending').title('Кількість людей'),
alt.Y('Вік:O').sort('descending').axis(None),
tooltip=['Вік:O', 'count()']) \
.properties(height=600, title=f'Чоловіки, {num_male} всього') \
.interactive()
female = alt.Chart(df_1897) \
.transform_filter(alt.datum['Стать'] == 'Жінка') \
.mark_bar(color='#8b9dc3') \
.encode(
alt.X('count()').title('Кількість людей'),
alt.Y('Вік:O').sort('descending').axis(None),
tooltip=['Вік:O', 'count()']) \
.properties(height=600, title=f'Жінки, {num_male} всього') \
.interactive()
age_scale = alt.Chart(df_1897) \
.mark_text(size=9) \
.encode(
alt.Y('Вік:O').sort('descending').axis(None),
alt.Text('Вік:O')) \
.properties(height=600)
title = {
'text': 'Статево-вікова піраміда населення села Дунаєць, 1897 рік',
'fontSize': 17,
'anchor': 'middle',
'fontWeight': 'bold'}
alt.concat(male, age_scale, female, spacing=1, title=title).resolve_scale(y='shared')
Мої коментарі до статево-вікової піраміди 1897 року ↑
- Порівняно з 1778 роком помітно збільшилась тривалість життя населення. Так, наприклад, якщо у 1778 році у с. Дунаєць проживало всього 3 людини старше 70 років, то у 1897 році їх було вже 30.
- Серед населенння старшого віку (>60 років) помітно переважають чоловіки, що знову ж таки суперечить сучасним трендам в Україні.
- Загалом статевий розподіл населення є більш рівномірним (і чоловіків, і жінок 774 особи), порівняно з 1778 роком.
Візуалізація 3: гістограма для порівняння розподілу населення за соціальним статусом у 1778 та 1897 роках¶
Далі я вирішила порівняти те, яка кількість населення мала певний соціальний статус у 1778 та 1897 роках, зобразивши це у вигляді гістограми.
Спочатку я попрацювала з колонкою 'Соціальний статус' у датасеті 1778 року:
# Бачимо, що у датасеті 1778 року є одна людина, що має None у колонці 'Соціальний статус'
df_1778[df_1778['Соціальний статус'].isna()]
| 3 | Чоловіки, Число людей наскрізне | Жінки, Число людей наскрізне | Імʼя | По-батькові | Прізвище | Родиний статус | Соціальний статус | Вік | Стать |
|---|---|---|---|---|---|---|---|---|---|
| 742 | 381 | NaN | Семен | Гордиев | NaN | двоюродный брат Лазара | NaN | 28 | Чоловік |
# У датасеті зазначено, що ця людина належала до родини, всі члени якої мали статус 'военные', тому в цьому випадку найімовірніше, що None є просто помилкою, яку краще виправити:
df_1778.loc[df_1778['Соціальний статус'].isna(), 'Соціальний статус'] = 'военные'
# Перекладаємо елементи колонки 'Соціальний статус' українською
social_status = {'духовные': 'Духовенство',
'военные': 'Військові',
'посполитые': 'Посполиті',
'дворовые': 'Дворові',
'бездворные': 'Бездворні'}
df_1778['Соціальний статус'] = df_1778['Соціальний статус'].map(social_status)
# df_1778['Соціальний статус'].unique()
df_1778
| 3 | Чоловіки, Число людей наскрізне | Жінки, Число людей наскрізне | Імʼя | По-батькові | Прізвище | Родиний статус | Соціальний статус | Вік | Стать |
|---|---|---|---|---|---|---|---|---|---|
| 4 | 1 | NaN | Федор | Кондратьев | Лукашевич | господар | Духовенство | 44 | Чоловік |
| 5 | NaN | 1 | Варвара | Симева | NaN | жена | Духовенство | 35 | Жінка |
| 6 | NaN | 2 | Анна | NaN | NaN | дочь | Духовенство | 17 | Жінка |
| 7 | 2 | NaN | Тимофей | NaN | NaN | сын | Духовенство | 15 | Чоловік |
| 8 | 2 | NaN | Пантелеймон | NaN | NaN | сын | Духовенство | 14 | Чоловік |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1596 | 824 | NaN | Леонтий | Афанасиев | NaN | двоюродный брат Александра | Бездворні | 25 | Чоловік |
| 1597 | NaN | 770 | Мотрона | Михайлова | NaN | жена его | Бездворні | 22 | Жінка |
| 1598 | 825 | NaN | Герасим | Фомик | Мерник | господар | Бездворні | 43 | Чоловік |
| 1599 | NaN | 771 | Агафия | Максимова | NaN | жена его | Бездворні | 42 | Жінка |
| 1600 | 826 | NaN | Лукьян | NaN | NaN | NaN | Бездворні | 14 | Чоловік |
1597 rows × 9 columns
А також переклала колонку 'Соціальний статус' у датасеті 1897 року:
# Значень None у цій колонці цього датасету немає, тож просто перекладаємо елементи колонки 'Соціальний статус' українською
social_status_1 = {'dukhovnogo': 'Духовенство',
'cossack': 'Козаки',
'citizen': 'Міщани',
'peasant-owner': 'Селяни',
'dvorovyj': 'Дворові',
'state peasant': 'Державні селяни',
'nobles': 'Дворяни',
'imenuyushchijsya dvoryanin': 'Іменовані дворяни'}
df_1897.loc[:, 'Соціальний статус'] = df_1897['Соціальний статус'].map(social_status_1)
# df_1897['Соціальний статус'].unique()
df_1897
| Стать | Вік | Соціальний статус | Освіта | |
|---|---|---|---|---|
| 0 | Чоловік | 32 | Козаки | rural school |
| 1 | Жінка | 28 | Козаки | NaN |
| 2 | Жінка | 5 | Козаки | NaN |
| 3 | Чоловік | 1 | Козаки | NaN |
| 4 | Чоловік | 70 | Козаки | NaN |
| ... | ... | ... | ... | ... |
| 1543 | Жінка | 30 | Селяни | NaN |
| 1544 | Жінка | 9 | Селяни | NaN |
| 1545 | Чоловік | 7 | Селяни | NaN |
| 1546 | Чоловік | 5 | Селяни | NaN |
| 1547 | Чоловік | 3 | Селяни | NaN |
1545 rows × 4 columns
Далі я створила саму гістограму для порівняння розподілу людей за соціальним статусом:
color_scale=alt.Scale(
domain=['Військові', 'Козаки', 'Посполиті', 'Селяни', 'Бездворні', 'Дворові', 'Духовенство', 'Іменовані дворяни', 'Міщани', 'Державні селяни', 'Дворяни'],
range=['#5e4fa2', '#5e4fa2', '#3288bd', '#3288bd', '#66c2a5', '#abdda4', '#e6f598', '#fee08b', '#fdae61', '#f46d43', '#d53e4f'])
social_1778 = alt.Chart(df_1778) \
.mark_bar() \
.encode(
alt.Y('count()').title('Кількість людей'),
alt.X('Соціальний статус').sort(['Військові', 'Посполиті', 'Бездворні', 'Дворові', 'Духовенство']).title(None).axis(alt.Axis(labelAngle=-50)),
tooltip=['Соціальний статус', 'count()'],
color=alt.Color('Соціальний статус').scale(color_scale)) \
.properties(height=400, width=200, title=f'1778 рік') \
.interactive()
social_1897 = alt.Chart(df_1897) \
.mark_bar() \
.encode(
alt.Y('count()').title('Кількість людей'),
alt.X('Соціальний статус').sort(['Козаки', 'Селяни', 'Духовенство', 'Іменовані дворяни', 'Міщани', 'Державні селяни', 'Дворяни', 'Дворові']).title(None).axis(alt.Axis(labelAngle=-50)),
tooltip=['Соціальний статус', 'count()'],
color=alt.Color('Соціальний статус').scale(color_scale)) \
.properties(height=400, width=320, title=f'1897 рік') \
.interactive()
title = {
'text': 'Розподіл населення за соціальним статусом',
'fontSize': 17,
'anchor': 'middle',
'fontWeight': 'bold'}
alt.concat(social_1778, social_1897, title=title).resolve_scale(y='shared')
Мої коментарі до гістограми ↑
*Тут можна скористатись tooltip, щоб подивитись на конкретну кількість людей, що мали певний соціальний статус
- І у 1778 році, і у 1897 двома основними категоріями населення були Військові/ Козаки та Посполиті/ Селяни. Інші категорії були дуже малочисельними, особливо у 1897 році.
- Категорія Бездворні повністю зникла до 1897 року, а категорія Дворові стала помітно менш численною (84 людини у 1778 році у порівнянні з лише 1 у 1897).
- У 1897 році з'явились такі категорії населення як Іменовані дворяни, Дворяни, Міщани та Державні селяни.
Я вирішила також додати визначення деяких термінів-соціальних статусів для більш повного розуміння гістограми (посилання на процитовані джерела лишила в кінці роботи):
- Посполиті - "селяни Лівобережної і Слобідської України в другій половині XVII — XVIII століттях та некозацьке населення (селянство) Запоріжжя за часів Нової Січі (1734—1775)".
- Дворові - "особлива категорія кріпаків, які використовувалися їхніми панами-господарями як домашня прислуга".
- Державні селяни - "велика станова група селян в російській імперії, в тому числі і на українських землях, у 18-19 століттях, які користувалися казенною землею і були феодально залежні від держави, вважаючись проте особисто вільними".
Візуалізація 4: гістограма, що демонструє, які типи освіти були найпоширенішими у 1897 році, а також соціальний статус людей, що її здобували¶
Тут я вирішила подивитись, які шляхи отримання освіти були популярними у 1897 році, а також який соціальний статус мали люди, що мали можливість здобувати освіту.
На жаль, у датасеті 1778 року відсутня інформація про отримання освіти, тому порівняльний аналіз тут зробити неможливо:(
Спочатку я подивилась, які загалом були варіанти шляхів отримання освіти. Вони виявились досить різноманітними; окрім шкіл та училищ, люди могли навчатись вдома, у полку, або у причетника:
df_1897_education = df_1897[~df_1897['Освіта'].isna()].copy()
df_1897_education['Освіта'].unique()
# df_1897_education[df_1897_education['Стать']== 'Жінка']
array(['rural school',
"obuchaetsya v sel'skom nachal'nom zemskom uchilishche",
'zemskoe uchilishche', "zemskaya nachal'naya shkola",
"obuchaetsya v zemskom nachal'nom uchilishche",
'obuchaetsya v zemskom narodnom uchilishche',
'zemskoe narodnoe uchilishche', "sel'skoe narodnoe uchilishche",
'zemskaya narodnaya shkola', 'Home',
"zemskoe nachal'noe uchilishche", 'zemskaya shkola', 'V polku',
'Gluhovskoe gorodskoe uchilishche', 'u prichetnika',
'zemskoe narodnoe odnoklassnoe uchilishche',
"Zemskoe odnoklasnoe sel'skoe uchilishche",
"zemskoe nachal'noe odnoklasnoe uchilishche",
"zemskoe nachal'noe sel'skoe uchilishche",
"zemskoe odnoklasnoe sel'skoe uchilishche",
"obuchaetsya v zemskom nachal'nom odnoklasnom uchilishche",
"sel'skoe nachal'noe odnoklasnoe uchilishche",
"sel'skoe zemskoe uchilishche",
"obuchaetsya v sel'skom narodnom zemskom uchilishche", 'Doma',
"sel'skaya zemskaya shkola",
'detskij priyut G. Tereshchenko v m. Glukhove',
'cerkovno-prikhodskaya shkola',
'obuchaetsya v zemskom narodnom odnoklassnom uchilishche',
'obuchaetsya v gorodskom 3 klassnom uchilishche',
'zemskoe prikhodskoe uchilishche',
'zemskoe odnoklassnoe uchilishche',
'Glukhovskoe 3-kh klassnoe uezdnoe uchilishche',
"sel'skaya narodnaya shkola",
"narodnoe sel'skoe odnoklasnoe uchilishche",
"Umanskoe zemledel'cheskoe uchilishche", "sel'skaya shkola",
"obuchaetsya v sel'skoj shkole",
'Chernigovskaya dukhovnaya seminariya',
'Novgorod-Severskaya progimnaziya',
'gorodskoe 3-kh klassnoe uchilishche'], dtype=object)
Ці елементи потребували перекладу та перекодування. Серед них були такі, що були записані трохи різним чином, проте мали однаковий зміст (наприклад, "obuchaetsya v zemskom nachal'nom uchilishche" та "zemskoe nachal'noe uchilishche"), тож я записувала їх однаковим чином ('Земське початкове училище'):
# Задаємо словник для перекладу та перекодування та застосовуємо його
education = {'rural school': 'Сільська школа',
"zemskaya nachal'naya shkola": 'Земська школа',
'zemskaya narodnaya shkola': 'Земська народна школа',
'zemskaya shkola': 'Земська школа',
"sel'skoe narodnoe uchilishche": 'Сільське народне училище',
"obuchaetsya v sel'skom nachal'nom zemskom uchilishche": 'Земське сільське училище',
"obuchaetsya v zemskom nachal'nom uchilishche": 'Земське початкове училище',
"zemskoe nachal'noe uchilishche": 'Земське початкове училище',
'zemskoe uchilishche': 'Земське училище',
'obuchaetsya v zemskom narodnom uchilishche': 'Земське народне училище',
'zemskoe narodnoe uchilishche': 'Земське народне училище',
'Home': 'Вдома',
'Doma': 'Вдома',
'V polku': 'В полку',
'u prichetnika': 'У причетника',
'Gluhovskoe gorodskoe uchilishche': 'Глухівське міське училище',
'zemskoe narodnoe odnoklassnoe uchilishche': 'Земське народне однокласне училище',
"Zemskoe odnoklasnoe sel'skoe uchilishche": 'Земське сільське училище',
"zemskoe nachal'noe odnoklasnoe uchilishche": 'Земське початкове училище',
"zemskoe nachal'noe sel'skoe uchilishche": 'Земське сільське училище',
"zemskoe odnoklasnoe sel'skoe uchilishche": 'Земське сільське училище',
"obuchaetsya v zemskom nachal'nom odnoklasnom uchilishche": 'Земське початкове училище',
"sel'skoe nachal'noe odnoklasnoe uchilishche": 'Сільське училище',
"sel'skoe zemskoe uchilishche": 'Земське сільське училище',
"obuchaetsya v sel'skom narodnom zemskom uchilishche": 'Сільське народне училище',
"sel'skaya zemskaya shkola": 'Земська школа',
'detskij priyut G. Tereshchenko v m. Glukhove': 'Дитячий притулок Г. Терещенко в Глухові',
'cerkovno-prikhodskaya shkola': 'Церковно-парафіяльна школа',
'obuchaetsya v zemskom narodnom odnoklassnom uchilishche': 'Земське народне однокласне училище',
'obuchaetsya v gorodskom 3 klassnom uchilishche': 'Глухівське міське училище',
'zemskoe prikhodskoe uchilishche': 'Земське училище',
'zemskoe odnoklassnoe uchilishche': 'Земське училище',
'Glukhovskoe 3-kh klassnoe uezdnoe uchilishche': 'Глухівське міське училище',
"sel'skaya narodnaya shkola": 'Сільська народна школа',
"narodnoe sel'skoe odnoklasnoe uchilishche": 'Сільське народне училище',
"Umanskoe zemledel'cheskoe uchilishche": 'Уманське землеробське училище',
"sel'skaya shkola": 'Сільська школа',
"obuchaetsya v sel'skoj shkole": 'Сільська школа',
'Chernigovskaya dukhovnaya seminariya': 'Чернігівська духовна семінарія',
'Novgorod-Severskaya progimnaziya': 'Новгород-Сіверська прогімназія',
'gorodskoe 3-kh klassnoe uchilishche': 'Глухівське міське училище'}
df_1897_education['Освіта'] = df_1897_education['Освіта'].map(education)
df_1897_education['Освіта'].unique()
array(['Сільська школа', 'Земське сільське училище', 'Земське училище',
'Земська школа', 'Земське початкове училище',
'Земське народне училище', 'Сільське народне училище',
'Земська народна школа', 'Вдома', 'В полку',
'Глухівське міське училище', 'У причетника',
'Земське народне однокласне училище', 'Сільське училище',
'Дитячий притулок Г. Терещенко в Глухові',
'Церковно-парафіяльна школа', 'Сільська народна школа',
'Уманське землеробське училище', 'Чернігівська духовна семінарія',
'Новгород-Сіверська прогімназія'], dtype=object)
Тепер можемо побудувати для гістограму для отриманих даних:
color_scale_1897=alt.Scale(
domain=['Козаки','Селяни', 'Дворові', 'Духовенство', 'Іменовані дворяни', 'Міщани', 'Державні селяни', 'Дворяни'],
range=['#5e4fa2','#3288bd', '#abdda4', '#e6f598', '#fee08b', '#fdae61', '#f46d43', '#d53e4f'])
alt.Chart(df_1897_education) \
.mark_bar() \
.encode(
alt.Y('count()').title('Кількість людей'),
alt.X('Освіта').sort('-y').title(None).axis(alt.Axis(labelAngle=-50)),
tooltip=['Соціальний статус', 'count()'],
color=alt.Color('Соціальний статус').scale(color_scale_1897)) \
.properties(height=500, width=800, title=f'Популярність різних способів здобуття освіти, 1897 рік') \
.interactive()
Мої коментарі до гістограми ↑
*Тут можна скористатись tooltip, щоб подивитись скільки саме людей з певним соціальним статусом здобували освіту певним шляхом
- Перш за все, ми бачимо, що найбільш популярним шляхом здобуття освіти були різні типи земських училищ (перша, друга, третя та п'ята колонки).
- Також досить помітна частка людей навчались вдома, у причетника чи в полку, тобто здобували неформальну освіту.
- Сільські училища та різні типи шкіл були помітно менш популярними.
Візуалізація 5: кругова діаграма для порівняння розподілу людей, що здобували освіту, за статевою приналежністю¶
Наприкінці мені стало цікаво подивитись на статевий розподіл серед людей, що мали змогу здобувати освіту. Чи були серед них жінки?
Для цього я вирішила створити кругову діаграму:
# Рахуємо, скільки було чоловіків та жінок, що здобували освіту
people_with_education_males = df_1897_education[df_1897_education['Стать']=='Чоловік'].shape[0]
people_with_education_females = df_1897_education[df_1897_education['Стать']=='Жінка'].shape[0]
gender_and_education = pd.DataFrame({
'Num of people with education': [people_with_education_males, people_with_education_females],
'Text': [f'{people_with_education_males} чоловіків', f'{people_with_education_females} жінок']
})
# Створюємо pie chart
base = alt.Chart(gender_and_education) \
.encode(
alt.Theta('Num of people with education:Q').stack(True),
alt.Color('Text').legend(None))
pie = base.mark_arc(outerRadius=110).properties(title='Серед людей, що здобували освіту у 1897 році, було:')
text = base.mark_text(radius=120, size=14).encode(text='Text')
pie + text
Мої коментарі до кругової діаграми ↑
Ми бачимо, що кілька жінок все ж здобували освіту, але у порівнянні з чоловіками, їх, звичайно, було дуже мало.
Це кінець мого Final Project. Дякую за увагу:)
Посилання на процитовані джерела:
- Визначення: