TOP
class="layout-aside-left paging-number">
본문 바로가기
데이터분석 만능열쇠 [파이썬]/<파이썬 데이터 분석>

[파이썬] 서울시 구별 CCTV 현황 분석-4

by 기록자_Recordian 2024. 4. 14.
728x90
반응형
시작에 앞서
해당 내용은 <파이썬으로 데이터 주무르기> -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다.
보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다.

지난 번 분석 이어서 하기
 

[파이썬 기초] 서울시 구별 CCTV 현황 분석-3

시작에 앞서 해당 내용은 -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다. 보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다. 지난 번 분석 이어서 하기 [파이썬 기초] 서

puppy-foot-it.tistory.com


CCTV 현황 그래프로 분석하기

 
CCTV 현황을 그래프로 분석하기 전에, matplotlib이 기본으로 가진 폰트는 한글을 지원하지 않기 때문에,
matplotlib의 폰트를 변경하는 것부터 해야 한다

한글 포트 변경하기
Windows 운영체제 버전

 
pandas 뒤에 plot 명령을 붙여 그래프 그림 (종류는 수평바)

data_result['소계'].plot(kind='barh', grid=True, figsize=(10,10))
plt.show()

※ kind='barh' > 종류는 수평바

수평바 만들기

 
보기가 어려우므로, plot 앞에 'sort_values' 를 넣어 표시 순서를 정렬

data_result['소계'].sort_values().plot(kind='barh', grid=True, figsize=(10,10))

plt.show()

수평바 정렬하기
데이터를 한눈에 보기 더 편해졌다

 

인구 대비 CCTV 비율을 계산하여 그래프로 표현 하기
data_result['CCTV비율'] = data_result['소계'] / data_result['인구수'] * 100
data_result['CCTV비율'].sort_values().plot(kind='barh', grid=True, figsize=(10,10))

plt.show()

cctv 비율 계산하여 수평바로 표현하기

인구 대비 CCTV 비율은 용산구, 종로구, 중구 순으로 높다.


Scatter (산점도) 를 사용하여 데이터 보기
plt.figure(figsize=(6,6))
plt.scatter(data_result['인구수'], data_result['소계'], s=50)
plt.xlabel('인구수')
plt.ylabel('CCTV')
plt.grid()
plt.show()

산점도 그리기

산점도 그래프에 상관관계 표현하는 직선 넣기 (numpy의 polyfit 명령)

 
CCTV와 인구수의 상관관계를 계산해보면, 양의 상관관계가 있다.

상관관계 보기

 
직선을 그리기 위해서는 x축과 y축 데이터를 얻어야 하는데,
x축 데이터 - numpy 의 linspace
y축 데이터 - numpy 의 poly1d
로 만들 수 있음

plt.figure(figsize=(10,10))
plt.scatter(data_result['인구수'], data_result['소계'], s=50)
plt.plot(fx, f1(fx), ls='dashed', lw=3, color='g')
plt.xlabel('인구수')
plt.ylabel('CCTV')
plt.grid()
plt.show()

 

상관관계 표현하는 직선 그리기

추세에서 멀리 떨어진 구 이름 표시 하기
직선에서 멀어지는 데이터 표현 하기

 
직선이 이 전체 데이터의 대표 값 역할을 한다면 (예. 인구수가 300000일 때는 CCTV는 1100 정도)
1) 그 경향에서 멀리 있는 구는 이름이 같이 나타나도록 하기
2) 직선에서 멀어질수록 다른 색을 나타내도록 하기
 
▶ 오차를 계산할 수 있는 코드를 만들고 오차가 큰 순으로 데이터를 정렬하여 다시 저장

fp1 = np.polyfit(data_result['인구수'], data_result['소계'], 1)

f1 = np.poly1d(fp1)
fx = np.linspace(100000, 700000, 100)

data_result['오차'] = np.abs(data_result['소계'] - f1(data_result['인구수']))

df_sort = data_result.sort_values(by='오차', ascending = False)
df_sort.head()

 

오차 계산 코드 만들기

 
오차 계산이 완료된 데이터에 텍스트와 Colormap 입히기

plt.figure(figsize=(14,10))
plt.scatter(data_result['인구수'], data_result['소계'],
                c=data_result['오차'], s=50)
plt.plot(fx, f1(fx), ls='dashed', lw=3, color='g')

for n in range(10):
          plt.text(df_sort['인구수'][n]*1.02, df_sort['소계'][n]*0.98,
                      df_sort.index[n], fontsize=15)

plt.xlabel('인구수')
plt.ylabel('인구당비율')

plt.colorbar()
plt.grid()
plt.show()

 

컬러맵 입력 코드
컬러맵 넣은 산점도

 

728x90
반응형