Полный гид: как работать с iris dataset в формате CSV – анализ данных

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Для кого эта статья:

  • начинающие аналитики данных
  • преподаватели и студенты курсов по data science
  • профессионалы, желающие улучшить свои навыки анализа данных и машинного обучения

    Набор данных Iris — настоящая легенда в мире анализа данных. 📊 Эта небольшая, но невероятно информативная коллекция измерений цветков ириса стала первым шагом для тысяч аналитиков. Когда я впервые столкнулся с ним, именно его простота и многогранность открыли для меня дверь в увлекательный мир data science. Представьте: всего 150 записей о цветках, но они могут научить вас визуализации, статистическому анализу и даже построению прогнозных моделей! От загрузки CSV-файла до создания сложных классификаторов — этот гид проведет вас через весь путь освоения фундаментальных техник анализа данных.

Многие начинают путь в аналитику с теоретических знаний, но быстро теряются при работе с реальными данными. Курс «Аналитик данных» с нуля от Skypro устраняет этот разрыв, используя практические задания на таких классических наборах, как Iris Dataset. На курсе вы научитесь не только работать с разными форматами данных, но и строить интерпретируемые модели, способные принести реальную пользу бизнесу — именно те навыки, которые ищут работодатели в 2025 году.

Что такое Iris Dataset: основные характеристики набора данных

Iris Dataset — это многомерный набор данных, введенный статистиком и биологом Рональдом Фишером в 1936 году для демонстрации дискриминантного анализа. Он содержит 150 образцов трех видов ирисов (Iris setosa, Iris versicolor и Iris virginica), по 50 образцов каждого вида.

Для каждого образца измерены четыре характеристики:

  • Длина чашелистика (sepal length) в см
  • Ширина чашелистика (sepal width) в см
  • Длина лепестка (petal length) в см
  • Ширина лепестка (petal width) в см

На основе этих измерений можно классифицировать вид ириса. Интересно, что один вид (Iris setosa) линейно отделим от двух других, в то время как два остальных вида не являются линейно разделимыми друг от друга. Это делает набор данных идеальным для демонстрации алгоритмов классификации.

ОсобенностьОписание
Размер набора150 образцов
Количество классов3 вида (по 50 образцов каждого)
Признаки4 числовых показателя
ЗадачаКлассификация видов по измерениям
Сложность разделенияОдин класс легко отделим, два других перекрываются

Структура CSV-файла предельно проста: пять столбцов, где первые четыре содержат числовые измерения, а пятый — название вида. Отсутствие пропущенных значений и аномалий делает этот набор отличным стартовым материалом для новичков в data science. 🌸

Максим Соколов, преподаватель Data Science

Когда я только начинал свою карьеру аналитика, я не понимал важности "простых" наборов данных. На первом рабочем проекте мне поручили анализ поведения пользователей на сайте — огромный массив кликстрима с десятками различных метрик. Я погрузился в данные и... совершенно запутался.

Тогда мой руководитель посоветовал начать с основ и дал мне домашнее задание — полностью проанализировать Iris Dataset. "Это же примитив!" — подумал я. Но когда я методично прошел путь от загрузки CSV до построения моделей, я понял, насколько был неправ. Именно этот "простой" датасет научил меня правильно визуализировать распределения, проверять гипотезы и интерпретировать результаты классификации. Теперь я сам начинаю обучение своих студентов именно с этого набора данных.

Кинга Идем в IT: пошаговый план для смены профессии

Загрузка и первичная обработка Iris Dataset CSV

Прежде чем погрузиться в анализ, необходимо правильно загрузить и подготовить данные. В этом разделе мы рассмотрим основные шаги первичной обработки Iris Dataset в формате CSV.

Существует несколько способов получить Iris Dataset:

  • Загрузить из официального репозитория UCI Machine Learning Repository
  • Использовать встроенные наборы данных в библиотеках (scikit-learn, seaborn)
  • Скачать CSV-файл с GitHub или других ресурсов

Для загрузки CSV-файла в Python можно использовать библиотеку pandas:

Python
Скопировать код
import pandas as pd

# Вариант 1: Загрузка из локального файла
iris_df = pd.read_csv('iris.csv')

# Вариант 2: Загрузка напрямую из URL
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
column_names = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species']
iris_df = pd.read_csv(url, header=None, names=column_names)

# Просмотр первых 5 строк
print(iris_df.head())

После загрузки необходимо выполнить первичную обработку данных:

  1. Изучить структуру датасета — проверить размерность, типы данных и уникальные значения
  2. Проверить наличие пропущенных значений — в Iris Dataset их обычно нет, но это важный шаг для любого анализа
  3. Изучить базовые статистики — оценить средние значения, медианы и разброс данных
  4. Подготовить данные для дальнейшего анализа — разделить признаки и целевую переменную
Python
Скопировать код
# Изучение структуры датасета
print(iris_df.shape) # (150, 5)
print(iris_df.dtypes)

# Проверка пропущенных значений
print(iris_df.isnull().sum())

# Базовые статистики
print(iris_df.describe())

# Подсчет образцов каждого класса
print(iris_df['species'].value_counts())

# Подготовка данных для анализа
X = iris_df.drop('species', axis=1) # Признаки
y = iris_df['species'] # Целевая переменная

Особенность работы с Iris Dataset — необходимость правильной интерпретации имен классов. В зависимости от источника, классы могут быть представлены как 'Iris-setosa', 'Iris-versicolor' и 'Iris-virginica' или просто 'setosa', 'versicolor' и 'virginica'. 🔍

Для некоторых задач также полезно нормализовать числовые признаки, так как они имеют разные диапазоны values:

Python
Скопировать код
from sklearn.preprocessing import StandardScaler

# Нормализация признаков
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# Преобразование обратно в DataFrame для удобства
X_scaled_df = pd.DataFrame(X_scaled, columns=X.columns)
print(X_scaled_df.head())

Методы визуализации Iris Dataset для анализа данных

Визуализация — ключевой этап анализа данных, позволяющий увидеть закономерности, которые могут быть не очевидны из таблиц и статистик. Для Iris Dataset существует ряд эффективных методов визуализации, помогающих понять структуру и особенности данных. 📈

Начнём с самых базовых визуализаций — гистограмм и ящиков с усами для каждого признака:

Python
Скопировать код
import matplotlib.pyplot as plt
import seaborn as sns

# Настройка стиля
sns.set(style="whitegrid")

# Гистограммы для каждого признака с разбивкой по видам
plt.figure(figsize=(12, 8))
for i, feature in enumerate(iris_df.columns[:-1]):
plt.subplot(2, 2, i+1)
sns.histplot(data=iris_df, x=feature, hue='species', kde=True)
plt.title(f'Распределение {feature}')
plt.tight_layout()
plt.show()

# Ящики с усами для сравнения распределений
plt.figure(figsize=(12, 6))
for i, feature in enumerate(iris_df.columns[:-1]):
plt.subplot(1, 4, i+1)
sns.boxplot(data=iris_df, y=feature, x='species')
plt.title(f'{feature} по видам')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

Более продвинутые методы визуализации помогают увидеть взаимосвязи между признаками:

Метод визуализацииНазначениеИнтерпретация
Парные диаграммы рассеянияПоказывают взаимосвязи между всеми парами признаковПозволяют выявить группировку классов и корреляции
Корреляционная тепловая картаВизуализирует матрицу корреляций признаковПомогает определить зависимые признаки
Диаграммы скрипичного графикаОбъединяет ящик с усами и график плотностиДаёт детальное представление о распределении
Визуализация в пространстве главных компонентУменьшает размерность для визуализации в 2D/3DВыявляет глобальную структуру данных

Реализация этих методов в коде:

Python
Скопировать код
# Парные диаграммы рассеяния
sns.pairplot(iris_df, hue='species', height=2.5)
plt.suptitle('Парные диаграммы рассеяния признаков Iris Dataset', y=1.02)
plt.show()

# Корреляционная тепловая карта
plt.figure(figsize=(8, 6))
corr = iris_df.drop('species', axis=1).corr()
sns.heatmap(corr, annot=True, cmap='coolwarm')
plt.title('Корреляционная матрица признаков')
plt.show()

# Визуализация в пространстве главных компонент
from sklearn.decomposition import PCA

# Применение PCA для уменьшения размерности до 2
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

# Создание DataFrame для визуализации
pca_df = pd.DataFrame(data=X_pca, columns=['PC1', 'PC2'])
pca_df['species'] = iris_df['species'].values

# Визуализация результатов PCA
plt.figure(figsize=(10, 8))
sns.scatterplot(data=pca_df, x='PC1', y='PC2', hue='species', style='species', s=100)
plt.title('PCA: проекция Iris Dataset на двумерное пространство')

# Добавление информации о доле объяснённой дисперсии
explained_variance = pca.explained_variance_ratio_ * 100
plt.xlabel(f'PC1: {explained_variance[0]:.2f}% объяснённой дисперсии')
plt.ylabel(f'PC2: {explained_variance[1]:.2f}% объяснённой дисперсии')
plt.show()

Анализируя эти визуализации, можно заметить несколько важных закономерностей:

  • Признаки, связанные с лепестками (petal length и petal width), имеют большую дискриминационную способность для различения видов, чем признаки чашелистиков
  • Iris setosa чётко отделяется от других видов во всех проекциях, связанных с размерами лепестков
  • Между признаками petal length и petal width наблюдается сильная положительная корреляция
  • Versicolor и virginica species частично перекрываются, что объясняет сложность их линейного разделения

Анна Волкова, аналитик данных

На собеседовании в крупную ритейл-компанию мне дали тестовое задание — проанализировать причины отказа клиентов от скидочных карт. Данные были обезличены, но структурированы. Я начала с нескольких стандартных гистограмм, но не увидела ничего интересного.

Тогда я вспомнила подход, который использовала при анализе Iris Dataset — применила парную визуализацию всех признаков с разделением по целевому классу. И вот тут возник настоящий инсайт! На одной из диаграмм рассеяния чётко выделились три отдельных кластера клиентов, которые отказывались от карт по совершенно разным причинам.

Этот метод визуализации, который я отточила именно на наборе Iris, позволил мне обнаружить неочевидный паттерн и предложить три различные стратегии удержания для разных сегментов. Меня взяли на работу, а спустя три месяца одна из предложенных стратегий увеличила сохранение клиентов на 24%.

Применение статистических методов к Iris Dataset CSV

Статистический анализ Iris Dataset позволяет построить фундамент для более сложных методов машинного обучения и обосновать выбор признаков для моделирования. Рассмотрим ключевые статистические методы, применимые к этому набору данных. 📊

Начнем с описательной статистики для каждого вида ирисов:

Python
Скопировать код
# Группировка и описательная статистика по видам
grouped_stats = iris_df.groupby('species').describe()
print(grouped_stats)

# Или более компактно, для конкретных показателей
for species in iris_df['species'].unique():
print(f"\nСтатистика для {species}:")
species_data = iris_df[iris_df['species'] == species].drop('species', axis=1)
print(species_data.agg(['mean', 'median', 'std', 'min', 'max']).round(2))

Для проверки статистической значимости различий между видами можно применить дисперсионный анализ (ANOVA):

Python
Скопировать код
import scipy.stats as stats

# Применение ANOVA для каждого признака
for feature in iris_df.columns[:-1]:
# Создание групп для каждого вида
setosa = iris_df[iris_df['species'] == 'Iris-setosa'][feature]
versicolor = iris_df[iris_df['species'] == 'Iris-versicolor'][feature]
virginica = iris_df[iris_df['species'] == 'Iris-virginica'][feature]

# Проведение однофакторного дисперсионного анализа
f_stat, p_value = stats.f_oneway(setosa, versicolor, virginica)

print(f"ANOVA для признака {feature}:")
print(f"F-статистика: {f_stat:.4f}, p-value: {p_value:.10f}")
print(f"Различия статистически значимы: {p_value < 0.05}\n")

Для многомерного статистического анализа можно использовать дискриминантный анализ, который был изначально применен Фишером к этому набору данных:

Python
Скопировать код
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# Применение линейного дискриминантного анализа
lda = LinearDiscriminantAnalysis(n_components=2)
X_lda = lda.fit_transform(X, y)

# Создание DataFrame для визуализации
lda_df = pd.DataFrame(data=X_lda, columns=['LD1', 'LD2'])
lda_df['species'] = iris_df['species'].values

# Визуализация результатов LDA
plt.figure(figsize=(10, 8))
sns.scatterplot(data=lda_df, x='LD1', y='LD2', hue='species', style='species', s=100)
plt.title('Дискриминантный анализ Фишера для Iris Dataset')
plt.show()

# Оценка важности признаков из LDA
print("Коэффициенты дискриминантных функций:")
print(pd.DataFrame(lda.coef_, columns=X.columns, index=lda.classes_))

Для исследования корреляций между признаками можно использовать ранговую корреляцию Спирмена, которая менее чувствительна к выбросам:

Python
Скопировать код
# Расчет ранговой корреляции Спирмена
spearman_corr = X.corr(method='spearman')

# Визуализация
plt.figure(figsize=(8, 6))
sns.heatmap(spearman_corr, annot=True, cmap='viridis')
plt.title('Ранговая корреляция Спирмена между признаками')
plt.show()

Важные статистические выводы из анализа Iris Dataset:

  • Все признаки показывают статистически значимые различия между видами (p-value < 0.001 для всех ANOVA-тестов)
  • Признаки petal length и petal width имеют наибольшую дискриминационную силу
  • Коэффициент вариации для признаков лепестков выше, чем для чашелистиков
  • Между некоторыми признаками (особенно связанными с лепестками) существует сильная положительная корреляция
  • Для вида Iris setosa наблюдается наименьшая внутригрупповая вариация

Анализируя результаты статистических тестов, можно построить более обоснованные модели классификации, основанные на понимании распределения признаков и их взаимосвязей. 🧮

Не уверены, как применить полученные статистические знания на практике? Пройдите Тест на профориентацию от Skypro и узнайте, подходит ли вам карьера аналитика данных. Тест определит ваши сильные стороны в работе со статистическими концепциями и предложит оптимальное направление развития в сфере аналитики. Получите персонализированные рекомендации по развитию вашей карьеры на основе ваших аналитических способностей!

Создание моделей классификации на основе Iris Dataset

Построение моделей классификации — кульминация анализа Iris Dataset. Полученные модели помогают не только автоматически определять виды ирисов, но и понять, какие признаки наиболее важны для классификации. 🤖

Начнем с подготовки данных для моделирования и разделения на обучающую и тестовую выборки:

Python
Скопировать код
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score

# Разделение признаков и целевой переменной
X = iris_df.drop('species', axis=1)
y = iris_df['species']

# Разделение на обучающую и тестовую выборку (70/30)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)

# Стандартизация признаков
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

print(f"Размер обучающей выборки: {X_train.shape[0]} образцов")
print(f"Размер тестовой выборки: {X_test.shape[0]} образцов")

Сравним несколько алгоритмов классификации, чтобы выбрать наиболее эффективный:

Python
Скопировать код
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# Создание и обучение моделей
models = {
"Логистическая регрессия": LogisticRegression(max_iter=1000),
"k-ближайших соседей": KNeighborsClassifier(n_neighbors=3),
"Дерево решений": DecisionTreeClassifier(),
"Метод опорных векторов": SVC(),
"Случайный лес": RandomForestClassifier()
}

# Обучение и оценка каждой модели
for name, model in models.items():
# Обучение модели
model.fit(X_train_scaled, y_train)

# Прогноз на тестовой выборке
y_pred = model.predict(X_test_scaled)

# Оценка точности
accuracy = accuracy_score(y_test, y_pred)

print(f"\nМодель: {name}")
print(f"Точность: {accuracy:.4f}")
print("Отчет по классификации:")
print(classification_report(y_test, y_pred))

# Матрица ошибок
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=model.classes_, yticklabels=model.classes_)
plt.title(f'Матрица ошибок: {name}')
plt.ylabel('Истинный класс')
plt.xlabel('Предсказанный класс')
plt.show()

Для более глубокого анализа моделей и выбора оптимальных гиперпараметров можно использовать перекрестную проверку и поиск по сетке:

Python
Скопировать код
from sklearn.model_selection import GridSearchCV

# Пример поиска оптимальных параметров для SVM
param_grid = {
'C': [0\.1, 1, 10, 100],
'gamma': [0\.01, 0.1, 1, 'scale', 'auto'],
'kernel': ['rbf', 'linear', 'poly']
}

svm = SVC()
grid_search = GridSearchCV(svm, param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train_scaled, y_train)

print("Лучшие параметры для SVM:")
print(grid_search.best_params_)
print(f"Лучшая точность при перекрестной проверке: {grid_search.best_score_:.4f}")

# Оценка модели с лучшими параметрами на тестовой выборке
best_svm = grid_search.best_estimator_
y_pred = best_svm.predict(X_test_scaled)
print(f"Точность на тестовых данных: {accuracy_score(y_test, y_pred):.4f}")

Анализ важности признаков для интерпретируемых моделей, таких как дерево решений:

Python
Скопировать код
# Обучение дерева решений
dt = DecisionTreeClassifier(max_depth=4)
dt.fit(X_train, y_train)

# Визуализация дерева решений
from sklearn.tree import plot_tree

plt.figure(figsize=(15, 10))
plot_tree(dt, filled=True, feature_names=X.columns, class_names=dt.classes_, rounded=True)
plt.title('Дерево решений для классификации видов Iris')
plt.show()

# Важность признаков
importances = pd.DataFrame({
'Признак': X.columns,
'Важность': dt.feature_importances_
}).sort_values(by='Важность', ascending=False)

plt.figure(figsize=(10, 6))
sns.barplot(data=importances, x='Важность', y='Признак')
plt.title('Важность признаков в модели дерева решений')
plt.show()

Сравнение результатов различных моделей показывает:

  • Большинство классификаторов достигает точности выше 95% даже без тщательной настройки
  • SVM и k-NN часто показывают наилучшие результаты на Iris Dataset
  • Модели с линейной разделяющей поверхностью испытывают трудности с разделением versicolor и virginica
  • Все модели безошибочно классифицируют Iris setosa
  • Важнейшими признаками для классификации оказываются параметры лепестков (petal length и petal width)

После выбора оптимальной модели можно сохранить её для будущего использования:

Python
Скопировать код
import joblib

# Сохранение лучшей модели и скалера
best_model = grid_search.best_estimator_
joblib.dump(best_model, 'iris_classifier.pkl')
joblib.dump(scaler, 'iris_scaler.pkl')

# Пример использования сохраненной модели
loaded_model = joblib.load('iris_classifier.pkl')
loaded_scaler = joblib.load('iris_scaler.pkl')

# Предсказание для нового образца
new_sample = [[5\.1, 3.5, 1.4, 0.2]] # Примерные измерения для Iris setosa
new_sample_scaled = loaded_scaler.transform(new_sample)
prediction = loaded_model.predict(new_sample_scaled)
print(f"Предсказанный вид: {prediction[0]}")

Понимая силу и ограничения различных моделей классификации, вы сможете уверенно применять эти знания к гораздо более сложным наборам данных в реальных проектах. 🔬

Работа с Iris Dataset — это только начало пути в анализе данных и машинном обучении. Методики, которые вы изучили, масштабируются на наборы данных любой сложности. От базовой визуализации до тонкой настройки моделей классификации — эти навыки составляют ядро компетенций современного аналитика. Помните: простота Iris Dataset скрывает важные уроки об интерпретации данных, выборе признаков и оценке моделей. Применяйте эти принципы в своих проектах, и вы увидите, как аналитический подход преображает понимание данных.