Patrick's 데이터 세상

Python 데이터 분석 - 탐색적 자료 분석 EDA (NumPy를 활용한 그래프, 산점도) 본문

Data Analysis/EDA

Python 데이터 분석 - 탐색적 자료 분석 EDA (NumPy를 활용한 그래프, 산점도)

patrick610 2020. 6. 24. 22:02
반응형
SMALL

◎ csv 파일 Read 후 NumPy 분석

 

import numpy as np
import pandas as pd
CCTV_Seoul = pd.read_csv('data_files/cctv-in-seoul.csv',  encoding='utf-8')
CCTV_Seoul.head()

결과

 

# rename : 컬럼명 변경
CCTV_Seoul.rename(columns={CCTV_Seoul.columns[0] : '구별'}, inplace=True)
CCTV_Seoul.head()

결과

 

# !명령어 : 터미널 실행 효과
!pip install xlrd
pop_Seoul = pd.read_excel('data_files/population-in-seoul.xls',  encoding='utf-8')
pop_Seoul.head()

결과

 

# 원하는 열만 추려서 가져오기
pop_Seoul = pd.read_excel('data_files/population-in-seoul.xls', 
                          header = 2,   # 2행을 컬럼 정보로 사용
                          usecols = 'B, D, G, J, N',   # 사용할 컬럼 위치
                          encoding='utf-8')
pop_Seoul.head()

결과

 

# 컬럼 Rename
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()

결과

 

# Na 데이터 삭제
pop_Seoul[pop_Seoul['구별'].isnull()]

pop_Seoul.drop([26], inplace=True)
pop_Seoul.head()

결과

 

 

# 비율 컬럼 추가
pop_Seoul['외국인비율'] = pop_Seoul['외국인'] / pop_Seoul['인구수'] * 100
pop_Seoul['고령자비율'] = pop_Seoul['고령자'] / pop_Seoul['인구수'] * 100
pop_Seoul.head()

결과

 

 

 

# 두 개의 DataFrame 병합
data_result = pd.merge(CCTV_Seoul, pop_Seoul, on='구별')
data_result.head()

결과

 

 

# 불필요한 열 삭제
# data_result.drop(['2013년도 이전', '2014년', '2015년', '2016년'],
#                  axis=1, inplace=True)
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)
data_result.head()

결과

 

 

# 상관 계수 계산
# correlation(상관분석) 상관 계수 계산
#   하나의 속성이 바뀔 때 다른 속성이 얼마나 따라서 움직이느냐
#   -1 ~ 1
#   상관 관계가 없을 때 0

np.corrcoef(data_result['고령자비율'], data_result['소계'])

결과

 

 

# 상관 계수 계산
np.corrcoef(data_result['외국인비율'], data_result['소계'])

결과

 

 

# 상관 계수 계산
np.corrcoef(data_result['인구수'], data_result['소계'])

결과

 

 


◎ Matplotlib을 활용한 그래프

 

import platform
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc

plt.rcParams['axes.unicode_minus'] = False # Plot에서 -를 표시하기 위한 설정

 

 

print("Platform:", platform.system()) # 운영체제 확인

if platform.system() == 'Darwin':          # 맥
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':       # 윈도우
    path = "c:/Windows/Fonts/malgun.ttf"
    # matplotlib이 사용할 폰트 지정
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc('font', family=font_name)
else:
    print('Unknown system... sorry~~~~') 

· 시각화

* 한글은 한글 폰트가 설치가 되어야 한다.
   C:\Windows\Fonts에 나눔 폰트가 설치되어 있어야한다.
   맥은 맥용 나눔폰트 설치해야 함.

결과

 

 

plt.figure()
# pandas의 DataFrame의 시각화 함수 사용
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))
# 산점도 그래프 : 2변수 상관성 표시에 유용
plt.scatter(data_result['인구수'], data_result['소계'], s=50)
plt.xlabel('인구수')
plt.ylabel('CCTV')
plt.grid()
plt.show()

결과

 

 

# 단순회귀 -> 기울기 / 절편
fp1 = np.polyfit(data_result['인구수'], data_result['소계'], 1) # y = ax + b의 a, b 계산
fp1

결과

 

f1 = np.poly1d(fp1) # 계산기 만들기 : ax + b
fx = np.linspace(100000, 700000, 100) # 100000 ~ 700000 사이를 100개로 나누기

plt.figure(figsize=(15,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) # x : 독립변수

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 : 텍스트 출력 함수
    plt.text(df_sort['인구수'][n]*1.02, df_sort['소계'][n]*0.98, # 텍스트 출력 위치
             df_sort.index[n], # 출력할 텍스트 (구 이름: 송파구, 강남구, ...)
             fontsize=15) # 텍스트 크기
    
plt.xlabel('인구수')
plt.ylabel('인구당비율')
plt.colorbar() # 색상 Gradation 출력
plt.grid()
plt.show()

결과

반응형
LIST
Comments