<jupyter_start><jupyter_text>Titanic Data Pre-Processing<jupyter_code>import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

sns.set(style="whitegrid")
# sns.set_context('talk')<jupyter_output><empty_output><jupyter_text>***Завдання 1.*** Перед початком роботи з будь яким датасетом, необхідно:  - завантажити датасет;  - вивести основну статистичну інформацію по числовим змінним;- вивести розмірність датасету;- перевірити типи змінних і кількість данних по кожній змінній.<jupyter_code>df = pd.read_csv('titanic.csv', sep=',')
df.head()
df.describe()<jupyter_output><empty_output><jupyter_text>***Завдання 2.*** Визначити кількість пропущених значень по кожному атрибуту<jupyter_code>df.isna().sum()<jupyter_output><empty_output><jupyter_text>Ваші висновки:тут ми можемо побачити що важливий атрибут віку пасажирів має пропуски, також багато пропущених значень має `Cabin`, і дуже незначну кількість - `Embarked` ***Завдання 3:*** Побудувати матрицю кореляції  1.   Вирахувати кореляційні коефіціенти для набору данних за методом Пірсона2.   Відобразити отриману матрицю коефіціентів у вигляді теплокарти3. Описати отримані результати, спираючись на значення коефіціентів кореляції<jupyter_code>coef = df.corr(method='pearson')
sns.heatmap(coef, annot=True)
plt.show()<jupyter_output><empty_output><jupyter_text>Ваші висновки:маємо логічну кореляцію між класом та вартісnю проїзду, також закономірність між кількістю подружжя на борту та кількістю батьків і дітей **Завдання 4:** Як ви могли помітити, у нашому датесеті досить багато пропущених значень, зокрема у атрибута віку пасажирів. Робота з такими даними впливае як на результат моделювання так і на загалом уявлення цілісної картини про дані. Тож для того, що позбавитися пропусків ми використаємо заповнення пропущених значень медіаною за групами.1.   Напишіть функцію, що на вхід приймає датафрейм, назву колонки з пропущеними значеннями та список групуючих колонок та повертає датафрейм з заповненими пропущеними значеннями2.   Наведіть приклад роботи функції та зробіть перевірку на пропущені значення (дивись **завдання 2**)<jupyter_code>def fill_na_median(df: pd.DataFrame, col: str, groups: list):
    df[col] = df[col].fillna(df.groupby(groups)[col].transform('mean'))
    return df

fill_na_median(df, 'Age', ['Sex']).isna().sum()
df.groupby(['Sex'])['Age'].mean()<jupyter_output><empty_output><jupyter_text>Ваші висновки:оскільки значення віку пасижирів у чоловіків і жінок в середньому різне, то заповнювати пропущені значення треба середнім значенням залежно від статі  ***Завдання 5:*** В моделях машинного навчання інснує велика проблема опрацювання безперервних змінних. Потрібно перетворити безперервні значення в категоріальні. Максимальний вік пасажира - ```80 років```.Отже, давайте розділимо діапазон від ```0 до 80``` на ```5``` осередків. Додайте до нашого датасету нову колонку ```Age_bin```, в якій будуть значення ```0, 1, 2, 3, 4```відповідно кожній віковій групі.Побудуйте графік, який відображає кількість виживших у кожній віковій категорії.<jupyter_code>age_bin = pd.cut(df.Age, 5, labels = range(5))
df["Age_bin"] = age_bin
df.head()
f, ax = plt.subplots(1,2,figsize=(10,5))

sns.histplot(x=df[df['Survived']==1]['Age'], ax=ax[0], bins=5)
sns.countplot(x=df[df['Survived']==1]['Age_bin'], ax=ax[1])
plt.show()
df[df['Survived']==1]['Age_bin'].value_counts()<jupyter_output><empty_output><jupyter_text>Ваші висновки:з графіків можемо побачити що найбільше вижило людей з категорії 1 (16-32 років), та тільки один виживший з четвертої вікової категорії ***Завдання 6:*** Так як змінна ```fare``` також є неперервною її треба закодувати до ```порядкової шкали``` Для цього скоритайтесь функцією ```pandas.qcut```.[pandas.qcut](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.qcut.html)  - необхідно перевірити, чи є вірною гіпотеза про те, що кількість виживших пасажирів для квартильних значеннь змінної ```fare``` відрізняється, та чи доцільно використовувати кодування на цю змінну(для подальшої роботи з закодованою фичею)<jupyter_code>df['Fare_bin'] = pd.qcut(df.Fare, 4, labels=range(4))

df.groupby(['Fare_bin'])['Survived'].apply(lambda x: (x==1).sum())<jupyter_output><empty_output><jupyter_text>Ваші висновки:на теплокарті ми бачили кореляцію між `Fare` та `Survived`, тому гіпотеза про те що в залежності від `Fare`, змінюється кількість виживших, підтверджується ***Завдання 7:*** Необхідно створити нові змінні ```Family_size``` та ```Alone``` та проаналізувати їх. Змінна ```Family_size``` передає суму змінних ```Parch``` та ```SibSp```. Змінна ```Family_size``` буде відібражати комбіновані дані, які необхідні для перевірки гіпотези, що ```виживання пасажирів залежіть від кількості членів їх сім'ї```. Змінна ```Alone``` позначає наявніть сім'ї.<jupyter_code>df['Family_size'] = df['Parch'] + df['SibSp']
df['Alone'] = [1 if i==0 else 0 for i in df['Family_size']]
df.head()<jupyter_output><empty_output><jupyter_text>Ваші висновки:зробивши окремі атрибути для кількості членів сім'ї, ми узагальнили дані ***Завдання 8:*** Видалити атрибути які є ***НЕрелевантними*** або містять багато пропущених значень. Аргументувати свій вибір.<jupyter_code>df = df.drop(columns=['Age', 'Fare', 'SibSp', 'Parch', 'Ticket', 'Cabin', 'PassengerId', 'Name'])
df.head()<jupyter_output><empty_output><jupyter_text>Ваші висновки:атрибути віку `Age` та вартості `Fare` нам не потрбіен, бо ми перетворили їх в категоріальні. `SibSp` та `Parch` - не потрбіні, бо з них стоврили `Family_size` і `Alone`. Колонка квитка `Ticket`виглядає незмістовною, `Cabin` - має багато пропусків. `PassengerId` та `Name` - не впливають ні на що. ***Завдання 9:*** Перетворіть змінні ```Sex``` та ```Embarked``` в числові значення<jupyter_code>df.isna().sum()
df['Embarked'] = df['Embarked'].fillna('S')
df.isna().sum()
df['Sex'] = df['Sex'].factorize()[0]
df['Embarked'] = df['Embarked'].factorize()[0]

df.head()<jupyter_output><empty_output><jupyter_text>Ваші висновки:датасет готовий для моделювання, всі колонки складаються з числових даних ***Завдання 10.*** Побудувати графіки всіх категоріальних змінних та проаналізувати скільки кожна категорія містить даних1.   виділити категоріальні змінні 2.   побудувати сітку графіків кількості спотрережень по кожній категорії<jupyter_code>f, ax = plt.subplots(1,7,figsize=(23,3))

sns.histplot(x=df['Survived'], ax=ax[0], color='r', bins=2)
sns.histplot(x=df['Pclass'], ax=ax[1], color='g', bins=3)
sns.histplot(x=df['Sex'], ax=ax[2], color='b', bins=2)
sns.histplot(x=df['Embarked'], ax=ax[3], color='y', bins=3)
sns.histplot(x=df['Age_bin'], ax=ax[4], color='pink')
sns.histplot(x=df['Fare_bin'], ax=ax[5], color='violet')
sns.histplot(x=df['Alone'], ax=ax[6],color='gray', bins=2)
plt.show()<jupyter_output><empty_output><jupyter_text>Ваші висновки:спостерігаємо за розподілом категоріальних змінних, можемо оцінити які дані знаходяться в датасеті ***Завдання 11.*** Побудувати діаграми розподілу всіх числових змінних<jupyter_code>f, ax = plt.subplots(figsize=(10,3))

sns.histplot(x=df['Family_size'], color='black')
plt.show()<jupyter_output><empty_output><jupyter_text>Ваші висновки:у `Family_size` помітно викиди  Співвіднонешшя між всіма числовими змінними   ***Завдання 12.*** В деяких випадках візуалізація співвідношення між змінними (числовими, категоріальними) дає можливість побачити викиди в змінних та знайти приховані тенденції і виділити навіть додаткові змінні. Тому, необхідно:1) побудувати графіки співвідношення між всіма числовими змінними.  2) описати отримані співвідношення і запропонувати як їх можна (чи не можна) використати<jupyter_code>f, ax = plt.subplots(1,1,figsize=(10,8))
coef = df.corr(method='pearson')
sns.heatmap(coef, xticklabels=coef.columns, yticklabels=coef.columns, annot=True)
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12959183673469388, 'fraction_numerical': 0.011096938775510204, 'mean_word_length': 7.413090128755365, 'pattern_counts': {'":': 0, '<': 53, '<?xml version=': 0, '>': 53, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '13', 'dir': 'jupyter-structured-clean-dedup', 'id': '240960', 'license': 'Apache-2.0', 'n_tokens_mistral': 3472, 'n_tokens_neox': 4152, 'n_words': 745, 'path': 'pre-processing.ipynb', 'repo_name': 'povstenko/kaggle-titanic', 'size': '7840'}