Project/서울시 범죄 발생률 예측 서비스

[Project] 서울시 범죄 발생률 예측 서비스 - Model 1

gangee 2024. 6. 9. 22:10

목차

    728x90
    반응형

    1. Data Collecting

    • 서울시 5대 범죄, 날씨, 지역, 인구 데이터 수집
      • 데이터 수집 기관
      1. 범죄 데이터 : 서울특별시 경찰청
      2. 날씨 데이터 : 기상청
      3. 인구 데이터 : 서울 열린 데이터 광장
      4. 지역 데이터 : 서울 열린 데이터 광장, 토지 대장 등
    • 모든 데이터는 2020년1월 부터 2022년12월 까지 3년치 데이터를 수집

    2. PreProcessing

    2-1. 범죄 데이터

    • 1월부터 12월까지 월별로 구성된 범죄 데이터를 이용해 feature engineering 진행
    • filter 함수를 이용해 연도별 범죄건수 총합을 구함
    • (월별 범죄건수/연도별 범죄총합) * 100 -> 월별 범죄율
    • (연도별 범죄총합/ 총 범죄건수) * 100 -> 연도별 범죄율
    # filter 함수
    data['20년_범죄총합'] = data.filter(like='20년').sum(axis=1)
    
    # 월별 범죄건수, 범죄율
    for month in range(1, 13):
        data[f'20년{month}월_범죄건수'] = (data[f'20년{month}월_살인'] + data[f'20년{month}월_강도'] + data[f'20년{month}월_강간/강제추행'] + data[f'20년{month}월_절도'] + data[f'20년{month}월_폭력'])   # 범죄건수
        data[f'20년{month}월_범죄율'] = (data[f'20년{month}월_범죄건수'] / data[f'20년_범죄총합']) * 100   # 범죄율
    
    # 총 범죄건수, 연도별 범죄율
    data['총범죄건수'] = data['20년_범죄총합'] + data['21년_범죄총합'] + data['22년_범죄총합']
    data['20년_범죄율'] = (data['20년_범죄총합'] / data['총범죄건수']) * 100
    
    # 실행코드 일부 발췌

    2-2. 날씨 데이터

    • 강수, 기온, 풍속, 습도 등 데이터를 불러와 필요한 column만 추출 후 하나의 파일로 concat
    • 생성한 파일의 결측치 삭제 후 저장
    # 데이터에서 필요한 칼럼만 가져오기
    new_columns = ['일시', '강수량(mm)', '일최다강수량(mm)']
    rain = rain[new_columns]
    
    t_new_columns = ['평균기온(℃)',    '평균최고기온(℃)', '최고기온(℃)', '평균최저기온(℃)', '최저기온(℃)']
    temp = temp[t_new_columns]
    w_new_columns = ['평균풍속(m/s)', '최대풍속(m/s)', '최대순간풍속(m/s)']
    wind = wind[w_new_columns]
    h_new_columns = ['평균습도(%rh)', '최저습도(%rh)']
    humidity = humidity[h_new_columns]
    
    # 행 기준으로 데이터프레임 합치기
    df = pd.concat([rain, temp, wind, humidity], axis=1)
    
    # 결측치 제거
    df = df.dropna()
    
    # 데이터 저장
    df.to_csv('날씨데이터총합.csv', encoding='cp949', index=False)
    
    # 실행코드 일부 발췌

    2-3. 인구 데이터

    • 필요없는 index, column 삭제
    • column을 원하는 이름으로 rename
    # index 삭제
    pop = pop.drop(0)
    
    # column rename
    pop.rename(columns={'동별(2)':'자치구', '2020':'2020_세대수', '2020.1':'2020_한국인'. '2020.2':'2020_등록외국인'})
    
    # 실행코드 일부 발췌

    2-4. 지역 데이터

    • 토지 대장에서 수집한 건축물 높이와 건폐율 관련 데이터를 지역별로 구분하여 사용하려 했지만 결측치가 너무 많아 사용하지 못 했음.

    3. Visualization & Insight

    3-1. 시각화를 통한 인사이트 파악

    1. 연도별 범죄 건수 데이터를 선 그래프로 시각화하여 범죄가 가장 많이 일어나는 지역 확인
    # 2020년 범죄 총합 시각화
    import matplotlib.pyplot as plt
    
    plt.rcParams['font.family'] = 'Malgun Gothic'
    # 그래프의 크기를 설정합니다.
    plt.figure(figsize=(15, 6))
    
    # 자치구를 x축으로, 20년 범죄총합을 y축으로 하는 선 그래프를 그립니다.
    plt.plot(df['자치구'], df['20년_범죄총합'], marker='o', linestyle='-')
    
    # x축 레이블 회전
    plt.xticks(rotation=45)
    
    # 그래프의 타이틀과 축 레이블을 추가합니다.
    plt.title('자치구별 20년 범죄총합', fontsize=16)
    plt.xlabel('자치구', fontsize=14)
    plt.ylabel('20년 범죄총합', fontsize=14)
    
    plt. savefig("20년도 자치구별 범죄총합 시각화.png")
    # 그래프를 표시합니다.
    plt.show()

    2020년 범죄 총합 2022년 범죄 총합

    • 전체적으로 강남구, 송파구, 영등포구에서 범죄 수가 가장 높게 나타남을 확인
    • 2020년 이후 관악구의 범죄건수가 많이 떨어진 것을 확인
    1. 같은 방법을 통해 지역별 범죄건수 변화 확인
      • 대체로 2021년에 범죄가 많이 줄어들었음
      • 노원구, 동대문구, 관악구는 범죄 수가 감소하고 있음을 확인
      • 강동구, 도봉구, 강서구는 범죄 수가 증가하고 있음을 확인

    3-2. 상관관계 분석을 통한 인사이트 파악

    • Scikit-learn의 linear model을 이용해 범죄율과 인구에 대한 상관관계 확인
    1. 나이대별 남여에 대해 범죄와의 상관관계 확인
    # 선형 관계의 대한 절편, 계수, 점수 
    linear_regression.fit(X = pd.DataFrame(df['2020_40대_남자']), y = df['총범죄건수'])
    prediction = linear_regression.predict(X = pd.DataFrame(df['2020_40대_남자']))
    print('절편', linear_regression.intercept_)
    print('계수', linear_regression.coef_)
    print('점수', linear_regression.score(X = pd.DataFrame(df['2020_40대_남자']), y = df['총범죄건수']))
    print('-----------------------------')
    linear_regression.fit(X = pd.DataFrame(df['2020_40대_여자']), y = df['총범죄건수'])
    prediction = linear_regression.predict(X = pd.DataFrame(df['2020_40대_여자']))
    print('절편', linear_regression.intercept_)
    print('계수', linear_regression.coef_)
    print('점수', linear_regression.score(X = pd.DataFrame(df['2020_40대_여자']), y = df['총범죄건수']))
    
    # 범죄와 인구 데이터에 대해 scatter로 시각화하여 선형 관계 확인
    plt.rcParams['font.family'] = 'Malgun Gothic'
    plt.figure(figsize=(15, 5))
    plt.subplots_adjust(left=0.125, bottom=0.1, right=0.9, top=0.9, wspace=0.2, hspace=0.4)
    
    plt.subplot(121)
    plt.scatter(df['2020_40대_남자'], df['총범죄건수'], color='b')
    plt.title('2020년 40대 남자')
    
    plt.subplot(122)
    plt.scatter(df['2020_40대_여자'], df['총범죄건수'], color='r')
    plt.title('2020년 40대 여자')
    
    plt. savefig("2020년 40대 1인가구_남여 상관관계.png")
    
    # 실행 코드 일부 발췌

    2021년 40대 남여 & 범죄 상관관계

    • 인구와 관련된 각종 칼럼들의 상관관계를 분석해본 결과
      • 30대 남자, 40대 여자가 가장 높은 상관관계를 가짐
      • 등록 외국인 수, 고령 인구는 아주 낮은 상관관계를 가짐
      • 각종 날씨 데이터는 터무니 없는 분석 점수를 가짐
    • 날씨 데이터의 경우 서울시의 각 구별 날씨가 아닌 서울시 전체의 날씨를 나타내고 있음
    • 이에 각 구별 범죄율를 예측하는데 사용하기엔 한계가 있다고 판단되어 분석 데이터에서 제외
    728x90
    반응형