ユニファ開発者ブログ

ユニファ株式会社プロダクトデベロップメント本部メンバーによるブログです。

NYC Open Dataで探るニューヨークの保育施設の質

はじめに

こんにちは、データエンジニアリングチームの島田です。

ユニファではIoTやAIを活用し、保育業務の負担を軽減することで保育者の時間と心のゆとりを確保し、保育の質を高めることを目指しています。 また、保育施設は子育て世帯にとって欠かせない重要なインフラとなっています。子どもの成長を支えるだけでなく、親が安心して働くための社会基盤にもなっているため、保育施設が適切に機能しているかを把握することは、家庭だけでなく、社会全体にとっても非常に重要だと思います。

日本国内では保育施設の詳細なデータを公開しているオープンデータがほとんど存在しないのが現状ですが、国外のデータを調査したところ、米国のニューヨーク市が公開しているNYC Open Dataにたどり着きましたので、本記事では、NYC Open Dataを活用した保育施設のデータについて分析内容を共有します。

NYC Open Data

NYC Open Dataとは、ニューヨーク市政府が市民や研究者、企業に向けて提供する公的なオープンデータポータルで、ニューヨーク市のさまざまな分野におけるデータを公開し、透明性を高めることを目的としています。NYC Open Dataには、ニューヨーク市が保有する公共交通、教育、健康、インフラ、治安など、幅広い分野のデータが1,000種類以上含まれています。これにより、さまざまな分析や研究が可能になります。

今回の分析に使用する保育施設データには、施設の所在地、定員、違反記録、検査結果などが含まれています。このデータを利用することで、保育施設の運営状況やサービスの質を評価し、改善のための知見を得ることを目指しています。具体的には、施設ごとの違反の傾向や地域ごとの保育サービスの質を明らかにし、政策改善や事業戦略の立案に役立てることが狙いです。

データセットの概要

まず、NYC Open Dataから取得した保育施設データセットの基本情報を確認します。このデータセットには、ニューヨーク市内の保育施設に関する詳細な情報が含まれています。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv('Childcare_Centers.csv')
print(len(df))
df.head()

データセットは2024年8月時点でレコード数は26,397行あり、施設名、所在地、郵便番号、定員、違反記録など、保育施設の運営や質に関する多くの情報が含まれています。これらの情報を分析することで、各施設などの傾向や特徴を理解することができそうです。

地域ごとの保育施設の種類別分布

まずはニューヨーク市の各区における保育施設の種類別の分布を見てみます。保育施設には3〜5歳の幼児を対象とした保育施設(Child Care - Pre School)、学校の施設内で提供される保育施設(School Based Child Care)、0〜3歳の乳児や幼児を対象とする保育施設(Child Care - Infants/Toddlers)の3種類があり、各発達段階に応じた施設があることがわかります。

# 重複行を排除
df_unique = df.drop_duplicates()

type_distribution = df_unique.groupby(['Borough', 'Child Care Type']).size().reset_index(name='Count')

# 可視化
plt.figure(figsize=(10, 6))
sns.barplot(x='Borough', y='Count', hue='Child Care Type', data=type_distribution)
plt.title('Distribution of Child Care Types by Borough')
plt.xlabel('Borough')
plt.ylabel('Number of Facilities')
plt.legend(title='Child Care Type')
plt.show()

この結果から、全体としての傾向は「Child Care - Pre School」が各区で最も多くの施設を持っていることがわかります。これは、幼児向けの保育需要が高いことを示唆しています。 また、各区についてはBrooklynとQueensは特に「Pre School」の施設数が多く、教育前の子どもを対象とした保育が充実していることが確認できます。 「Child Care - Infants/Toddlers」と「School Based Child Care」の施設数は比較的少なく、特にStaten Islandではどちらのタイプも非常に少ないことがわかります。

地域ごとにおける保育施設定員数

次に、地域ごとの保育施設の数を可視化し、どの地域に保育施設が集中しているか、または不足しているかといった傾向を見ていきます。

# 箱ひげ図の作成
plt.figure(figsize=(10, 6))
sns.boxplot(x='Borough', y='Maximum Capacity', data=df_unique)
plt.title('Maximum Capacity by Borough')
plt.xlabel('Borough')
plt.ylabel('Maximum Capacity')
plt.show()

これを見ると、Bronxは他の区と比較して中央値が高く、全体的に規模がやや大きい施設が多くあることを示唆しています。一方、ManhattanとStaten Islandは、他の区に比べて施設の規模が小さいように見えます。ただし、Manhattanについては外れ値も多くあるので一般的な規模を超えるサイズの施設も複数あることがわかります。

保育施設の運営状況や安全性

NYC Open Dataの保育施設データに含まれているユニークなデータの一つに保育施設に対する定期的な検査(施設が基準を満たしているかどうかを評価したもの)の結果があります。これは検査中に発見された基準違反の詳細、例えば健康や安全に関する違反の種類とカテゴリ、違反の重大度などが含まれていて、各施設の運営が健全であるかどうかが客観的に把握することができます。基準違反のカテゴリーは、GENERAL(軽度の違反)、CRITICAL(重大な違反)、PUBLIC HEALTH HAZARD(公衆衛生上の危険)の3つのレベル分けがされているようです。

基準違反の集計

基準違反のカテゴリーごとに集計した結果を見てみます。また、欠損値については”UNKNOWN”として集計しました。

# 欠損値を 'UNKNOWN' として扱う
df_unique['Violation Category'] = df_unique['Violation Category'].fillna('UNKNOWN')

# 違反カテゴリの集計
violation_counts = df_unique.groupby(['Violation Category']).size().reset_index(name='Counts')

# 集計結果の表示
print(violation_counts)

# 違反カテゴリの可視化
plt.figure(figsize=(10, 6))
plt.bar(violation_counts['Violation Category'], violation_counts['Counts'])
plt.title('Violation Counts by Category')
plt.xlabel('Violation Category')
plt.ylabel('Number of Violations')
plt.xticks(rotation=45)
plt.show()

これを見ると、多くの検査結果がUNKNOWNとなっていることがわかります。欠損は検査で問題がないといった意味合いであるとのことだったので、多くの施設が検査に合格していることがわかります。その一方で、軽度以上の違反についても同等数あることも確認できます。

定員数と違反カテゴリの関係性

次に、施設の定員数と違反カテゴリの間の関係性も見ていきます。

plt.figure(figsize=(10, 6))
sns.violinplot(x='Violation Category', y='Maximum Capacity', data=df_unique)
plt.title('Maximum Capacity by Violation Category')
plt.xlabel('Violation Category')
plt.ylabel('Maximum Capacity')
plt.show()

傾向としては似たような分布をしており、いずれの違反カテゴリも定員数が広く分布しており、特に中小規模の施設に違反が多いことがわかります。

違反カテゴリーの推移

最後に、違反数の時系列的な推移を見ていきます。

# 月ごとに集計
violation_counts_monthly = df_unique.set_index('Inspection Date').groupby([pd.Grouper(freq='M'), 'Violation Category']).size().unstack(fill_value=0)

# 時系列での違反カテゴリの推移をプロット
violation_counts_monthly.plot(kind='line', figsize=(12, 6), marker='o')
plt.title('Monthly Violation Counts by Category')
plt.xlabel('Inspection Date')
plt.ylabel('Number of Violations')
plt.legend(title='Violation Category')
plt.grid()
plt.show()

全体的な傾向として、「CRITICAL」と「GENERAL」の違反カテゴリが多く、特に「GENERAL」違反は2021年の後半に大きく増加しています。また、「PUBLIC HEALTH HAZARD」は他のカテゴリに比べて比較的少ないが、一定の頻度で発生していることがわかります。各年の年始から年中にかけて違反数が増加し、その後、夏のシーズンは減少傾向ですが年末にかけて再び増加する傾向が見られます。これは、季節的な要因なのか検査スケジュールの影響であるかはこのデータだけからではわかりませんが、いずれのカテゴリも上昇トレンドにあるように見えます。

最後に

今回は、NYC Open Dataの保育施設データを活用し、地域ごとの特性や施設の質についていくつかの視点から分析を行いました。オープンデータの重要性は今後も増すとともに、さらなるデータの組み合わせによってより深い洞察を得られる可能性もあります。たとえば、子どもの発達に関するデータを組み合わせることで、地理的な要因や施設の特性が子どもに与える影響を明らかにし、政策立案や事業戦略に貴重な知見を得られることも出来るかもしれません。また、オープンデータが整備されることで、研究者や関心のある個人が多様なテーマで分析を行い、社会問題の解決に寄与することも期待されると感じました。

ユニファでは子育て環境の充実に貢献していくことに関心がある仲間を募集中です!

unifa-e.com