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: кругова діаграма для порівняння розподілу людей, що здобували освіту, за статевою приналежністю
In [95]:
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". При цьому також одразу відкинула колонки, з якими не працюватиму у майбутньому:

In [96]:
# Читаємо файл за 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
Out[96]:
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

In [97]:
# Читаємо файл за 1897 рік
df_1897 = pd.read_csv('2.1_Дунаєць.xlsx - База людей.csv')

# Лишаємо лише потрібні колонки
df_1897 = df_1897[['Пол', 'Возраст', 'Сословие, состояние или звание', 'Обучение']]
df_1897 = df_1897

df_1897
Out[97]:
Пол Возраст Сословие, состояние или звание Обучение
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 року:

In [98]:
# Створюємо колонку 'Стать' у 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
Out[98]:
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 року:

In [99]:
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')
Out[99]:

Мої коментарі до статево-вікової піраміди 1778 року ↑

  1. Серед населення старшого віку (>40 років) помітно переважають чоловіки, що суперечить сучасним трендам в Україні та у світі.
  2. В цілому по чисельності дещо переважає чоловіче населення (828 чоловіків, 769 жінок), що також суперечить сучасному стану в Україні.

Візуалізація 2: статево-вікова піраміда по 1897 року¶

Я відредагувала і переклала відповідні колонки в датасеті 1897 року:

In [100]:
# Перекладаємо назви колонок у 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
Out[100]:
Стать Вік Соціальний статус Освіта
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 року:

In [101]:
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')
Out[101]:

Мої коментарі до статево-вікової піраміди 1897 року ↑

  1. Порівняно з 1778 роком помітно збільшилась тривалість життя населення. Так, наприклад, якщо у 1778 році у с. Дунаєць проживало всього 3 людини старше 70 років, то у 1897 році їх було вже 30.
  2. Серед населенння старшого віку (>60 років) помітно переважають чоловіки, що знову ж таки суперечить сучасним трендам в Україні.
  3. Загалом статевий розподіл населення є більш рівномірним (і чоловіків, і жінок 774 особи), порівняно з 1778 роком.

Візуалізація 3: гістограма для порівняння розподілу населення за соціальним статусом у 1778 та 1897 роках¶

Далі я вирішила порівняти те, яка кількість населення мала певний соціальний статус у 1778 та 1897 роках, зобразивши це у вигляді гістограми.

Спочатку я попрацювала з колонкою 'Соціальний статус' у датасеті 1778 року:

In [102]:
# Бачимо, що у датасеті 1778 року є одна людина, що має None у колонці 'Соціальний статус'
df_1778[df_1778['Соціальний статус'].isna()]
Out[102]:
3 Чоловіки, Число людей наскрізне Жінки, Число людей наскрізне Імʼя По-батькові Прізвище Родиний статус Соціальний статус Вік Стать
742 381 NaN Семен Гордиев NaN двоюродный брат Лазара NaN 28 Чоловік
In [103]:
# У датасеті зазначено, що ця людина належала до родини, всі члени якої мали статус 'военные', тому в цьому випадку найімовірніше, що None є просто помилкою, яку краще виправити:
df_1778.loc[df_1778['Соціальний статус'].isna(), 'Соціальний статус'] = 'военные'

# Перекладаємо елементи колонки 'Соціальний статус' українською
social_status = {'духовные': 'Духовенство',
                 'военные': 'Військові',
                 'посполитые': 'Посполиті',
                 'дворовые': 'Дворові',
                 'бездворные': 'Бездворні'}
df_1778['Соціальний статус'] = df_1778['Соціальний статус'].map(social_status)

# df_1778['Соціальний статус'].unique()

df_1778
Out[103]:
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 року:

In [104]:
# Значень 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
Out[104]:
Стать Вік Соціальний статус Освіта
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

Далі я створила саму гістограму для порівняння розподілу людей за соціальним статусом:

In [105]:
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')
Out[105]:

Мої коментарі до гістограми ↑

*Тут можна скористатись tooltip, щоб подивитись на конкретну кількість людей, що мали певний соціальний статус

  1. І у 1778 році, і у 1897 двома основними категоріями населення були Військові/ Козаки та Посполиті/ Селяни. Інші категорії були дуже малочисельними, особливо у 1897 році.
  2. Категорія Бездворні повністю зникла до 1897 року, а категорія Дворові стала помітно менш численною (84 людини у 1778 році у порівнянні з лише 1 у 1897).
  3. У 1897 році з'явились такі категорії населення як Іменовані дворяни, Дворяни, Міщани та Державні селяни.

Я вирішила також додати визначення деяких термінів-соціальних статусів для більш повного розуміння гістограми (посилання на процитовані джерела лишила в кінці роботи):

  • Посполиті - "селяни Лівобережної і Слобідської України в другій половині XVII — XVIII століттях та некозацьке населення (селянство) Запоріжжя за часів Нової Січі (1734—1775)".
  • Дворові - "особлива категорія кріпаків, які використовувалися їхніми панами-господарями як домашня прислуга".
  • Державні селяни - "велика станова група селян в російській імперії, в тому числі і на українських землях, у 18-19 століттях, які користувалися казенною землею і були феодально залежні від держави, вважаючись проте особисто вільними".

Візуалізація 4: гістограма, що демонструє, які типи освіти були найпоширенішими у 1897 році, а також соціальний статус людей, що її здобували¶

Тут я вирішила подивитись, які шляхи отримання освіти були популярними у 1897 році, а також який соціальний статус мали люди, що мали можливість здобувати освіту.

На жаль, у датасеті 1778 року відсутня інформація про отримання освіти, тому порівняльний аналіз тут зробити неможливо:(

Спочатку я подивилась, які загалом були варіанти шляхів отримання освіти. Вони виявились досить різноманітними; окрім шкіл та училищ, люди могли навчатись вдома, у полку, або у причетника:

In [106]:
df_1897_education = df_1897[~df_1897['Освіта'].isna()].copy()

df_1897_education['Освіта'].unique()
# df_1897_education[df_1897_education['Стать']== 'Жінка']
Out[106]:
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"), тож я записувала їх однаковим чином ('Земське початкове училище'):

In [107]:
# Задаємо словник для перекладу та перекодування та застосовуємо його
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()
Out[107]:
array(['Сільська школа', 'Земське сільське училище', 'Земське училище',
       'Земська школа', 'Земське початкове училище',
       'Земське народне училище', 'Сільське народне училище',
       'Земська народна школа', 'Вдома', 'В полку',
       'Глухівське міське училище', 'У причетника',
       'Земське народне однокласне училище', 'Сільське училище',
       'Дитячий притулок Г. Терещенко в Глухові',
       'Церковно-парафіяльна школа', 'Сільська народна школа',
       'Уманське землеробське училище', 'Чернігівська духовна семінарія',
       'Новгород-Сіверська прогімназія'], dtype=object)

Тепер можемо побудувати для гістограму для отриманих даних:

In [108]:
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()
Out[108]:

Мої коментарі до гістограми ↑

*Тут можна скористатись tooltip, щоб подивитись скільки саме людей з певним соціальним статусом здобували освіту певним шляхом

  1. Перш за все, ми бачимо, що найбільш популярним шляхом здобуття освіти були різні типи земських училищ (перша, друга, третя та п'ята колонки).
  2. Також досить помітна частка людей навчались вдома, у причетника чи в полку, тобто здобували неформальну освіту.
  3. Сільські училища та різні типи шкіл були помітно менш популярними.

Візуалізація 5: кругова діаграма для порівняння розподілу людей, що здобували освіту, за статевою приналежністю¶

Наприкінці мені стало цікаво подивитись на статевий розподіл серед людей, що мали змогу здобувати освіту. Чи були серед них жінки?

Для цього я вирішила створити кругову діаграму:

In [109]:
# Рахуємо, скільки було чоловіків та жінок, що здобували освіту
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
Out[109]:

Мої коментарі до кругової діаграми ↑

Ми бачимо, що кілька жінок все ж здобували освіту, але у порівнянні з чоловіками, їх, звичайно, було дуже мало.


Це кінець мого Final Project. Дякую за увагу:)

Посилання на процитовані джерела:

  • Визначення:

https://uk.wikipedia.org/wiki/%D0%9F%D0%BE%D1%81%D0%BF%D0%BE%D0%BB%D0%B8%D1%82%D1%96#:~:text=%D0%9F%D0%BE%D1%81%D0%BF%D0%BE%D0%BB%D0%B8%D1%82%D1%96%20(%D0%B2%D1%96%D0%B4%20%D0%BF%D0%BE%D0%BB%D1%8C%D1%81%D1%8C%D0%BA%D0%BE%D0%B3%D0%BE%20%E2%80%94%20%D0%B7%D0%B0%D0%B3%D0%B0%D0%BB%D1%8C%D0%BD%D0%B8%D0%B9%2C%20%D0%B7%D0%B2%D0%B8%D1%87%D0%B0%D0%B9%D0%BD%D0%B8%D0%B9)%20%D0%B2%D0%BE%D0%BD%D0%B8,(%D1%81%D0%B5%D0%BB%D1%8F%D0%BD%D1%81%D1%82%D0%B2%D0%BE)%20%D0%97%D0%B0%D0%BF%D0%BE%D1%80%D1%96%D0%B6%D0%B6%D1%8F%20%D0%B7%D0%B0%20%D1%87%D0%B0%D1%81%D1%96%D0%B2%20%D0%9D%D0%BE%D0%B2%D0%BE%D1%97%20%D0%A1%D1%96%D1%87%D1%96%20(1734%E2%80%941775).

https://uk.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D1%80%D0%BE%D0%B2%D1%96_%D0%BB%D1%8E%D0%B4%D0%B8_(%D1%81%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B5_%D0%BD%D0%B0%D1%81%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D1%8F)

https://uk.wikipedia.org/wiki/%D0%94%D0%B5%D1%80%D0%B6%D0%B0%D0%B2%D0%BD%D1%96_%D1%81%D0%B5%D0%BB%D1%8F%D0%BD%D0%B8