- •Изучение набора данных iris.Csv с использованием Pandas и Seaborn:
- •Загрузить данные из файла как Pandas DataFrame
- •1.2. Вызвав у датафрейма метод head, проверить корректность загруженных данных
- •1.3. Вызвав у датафрейма метод describe, получить характеристики. Опишите полученный результат.
- •1.6.1. Постройте гистограммы для разного количества столбцов: 5,10,15,20,30. Выберите на ваш взгляд такое количество столбцов, который лучшие образом описывает форму распределения признаков.
- •1.7. Постройте гистограммы, чтобы вместо столбцов изображались ступеньки.
- •2.2. Выведите первые 10 наблюдений набора данных.
- •2.3. Рассчитайте характеристики, полученные методом describe в п. 1.3 с использованием методов NumPy. Обращайте внимание на то, где оценка смещенная, а где нет.
- •1.8. Добавьте на гистограммы график ядерной оценки плотности.
- •2. Изучение набора данных iris.Csv с использованием NumPy:
- •2.1. Загрузите данные из файла как массив NumPy
- •3. Изучение набора данных вашего варианта:
- •3.1. Оцените и опишите набор данных вашего варианта с использованием методов, рассмотренных ранее. Сделайте выводы о кол-во классов, наличию выбросов, пересечении классов, и т.Д.
- •4. Преобразование данных:
- •4.1. Получите из датафрейма из п. 1.4 столбец с названием классов. Используя LabelEncoder и OneHotEncoder получите различные способы кодирования меток класса. В чем различия полученных кодировок?
- •4.2. Для датафрейма из п. 1.4, получите все столбцы признаков (столбцы не содержащие метки классов). Преобразуйте полученные столбцы в массив NumPy.
3. Изучение набора данных вашего варианта:
3.1. Оцените и опишите набор данных вашего варианта с использованием методов, рассмотренных ранее. Сделайте выводы о кол-во классов, наличию выбросов, пересечении классов, и т.Д.
Для начала загрузим данные из файла в датафрейм и уберем лишний первый столбец. Далее заменим метки классов: 0 – Iris-setosa, 1 – Iris-versicolor, 2 – Iris-virginica, и выведем основные статистические характеристики. Реализация приведена в Листинге 3.1.1. Результат представлен в Листинге 3.1.2.
Листинг 3.1.1 – Загрузка датасета и вывод характеристик.
df = pd.read_csv("lab1_var1.csv", index_col=0) df["label"] = df["label"].replace([0, 1, 2], ["Iris-setosa", "Iris-versicolor", "Iris-virginica"]) print(df.describe()) |
Листинг 3.1.2 – Статистические характеристики датасета.
|
var1 |
var2 |
var3 |
var4 |
label |
count |
200.000000 |
200.000000 |
200.000000 |
200.000000 |
200.000000 |
mean |
0.116475 |
-0.110263 |
-0.167975 |
0.035150 |
0.995000 |
std |
2.725473 |
2.707951 |
3.729149 |
2.649211 |
0.817506 |
min |
-5.467196 |
-4.597760 |
-7.753001 |
-4.694267 |
0.000000 |
25% |
-2.523431 |
-2.785206 |
-3.393294 |
-2.346640 |
0.000000 |
50% |
0.338841 |
-0.496754 |
0.429499 |
0.124045 |
1.000000 |
75% |
2.689858 |
2.513700 |
2.989684 |
2.504390 |
2.000000 |
max |
4.439297 |
5.207049 |
7.338198 |
4.814143 |
2.000000 |
Реализация построения графиков оценки ядерной плотности, диаграмм рассеивания и двумерной оценки ядерной плотности каждого признака представлена в Листинге 3.1.3. Результаты приведены на Рисунке 3.1.4.
Листинг 3.1.3 – Реализация построения графиков оценки ядерной плотности, диаграмм рассеивания и двумерной оценки ядерной плотности каждого признака.
g = sns.PairGrid(df, hue="label", palette="tab10", diag_sharey=False) g.map_upper(sns.scatterplot) g.map_lower(sns.kdeplot) g.map_diag(sns.kdeplot) g.add_legend() plt.show() |
Рисунок 3.1.4 – Графики оценки ядерной плотности, диаграммы рассеивания и двумерной оценки ядерной плотности каждого признака
На графиках видно, что iris-setosa четко отделяется от остальных классов по переменным var2 и var3. В диаграммах рассеяния можно наблюдать, как его точки образуют отдельные кластеры. Ядерная оценка плотности также подтверждает, что распределение этого класса не пересекается с другими. Iris-versicolor и iris-virginica, напротив, имеют значительное перекрытие, особенно по переменным var1 и var4. Это хорошо заметно на диаграммах рассеяния, где их точки накладываются друг на друга. Контурные линии KDE подтверждают частичное пересечение этих двух классов, что может затруднить их классификацию. В некоторых распределениях можно увидеть точки, значительно удаленные от основной массы данных, что может указывать на наличие выбросов. Например, по переменным var3 и var4 видно, что некоторые точки выходят за пределы основных плотностей распределений, особенно у iris-virginica. Также между некоторыми переменными наблюдается линейная зависимость, например, между var1 и var3. В проекциях классы располагаются вдоль диагональных линий, что указывает на возможные корреляции между переменными.
Построение гистограмм распределения для каждого признака с графиком ядерной оценки плотности представлено в Листинге 3.1.5. Результат приведен на Рисунке 3.1.6.
Листинг 3.1.5 – Реализация построения гистограмм распределения для каждого признака с графиком ядерной оценки плотности.
fig, axes = plt.subplots(1, 4, figsize=(20, 5)) for ax, column in zip(axes, df.columns[:-1]): sns.histplot(data=df, x=column, hue='label', bins=15, multiple='layer', element='step', ax=ax, kde=True) fig.suptitle(f'Распределение признаков с графиком ядерной оценки плотности') plt.tight_layout() plt.show() |
Рисунок 3.1.6 – Гистограммы распределения для каждого признака с графиком ядерной оценки плотности
По гистограмме можно сказать, что iris-setosa четко отделяется, тогда как iris-versicolor и iris-virginica частично пересекаются, что усложняет их классификацию. Var3 наиболее информативен, так как лучше всего разделяет классы, тогда как var4 имеет значительное перекрытие и может быть менее полезен. В некоторых признаках, особенно в var3, видно два пика в распределении и возможные выбросы.
