Разведочный анализ на датасет ny-2015-street-tree-census-tree-data

Разведочный анализ на датасет ny-2015-street-tree-census-tree-data

В исследование отобразить следующее:

  1. Показать при помощи таблиц превью данных.
  2. Продемонстрировать при помощи таблиц или графиков объем пропущенных значений в данных.
  3. Построить диаграммы попарного распределения признаков.
  4. Рассчитать и показать матрицу попарных корреляций между вещественными признаками.
  5. Отобразить географическое представление деревьев из датасета. Используя поля latitude и longitude и подходящие библиотеки, сгенерировать карту расположения объектов.
import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns

import geopandas as gpd

Датасет был предварительно загружен через

kaggle datasets download -d new-york-city/ny-2015-street-tree-census-tree-data

Версионировать общедоступный датасет в репозитории не имеет смысла, поскольку эти данные не будут меняться. Поэтому соответствующий файл добавлен в .gitignore

data = pd.read_csv('../data/2015-street-tree-census-tree-data.csv')

Общее превью данных

pd.options.display.max_columns = 100
pd.options.display.width = 130

print(data.shape, '\n')
print(data.head())
(683788, 46) 

   tree_id  block_id               created_at  tree_dbh  stump_diam curb_loc status health                           spc_latin  \
0   180683    348711  2015-08-27T00:00:00.000         3           0   OnCurb  Alive   Fair                         Acer rubrum   
1   200540    315986  2015-09-03T00:00:00.000        21           0   OnCurb  Alive   Fair                   Quercus palustris   
2   204026    218365  2015-09-05T00:00:00.000         3           0   OnCurb  Alive   Good  Gleditsia triacanthos var. inermis   
3   204337    217969  2015-09-05T00:00:00.000        10           0   OnCurb  Alive   Good  Gleditsia triacanthos var. inermis   
4   189565    223043  2015-08-30T00:00:00.000        21           0   OnCurb  Alive   Good                     Tilia americana   

        spc_common steward guards  sidewalk         user_type problems root_stone root_grate root_other trunk_wire trnk_light  \
0        red maple     NaN    NaN  NoDamage  TreesCount Staff      NaN         No         No         No         No         No   
1          pin oak     NaN    NaN    Damage  TreesCount Staff   Stones        Yes         No         No         No         No   
2      honeylocust    1or2    NaN    Damage         Volunteer      NaN         No         No         No         No         No   
3      honeylocust     NaN    NaN    Damage         Volunteer   Stones        Yes         No         No         No         No   
4  American linden     NaN    NaN    Damage         Volunteer   Stones        Yes         No         No         No         No   

  trnk_other brch_light brch_shoe brch_other            address  postcode      zip_city  community board  borocode   borough  \
0         No         No        No         No  108-005 70 AVENUE     11375  Forest Hills              406         4    Queens   
1         No         No        No         No   147-074 7 AVENUE     11357    Whitestone              407         4    Queens   
2         No         No        No         No  390 MORGAN AVENUE     11211      Brooklyn              301         3  Brooklyn   
3         No         No        No         No  1027 GRAND STREET     11211      Brooklyn              301         3  Brooklyn   
4         No         No        No         No       603 6 STREET     11215      Brooklyn              306         3  Brooklyn   

   cncldist  st_assem  st_senate   nta            nta_name  boro_ct     state   latitude  longitude         x_sp         y_sp  \
0        29        28         16  QN17        Forest Hills  4073900  New York  40.723092 -73.844215  1027431.148  202756.7687   
1        19        27         11  QN49          Whitestone  4097300  New York  40.794111 -73.818679  1034455.701  228644.8374   
2        34        50         18  BK90   East Williamsburg  3044900  New York  40.717581 -73.936608  1001822.831  200716.8913   
3        34        53         18  BK90   East Williamsburg  3044900  New York  40.713537 -73.934456  1002420.358  199244.2531   
4        39        44         21  BK37  Park Slope-Gowanus  3016500  New York  40.666778 -73.975979   990913.775  182202.4260   

   council district  census tract        bin           bbl                          geometry  
0              29.0         739.0  4052307.0  4.022210e+09  POINT (-73.84421522 40.72309177)  
1              19.0         973.0  4101931.0  4.044750e+09  POINT (-73.81867946 40.79411067)  
2              34.0         449.0  3338310.0  3.028870e+09   POINT (-73.9366077 40.71758074)  
3              34.0         449.0  3338342.0  3.029250e+09  POINT (-73.93445616 40.71353749)  
4              39.0         165.0  3025654.0  3.010850e+09  POINT (-73.97597938 40.66677776)  

Распределение данных в числовых столбцах

data.hist(figsize=(12, 13))
plt.show()

Визуализация пропусков данных при помощи Heat Map

fig, ax = plt.subplots(figsize=(13,13))
sns_heatmap = sns.heatmap(data.isnull(), yticklabels=False, cbar=False, cmap='viridis')
plt.show()

Диаграммы попарного распределения признаков

# Выбор численных признаков из датасета
numeric_cols = data.select_dtypes(include=['float64', 'int64']).columns

# Построение диаграммы попарного распределения
sns.pairplot(data[numeric_cols])

plt.show()

Матрица попарных корреляций между численными признаками

# Выбор численных признаков
numeric_cols = data.select_dtypes(include=['float64', 'int64']).columns

# Вычисление матрицы корреляций
corr_matrix = data[numeric_cols].corr()

# Создание маски для отображения только нижнего треугольника матрицы
mask = np.triu(np.ones_like(corr_matrix, dtype=bool))

plt.figure(figsize=(12, 10))

# Построение тепловой карты с маской
sns.heatmap(corr_matrix, annot=True, mask=mask, cmap='coolwarm', vmin=-1, vmax=1)

# Направление текста на осях
plt.xticks(rotation=90)
plt.yticks(rotation=0)

plt.title('Матрица попарных корреляций между численными признаками', fontsize=16)

plt.show()

Географическое представление деревьев из датасета на карте

# Создаем GeoDataFrame из pandas DataFrame, используя колонки гео-координат
gdf = gpd.GeoDataFrame(data, geometry=gpd.points_from_xy(data.longitude, data.latitude))

# Установка координат согласно CRS
gdf.crs = "EPSG:4326"

# Рисуем карту с расположением деревьев
ax = gdf.plot(figsize=(12, 12), color='green', markersize=5, alpha=0.5)

plt.title('Географическое распределение деревьев на карте', fontsize=16)

plt.show()