Исследовательский анализ данных (EDA), как следует из названия, представляет собой подход к анализу данных, в котором используются различные методы для определения лежащей в основе структуры, понимания переменных, обнаружения аномалий и, прежде всего, для получения максимальной информации для анализа. хорошая модель сборки. Другими словами, EDA помогает предоставить обзор качественной и количественной информации, чтобы избежать риска принятия неверных бизнес-решений на основе разработанных моделей.
Это первый и главный шаг для любого проекта по науке о данных, который аналитик должен сделать, чтобы получить представление о данных, прежде чем углубляться в разработку функций, построение модели, настройку параметров и многое другое (подробно мы обсудим в следующих постах, так что следите за обновлениями). !)
О наборе данных
Чтобы объяснить концепции и получить представление, будут использоваться данные о жилье (данные о собственности), доступные в репозитории машинного обучения UCI.
Набор данных, используемый в этом проекте, представляет собой данные о собственности из округа Кинг, штат Вашингтон, США. Информацию о местоположении легко получить, нанеся данные на график с помощью библиотеки folium с открытым исходным кодом. Данные плотно сгруппированы вокруг района Сиэтл-Белвью-Рентон-Кент-Федерал-Уэй-Такома, городского конгломерата.
Импорт данных и пространственная визуализация
Для импорт данных и визуализации.
# Базовые библиотеки
импортировать numpy как np # линейная алгебра
импортировать панды как pd # обработка данных
## Библиотеки визуализации данных
import matplotlib.pyplot как plt # графики данных
%matplotlib inline
импортировать seaborn как sns # графики данных и визуализацию
## Импорт данных
prop_data = pd.read_csv(“innercity.csv”)
prop_data.head()
Функция «.head()» библиотеки pandas возвращает первые пять наблюдений данных, тогда как «.tail()» возвращает последние пять наблюдений.
Создание карты
Folium использует сильные стороны экосистемы Python для обработки данных и картографические возможности библиотеки Leaflet.js для визуализации геопространственных данных. Данные обрабатываются в Python, а затем визуализируются на карте Leaflet через folium. Карты интерактивны по своей природе и могут быть построены на основе значений широты и долготы и визуализированы в среде ноутбуков.
Дополнительные сведения о Folium в действии см. в блоге здесь.
импортировать folium
из folium.plugins import MarkerCluster
some_map = folium.Map(location=[prop_data[‘lat’].mean(), prop_data[‘long’].mean()], zoom_start=10)
mc = MarkerCluster()
#создание маркера для каждой точки. Каждая точка получит всплывающее окно со своим zip
для строки в prop_data.itertuples():
mc.add_child(folium.Marker(location=[row.lat,row.long], popup=row. почтовый индекс))
some_map.add_child(mc)
some_map
Путешествие по исследованию данных начинается….
# Проверяем форму фрейма данных
prop_data.shape
(21613, 23)
Данные о собственности содержат 21 613 наблюдений с 23 переменными [22 независимыми и 1 целевая переменная (цена)], которые включают в основном числовые атрибуты и атрибуты даты/времени и помогают определить характеристики собственности.
# Проверить типы данных
prop_data.dtypes
cid int64 dayhours object price int64 room_bed int64 room_bath float64 living_measure int64 lot_measure int64 ceil float64 coast int64 sight int64 condition int64 quality int64 ceil_measure int64 basement int64 yr_built int64 yr_renovated int64 zipcode int64 lat float64 long float64 living_measure15 int64 lot_measure15 int64 furnished int64 total_area int64 dtype: object
Каждая запись представляет характеристики недвижимости, такие как количество спален, ванных комнат, размеры (площадь, высота), год постройки, эстетическую ценность (близость к побережью, вид и т. д.), а также атрибуты местоположения (широта, долгота, почтовый индекс) в соответствии с набор атрибутов.
# Просмотр описательной статистики
df = prop_data.describe().transpose()
dfStyler = df.style.set_properties(**{'text-align': 'left'})
dfStyler.set_table_styles([dict (selector='th', props=[('text-align', 'left')])])
Функция «.describe()» показывает, что различные поля/атрибуты имеют 0 значений в данных. Независимо от того, имеют ли эти нули значимости или требуют очистки, потребуется дальнейшее исследование данных. В данных присутствует несколько выбросов
Выбросы Проверить
- Выбросы присутствуют в атрибуте room_bed данных атрибута свойства. Минимум — 0, максимум — 33, а 75% значений меньше 4. Тем не менее, есть некоторые записи, достигающие 33. Отсюда явный признак выбросов.
- Выбросы присутствуют в атрибуте room_bath данных атрибута свойства. Минимум равен 0, максимум равен 8, а 75% значений меньше 2,5. Тем не менее, есть некоторые записи, достигающие 8. Отсюда явный признак выбросов.
- Выбросы присутствуют в атрибуте living_measure данных атрибута свойства. Минимум 290, максимум 13540, а 75% значений меньше 2550. Тем не менее, есть записи, достигающие 13540. Отсюда явное указание на выбросы.
- Выбросы присутствуют в атрибуте lot_measure данных атрибута свойства. Минимум 520, максимум 1.65136e+06, а 75% значений меньше 10688. Тем не менее, есть записи, достигающие 1.65136e+06. Отсюда явное указание на выбросы.
- Выбросы присутствуют в атрибуте 'quality' данных атрибута свойства. Минимум — 1, максимум — 13, а 75% значений меньше 8. Тем не менее, есть некоторые записи, достигающие 13. Отсюда явный признак выбросов.
- Выбросы присутствуют в атрибуте ceil_measure данных атрибута свойства. Минимум — 290, максимум — 9410, а 75% значений меньше 2210. Тем не менее, есть записи, достигающие 9410. Отсюда явное указание на выбросы.
- Выбросы присутствуют в атрибуте «подвал» данных атрибута свойства. Минимум — 0, максимум — 4820, а 75% значений меньше 560. Тем не менее, есть записи, достигающие 4820. Отсюда явное указание на выбросы.
- Выбросы присутствуют в атрибуте living_measure15 данных атрибута свойства. Минимум — 399, максимум — 6210, а 75% значений меньше 2360. Тем не менее, есть записи, достигающие 6210. Отсюда явный признак выбросов.
- Выбросы присутствуют в атрибуте lot_measure15 данных атрибута свойства. Минимум — 651, максимум — 871 200, а 75% значений меньше 10 083. Тем не менее, есть записи, достигающие 871 200. Отсюда явное указание на выбросы.
- Выбросы присутствуют в атрибуте total_area данных атрибута свойства. Минимум 1423, максимум 1.65266e+06, а 75% значений меньше 13000. Тем не менее, есть записи, достигающие 1.65266e+06. Отсюда явное указание на выбросы.
# Измерение асимметрии данных
В данных также присутствует асимметрия.
prop_data.skew(ось = 0, skipna = True)
Асимметрия — это мера симметрии или, точнее, отсутствия симметрии. Распределение или набор данных является симметричным, если оно выглядит одинаково слева и справа от центральной точки. Асимметрия для нормального распределения равна нулю, и любые симметричные данные должны иметь асимметрию около нуля. Отрицательные значения асимметрии указывают на данные, которые смещены влево, а положительные значения асимметрии указывают на данные, которые смещены вправо.
- If the skewness is between -0.5 and 0.5, the data is fairly symmetrical.
- If the skewness is between -1 and -0.5 (negatively skewed) or between 0.5 and 1 (positively skewed), the data is moderately skewed.
- If the skewness is less than -1 (negatively skewed) or greater than 1 (positively skewed), the data is highly skewed.
cid 0.243329 price 4.021716 room_bed 1.974300 room_bath 0.511108 living_measure 1.471555 lot_measure 13.060019 ceil 0.616177 coast 11.385108 sight 3.395750 condition 1.032805 quality 0.771103 ceil_measure 1.446664 basement 1.577965 yr_built -0.469805 yr_renovated 4.549493 zipcode 0.405661 lat -0.485270 long 0.885053 living_measure15 1.108181 lot_measure15 9.506743 furnished 1.526232 total_area 12.956067 dtype: float64
Довольно симметричные поля данных: cid, zipcode, yr_built, lat
Данные с положительным перекосом (средний уровень): room_bath, ceil, quality, long.
Положительно искаженные данные (высокий): цена, room_bed, living_measure, lot_measure, Coast, Sight, Condition, ceil_measure, basement, yr_renovated, living_measure15, lot_measure15, меблированная, total_area
Таким образом, если несколько переменных можно отбросить или импутировать с помощью правильной стратегии, асимметрия в данных может быть уменьшена. Например, вместо того, чтобы сохранять как атрибуты измерения лота, так и атрибуты общей площади (поля с сильной асимметрией), можно сохранить только одну переменную. Но для этого необходимо проанализировать взаимосвязи переменных, что и делается в последующих разделах.
# Поиск пропущенных значений
prop_data.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 21613 entries, 0 to 21612 Data columns (total 29 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 cid 21613 non-null int64 1 dayhours 21613 non-null int32 2 price 21613 non-null int64 3 room_bed 21613 non-null int64 4 room_bath 21613 non-null float64 5 living_measure 21613 non-null int64 6 lot_measure 21613 non-null int64 7 ceil 21613 non-null float64 8 coast 21613 non-null int64 9 sight 21613 non-null int64 10 condition 21613 non-null int64 11 quality 21613 non-null int64 12 ceil_measure 21613 non-null int64 13 basement 21613 non-null int64 14 yr_built 21613 non-null int64 15 yr_renovated 21613 non-null int64 16 zipcode 21613 non-null int64 17 lat 21613 non-null float64 18 long 21613 non-null float64 19 living_measure15 21613 non-null int64 20 lot_measure15 21613 non-null int64 21 furnished 21613 non-null int64 22 total_area 21613 non-null int64 23 lt_price 21613 non-null float64 24 yr_sold 21613 non-null int32 25 month_sold 21613 non-null int32 26 yr_mn_sold 21613 non-null int32 27 city 21613 non-null object 28 zipcode_cl 21613 non-null int64 dtypes: float64(5), int32(4), int64(19), object(1) memory usage: 4.5+ MB
Поскольку количество наблюдений Not Null равно количеству записей, вероятность наличия пропущенных значений отсутствует.
#Создайте новую функцию:
def num_missing(x):
return sum(x.isnull())
# Применение для каждого столбца:
print("Отсутствующие значения в атрибутах (если есть):")
print(prop_data.apply(num_missing, axis=0))
Missing Values in Attributes (if any): cid 0 dayhours 0 price 0 room_bed 0 room_bath 0 living_measure 0 lot_measure 0 ceil 0 coast 0 sight 0 condition 0 quality 0 ceil_measure 0 basement 0 yr_built 0 yr_renovated 0 zipcode 0 lat 0 long 0 living_measure15 0 lot_measure15 0 furnished 0 total_area 0 lt_price 0 yr_sold 0 month_sold 0 yr_mn_sold 0 city 0 zipcode_cl 0 dtype: int64
Ноль (0) означает, что в каждом атрибуте данных нет нулевого значения.
# Проверить повторяющиеся значения
dups = prop_data.duplicated()
print('Количество повторяющихся строк = %d' % (dups.sum()))
Number of duplicate rows = 0
Повторяющихся строк не существует, поэтому удаление не требуется.
Проверка наличия повторяющихся атрибутов
Предположение: CID, который является уникальным идентификатором Ресурса, не должен повторяться.
prop_data[prop_data.duplicated([‘cid’])].count()[‘cid’]
177
Для CID присутствует 177 повторяющихся записей, хотя данные атрибутов не дублируются. Нам нужно проверить, какую строку оставить, а какую отбросить, основываясь на других атрибутах, присутствующих для тех же строк CID. При дальнейшем изучении, на основе последнего значения дня и часа, повторяющийся идентификатор CID может быть удален (поскольку данные о собственности содержат несколько транзакций продаж и, следовательно, дублируют записи для одной и той же собственности, за исключением цены и дня продажи).
# Анализ парных диаграмм
PairPlot: для построения нескольких попарных двумерных распределений в наборе данных используется функция pairplot(). Это создает матрицу осей и показывает отношения для каждой пары столбцов в DataFrame. По умолчанию он также рисует одномерное распределение каждой переменной по диагональным осям.
sns.pairplot(prop_data, diag_kind = 'kde', panel="husl")
plt.tight_layout()
plt.savefig('Property_Data_PairPlot_Analysis.png')
plt. показать()
# Корреляционный анализ
Для измерения степени корреляции проводится корреляционный анализ с использованием коэффициента Пирсона. Давайте проведем корреляционный анализ между различными измерениями, а также каждым измерением с зависимым измерением. Это делается с помощью функции матрицы рассеяния, которая создает информационную панель, отражающую полезную информацию об измерениях. Результат можно сохранить в виде файла .png и открыть в приложениях для просмотра изображений, чтобы увеличить его.
Коэффициент корреляции
- Коэффициент корреляции, также известный как коэффициент корреляции Пирсона «произведение-момент», получается путем деления ковариации двух переменных на произведение их стандартных отклонений.
- Значения коэффициента корреляции могут варьироваться от -1 до +1. Чем ближе оно к +1 или -1, тем теснее связаны две переменные. Положительный знак означает направление корреляции, то есть, если одна из переменных увеличивается, предполагается, что другая переменная также увеличивается.
- Теперь, если мы посмотрим на отдельные элементы корреляционной матрицы, вся главная диагональ состоит из 1. Это указывает на то, что корреляция элемента с самим собой равна 1 или максимально возможному значению.
# Представление корреляции через тепловую карту
corr = prop_data.corr()
cmap = cmap=sns.diverging_palette(255, 5, as_cmap=True)
fig, ax = plt.subplots(figsize=(18,13))
sns.heatmap(corr, center=0, cmap=cmap, annot=True, annot_kws={"size": 11})
plt.show()
Корреляция более 70% указывает на то, что независимые переменные (X1, X2… Xn) влияют друг на друга.
cor = prop_data.corr()
cor.loc[:,:] = np.tril(cor,k=-1)
cor=cor.stack()
cor [(кор › 0,70) | (кор‹ -0,70)]
living_measure price 0.70 room_bath 0.75 quality living_measure 0.76 ceil_measure living_measure 0.88 quality 0.76 living_measure15 living_measure 0.76 quality 0.71 ceil_measure 0.73 lot_measure15 lot_measure 0.72 furnished quality 0.79 total_area lot_measure 1.00 lot_measure15 0.72 lt_price price 0.89 quality 0.70 yr_sold dayhours 1.00 month_sold dayhours -0.76 yr_sold -0.78 yr_mn_sold dayhours 1.00 yr_sold 1.00 month_sold -0.76 zipcode_cl zipcode 0.98 dtype: float64
Поскольку переменные коррелированы или коллинеарны, и, следовательно, есть вероятность столкнуться с загадкой мультиколлинеарности. Кроме того, говоря простым языком, если две переменные так сильно коррелированы, они, очевидно, сообщат модели почти одинаковую информацию, и включение обеих коллинеарных переменных ослабит модель. В модель не добавляется дополнительная информация, вместо этого модель наполняется шумом. Таким образом, пара сильно коррелированных переменных может быть удалена для уменьшения размерности без большой потери информации.
Выводы о корреляции. Из приведенной выше корреляционной матрицы мы можем только сделать вывод, что некоторые переменные можно легко исключить, чтобы избежать мультиколлинеарности модели. Пример:
общая_площадь = мера_лота + мера_жилого_места, поэтому удаление показателя лота и показателя жизненного цикла поможет уменьшить множественную коллинеарность в данных
# Блочные диаграммы для обнаружения выбросов
# Проверка выбросов
prop_data_o = prop_data
prop_data_o.boxplot(figsize=(15,10))
plt.xticks(rotation=90)
plt.show()
Первое, на что следует обратить внимание, это то, что «цена» имеет много выбросов. Однако совместное построение всех данных может быть неправильным из-за разных диапазонов атрибутов. Таким образом, можно обращаться к одной переменной за раз, если сочетание переменных не имеет смысла. Например, давайте проанализируем атрибут спальни данных о собственности, используя коробочную диаграмму.
Из приведенного выше графика мы можем подытожить, что для стандартной недвижимости с тремя спальнями количество выбросов означает, что владельцы заплатили премиальную цену за свою соответствующую недвижимость, которая либо находилась бы на набережной, либо стоимость недвижимости на кв. были выше стандартных показателей. Образно говоря, стандартные ставки ниже 645 000. При внимательном наблюдении, выше значения 645 000, есть несколько свойств, которые могут иметь более высокое значение sqft_living, значения выше 2000 000 могут относиться к тем свойствам, которые могут быть рядом с набережной и т. д.
Исследовательский анализ данных — это научный и художественный подход к пониманию неприятных данных. До сих пор мы в основном видели научный подход к оценке данных. Во второй части блога мы углубимся в художественный мир, анализируя сюжеты визуализации.
Есть много других подходов, которые можно использовать для изучения данных. Некоторые из них обсуждались в этом блоге. Если у вас есть какие-либо конкретные вопросы/комментарии по поводу этого обсуждения, не стесняйтесь делиться отзывами/предложениями. Оставайтесь с нами для ЧАСТИ II.