import pandas as pd
import numpy as np
CCTV_Seoul = pd.read_csv('CCTV_in_Seoul.csv', encoding='utf-8')
CCTV_Seoul.head()
CCTV_Seoul.columns
CCTV_Seoul.columns[0]
CCTV_Seoul.rename(columns={CCTV_Seoul.columns[0] : '구별'}, # 컬럼 이름 변경
inplace=True) # 변수 내용 갱신
CCTV_Seoul.head()
pop_Seoul = pd.read_excel('population_in_Seoul.xls', encoding='utf-8')
pop_Seoul.head()
pop_Seoul = pd.read_excel('population_in_Seoul.xls', header = 2, usecols = 'B, D, G, J, N', encoding='utf-8')
pop_Seoul.head()
pop_Seoul.rename(columns = {pop_Seoul.columns[0] : '구별',
pop_Seoul.columns[1] : '인구수',
pop_Seoul.columns[2] : '한국인',
pop_Seoul.columns[3] : '외국인',
pop_Seoul.columns[4] : '고령자'}, inplace=True)
pop_Seoul.head()
CCTV_Seoul.head()
CCTV_Seoul.sort_values(by='소계', ascending=True).head(5)
CCTV_Seoul.sort_values(by='소계', ascending=False).head(5)
CCTV_Seoul['최근 증가율'] = (CCTV_Seoul['2014년'] + CCTV_Seoul['2015년'] + CCTV_Seoul['2016년']) / CCTV_Seoul['2013년도 이전'] * 100
CCTV_Seoul.sort_values(by='최근 증가율', ascending=False).head(5)
pop_Seoul.head()
pop_Seoul.drop([0], inplace=True)
pop_Seoul.head()
pop_Seoul['구별'].unique() # 반복된 데이터는 하나로 나타냄
pop_Seoul[pop_Seoul['구별'].isnull()] # NaN 데이터 추출
pop_Seoul['외국인 비율'] = pop_Seoul['외국인'] / pop_Seoul['인구수'] * 100
pop_Seoul['고령자 비율'] = pop_Seoul['고령자'] / pop_Seoul['인구수'] * 100
pop_Seoul.head()
pop_Seoul.sort_values(by='인구수', ascending=False).head(5)
pop_Seoul.sort_values(by='외국인', ascending=False).head(5)
pop_Seoul.sort_values(by='외국인 비율', ascending=False).head(5)
pop_Seoul.sort_values(by='고령자', ascending=False).head(5)
pop_Seoul.sort_values(by='고령자 비율', ascending=False).head(5)
data_result = pd.merge(CCTV_Seoul, pop_Seoul, on='구별')
data_result.head()
del data_result['2013년도 이전']
del data_result['2014년']
del data_result['2015년']
del data_result['2016년']
data_result.head()
data_result.set_index('구별', inplace=True) # index 설정
data_result.head()
np.corrcoef(data_result['고령자 비율'], data_result['소계']) # 약한 음의 상관관계
np.corrcoef(data_result['외국인 비율'], data_result['소계']) # 뚜렷한 음의 상관관계 (한 쪽이 증가하면 다른 쪽은 감소)
np.corrcoef(data_result['인구수'], data_result['소계']) # 약한 양의 상관관계
data_result.sort_values(by='소계', ascending=False).head(5)
data_result.sort_values(by='인구수', ascending=False).head(5)
data_result.sort_values(by='외국인 비율', ascending=False).head(5)
import matplotlib.pyplot as plt
%matplotlib inline
import platform
from matplotlib import font_manager, rc
plt.rcParams['axes.unicode_minus'] = False
if platform.system() == 'Windows': # Windows 체제에서 한글 폰트 변경
path = "c:/Windows/Fonts/malgun.ttf"
font_name = font_manager.FontProperties(fname=path).get_name()
rc('font', family=font_name)
else:
print('Unknown system... sorry!')
data_result.head()
data_result['소계'].plot(kind='barh', grid=True, figsize=(10, 10)) # 수평바, 그리드 적용
plt.show()
data_result['소계'].sort_values().plot(kind='barh', grid=True, figsize=(10, 10))
plt.show()
data_result['CCTV 비율'] = data_result['소계'] / data_result['인구수'] * 100
data_result['CCTV 비율'].sort_values().plot(kind='barh', grid=True, figsize=(10, 10))
plt.show()
plt.figure(figsize=(6, 6))
plt.scatter(data_result['인구수'], data_result['소계'], s=50) # scatter 함수 적용
plt.xlabel('인구수')
plt.ylabel('CCTV')
plt.grid()
plt.show()
fp1 = np.polyfit(data_result['인구수'], data_result['소계'], 1) # 데이터를 대표하는 직선 만듦
fp1
f1 = np.poly1d(fp1)
fx = np.linspace(100000, 700000, 100)
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()
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()
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()