import pandas as pd
import matplotlib.pyplot as plt
# 데이터 정의
data = {
'연령대': ['합계', '20세 이하', '21~30세', '31~40세', '41~50세', '51~60세', '61~64세', '65세 이상', '연령불명'],
'01월': [14480, 285, 1904, 2225, 2545, 3326, 1482, 2525, 188],
'02월': [13284, 315, 1716, 1807, 2268, 3020, 1366, 2582, 210],
'03월': [16000, 415, 2078, 2168, 2777, 3637, 1584, 3110, 231],
'04월': [16336, 484, 2128, 2243, 2742, 3919, 1672, 3220, 210],
'05월': [17552, 579, 2175, 2386, 2960, 3717, 1760, 3524, 249],
'06월': [16716, 580, 2133, 2264, 2759, 3717, 1681, 3379, 203],
'07월': [16578, 534, 2097, 2377, 2793, 3647, 1678, 3252, 200],
'08월': [17212, 552, 2216, 2351, 2964, 3732, 1686, 3521, 190],
'09월': [17860, 547, 2254, 2414, 2931, 4022, 1742, 3714, 236],
'10월': [17333, 557, 2056, 2356, 2823, 3796, 1792, 3715, 238],
'11월': [17748, 403, 2129, 2529, 2844, 4057, 1812, 3733, 241],
'12월': [17197, 340, 2089, 2549, 3022, 3812, 1791, 3339, 255]
}
# 데이터프레임 생성
df = pd.DataFrame(data)
# 합계 열 제외
df_no_sum = df.drop('연령대', axis=1).sum(axis=1)
# 연령대별 사고 비율 계산
df_ratio = df.drop('연령대', axis=1).apply(lambda x: x / df_no_sum)
# 연령대별 월별 사고 건수 시각화
plt.figure(figsize=(10, 6))
for i in range(1, len(df)):
plt.plot(df.columns[1:], df.iloc[i, 1:], label=df.iloc[i, 0])
plt.title('연령대별 월별 가해 운전자 사고 건수 (2023년)', fontsize=14)
plt.xlabel('월', fontsize=12)
plt.ylabel('사고 건수', fontsize=12)
plt.legend(title="연령대", bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid(True)
plt.tight_layout()
plt.show()
plt.savefig('연령대별 월별 가해 운전자 사고 건수 (2023년).png')
# 연령대별 비율 시각화
df_ratio.plot(kind='bar', figsize=(12, 7), stacked=True)
plt.title('연령대별 사고 비율 (2023년)', fontsize=14)
plt.xlabel('월', fontsize=12)
plt.ylabel('비율', fontsize=12)
plt.legend(title="연령대", bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
plt.show()
plt.savefig('연령대별 사고 비율 (2023년).png')
연령.csv
import pandas as pd
train = pd.read_csv('C:/Users/USER/Desktop/최종.csv',encoding='euc-kr')
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
categorial_feature = train.dtypes[train.dtypes == 'object'].index.values
for i in categorial_feature:
train[i] = encoder.fit_transform(train[i])
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import rcParams
plt.rcParams['font.family'] = 'Malgun Gothic' # 나눔고딕 폰트를 사용하도록 설정
plt.rcParams['axes.unicode_minus'] = False # 마이너스 부호가 깨지지 않도록 설정
import warnings
warnings.filterwarnings("ignore", message="Glyph 8722")
train_x = train.drop(columns=['가해운전자 연령대'])
train_y = train['가해운전자 연령대']
plt.figure(figsize = (20,20))
sns.heatmap(train.corr(), annot = True)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(train_x, train_y)
model.score(train_x, train_y)
## 예측 모델 정확도
importance = model.feature_importances_
fn = train_x.columns.tolist() # train_x의 컬럼명을 fn으로 사용
importance_df = pd.DataFrame({
"Feature" : fn,
"Importance" : importance
}).sort_values(by="Importance", ascending = False)
print(importance_df)
## 기계학습 시켰을 때 가해 연령별 예측이 잘 맞을 순서
import seaborn as sns
import matplotlib.pyplot as plt
# 1. '기상상태'별 '가해운전자 연령대' 분포
sns.boxplot(x='기상상태', y='가해운전자 연령대', data=train)
plt.title("기상상태별 가해운전자 연령대 분포")
plt.show()
# 2. '요일'별 '가해운전자 연령대' 분포
sns.boxplot(x='요일', y='가해운전자 연령대', data=train)
plt.title("요일별 가해운전자 연령대 분포")
plt.show()
# 3. '도로형태'별 '가해운전자 연령대' 분포
sns.boxplot(x='도로형태', y='가해운전자 연령대', data=train)
plt.title("도로형태별 가해운전자 연령대 분포")
plt.show()
# 4. '법규위반'별 '가해운전자 연령대' 분포
sns.boxplot(x='법규위반', y='가해운전자 연령대', data=train)
plt.title("법규위반별 가해운전자 연령대 분포")
plt.show()
# 5. '피해운전자 차종'별 '가해운전자 연령대' 분포
sns.boxplot(x='피해운전자 차종', y='가해운전자 연령대', data=train)
plt.title("피해운전자 차종별 가해운전자 연령대 분포")
plt.show()
# 6. '가해운전자 차종'별 '가해운전자 연령대' 분포
sns.boxplot(x='가해운전자 차종', y='가해운전자 연령대', data=train)
plt.title("가해운전자 차종별 가해운전자 연령대 분포")
plt.show()
# 7. '피해운전자 성별'별 '가해운전자 연령대' 분포
sns.boxplot(x='피해운전자 성별', y='가해운전자 연령대', data=train)
plt.title("피해운전자 성별별 가해운전자 연령대 분포")
plt.show()
# 8. '가해운전자 상해정도'별 '가해운전자 연령대' 분포
sns.boxplot(x='가해운전자 상해정도', y='가해운전자 연령대', data=train)
plt.title("가해운전자 상해정도별 가해운전자 연령대 분포")
plt.show()
# 9. '피해운전자 상해정도'별 '가해운전자 연령대' 분포
sns.boxplot(x='피해운전자 상해정도', y='가해운전자 연령대', data=train)
plt.title("피해운전자 상해정도별 가해운전자 연령대 분포")
plt.show()
# 10. '가해운전자 성별'별 '가해운전자 연령대' 분포
sns.boxplot(x='가해운전자 성별', y='가해운전자 연령대', data=train)
plt.title("가해운전자 성별별 가해운전자 연령대 분포")
plt.show()
# 11. '중상자수'별 '가해운전자 연령대' 분포
sns.boxplot(x='중상자수', y='가해운전자 연령대', data=train)
plt.title("중상자수별 가해운전자 연령대 분포")
plt.show()
# 12. '노면상태'별 '가해운전자 연령대' 분포
sns.boxplot(x='노면상태', y='가해운전자 연령대', data=train)
plt.title("노면상태별 가해운전자 연령대 분포")
plt.show()
# 13. '사망자수'별 '가해운전자 연령대' 분포
sns.boxplot(x='사망자수', y='가해운전자 연령대', data=train)
plt.title("사망자수별 가해운전자 연령대 분포")
plt.show()
최종.csv