Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
еще примеры курсачей / еще курсач.docx
Скачиваний:
0
Добавлен:
15.07.2025
Размер:
1.04 Mб
Скачать
    1. Выполнение прогнозирования

В данной главе будет проведено прогнозирование уровня преступности на период с начала 2024 по его конец. Оно имеет несколько важных применений:

  1. Планирование ресурсов правоохранительных органов: Зная ожидаемое количество преступлений на следующий год, правоохранительные органы могут оптимизировать распределение своих ресурсов, включая персонал и бюджетные средства. Это позволяет эффективнее бороться с преступностью и повышать уровень безопасности в обществе.

  2. Разработка стратегий превентивных мер: Прогнозирование преступности позволяет правоохранительным органам разрабатывать и реализовывать более эффективные стратегии превентивных мер. Заранее предотвращение преступлений и сокращение их числа можно достигнуть благодаря целенаправленным профилактическим действиям.

  3. Оптимизация городского планирования и управления: Знание о прогнозируемом уровне преступности на следующий год может быть важным фактором при принятии решений о городском планировании и управлении. Это может включать в себя решения о размещении общественных объектов, развитии инфраструктуры или изменениях в урбанистической среде с целью снижения риска преступности.

  4. Экономическое планирование и управление рисками: Прогнозирование преступности также может иметь значение для бизнес-сектора и финансовых учреждений. Это позволяет предпринимать меры по снижению рисков, связанных с преступностью, и принимать решения о размещении бизнеса и инвестициях с учетом потенциальных угроз.

Таким образом, прогнозирование количества преступлений на следующий год является важным инструментом для планирования и управления в различных областях, от правоохранительных органов до городского планирования и бизнеса. Это помогает повысить эффективность мер борьбы с преступностью и обеспечить безопасность общества.

Для начала нам необходимо создать отдельный набор данных Edited_Crime_Data.csv (рисунок 13) (приложение: листинг 9), в который мы поместим отредактированные данные о дате и времени совершения преступления начиная с 2020 по 2024 гг. Эти данные понадобятся для создания зависимости количества преступлений от времени суток и месяца:

Рис. 13. Набор данных Edited_Crime_Data.csv

Теперь на гистограммах изобразим (рисунки 14-15), в какой месяц/промежуток времени какое количество преступлений происходит (приложение: листинг 10):

Рис. 14. Уровень преступности по времени суток с 2020 – 2024 гг.

Рис. 15. Уровень преступности по месяцам с 2020 – 2024 гг.

Далее построим временной ряд (рисунок 16) (приложение: листинг 11) для лучшей наглядности наших двух зависимостей и создания прогноза:

Рис. 16. Временной ряд

Выполнение прогнозирования (приложение: листинг 12)

Модель SARIMA (Seasonal Autoregressive Integrated Moving Average) – это расширение модели ARIMA, которая учитывает сезонные компоненты временных рядов. Разберем основные аспекты и возможности модели SARIMA [5]:

  1. Авторегрессионная (AR) компонента: это компонента модели, которая учитывает зависимость текущего значения временного ряда от предыдущих значений. ARIMA использует авторегрессионный параметр p, который определяет количество предыдущих значений временного ряда, используемых для прогнозирования текущего значения.

  2. Интегрированная (I) компонента: это компонента модели, которая учитывает разность между текущим значением временного ряда и его предыдущим значением. Интегрированная компонента помогает стабилизировать временной ряд, делая его стационарным.

  3. Скользящее среднее (MA) компонента: это компонента модели, которая учитывает взвешенные суммы предыдущих ошибок прогнозирования. SARIMA использует параметр q, который определяет количество предыдущих ошибок прогнозирования, используемых для моделирования текущего значения.

  4. Сезонность: одна из ключевых особенностей SARIMA - это способность учитывать сезонные факторы во временных рядах. SARIMA позволяет моделировать и прогнозировать сезонные изменения, что особенно полезно для данных, где наблюдаются повторяющиеся сезонные тренды, например, ежемесячные или ежегодные сезонные колебания.

  5. Оптимизация параметров: SARIMA может автоматически определить оптимальные параметры модели (p, d, q) с учетом сезонности (P, D, Q) с помощью методов оптимизации, таких как метод наименьших квадратов или метод максимального правдоподобия.

  6. Прогнозирование: после обучения модели SARIMA можно использовать для прогнозирования будущих значений временного ряда. Модель учитывает как тренд, так и сезонность, что позволяет делать более точные прогнозы даже для временных рядов с сложной структурой.

  7. Диагностика и оценка модели: SARIMA предоставляет инструменты для диагностики и оценки качества модели, такие как оценки параметров, тесты на стационарность и адекватность модели, что позволяет анализировать и улучшать прогнозы.

В коде SARIMA модель использовалась для прогнозирования количества преступлений на следующий год. Разберем, как конкретно использовались возможности SARIMA:

Определение параметров SARIMA модели:

  • Использовалась функция auto_arima, которая автоматически определяет оптимальные параметры модели SARIMA, учитывая сезонность.

  • Параметр seasonal=True указывает на то, что модель должна учитывать сезонные компоненты в данных.

  • Параметр m=12 указывает на количество периодов в сезонном цикле (12 месяцев).

  • Параметр stepwise=True указывает на использование пошагового метода оптимизации параметров модели.

Обучение модели SARIMA:

  • Создана SARIMAX модель (SARIMAX), указав в качестве параметров определенные order и seasonal_order из результатов автоматического выбора параметров модели.

  • Модель обучается на исходных данных о количестве преступлений.

Прогнозирование на один год вперед:

  • С помощью обученной модели sarima_result делается прогноз на следующий год, вызывая метод forecast с параметром steps=12 (12 месяцев вперед).

Таким образом, SARIMA модель была использована для определения оптимальных параметров модели, обучения на данных и прогнозирования количества преступлений на следующий год с учетом сезонности временного ряда. В результате мы видим (рисунок 17), что на период всего 2024 года прогнозируется рост уровня преступности, что должно повлечь за собой усиленную подготовку правоохранительных служб на этот период.

Рис. 17. Прогноз уровня преступности на 2024 год

Вывод

В результате проведенного анализа мы получили ценные инсайты о динамике преступности в городе Лос-Анджелес. Предобработка данных с использованием библиотеки Pandas позволила подготовить данные для анализа и моделирования, что существенно повысило качество и надежность полученных результатов. Использование модели SARIMA для прогнозирования временных рядов, оптимизированной с помощью auto_arima, позволило учесть сезонные колебания и тренды, что является критически важным для данных о преступлениях. Визуализация результатов с помощью Matplotlib и Seaborn предоставила наглядное представление о фактических и прогнозных данных.

Исследование демонстрирует эффективность использования Python и его библиотек для комплексного анализа данных, включая предобработку, парсинг и прогнозирование. Прогнозирование будущих значений на основе исторических данных может служить важным инструментом для правоохранительных органов и городских властей в планировании ресурсов и разработке стратегий по снижению уровня преступности.

Таким образом, проведенная работа подтверждает значимость и полезность анализа данных для принятия обоснованных решений в области обеспечения общественной безопасности. Модель SARIMA показала свою способность точно прогнозировать будущие значения временных рядов, что делает её полезным инструментом для анализа данных о преступлениях и других областей, где присутствуют сезонные колебания.

ЗАКЛЮЧЕНИЕ

В современном мире объемы данных растут с невероятной скоростью, и способность эффективно их обрабатывать и анализировать становится критически важной. Предобработка и анализ данных являются ключевыми этапами в процессе анализа данных, от которых зависит качество и надежность последующих исследований и прогнозов. Язык программирования Python, благодаря своему богатому набору библиотек и инструментов, предоставляет мощные возможности для решения этих задач. В ходе данной курсовой работы мы продемонстрировали, как современные методы и средства Python могут быть использованы для предобработки и анализа данных на примере набора данных о преступлениях. В ходе выполнения данной курсовой работы было показано, что применение современных методов анализа данных и прогнозирования позволяет не только эффективно отслеживать текущую ситуацию, но и предсказывать будущие изменения. Это, в свою очередь, способствует более целенаправленному распределению ресурсов, что подчеркивает актуальность проведенного исследования.

Основные результаты, полученные в течении выполнения работы можно описать в следующих пунктах:

  1. Обработка данных:

    • Мы загрузили и преобразовали исходный набор данных, используя библиотеку Pandas. Это включало конвертацию дат в формат datetime, создание новых признаков (год и месяц), а также фильтрацию данных по заданному временному промежутку.

  2. Анализ временных рядов:

    • В рамках работы мы сгруппировали данные по месяцам и создали временной ряд, который затем был подвергнут разложению на тренд, сезонность и остатки с использованием библиотеки statsmodels. Это позволило выявить ключевые тенденции и сезонные колебания в данных.

  3. Прогнозирование с использованием модели SARIMA:

    • Оптимизировав параметры модели с помощью auto_arima из библиотеки pmdarima, мы обучили модель SARIMA для прогнозирования временного ряда. Модель SARIMA, учитывая авторегрессионные компоненты и сезонные изменения, успешно прогнозировала количество преступлений на следующий год.

  4. Визуализация данных:

    • Результаты анализа и прогнозирования были визуализированы с использованием библиотек Matplotlib и Seaborn. Эти визуализации помогли наглядно представить динамику данных и прогнозируемые значения, облегчая интерпретацию результатов.

В ходе выполнения данной курсовой работы я приобрёл и развил следующие знания, умения и навыки:

  1. Работа с библиотеками Python: Я научился эффективно использовать библиотеки Pandas, Matplotlib, Seaborn, а также инструменты для анализа временных рядов, такие как statsmodels и pmdarima. Эти навыки позволили мне обрабатывать данные, выполнять анализ и визуализацию на высоком уровне.

  2. Предобработка данных: Я освоил методы очистки данных, обработки пропущенных значений и создания новых признаков, что является критически важным этапом в любом аналитическом проекте.

  3. Обработка данных: в ходе работы я провел обработку и анализ данных непосредственно из доступного набора данных, используя функции и методы библиотеки Pandas для чтения, предобработки и анализа данных. Применение этих инструментов позволило мне извлечь необходимую информацию и выполнить задачи анализа.

  4. Анализ временных рядов: Я применил методы разложения временных рядов и построения моделей прогнозирования, такие как SARIMA, что углубило моё понимание анализа данных и позволило мне решать сложные задачи прогнозирования.

  5. Оптимизация моделей: Использование auto_arima для автоматического определения параметров модели научило меня принципам оптимизации и выбора лучших параметров для построения эффективных моделей.

  6. Визуализация данных: Я приобрёл навыки создания информативных визуализаций, что важно для интерпретации и представления результатов анализа.

Таким образом, выполнение этой курсовой работы не только углубило мои знания в области предобработки и анализа данных с использованием Python, но и дало практические навыки, которые будут полезны в моей дальнейшей профессиональной деятельности.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ И ЛИТЕРАТУРЫ

  1. Python. Начало работы [Электронный ресурс] URL: https://www.python.org/about/gettingstarted/ (дата обращения 24.05.2024).

  2. Документация, учебные пособия и руководства по Python [Электронный ресурс] URL:

https://www.python.org/doc/ (дата обращения 24.05.2024).

  1. Pandas. Начало работы. Документация [Электронный ресурс] URL:

https://pandas.pydata.org/ (дата обращения 24.05.2024).

  1. Numpy. Фундаментальный пакет для научных вычислений на Python [Электронный ресурс] URL:

https://numpy.org/ (дата обращения 24.05.2024).

  1. Python. Справочник [Электронный ресурс] URL:

https://www.python.org/about/help/ (дата обращения 24.05.2024).

ПРИЛОЖЕНИЕ

Листинг 1. Предобработка данных

# Загрузим датасет:

crime = pd.read_csv('Crime_Data.csv')

# Удалим дубликаты

crime = crime.drop_duplicates()

# Проверим наличие пропущенных значений

print(crime.isnull().sum())

# Удалим строки, в которых большинство значений отсутствует (например, более 50%)

threshold = len(crime) * 0.5

crime = crime.dropna(thresh=threshold, axis=1)

# Заполним оставшиеся пропущенные значения

# Для этого можем использовать различные методы: среднее значение, мода, медиана и т.д.

# В данном примере мы заполним пропуски наиболее часто встречающимся значением для категориальных данных и средним значением для числовых данных.

# Заполнение категориальных данных

categorical_columns = ['DR_NO', 'AREA', 'AREA NAME', 'Part 1-2', 'Crm Cd', 'Crm Cd Desc', 'Mocodes', 'Vict Sex', 'Vict Descent', 'Premis Cd', 'Premis Desc', 'Weapon Used Cd', 'Weapon Desc', 'Status', 'Status Desc', 'Crm Cd 1', 'Crm Cd 2', 'Crm Cd 3', 'Crm Cd 4', 'LOCATION', 'Cross Street']

for col in categorical_columns:

if col in crime.columns:

crime[col].fillna(crime[col].mode()[0], inplace=True)

# Заполнение числовых данных

numerical_columns = ['Rpt Dist No', 'Vict Age', 'LAT', 'LON']

for col in numerical_columns:

if col in crime.columns:

crime[col].fillna(crime[col].mean(), inplace=True)

# Проверка на пропуски после обработки

print(crime.isnull().sum())

# Проверка на пропуски после обработки

print("Пропущенные значения после обработки:")

print(crime.isnull().sum())

# Выведем первые 5 строк обработанного датасета

print("Первые 5 строк обработанного датасета:")

print(crime.head())

Листинг 2. Создание отдельного набора данных heatmap_crimes.csv

# создадим хитмап с помощью группировки по категориям широты, долготы и уровню престуления

# с помощью .agg() подсчитаем количество уникальных значений

crime_heatmap = crime.groupby(["lon_round", "lat_round", "crime_level"]).agg({

"DR_NO": ["count"],

})

# оставим только

crime_heatmap.columns = crime_heatmap.columns.map(''.join)

# преобразуем индексные столбцы в обычные:

crime_heatmap = crime_heatmap.reset_index()

# Удаляем строки, где значения в обоих столбцах lat_round и lon_round равны 0

crime_heatmap = crime_heatmap[(crime_heatmap['lat_round'] != 0) | (crime_heatmap['lon_round'] != 0)]

# создаем новый .csv файл для хитмапа

crime_heatmap.to_csv("heatmap_crimes.csv")

crime_heatmap

Листинг 3. Создание хитмапа

# Создание хитмапа

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

heatmap = sns.heatmap(crime_heatmap.pivot_table(index='lat_round', columns='lon_round', values='crime_level'), cmap='YlOrRd')

heatmap.set_title('Crime Heatmap')

heatmap.set_xlabel('Longitude')

heatmap.set_ylabel('Latitude')

plt.show()

Листинг 4. Создание матрицы корреляции

crime_heatmap = pd.read_csv("heatmap_crimes.csv")

# Выбор числовых переменных для расчета корреляции

numeric_columns = ['lon_round', 'lat_round', 'crime_level']

# Создание матрицы корреляции

correlation_matrix = crime_heatmap[numeric_columns].corr()

# Визуализация матрицы корреляции с помощью heatmap

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

sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f")

plt.title('Correlation Matrix (Crime Heatmap Data)')

plt.show()

Листинг 5. Анализ и визуализация процентного соотношения преступлений по полу

# Подсчет количества жертв: мужчин и женщин

gender_counts = crime['Vict Sex'].value_counts()

# Построение гистограммы

plt.figure(figsize=(8, 6))

gender_counts.plot(kind='bar', color=['blue', 'pink', 'gray'], alpha=0.7)

# Добавление процентных значений над столбцами

for i, count in enumerate(gender_counts):

plt.text(i, count + 10, f"{count / len(crime) * 100:.2f}%", ha='center')

plt.title('Gender Distribution of Victims')

plt.xlabel('Gender')

plt.ylabel('Count')

plt.xticks(rotation=0)

plt.show()

Листинг 6. Анализ и визуализация процентного соотношения преступлений по возрасту

# Фильтрация строк с возрастом 0 (или любым другим отрицательным значением)

crime_filtered = crime[crime['Vict Age'] > 0]

# Группировка данных по возрасту и подсчет количества преступлений в каждой возрастной группе

age_counts = crime_filtered.groupby('Vict Age').size().reset_index(name='Count')

# Нахождение возрастной группы, подвергшейся наибольшим количеством преступлений

max_age_group = age_counts.loc[age_counts['Count'].idxmax()]

# Построение scatter plot

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

plt.scatter(age_counts['Vict Age'], age_counts['Count'], color='blue', alpha=0.7)

plt.title('Crime Counts by Age Group')

plt.xlabel('Age Group')

plt.ylabel('Crime Count')

# Добавление текста с информацией о возрастной группе жертв

plt.text(max_age_group['Vict Age'], max_age_group['Count'], f"Max Crime Count: {max_age_group['Count']} at Age {max_age_group['Vict Age']}", fontsize=10, ha='right')

plt.show()

Листинг 7. Анализ и визуализация процентного соотношения преступлений по расе

# Группировка данных по расе и подсчет количества преступлений в каждой группе

race_counts = crime['Vict Descent'].value_counts().reset_index()

race_counts.columns = ['Race', 'Crime Count']

# Коды расы

race_codes = {'A': 'Other Asian', 'B': 'Black', 'C': 'Chinese', 'D': 'Cambodian', 'F': 'Filipino',

'G': 'Guamanian', 'H': 'Hispanic/Latin/Mexican', 'I': 'American Indian/Alaskan Native',

'J': 'Japanese', 'K': 'Korean', 'L': 'Laotian', 'O': 'Other', 'P': 'Pacific Islander',

'S': 'Samoan', 'U': 'Hawaiian', 'V': 'Vietnamese', 'W': 'White', 'X': 'Unknown',

'Z': 'Asian Indian'}

# Замена кодов расы на полное наименование

race_counts['Race'] = race_counts['Race'].map(race_codes)

# Создание графика

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

plt.scatter(race_counts['Race'].astype(str), race_counts['Crime Count'], color='blue')

# Преобразование названий расы для более удобного отображения на графике

plt.xticks(rotation=45, ha='right')

# Добавление аппроксимирующей прямой (линейной регрессии)

x = np.arange(len(race_counts))

y = race_counts['Crime Count']

regression = LinearRegression().fit(x.reshape(-1, 1), y)

plt.plot(x, regression.predict(x.reshape(-1, 1)), color='red', linestyle='--')

plt.title('Crime Counts by Race')

plt.xlabel('Race')

plt.ylabel('Crime Count')

plt.tight_layout()

plt.show()

Листинг 8. Анализ и визуализация данных о преступлениях, связанных с кражами, и использованным в них оружием

# Создание отдельного датасета с необходимыми столбцами

stolen_crimes_data = crime[['Crm Cd Desc', 'Weapon Desc']]

# Выбор строк, содержащих слово "STOLEN" в столбце Crm Cd Desc

stolen_crimes_data = stolen_crimes_data[stolen_crimes_data['Crm Cd Desc'].str.contains('STOLEN', na=False)]

stolen_crimes_data.to_csv('stolen_crimes_data.csv', index=False)

stolen_crimes_data = pd.read_csv('stolen_crimes_data.csv')

# Подсчет общего количества преступлений

total_crimes = len(crime)

# Подсчет количества краж

stolen_crimes = stolen_crimes_data.shape[0]

# Рассчет процента краж от общего числа преступлений

stolen_percentage = (stolen_crimes / total_crimes) * 100

print("Количество краж:", stolen_crimes)

print("Процент краж от всех преступлений:", stolen_percentage)

# Построение графика для определения оружия, с которым кражи происходят чаще всего

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

sns.countplot(data=stolen_crimes_data, y='Weapon Desc', order=stolen_crimes_data['Weapon Desc'].value_counts().index, palette='viridis')

plt.title('Most Common Weapons Used in Stolen Crimes')

plt.xlabel('Number of Occurrences')

plt.ylabel('Weapon Description')

# Добавление процента краж на график

plt.text(0, -1, f"Percentage of thefts: {stolen_percentage:.2f}%", fontsize=10, ha='left')

plt.show()

Листинг 9. Создание отдельного датасета Edited_Crime_Data.csv

# Загрузка данных

crime = pd.read_csv('Crime_Data.csv', sep=',')

# Убираем "12:00:00 AM" из столбца DATE OCC

crime['DATE OCC'] = crime['DATE OCC'].str.split(' ').str[0]

# Преобразуем столбец TIME OCC в строковый формат и добавляем ":" перед минутами

crime['TIME OCC'] = crime['TIME OCC'].astype(str).apply(lambda x: x[:2] + ':' + x[2:] if len(x) == 4 else '0' + x[:1] + ':' + x[1:])

# Создаем новый датасет с отредактированными столбцами

edited_crime = pd.DataFrame({

'Date': crime['DATE OCC'],

'Time': crime['TIME OCC']

})

# Сохраняем новый датасет в CSV файл

edited_crime.to_csv('Edited_Crime_Data.csv', index=False)

# Отображаем первые строки нового датасета

edited_crime

Листинг 10. Анализ и визуализация зависимости количества преступлений от времени суток и месяца

# Загрузка отредактированного датасета

edited_crime = pd.read_csv('Edited_Crime_Data.csv')

# Преобразуем столбец Date в формат datetime

edited_crime['Date'] = pd.to_datetime(edited_crime['Date'])

# Создаем новый столбец с временным периодом преступления

def time_period(hour):

if hour < 6:

return 'Night'

elif hour < 12:

return 'Morning'

elif hour < 18:

return 'Afternoon'

else:

return 'Evening'

edited_crime['Time Period'] = edited_crime['Time'].apply(lambda x: time_period(int(x.split(':')[0])))

# Фильтруем данные для заданного временного промежутка

start_date = '2020-03-01'

end_date = '2024-01-15'

filtered_crime = edited_crime[(edited_crime['Date'] >= start_date) & (edited_crime['Date'] <= end_date)]

# Подсчитываем количество преступлений для каждого временного периода

crime_time_counts = filtered_crime['Time Period'].value_counts()

# Построение графика

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

crime_time_counts.plot(kind='bar', color='skyblue')

plt.title('Crime Frequency by Time Period')

plt.xlabel('Time Period')

plt.ylabel('Number of Crimes')

plt.xticks(rotation=45)

plt.tight_layout()

plt.show()

# Создание нового столбца с названием месяца

edited_crime['Month'] = edited_crime['Date'].dt.strftime('%B')

# Фильтруем данные для заданного временного промежутка

start_date = '2020-03-01'

end_date = '2024-01-15'

filtered_crime = edited_crime[(edited_crime['Date'] >= start_date) & (edited_crime['Date'] <= end_date)]

# Подсчитываем количество преступлений для каждого месяца

crime_month_counts = filtered_crime['Month'].value_counts()

# Построение графика

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

crime_month_counts.plot(kind='bar', color='skyblue')

plt.title('Crime Frequency by Month')

plt.xlabel('Month')

plt.ylabel('Number of Crimes')

plt.xticks(rotation=45)

plt.tight_layout()

plt.show()

Листинг 11. Построение временного ряда

# Загрузка отредактированного датасета

edited_crime = pd.read_csv('Edited_Crime_Data.csv')

# Преобразуем столбец Date в формат datetime

edited_crime['Date'] = pd.to_datetime(edited_crime['Date'])

# Создание нового столбца с годом

edited_crime['Year'] = edited_crime['Date'].dt.year

# Фильтруем данные для заданного временного промежутка

start_date = '2020-03-01'

end_date = '2023-12-31'

filtered_crime = edited_crime[(edited_crime['Date'] >= start_date) & (edited_crime['Date'] <= end_date)]

# Группируем данные по годам и месяцам

crime_counts_by_month = filtered_crime.groupby([filtered_crime['Date'].dt.year, filtered_crime['Date'].dt.month]).size()

# Преобразуем индекс в формат datetime

crime_counts_by_month.index = pd.to_datetime(crime_counts_by_month.index.map(lambda x: '-'.join(map(str, x))))

# Построение временного ряда

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

plt.plot(crime_counts_by_month)

plt.title('Crime Frequency by Month')

plt.xlabel('Month')

plt.ylabel('Number of Crimes')

plt.grid(True)

plt.show()

Листинг 12. Выполнение прогнозирования с использованием модели SARIMA

# Загрузка отредактированного датасета

edited_crime = pd.read_csv('Edited_Crime_Data.csv')

# Преобразуем столбец Date в формат datetime

edited_crime['Date'] = pd.to_datetime(edited_crime['Date'])

# Создание нового столбца с годом и месяцем

edited_crime['Year'] = edited_crime['Date'].dt.year

edited_crime['Month'] = edited_crime['Date'].dt.month

# Фильтруем данные для заданного временного промежутка

start_date = '2020-03-01'

end_date = '2023-12-31'

filtered_crime = edited_crime[(edited_crime['Date'] >= start_date) & (edited_crime['Date'] <= end_date)]

# Группируем данные по годам и месяцам

crime_counts_by_month=filtered_crime.groupby([filtered_crime['Year'], filtered_crime['Month']]).size()

# Преобразуем индекс в формат datetime

crime_counts_by_month.index = pd.to_datetime(crime_counts_by_month.index.map(lambda x: '-'.join(map(str, x))))

# Разложение временного ряда на тренд, сезонность и остатки

decomposition = seasonal_decompose(crime_counts_by_month, model='additive')

trend = decomposition.trend

seasonal = decomposition.seasonal

residual = decomposition.resid

# Определение параметров SARIMA модели

auto_arima_model = auto_arima(crime_counts_by_month, seasonal=True, m=12, stepwise=True, trace=True)

# Обучение модели SARIMA

sarima_model = SARIMAX(crime_counts_by_month, order=auto_arima_model.order, seasonal_order=auto_arima_model.seasonal_order)

sarima_result = sarima_model.fit()

# Прогноз на один год вперед

forecast = sarima_result.forecast(steps=12)

# Построение графика временного ряда и прогноза

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

plt.plot(crime_counts_by_month.index, crime_counts_by_month, label='Actual')

plt.plot(pd.date_range(start=crime_counts_by_month.index[-1], periods=13, freq='M')[1:], forecast, label='Forecast')

plt.title('Crime Frequency by Month with SARIMA Forecast')

plt.xlabel('Month')

plt.ylabel('Number of Crimes')

plt.legend()

plt.grid(True)

plt.show()

Соседние файлы в папке еще примеры курсачей