데이터분석 기초3
<Pandas 심화>
random.random() : 0부터 1사이에서 균일한 확률분포로 실수 난수를 생성
random.sample(sequence,k): 만들어놓은 sequence에서 지정한 숫자 k만큼의 요소들을 랜덤으로 뽑아 리스트로 반환
-> 보통 구현한 것에 대한 테스트용으로 사용할 예제를 쉽게 만들 수 있음
np.random.rand() : 0부터 1사이 균일확률분포에서 실수 난수 생성 ==random.random()과 흡사
차이점=> rand함수 : 원하는 차원을 정수형으로 입력/ random함수 : 원하는 차원을 튜플 자료형으로 입력
ex)3*2행렬을 원한다면,
np.random.rand(3,2)
np.random.random((3,2)) 이처럼 다르게 표현한다는 차이점 존재
np.random.rand(a): 0부터 1사이 균일한 확률분포로 실수 난수를 a개 생성
np.random.rand(a,b): 0부터 1사이 균일한 확률분포로 실수 난수를 a*b행렬로 생성
np.random.randn(k): 평균이 0, 표준편차가 1인 가우시안 표준 정규 분포를 따르는 난수를 k개 생성
np.random.randn(a,b): 평균이 0, 표준편차가 1인 가우시안 표준 정규 분포를 따르는 난수를 a*b행렬로 생성
np.random.randint(c): 0이상 c미만의 범위에서 랜덤한 정수 1개 생성
np.random.randint(a,b): a이상 b미만의 범위에서 랜덤한 정수 1개 생성
np.random.randint(a, size=m): 0이상 a미만의 범위에서 랜덤한 정수를 m개 생성
np.random.shuffle(): 기존의 데이터의 순서 바꾸기
np.random.choice(sample집단, sample 갯수, 복원추출여부(True/False), 확률리스트):
sample집단= 원하는 sampling의 범위
sample갯수= sampling하여 나온 결과의 차원을 지정-> 정수(1차원) or 튜플(2차원 이상)
확률리스트= 생략시-> 모든 sample 집단의 요소가 균등한 확률로 추출됨
각 요소에 대한 확률을 지정하여 리스트 형태로~-> 해당 확률을 반영하여 추출(단, 모든 확률의 합은 1)
np.unique(): 데이터에서 중복된 값을 제거하고 중복되지 않는 값의 리스트를 출력
np.bincount(): 발생하지 않은 사건에 대해서도 카운트를 해줌
1. 조건으로 검색하기
numpy 배열과 마찬가지로 masking 연산이 가능하여 조건에 맞는 행 추출 가능
import numpy as np
import pandas as pd
df=pd.DataFrame(np.random.rand(5,2),columns=["A","B"]) #0부터 1사이 균일한 확률분포로 실수 난수를 5*2행렬로 생성
df["A"]<0.5 #A칼럼의 데이터 값이 0.5미만이면 True, 이상이면 False
df[(df["A"]<0.5)&(df["B"]>0.3)] #A칼럼의 데이터가 0.5미만이면서 B칼럼의 데이터가 0.3초과인 행을 추출
df.query("A<0.5 and B>0.3") #위와 동일
#문자열 검색-> 다른 방식으로도 조건 검색 가능
#EX
df["Animal"].str.comtains("Cat") #Animal 칼럼의 데이터가 Cat인 경우 True, 아닐경우 False /꼭 완전한 단어 cat이 안들어가도 됨-> c를 포함하는 것만 찾아도 가능
df["Animal"].str.comtains("C") #꼭 완전한 단어 cat이 안들어가도 됨-> c를 포함하는 것만 찾아도 가능
df.Animal.str.match("Cat") #Animal 칼럼의 데이터가 Cat인 경우 True, 아닐경우 False
2. 함수로 데이터 처리하기 -apply()
import numpy as np
import pandas as pd
df=pd.DataFrame(np.arange(5),columns=["Num"]) #0이상 미만 범위의 데이터를 갖고 컬럼이 Num인 데이터프레임 생성
def square(x): #제곱을 반환하는 함수 정의
return x**2
df["Num"].apply(square) #Num컬럼의 데이터에 square함수를 적용
df["Square"]=df.Num.apply(lambda x:x**2) #람다를 사용하여 굳이 함수를 만들지 않을 수 있음. Num칼럼의 데이터를 제곱한 값을 데이터로 갖는 Square컬럼 생성
+)replace(): 데이터 값 대체
df["Sex"]=df.Sex.replace({"Male":0, "Female":1}) #Sex컬럼의 데이터가 Male이면 0, Female이면 1로 대체
#inplace ->명령어 실행 후 기존의 데이터프레임을 변경
df.Sex.replace({"Male":0, "Female":1}, inplace=True)
3. 그룹으로 묶기=> groupby()
그룹화를 통해서 묶인 데이터가 결과로 나옴
활용)
aggregate(): 집계를 한번에 계산
filter(): 데이터 필터링
apply(): 함수 적용
get_group(): 원하는 데이터를 가져옴
import numpy as np
import pandas as pd
#컬럼이 각각 key, data1, data2인 데이터프레임 생성
df=pd.DataFrame({'key':['A','B','C','A','B','C'], 'data1':[1,2,3,1,2,3],'data2':np.random.randint(0,6,6)})
#groupby()
df.groupby('key').sum() #key의 데이터가 동일한 행끼리 묶을건데 data1끼리 더하고 data2끼리 더하여 묶기
df.groupby(['key','data1']).sum() #key가 같고 data1가 같은 행을 묶을건데 묶으면서 data2를 더함
#aggregate()
df.groupby('key').aggregate([min, np.median,max]) #key가 동일한 행끼리 묶고 나서 data1과 data2의 각 최소값, 중간값, 최대값을 산출
df.groupby('key').aggregate({'data1':min, 'data2':np.sum})#key가 동일한 행끼리 묶는데 data1컬럼에는 최소값을, data2컬럼에는 더한 값을 넣음
#filter()
def filter_by_mean(x): #data2컬럼의 평균이 3보다 큰 행을 반환하는 함수 정의
return x['data2'].mean()>3
df.groupby('key').mean() #key가 동일한 행끼리 그룹화하는데 data1과 data2의 평균을 구하여 그룹화함
df.groupby('key').filter(filter_by_mean) #위에서 구한 결과값에다가 필터함수를 통하여 필터링-> data2의 평균값이 3보다 큰 key만 추출하여 펼침
#(이어서-)예를들면 B,C key의 data2의 평균이 3보다 크면 원래의 데이터프레임에서 key가 B,C인 행만 추출
#apply()
df.groupby('key').apply(lambda x:x.max()-x.min()) #묶인 데이터에 함수 적용
#get_group()
df=pd.read_csv("./univ.csv")
df.head()
df.groupby("시도").get_group("충남") #시도 컬럼의 데이터가 충남인 것만 가져옴
len(df.groupby("시도").get_group("충남"))
4. MultiIndex & pivot_table
MultiIndex
-인덱스를 계층적으로 만들 수 있음
-열 인덱스도 계층적으로 만들 수 있음
-다중 인덱스 컬럼의 경우-> 인덱싱 계층적으로 함
-인덱스 탐색의 경우-> loc, iloc 사용 가능
import numpy as np
import pandas as pd
#MultiIndex
#행을 계층적으로
df=pd.DataFrame(
np=random.randn(4,2),
index=[['A','A','B','B'], [1,2,1,2]],
columns=['data1','data2']
)
#열을 계층적으로
df=pd.DataFrame(
np.random.randn(4,4),
columns=[['A','A','B','B'], [1,2,1,2]]
)
pivot_table
-데이터에서 필요한 자료만 뽑아서 새롭게 요약
-index: 행 인덱스로 들어갈 key
-column: 열 인덱스로 들어갈 라벨링될 값
-value: 분석할 데이터
import numpy as np
import pandas as pd
#타이타닉 데이터에서 성별과 좌석별 생존률 구하기
df.pivot_table(
index='sex', columns='class', values='survived',
aggfunc=np.mean
)
#가계부
df.pivot_table(
index="월별", columns='내역', values=['수입','지출']
)