대한민국 범죄 분석 보고서 [데이터 사이언스]

데이터 사이언스 분석 보고 #4 트리맵, 데이터프레임, 원도표

rudals0000 2024. 12. 19. 21:26
import pandas as pd
import plotly.express as px

df = pd.read_csv("C:/데사프로젝트 데이터셋/경찰청_범죄 발생 지역별 통계_2024.04.csv", encoding='euc-kr')

region_columns = df.columns[2:]  # 지역 이름 2번째부터 시작

region_columns = [col for col in region_columns if col not in ['기타도시', '도시이외']]
region_sum = df[region_columns].sum()  

# 트리맵
region_sum_df = pd.DataFrame(region_sum).reset_index()
region_sum_df.columns = ['Region', 'Crime Count']
fig = px.treemap(region_sum_df,
                 path=['Region'],
                 values='Crime Count',
                 title="지역별 범죄 발생 합계 트리맵",
                 color='Crime Count',  # 색상은 범죄 발생 합계로
                 color_continuous_scale="Rainbow",
                 hover_data=['Crime Count']
                )

fig.update_layout(margin={"t": 0, "l": 0, "b": 0, "r": 0})
fig.show()

 

 

 

범죄발생 지역에 대한 트리 맵

트리맵의 크기는 지역별 전 유형의 범죄 합산 수를 나타낸다.

 

서울이 제일 범죄가 많이 일어나고, 그 뒤로 부산, 인천, 대구, 대전 순으로

많은 것을 확인 할 수 있다.

 

강원 태백이 가장 범죄가 적게 일어나고 그 뒤로 경북 문경, 경기 과천, 전북 김제

순으로 많은 것을 확인 할수 있다.

 

1 서울특별시 9,386,034
2 부산광역시 3,293,362
3 인천광역시 2,997,410
4 대구광역시 2,374,960
5 대전광역시 1,442,216
6 광주광역시 1,419,237
7 경기도 수원시 1,197,257
8 울산광역시 1,103,661
9 경기도 용인시 1,075,566
10 경기도 고양시 1,074,907

본 표에 있는 데이터는 KOSIS 국가통계포털에 있는

국가 인구 순위를 나타낸 표이다.

이 표와 위의 트리맵을 비교해 보면

1위인 서울특별시부터 7위인 경기 수원시까지

일치 하는 것이 보인다.

따라서 지역별 범죄 수는 지역별 인구 수를 추종하는 것을 알 수 있다.

인구가 많을수록 범죄 발생 수도 높다.

 

 

======================================================================================

 

 

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("C:/데사프로젝트 데이터셋/경찰청_범죄 발생 지역별 통계_2024.04.csv", encoding='euc-kr')

# 지역 2번째부터
region_columns = df.columns[2:]
# 노가다
gyeonggi = ['경기 고양', '경기 과천', '경기 광명', '경기 광주', '경기 구리', '경기 군포', '경기 김포', '경기 남양주', '경기 동두천', '경기 부천', '경기 성남',
            '경기 수원', '경기 시흥', '경기 안산', '경기 안성', '경기 안양', '경기 양주', '경기 여주', '경기 오산', '경기 용인', '경기 의왕', '경기 의정부',
            '경기 이천', '경기 파주', '경기 평택', '경기 포천', '경기 하남', '경기 화성']
gangwon = ['강원 강릉', '강원 동해', '강원 삼척', '강원 속초', '강원 원주', '강원 춘천', '강원 태백']
chungbuk = ['충북 제천', '충북 청주', '충북 충주']
chungnam = ['충남 계룡', '충남 공주', '충남 논산', '충남 당진', '충남 보령', '충남 서산', '충남 아산', '충남 천안']
jeonbuk = ['전북 군산', '전북 김제', '전북 남원', '전북 익산', '전북 전주', '전북 정읍']
jeonnam = ['전남 광양', '전남 나주', '전남 목포', '전남 순천', '전남 여수']
gyeongbuk = ['경북 경산', '경북 경주', '경북 구미', '경북 김천', '경북 문경', '경북 상주', '경북 안동', '경북 영주', '경북 영천', '경북 포항']
gyeongnam = ['경남 거제', '경남 김해', '경남 밀양', '경남 사천', '경남 양산', '경남 진주', '경남 창원', '경남 통영']
jeju = ['제주 서귀포', '제주 제주']
seoul = ['서울']
busan = ['부산']
daegu = ['대구']
incheon = ['인천']
gwangju = ['광주']
daejeon = ['대전']
ulsan = ['울산']
sejong = ['세종']

region_sum = df[region_columns].sum()

# 각 도별 합산
gyeonggi_sum = region_sum[gyeonggi].sum()
gangwon_sum = region_sum[gangwon].sum()
chungbuk_sum = region_sum[chungbuk].sum()
chungnam_sum = region_sum[chungnam].sum()
jeonbuk_sum = region_sum[jeonbuk].sum()
jeonnam_sum = region_sum[jeonnam].sum()
gyeongbuk_sum = region_sum[gyeongbuk].sum()
gyeongnam_sum = region_sum[gyeongnam].sum()
jeju_sum = region_sum[jeju].sum()

# 서울, 부산, 대구, 인천, 광주, 대전, 울산, 세종
seoul_sum = region_sum[seoul].sum()
busan_sum = region_sum[busan].sum()
daegu_sum = region_sum[daegu].sum()
incheon_sum = region_sum[incheon].sum()
gwangju_sum = region_sum[gwangju].sum()
daejeon_sum = region_sum[daejeon].sum()
ulsan_sum = region_sum[ulsan].sum()
sejong_sum = region_sum[sejong].sum()

# 지역별 인구 수
population = {"서울": 9335495,"부산": 3268993, "대구": 2364334,"인천": 3018589, "광주": 1409624,"대전": 1439687,"울산": 1098312, "세종": 390603,
              "경기": 13690645,"강원": 1518700,"충북": 1591100,"충남": 2136632,"전북": 1739751,"전남": 1789610,"경북": 2533979,"경남": 3230071,"제주": 670632}
# 결과 데이터프레임
result = {
    "지역": [ "서울", "부산", "대구", "인천", "광주", "대전", "울산", "세종","경기", "강원", "충북", "충남", "전북", "전남", "경북", "경남", "제주"],
    "범죄 발생 합계": [
        seoul_sum, busan_sum, daegu_sum, incheon_sum, gwangju_sum, daejeon_sum, ulsan_sum, sejong_sum,
        gyeonggi_sum, gangwon_sum, chungbuk_sum, chungnam_sum, jeonbuk_sum, jeonnam_sum, gyeongbuk_sum, gyeongnam_sum, jeju_sum
    ],
    "인구 수": [
        population["서울"], population["부산"], population["대구"], population["인천"], population["광주"],
        population["대전"], population["울산"], population["세종"], population["경기"], population["강원"],
        population["충북"], population["충남"], population["전북"], population["전남"], population["경북"],
        population["경남"], population["제주"]
    ]
}

df_result = pd.DataFrame(result)
df
df_result["범죄발생합계/인구수"] = df_result["범죄 발생 합계"] / df_result["인구 수"]
df_result

# 원도표
plt.figure(figsize=(10, 8))
plt.pie(df_result["범죄발생합계/인구수"], labels=df_result["지역"], autopct='%1.1f%%', colors=plt.cm.Paired.colors, startangle=140)
plt.title('범죄 발생 합계/인구수 비율 (지역별)', fontsize=14)
plt.axis('equal')  # 원이 길쭉해지지 않도록 비율을 맞춤
plt.show()

average_ratio = df_result["범죄발생합계/인구수"].mean()
print(f"범죄발생합계/인구수의 평균: {average_ratio:.6f}")

 

 

 

행정지역들을 더해 지역 컬럼의 수를 줄이고

국가 통계포털의 지역 인구 데이터를 입력해

지역별 범죄 수/ 지역 인구수를 계산해

데이터 프레임을 만들었다.

평균은 0.025701 이다.

지역별 범죄자율 = (지역별 범죄 수 / 지역 인구 수)

 

지역별 범죄 원 도표

이 원도표를 보면 육안으론 별 차이가

없어 보이지만 최소값인 3,8%의 세종과

최댓값인 9,1%의 제주와 비교해 봤을 때 큰 차이를

보인다는 것을 알 수 있다.

이는 검찰청의 [범죄분석통계]를 확인했을 때 같은

결과를 보인다.

 

제주, 부산, 서울은 외지인들이 많이 찾고 유동인구

의 이동이 잦아 범죄율이 인구대비 크게 일어나는

것으로 추정한다.

그 외에는 평이한 범죄율을 보이며 세종의 범죄율이

특히 낮은 이유는 여러 행정기관과 군 상위부대가

밀집해 있어 그에 따라 인구 유동이 적고,

공무원의 비율이 많아 범죄율이 적은 것으로 추정된다.