Исследовательский анализ данных (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.