import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import geopandas as gpd
Разведочный анализ на датасет ny-2015-street-tree-census-tree-data
Разведочный анализ на датасет ny-2015-street-tree-census-tree-data
В исследование отобразить следующее:
- Показать при помощи таблиц превью данных.
- Продемонстрировать при помощи таблиц или графиков объем пропущенных значений в данных.
- Построить диаграммы попарного распределения признаков.
- Рассчитать и показать матрицу попарных корреляций между вещественными признаками.
- Отобразить географическое представление деревьев из датасета. Используя поля latitude и longitude и подходящие библиотеки, сгенерировать карту расположения объектов.
Датасет был предварительно загружен через
kaggle datasets download -d new-york-city/ny-2015-street-tree-census-tree-data
Версионировать общедоступный датасет в репозитории не имеет смысла, поскольку эти данные не будут меняться. Поэтому соответствующий файл добавлен в .gitignore
= pd.read_csv('../data/2015-street-tree-census-tree-data.csv') data
Общее превью данных
= 100
pd.options.display.max_columns = 130
pd.options.display.width
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)
Распределение данных в числовых столбцах
=(12, 13))
data.hist(figsize plt.show()
Визуализация пропусков данных при помощи Heat Map
= plt.subplots(figsize=(13,13))
fig, ax = sns.heatmap(data.isnull(), yticklabels=False, cbar=False, cmap='viridis')
sns_heatmap plt.show()
Диаграммы попарного распределения признаков
# Выбор численных признаков из датасета
= data.select_dtypes(include=['float64', 'int64']).columns
numeric_cols
# Построение диаграммы попарного распределения
sns.pairplot(data[numeric_cols])
plt.show()
Матрица попарных корреляций между численными признаками
# Выбор численных признаков
= data.select_dtypes(include=['float64', 'int64']).columns
numeric_cols
# Вычисление матрицы корреляций
= data[numeric_cols].corr()
corr_matrix
# Создание маски для отображения только нижнего треугольника матрицы
= np.triu(np.ones_like(corr_matrix, dtype=bool))
mask
=(12, 10))
plt.figure(figsize
# Построение тепловой карты с маской
=True, mask=mask, cmap='coolwarm', vmin=-1, vmax=1)
sns.heatmap(corr_matrix, annot
# Направление текста на осях
=90)
plt.xticks(rotation=0)
plt.yticks(rotation
'Матрица попарных корреляций между численными признаками', fontsize=16)
plt.title(
plt.show()
Географическое представление деревьев из датасета на карте
# Создаем GeoDataFrame из pandas DataFrame, используя колонки гео-координат
= gpd.GeoDataFrame(data, geometry=gpd.points_from_xy(data.longitude, data.latitude))
gdf
# Установка координат согласно CRS
= "EPSG:4326"
gdf.crs
# Рисуем карту с расположением деревьев
= gdf.plot(figsize=(12, 12), color='green', markersize=5, alpha=0.5)
ax
'Географическое распределение деревьев на карте', fontsize=16)
plt.title(
plt.show()