388 KiB
388 KiB
Лабораторная работа 1¶
Датасет - Оценки студентов на экзаменах
Поля
- пол
- раса/этническая принадлежность
- уровень образования родителей
- обед
- курс подготовки к тесту
- оценка по математике
- оценка по чтению
- оценка по письму
Загрузка и сохранение данных
In [1]:
import pandas as pd
df = pd.read_csv("data/StudentsPerformance.csv")
df.to_csv("data/StudentsPerformance_updated.csv", index=False)
Получение сведений о датафрейме с данными
- Общая информация о датафрейме
In [2]:
df.info()
- Статистическая информация
In [3]:
df.describe()
Out[3]:
Получение сведений о колонках датафрейма
- Названия колонок
In [4]:
df.columns
Out[4]:
Вывод отдельных строк и столбцов
- Столбец "gender"
In [5]:
df[["gender"]]
Out[5]:
- Несколько столбцокв
In [6]:
df[["race/ethnicity", "writing score"]]
Out[6]:
- Первая строка
In [7]:
df.iloc[[0]]
Out[7]:
- Вывод по условию
In [8]:
df[df["writing score"] > 98]
Out[8]:
Группировка и агрегация данных
- Средняя скорость письма по полу
In [9]:
df.groupby(["gender"])[["writing score"]].mean()
Out[9]:
- Группировка по уровню образования родителей - сумма баллов по математике, среднее по оценкам чтения и письма
In [10]:
df.groupby("parental level of education").agg({"math score": "sum", "reading score": "mean", "writing score": "mean"})
Out[10]:
Сортировка данных
- Сортировка по результатам по математике по убыванию
In [11]:
df.sort_values("math score", ascending=False)
Out[11]:
- Сортировка по нескольким столбцам - по оценке по математике по возрастанию, по оценке по чтению по убыванию
In [12]:
df.sort_values(["math score", "reading score"], ascending=[True, False])
Out[12]:
Удаление строк/столбцов
- Удаление столбца
In [13]:
df.drop("race/ethnicity", axis=1)
Out[13]:
Удаление строки
In [14]:
df.drop(0, axis=0)
Out[14]:
Создание новых столбцов
- Создание нового столбца со средним баллом каждого студента по всем предметам
In [15]:
df["average rating"] = (df["math score"] + df["reading score"] + df["writing score"]) / 3
print(df[["average rating"]])
Удаление строк с пустыми значениями
- Удаление строк с NaN
In [16]:
df.dropna()
Out[16]:
- Заполнить пустые значения для определённого столбца
In [17]:
df.fillna({"writing score": df["writing score"].mean()}, inplace=True)
Заполнение пустых значений
- Заполнение средним значением (только для числовых значений)
In [18]:
df.fillna(df.select_dtypes(include='number').mean(), inplace=True)
Визуализация данных с Pandas и Matplotlib
- Линейная диаграмма (plot). Распределение оценок по математике в зависимости от пола
In [19]:
import matplotlib.pyplot as plt
df.plot(x="gender", y="math score", kind="line")
plt.xlabel("Пол")
plt.ylabel("Балл по математике")
plt.title("Распределение оценок по математике в зависимости от пола")
plt.show()
- Столбчатая диаграмма (bar). Средний балл по математике по полу
In [20]:
# Группируем по полу, находим средний балл по математике
grouped_df = df.groupby('gender')['math score'].mean().reset_index()
grouped_df.plot(x='gender', y='math score', kind='bar', color=['blue', 'orange'])
plt.xlabel('Пол')
plt.ylabel('Средний балл по математике')
plt.title('Средний балл по математике по полу')
plt.show()
- Гистограмма (hist). Распределение оценок по математике
In [21]:
df["math score"].plot(kind="hist")
plt.xlabel("Оценки по математике")
plt.ylabel("Частота")
plt.title("Распределение оценок по математике")
plt.show()
- Ящик с усами (box). Оценки по математике
In [22]:
df["math score"].plot(kind="box")
plt.ylabel("Оценки по математике")
plt.title("Box Plot оценок по математике")
plt.show()
- Диаграмма с областями (area).
In [23]:
df.plot(x="parental level of education", y="math score", kind="area")
plt.xlabel("Уровень образования родителей")
plt.ylabel("Балл по математике")
plt.title("Балл по математике по Уровню образования родителей")
plt.xticks(rotation=45) # Поворот меток оси X для лучшей читабельности
plt.show()
- Диаграмма рассеяния (scatter). Зависимость оценок по математике от оценко по чтению
In [24]:
df.plot(kind="scatter", x="math score", y="reading score")
plt.xlabel("Оценки по математике")
plt.ylabel("Оценки по чтению")
plt.title("Оценки по математике vs. Оценки по чтению")
plt.show()
- Круговая диаграмма (pie). Количество товаров
In [25]:
# Определение порога для объединения редких значений
threshold = 0.02 # Порог 2%
# Подсчёт количества уникальных значений и расчёт частот
value_counts = df["parental level of education"].value_counts()
total_count = value_counts.sum()
# Условие для агрегации значений ниже порога
other_values = value_counts[value_counts / total_count < threshold].sum()
main_values = value_counts[value_counts / total_count >= threshold]
# Добавление категории "Other"
main_values["Other"] = other_values
# Построение диаграммы
main_values.plot(kind="pie",
autopct='%1.1f%%', # Проценты
startangle=90, # Начальный угол
counterclock=False, # По часовой стрелке
cmap="Set3", # Цветовая схема
wedgeprops={'edgecolor': 'black'}) # Границы сегментов
plt.title("Распределение уровня образования родителей (агрегированные данные)")
plt.subplots_adjust(left=0.3, right=0.7, top=0.9, bottom=0.1)
plt.show()