Data Wrangling Tool, 데이터를 불러와 합치고, 간단한 전처리하고, 기초통계 분석하는 프레임워크
Pandas로 할 수 있는 2가지
1 2 3
1. 기초통계분석 (EDA) 2. 전처리 - 반정형 데이터를 정형데이터로 바꿔준다
ETL vs Munging ETL(Extract Transform Load)는 개발자 입장에서 하는 파이프라인이고 Munging은 통계분석가 입장에서 하는 파이프라인이라고 생각하면 된다.
데이터 종류
1 2 3
1. 정형 데이터 : Dataframe 객체에 정확하게 컬럼에 집어 넣을 수 있는 데이터 2. 비정형 데이터 3. 반정형 데이터
데이터 타입 만드는 방법
Numpy 방식 (structured array)
1 2 3 4 5 6 7 8
import numpy as np
x = np.array([('jihyuk',25,73.0),('thor',35,85.0),('lion',10,30.0)],dtype=[('name','U10'),('age','i4'),('weight','f4')])
x[0] : ('jihyuk',25,73.0) x[0]['name'] # dict의 key값으로 접근 : 'jihyuk'
Python 방식 (namedtuple)
1 2 3 4 5 6 7 8 9
from collections import namedtuple
x = namedtuple('Address',['name','age','weight']) a = x('jh',25,'73.0')
a.name # attribute a.age : 'jh' 25
Pandas로 기초통계분석하기
[첫번째] 데이터 불러들이기
1 2 3 4 5 6 7 8 9
import pandas as pd
data = pd.read_csv('/Users/SAMSUNG/Desktop/개인공부/AI/AI 이노베이션 스퀘어 기본과정/수업 내용/abc.csv',engine='python') type(data) : pandas.core.frame.DataFrame
# read 메소드는 flat file 또는 sql format을 dataframe형태로 불러들인다 # 첫번째 인자는 불러올 파일의 경로인데 현재 작업파일과 동일한 위치에 있다면 파일이름만 적어줘도 된다 # engine = 'python' 이나 encoding = 'cp949'를 인자로 넣어주지 않으면 unicodeerror가 뜬다
filepath_buffer는 read_csv 메소드의 첫번째 인자로 파일경로나, url이 올 수 있다
Dataframe 객체는 Numpy에서 structured array방식을 따라 데이터 타입을 생성한다. pandas는 벡터, 행렬연산으로 속도를 빠르게 하기 위해 Numpy방식을 그대로 이어받아 사용한다. 그리고 DataFrame에서 각 열은 단일 데이터 형식만을 저장한다. 따라서 타입체크를 하지 않아 속도가 빠르다. 또한 DataFrame은 dict, attr 두가지 방법으로 모두 접근 가능하다. ex) dataframe.column, dataframe[‘column’]
Series 객체는 Dataframe에서 1차원 데이터 한 행이나 한 열, 1차원이기 때문에 방향은 없다. Series는 dataframe 처럼 dictionary 형태로 구성되어 있고 key값으로 index가 자동 생성이 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
import pandas as pd
data = np.read_csv('abc.csv', engine='python') data.values
# dict으로 접근해서 values를 사용하면 numpy format인것을 확인할 수 있다
Series , Vector 차이점
Series, Vector 둘다 1차원 데이터에 방향도 없지만 Series는 index가 붙는다
[두번째] 분석하고 그래프 그리기
분석하기전 5가지 확인 사항
데이터를 분석하기 전에 분석할 가치가 있는 데이터인지 부터 판단해야 한다! 데이터의 갯수가 충분한지 여부도 체크하고, 내가 불러들일 수 있는 크기의 데이터 양인지 체크하고 편향된 데이터값이 많은지 등등 알고서 분석에 적합한 데이터를 판별해야한다. (데이터가 많으면 많을 수록 분석, 예측시 성능이 좋아진다!
1 2 3 4 5
1. info : 데이터의 기본 정보를 보여준다 2. describe : 숫자형태인 데이터에 대해서 기본 통계값을 보여준다 3. head : default로 앞에서 5개 데이터만 불러온다 (앞에서부터 보고싶은 데이터 갯수 입력 가능) 4. tail : head와 반대로 뒤에서 부터 데이터를 불러온다 5. sample : 랜덤으로 하나의 데이터를 불러온다
info, describe로 데이터의 숨겨진 의미 찾기
column 갯수 확인 => 차원의 저주 고려
데이터 갯수 확인 => 큰 수의 법칙 고려
미싱 데이터 찾기 => 미싱데이터를 포함하고 있으면 정확도
데이터 타입 확인 => 적절한 타입을 썻는지 체크 (category, object는 각각 지원하는 기능이 다르다)
1. dictionary 2. attribute 3. fancy indexing 4. data type
Pandas Tip1 데이터 분석시 데이터 조작을 하기위해 할당을 하는 경우에 view방식으로 접근하게되면 원본 데이터도 변경될 수 있으므로 copy방식을 사용해야 한다
행 뽑는 방법
1 2
1.loc # index 명으로 접근 2.iloc # index 숫자로 접근
문제해결 그리고 예측
많은 데이터 확보 => 기초 통계분석 및 전처리 => 기계학습 및 딥러닝으로 예측
Exploratory Data Analysis
수집한 데이터가 들어왔을 때, 이를 다양한 각도에서 관찰하고 이해하는 과정.
한마디로 데이터를 분석하기 전에 그래프나 통계적인 방법으로 자료를 직관적으로 바라보는 과정이다.
nan값 제거
1 2 3 4
import pandas as pd
data = pd.read_csv('abc.csv',engine='python') data.iloc[4].dropna()
복습 시간 2시간으로 추정
2019년 5월 26일 일요일 Jupyter Notebook 오류
Numpy 예제 100선을 풀기 위해 파일을 불러오는 도중 해당 파일이 Not trusted 문제가 발생했다
Not trusted
내가 작성한 파일이 아닌 다른 사람에 의해 만들어진 파일이라서 보안상 문제가 될 수 있어 발생한 오류 인것 같다
그래서 열고자 하는 파일이 믿을만하다는 것을 알려주기 위해서 명령 프롬프트를 통해 신뢰할만한 파일이라고 직접 알려줘야 한다
1
jupyter trust name.ipynb
위 명령어를 입력하자 not trusted 오류는 발생하지 않았다
페이지를 열기 위한 메모리가 충분하지 않음
크롬 브라우저에서 메모리가 부족하다는 것이다.
그래서 쿠키정보를 삭제해보았다.
해결!
그러나 힌트파일이 아닌 정답파일은 파일 자체 내용이 많아서 그런지 아직도 안열린다…
2019년 5월 27일 월요일 16th
유니콘이 되려면…
Data Wrangling Raw data를 또 다른 형태로 수작업으로 전환하거나 매핑하는 과정. 즉, 여러가지 데이터 포멧을 내가 원하는 데이터 포멧으로 전환하여 사용하기 위한 과정. (Data Munging 이라고도 불린다)
그래프 그리기
describe로 나오는 값들 그래프로 그리기
1 2 3 4 5 6
import numpy as np import pandas as pd import seaborn as sns
data = pd.read_csv('file.csv', engine='python') pd.plotting.boxplot(data)
정규분포가 되는지 확인하는 그래프 그리기
1 2 3 4 5 6
import numpy as np import pandas as pd import seaborn as sns
data = pd.read_csv('file.csv', engine='python') pd.plotting.scatter_matrix(data)
matplotlib inline & notebook
1 2 3 4 5
%matplotlib inline data.boxplot()
%matplotlib notebook data.boxplot()
inline
notebook
seaborn으로 그래프 이쁘게 그리기
1 2 3 4
import seaborn as sns
data = pd.read_csv('file.csv', engine='python') sns.pairplot(data)
Header name 바꾸기 (전처리 과정중 일부)
1 2 3 4 5 6
import pandas as pd
data = pd.read_csv('file.csv', engine='python') data.rename({0:'sl',1:'sw',2:'pl',3:'pw','class':'class_'},axis=1,inplace=True)
# inplace True하면 자기자신이 바뀜
짝을 이뤄 그래프 그리기
열(column)에 object가 있을 때
1 2 3 4 5
import pandas as pd
data = pd.read_csv('file.csv', engine='python') data.rename({0:'sl',1:'sw',2:'pl',3:'pw','class':'class_'},axis=1,inplace=True) sns.pairplot(data,hue='class_')
Tidy Data
Wide format ⇒ Long format
분석하기 좋은 데이터. Tidy data 형태로 만들면 차원도 줄고, 유지보수하기도 좋다
Tidy Data 특징
1 2 3 4
1. 각 변수는 개별의 열(column)로 존재한다 2. 각 관측치는 행(row)으로 구성한다 3. 각 표는 단 하나의 관측기준에 의해서 조작된 데이터를 저장한다 4. 만약 여러개의 표가 존재한다면, 적어도 하나이상의 열이 공유되어야 한다
위 원칙들은 관계형 데이터베이스 원칙과 유사하다
※ 예시
변수 : 키, 몸무게, 성별
값 : 175, 73, 남자
관측치 : 사람 (값을 측정한 단위가 되는 기준)
1 2 3 4
import pandas as pd
data = pd.read_csv('file.csv') data.melt(['iso2','year'], var_name='sp', value_name='값').dropna()
주의
Tidy Data화 하지 않으면 info, describe, 등.. 초기 작업시 엉망으로 값이 나온다
### 행 뽑기
1
tb.loc[5:7]
1
tb.iloc[1:3] # 파이썬 방식
상관성 체크하기 (correlation)
두 변수간에 어떤 선형적 관계를 갖고 있는지 분석하는 방법이 상관 분석. 그렇다면 상관성 있다는 것은 얼마나 관계가 있는지에 대한 정도라고 볼 수 있다. 만약 상관성이 1에 가깝다면 두 변수는 매우 관련 이 있다. 예를 들어 키가 크면 몸무게가 많이 나가는 것처럼 서로 관계가 가까운것.
양의 상관성: 기준이되는 변수가 커지면 상대 변수도 같이 커진다
음의 상관성: 기준이되는 변수가 커지면 상대 변수는 작아진다
상관 분석은 왜 하는거야?
데이터 분석시 column이 많아지면 계산이 복잡해지는데 상관관계를 따져
상관성이 높은 것들은 분석 데이터에서 제외시켜 계산 복잡도를 크게 줄일 수 있기 때문이다.
1. Occam's Razor (오캄의 면도날) - 같은 성능을 보일 때 간단한것을 택한다 2. Curse of dimensionality (차원의 저주) - 차원이 커지면 커질수록 필요한 데이터의 양이 커져야 한다 3. Law of large numbers (큰 수의 법칙) - 큰 모집단에서 무작위로 뽑은 표본의 평균이 전체 모집단의 평균과 가까울 가능성이 높다 - 모집단이 커지면 표본평균은 모평균을 더 정확히 추정할 수 있다 4. Central limit theorem (중심 극한 정리) - 동일한 확률분포를 가진 독립 확률 변수 n개의 평균의 분포는 n이 적당히 크다면 정규분포에 가까워진다는 정리
data = pd.DataFrame(np.random.randn(6,4), index = list('abcdef'), columns = list('ABCD') data : A B C D a 0.4270921.1227361.064223-0.724660 b 0.0918811.0498681.263243-0.193525 c 0.224007-1.128729-1.2610872.461563 d -0.859961-0.450851-0.0984740.456542 e 0.339599-0.9465700.892721-0.331624 f 1.691290-0.5656360.905357-0.301717
data.loc[lambda x: x.B>0, :] : A B C D a 0.4270921.1227361.064223-0.724660 b 0.0918811.0498681.263243-0.193525
data.loc[:, lambda x:['D','A']] : D A a -0.7246600.427092 b -0.1935250.091881 c 2.4615630.224007 d 0.456542-0.859961 e -0.3316240.339599 f -0.3017171.691290
data.iloc[:,lambda x:[0,3]] : A D a 0.427092-0.724660 b 0.091881-0.193525 c 0.2240072.461563 d -0.8599610.456542 e 0.339599-0.331624 f 1.691290-0.301717
data[lambda x: x.columns[3]] : a -0.724660 b -0.193525 c 2.461563 d 0.456542 e -0.331624 f -0.301717 Name: D, dtype: float64
columns
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
import seaborn as sns
tips = sns.load_dataset('tips') tips : total_bill tip sex smoker day time size 016.991.01 Female No Sun Dinner 2 110.341.66 Male No Sun Dinner 3 221.013.50 Male No Sun Dinner 3 323.683.31 Male No Sun Dinner 2
tips.melt(tips.columns[:3]) # 열만 따로 뽑기 : total_bill tip sex variable value 016.991.01 Female smoker No 110.341.66 Male smoker No 221.013.50 Male smoker No 323.683.31 Male smoker No
index
1 2 3 4 5 6 7 8 9 10 11 12
import pandas as pd data = pd.read_csv('billboard.csv',engine='python') data.melt(data.columns[:7]).set_index('genre').loc['Rock']
: year artist.inverted track time date.entered date.peaked variable value genre Rock 2000 Destiny's Child Independent 3:38 2000-09-23 2000-11-18 x1st.week 78.0 Women Part I Rock 2000 Santana Maria, Maria 4:18 2000-02-12 2000-04-08 x1st.week 15.0 Rock 2000 Savage Garden I Knew I Loved You 4:07 1999-10-23 2000-01-29 x1st.week 71.0 Rock 2000 Madonna Music 3:45 2000-08-12 2000-09-16 x1st.week 41.0 `
tips = sns.load_dataset('tips') x = tips.items() # or x = tips.iteritems() y = tips.iterrows() type(x) type(y) next(x) next(y) : generator generator ('total_bill', 016.99 110.34 221.01 323.68 424.59 525.29 (0, total_bill 16.99 tip 1.01 sex Female smoker No day Sun time Dinner size 2 Name: 0, dtype: object)
Pandas data type 종류
1 2 3
1. 숫자 => int64, float64 2. 문자 => object, category 3. 시간/날짜
Dask는 메모리의 제한으로 dataframe을 만들 수 없는 경우 도움을 줄 수 있는 패키지 이다. 파이썬으로 작성한 작업을 병렬화 할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13
!dir
: 2019-05-25 오후 10:014,173 pandas.ipynb 2019-05-25 오후 08:49139,785 pandas2.ipynb 2019-05-26 오후 02:51220,247 pandas3.ipynb 2019-05-27 오후 09:18749,763 pandas4.ipynb
---------------------------------------------------------- # 오늘 받은 패키지
!pip install vincent !pip install -q pdvega # -q 옵션은 설치시 나오는 메시지 생략 # -U 옵션은 최신 버전이 아닐 경우 업데이트
Jupyter Tip1 jupyter에서 !(느낌표) 뒤에 cmd에서 작동하는 명령어를 치면 작동한다
pdvega
1 2 3 4
import pdvega
s = tips.groupby('smoker') s.vgplot.bar()
Aggregation analysis (집합 분석)
Groupby의 내부적 구현 순서
1 2 3 4
1. iterrow 순회 2. split => groupby 3. apply => mean, max ... (통계적으로 대표할 수 있는 값 설정) 4. combine => 결과 묶기
: size tip total_bill sex Male Female All Male Female All Male Female All smoker Yes 15074224183.0796.74279.811337.07593.271930.34 No 263140403302.00149.77451.771919.75977.682897.43 All 413214627485.07246.51731.583256.821570.954827.77
tips = sns.load_dataset('tips') n = tips[tips.sex == 'Male'].loc[:15] # 맨처음 index부터 15 index까지 행 뽑기 n.reset_index(drop=True) # 기존 index 버리고 0부터 새로 생성
: total_bill tip sex smoker day time size 010.341.66 Male No Sun Dinner 3 121.013.50 Male No Sun Dinner 3 223.683.31 Male No Sun Dinner 2 325.294.71 Male No Sun Dinner 4 48.772.00 Male No Sun Dinner 2 526.883.12 Male No Sun Dinner 4 615.041.96 Male No Sun Dinner 2 714.783.23 Male No Sun Dinner 2 810.271.71 Male No Sun Dinner 2 915.421.57 Male No Sun Dinner 2 1018.433.00 Male No Sun Dinner 4 1121.583.92 Male No Sun Dinner 2
n.reset_index() # 기존의 index 삭제 X
: index total_bill tip sex smoker day time size 0110.341.66 Male No Sun Dinner 3 1221.013.50 Male No Sun Dinner 3 2323.683.31 Male No Sun Dinner 2 3525.294.71 Male No Sun Dinner 4 468.772.00 Male No Sun Dinner 2 5726.883.12 Male No Sun Dinner 4 6815.041.96 Male No Sun Dinner 2 7914.783.23 Male No Sun Dinner 2 81010.271.71 Male No Sun Dinner 2 91215.421.57 Male No Sun Dinner 2 101318.433.00 Male No Sun Dinner 4 111521.583.92 Male No Sun Dinner 2
행, 열 위치 변환하기
기준 데이터
1 2 3 4 5 6 7 8 9
tips.groupby(['sex','smoker']).mean()[['tip']]
tip sex smoker Male Yes 3.051167 No 3.113402 Female Yes 2.931515 No 2.773519
문자나, 숫자 보다 그림으로 혹은 그래프로 시각적인 정보가 사람에게는 더 명확하고 효율적으로 전달 되기 때문에 데이터 분석 결과를 시각화 할 수 있어야 한다
시각화 라이브러리
Python 시각화 라이브러리 분류
Costumize하려면 Matplotlib을 사용해야 한다
matplotlib, seaborn matplotlib는 python, numpy format으로 데이터를 처리하고 seaborn은 pandas format으로 데이터를 처리한다. .value는 pandas 데이터 형태를 numpy format으로 바꿔준다
Matplotlib
pyplot
pylab
이제 pylab은 쓰지 않는다
구성요소
그래프 커스터마이징 하기
1 2 3 4 5 6 7 8 9 10 11 12
import matplotlib.pyplot as plt
# canvas, figure, axes는 생략하면 자동으로 생성해서 그래프를 그려준다 # 단 생략하지 않으면 커스텀 할 수 있다
plt.figure(figsize=(10,5), facecolor='yellow') plt.axes(xlim=(0,10),ylim=(0,10)) # xlim,ylim은 최대 범위를 지정 plt.title('Title') plt.xlabel('Time') plt.ylabel('Rate') plt.grid(axis='y') plt.plot([1,2,3,4,5,6],[2,0,4,7,3,10], color='black', marker='o')