Полный гид: как работать с iris dataset в формате CSV – анализ данных
Пройдите тест, узнайте какой профессии подходите
Для кого эта статья:
- начинающие аналитики данных
- преподаватели и студенты курсов по 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 до построения моделей, я понял, насколько был неправ. Именно этот "простой" датасет научил меня правильно визуализировать распределения, проверять гипотезы и интерпретировать результаты классификации. Теперь я сам начинаю обучение своих студентов именно с этого набора данных.

Загрузка и первичная обработка Iris Dataset CSV
Прежде чем погрузиться в анализ, необходимо правильно загрузить и подготовить данные. В этом разделе мы рассмотрим основные шаги первичной обработки Iris Dataset в формате CSV.
Существует несколько способов получить Iris Dataset:
- Загрузить из официального репозитория UCI Machine Learning Repository
- Использовать встроенные наборы данных в библиотеках (scikit-learn, seaborn)
- Скачать CSV-файл с GitHub или других ресурсов
Для загрузки CSV-файла в Python можно использовать библиотеку pandas:
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())
После загрузки необходимо выполнить первичную обработку данных:
- Изучить структуру датасета — проверить размерность, типы данных и уникальные значения
- Проверить наличие пропущенных значений — в Iris Dataset их обычно нет, но это важный шаг для любого анализа
- Изучить базовые статистики — оценить средние значения, медианы и разброс данных
- Подготовить данные для дальнейшего анализа — разделить признаки и целевую переменную
# Изучение структуры датасета
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:
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 существует ряд эффективных методов визуализации, помогающих понять структуру и особенности данных. 📈
Начнём с самых базовых визуализаций — гистограмм и ящиков с усами для каждого признака:
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 | Выявляет глобальную структуру данных |
Реализация этих методов в коде:
# Парные диаграммы рассеяния
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 позволяет построить фундамент для более сложных методов машинного обучения и обосновать выбор признаков для моделирования. Рассмотрим ключевые статистические методы, применимые к этому набору данных. 📊
Начнем с описательной статистики для каждого вида ирисов:
# Группировка и описательная статистика по видам
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):
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")
Для многомерного статистического анализа можно использовать дискриминантный анализ, который был изначально применен Фишером к этому набору данных:
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_))
Для исследования корреляций между признаками можно использовать ранговую корреляцию Спирмена, которая менее чувствительна к выбросам:
# Расчет ранговой корреляции Спирмена
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. Полученные модели помогают не только автоматически определять виды ирисов, но и понять, какие признаки наиболее важны для классификации. 🤖
Начнем с подготовки данных для моделирования и разделения на обучающую и тестовую выборки:
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]} образцов")
Сравним несколько алгоритмов классификации, чтобы выбрать наиболее эффективный:
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()
Для более глубокого анализа моделей и выбора оптимальных гиперпараметров можно использовать перекрестную проверку и поиск по сетке:
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}")
Анализ важности признаков для интерпретируемых моделей, таких как дерево решений:
# Обучение дерева решений
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)
После выбора оптимальной модели можно сохранить её для будущего использования:
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 скрывает важные уроки об интерпретации данных, выборе признаков и оценке моделей. Применяйте эти принципы в своих проектах, и вы увидите, как аналитический подход преображает понимание данных.