데이터 다운로드를 위한 주소:

github.com/PinkWink/DataScience/blob/master/data

 

PinkWink/DataScience

책) 파이썬으로 데이터 주무르기 - 소스코드 및 데이터 공개. Contribute to PinkWink/DataScience development by creating an account on GitHub.

github.com

read_csv, read_excel, head(), rename()등의 기본기를 익힌후에 접근해본다.

 

1. 데이터 프레임 조작하기

 

일단 데이터 분석을 위한 library들을 불러온다.

항상 import 뒤에 모듈명이 들어간다.

import pandas as pd
import sys
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
pd.__version__
# print(sys.version) #Python 내에서 현재 python version확인용

우리가 사용할 library중 테이블을 잘 정리하고 분석에 용이한 Pandas라는 library에 대해 간략히 정리할 것이다.

우선 pandas의 기본 데이터 유형은 Series인데 어떤 데이터 유형이던 담을 수 있다. 

s = pd.Series([1,3,4,np.nan,6,8]) #pandas 의 기초유형
s

또한, 날짜 관련 데이터 유형이 있다. periods를 이용해서 지정한 2013년01월01일부터 2013년 01월06일까지 dates variable에 지정된다.

dates = pd.date_range('20130101',periods=6)
dates
#pd.date_range 함수를 쓰면 모든 날짜/시간을 일일히 입력할 필요없이 시작일과 종료일 또는 시작일과 기간을 입력하면 범위 내의 인덱스를 생성해 준다.

DataFrame을 만들고 여러가지 테이블 관련 함수를 사용하거나 문자와 숫자로 인덱싱을 할 수 있다.

*주의 할 점은 인덱싱을 할 때, 숫자나 문자로 인덱싱이 된다. 하지만 loc함수에서도 문자로만 indexing이 되고 iloc은 숫자로 인덱싱이 된다.

#data frame의 index를 dates로 설정, column명은 ABCD로 설정
df = pd.DataFrame(np.random.randn(6,4),index=dates, columns=['A','B','C','D'])
#data frame을 위에서 6줄만 보여줌
df.head(3)
#index, colums과 values
df.index
df.columns
df.values
df.info()
#column별로 통계량을 계산해준다.
df.describe()
#B컬럼을 기준으로 오름차순으로 정렬
df.sort_values(by='B',ascending=True)
#index을 문자로만 인덱싱
df['20130102':'20130104']
# loc함수는 문자로만 indexing
df.loc[dates[0]]
df.loc[:,['A','B']]
df.loc['20130102':'20130104',['A','B']]
# iloc는 index(숫자) 자체로만 indexing
df.iloc[3:5,1:3]
df.iloc[[1,2,4],[0,2]]

 조건을 걸어서 데이터 프레임을 조작할 수 있다.

copy()함수를 쓰는 이유는 그냥 다른 변수에 원래 변수를 할당해주면 동일한 주소를 갖게되므로 

copy()함수를 써서 다른 주소로 변수를 할당해주어야한다.

#조건에 맞는 테이블 찾기
df[df>0]
#변수 복사
df2 = df.copy()
#column하나 추가
df2['E']=['one','one','two','three','four','three']
#E컬럼에서 two와 four를 갖고있는 조건의 df2 데이터프레임 반환
df2[df2['E'].isin(['two','four'])]
#apply는 apply함수로 어떤 함수를 전체 데이터프레임에 적용함
df.apply(np.cumsum)
#간단하게 함수를 만들때 lambda를 사용
df.apply(lambda x: x.max()-x.min())
dist = lambda x: x.max()-x.min()

이제 실제로 데이터 분석을 위해 저장된 엑셀파일을 불러와보자. 

CCTV_seoul = pd.read_csv('C:/Users/USER-PC/Documents/DataScience_followingbook/data/01. CCTV_in_Seoul.csv',encoding='utf-8')
pop_seoul_ori= pd.read_excel('C:/Users/USER-PC/Documents/DataScience_followingbook/data/01. population_in_Seoul.xls')
pop_seoul = pd.read_excel('C:/Users/USER-PC/Documents/DataScience_followingbook/data/01. population_in_Seoul.xls',
                            encoding='utf-8',usecols='B,D,G,J,N',header=2,)
pop_seoul_test = pd.read_excel('C:/Users/USER-PC/Documents/DataScience_followingbook/data/01. population_in_Seoul.xls',
                            encoding='utf-8',header=2)

CCTV_seoul.head()
pop_seoul.head()
pop_seoul_test.head()

맘에 들지 않는 컬럼명을 바꿔보자.

CCTV_seoul.rename(columns={CCTV_seoul.columns[0]:'구별'},inplace=True)
CCTV_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)

데이터를 특정 column기준으로 정렬해보자.

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()

맘에 들지 않는 행이나 열을 지워보자.

pop_seoul.head()
pop_seoul.drop([0],axis=0) #drop함수는 행이나 열을 제거 axis =0 행, 1열
pop_seoul['구별'].unique()
pop_seoul[pop_seoul['구별'].isnull()]
pop_seoul.drop([26],axis=0)
pop_seoul.head()

 

2. 데이터 프레임끼리 JOIN

 

간단하게 데이터 프레임끼리 어떤 기준키로 데이터프레임을 조작하는 방법을 알아보자.

우선 사용할 df를 만들어주자.

df1 = pd.DataFrame({'A':['A0','A1','A2','A3'],
                   'B':['B0','B1','B2','B3'],
                   'C':['C0','C1','C2','C3'],
                   'D':['D0','D1','D2','D3']},index=[0,1,2,3])
df2 = pd.DataFrame({'A':['A4','A5','A6','A7'],
                   'B':['B4','B5','B6','B7'],
                   'C':['C4','C5','C6','C7'],
                   'D':['D4','D5','D6','D7']},index=[4,5,6,7])
df3 = pd.DataFrame({'A':['A8','A9','A10','A11'],
                   'B':['B8','B9','B10','B11'],
                   'C':['C8','C9','C10','C11'],
                   'D':['D8','D9','D10','D11']},index=[8,9,10,11])
df4 = pd.DataFrame({'B':['B2','B3','B6','B7'],
                   'D':['D2','D3','D6','D7'],
                   'F':['F2','F3','F6','F7']},index=[2,3,6,7])

concat은 행기준으로 데이터를 병합하는 것이고 열 기준으로 묶기 위해서는 axis를 1로 변경해준다. 그런데 자주 사용 안 할 것 같다.

result = pd.concat([df1,df2,df3],keys=['x','y','z']) #keys를 설정하면 다중 인덱스가 됨
result.index
result.index.get_level_values(0)
result = pd.concat([df1,df4],axis=1) #concat은 index를 기준으로 date를 합침
result = pd.concat([df1,df4],axis=1,join='inner') #concat은 index를 기준으로 date를 합침
result = pd.concat([df1,df4],axis=1,join_axes=[df1.index]) #concat은 index를 기준으로 date를 합침
result = pd.concat([df1,df4],ignore_index=True) #concat은 index를 기준으로 date를 합침
result

대신 merge라는 것을 사용할 것이다. 

left=pd.DataFrame({'key':['k0','k4','k2','k3'],
                  'A':['a0','a1','a2','a3'],
                  'B':['b0','b1','b2','b3']})
right=pd.DataFrame({'key':['k0','k1','k2','k3'],
                  'C':['c0','c1','c2','c3'],
                  'D':['d0','d1','d2','d3']})
left
right
pd.merge(left,right,on='key')
pd.merge(left,right,how='left',on='key')
pd.merge(left,right,how='right',on='key')
pd.merge(left,right,how='outer',on='key')
pd.merge(left,right,how='inner',on='key')
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)
data_result.head()

이제 정렬이 어느 정도 되었으니 각 column별로 얼마나 관계를 띄는지 확인해보려 한다.

이때, corrcoef함수로 correlation coefficient를 볼 수 있다.

np.corrcoef(data_result['고령자비율'],data_result['소계'])
np.corrcoef(data_result['외국인비율'],data_result['소계'])
np.corrcoef(data_result['인구수'],data_result['소계'])

 

'데이터분석 > 예제로 데이터분석' 카테고리의 다른 글

서울시 범죄 현황 분석  (0) 2020.02.19

+ Recent posts