stock price.xlsx
0.01MB
ml_탐색적 데이터 분석_평가_guide.ipynb
0.02MB
20200323 파이썬 판다스 데이터프레임 병합.html
0.28MB
20200323 파이썬 그룹연산.html
0.34MB
stock valuation.xlsx
0.01MB

 

분석 프로세스
	분석기획
    	데이터 수집	
        	탐색적 분석
            	모델링 및 평가
                	활용
              
 

 

데이터프레임 병합

데이터프레임 병합

  • merge()함수는 sql의join명령과 비슷한 방식으로 어떤 기준에 의해 두 데이터 프레임을 병합한 개념
  • 기준이 되는 열이나 인덱스를 키라고 부름
  • 키가 되는 열이나 인덱스는 반드시 양쪽 데이터프레임에 모두 존재함.
import pandas as pd

#fileth1 = 

# 주식 데이터를 가져와서 데이터프레임 만들기
df1 = pd.read_excel('stock price.xlsx')
df2 = pd.read_excel('stock valuation.xlsx')

print(df1)
print()
print(df2)
print()

 

# 데이터프레임 합치기 - 교집합
#on='None', how ='inner' 옵션이 기본값으로 적용
#on='None' 옵션은 두 대이터프레임에 공통으로 속하는 모든 열의 기준(키)로 병합한다

merge_inner = pd.merge(df1,df2)
print(merge_inner)

 

Q. df1,df2의 합집합을 구한 후 출력하세요.

#데이터프레임 합치기 =  왼쪽 데이터프레임 기준, 키값 분리
#how_left :왼쪽 df의 키열에 속하는 데이터 값 기준으로 병합
#left_on, rigth_on : 좌우 df에 각각 다르게 키를 지정 . id_x id_y구분하여 표시

merge_left = pd.merge(df1,df2, how='left',left_on = 'stock_name', right_on='name')
print(merge_left)

 

# df1에서 불린 인덱싱과 결합하여 원하는 데이터 찾기
price =  df1[df1['price']<50000]
print(price.head())

# df1에서 불린 인덱싱과 결합하여 원하는 데이터 찾기
price =  df1[df1['price']<50000]
print(price.head())

 

 

#df2에서 가격 조건 만족하는 데이터 찾기
value = pd.merge(price, df2)
display(value)

Q. df2에서 per 가 30 보다 크고 pbr이 0.8보다 큰 데이터를 모두 출력하세요

pcon = df2[(df2.per > 30) & (df2.pbr > 0.8)]
print(pcon)

데이터프레임 결합

  • 판다스 join() 메소드는 merge()함수를 기반으로 만들어졌기 때문에 기본 작동 방식이 서로 비슷
  • join() 메소드는 두 데이터프레임의 '행 인덱스'를 기준으로 결합하는 점에서 merge와 차이가 있으나 on=keys 옵션 설정하면 열을 기준으로 결합
import pandas as pd
# 주식 데이터를 가져와서 데이터프레임 만들기
df1 = pd.read_excel('stock price.xlsx', index_col='id')
df2 = pd.read_excel('stock valuation.xlsx', index_col='id')

display(df1.head())
display(df2.head()

# 데이터프레임 결합(join)
# df1의 행 인덱스를 기준으로 결합하는 how='left' 옵션이 기본 적용
df3 = df1.join(df2)
display(df3)

 

그룹 연산

  • 복잡한 데이터를 어떤 기준에 따라 여러 그룹으로 나누어서 관찰 할 수 있으며 이런 방식으로 분할처리하는 것은 그룹연산이라 함
  • 그룹연산은 데이터를 집계, 변환, 필터링을 하는데 효율적이면 판다스 GROUPBY()메소드를 사용한
  • 그룹 객체 만들기(분할)
  • 그룹연산 메소드(적용 - 결합)
import pandas as pd
import seaborn as sns
#titanic 데이터셋에서 age, sex, 등 5개 열을 선택하여 데이터프레임 만들기
titanic = sns.load_dataset('titanic')
df = titanic.loc[:, ['age','sex','class','fare','survived']]

print('승객 수 : ', len(df))
display(df.head())

 

# Class 열을 기준으로 분할( 1개 열을 기준)
grouped = df.groupby(['class'])
print(grouped)
list(grouped)

 

#그룸 객체를 iteration 으로 출력 : head() 메소드로 첫 5행만 출력
for key, group in grouped:
    print('* key:', key)
    print('* number:', len(group))
    print(group.head())

 

# 연산 메소드 적용
average =  grouped.mean()
print(average)

stat =  grouped.max()
stat

 

Q.'Third'그룹만을 선택해서 group3 이름으로 저장하고 통계요약표를 출력하세요.

 

#개별 그룸 선택하기
group3 = grouped.get_group('Third')
print(group3.head())

group3.describe()

 

#class 열 sex열을 기준으로 분할(여러 열을 기준으로 분할)
grouped_two = df.groupby(['class','sex'])

Q. group_two 그룹 객체를 for문을 사용, iteration으로 출력하세요

# grouped_two 그룹 객체를 iteration 으로 출력
for key, group in grouped_two:
    print('* key:',key)
    print('* number:',len(group))
    display(group.head())

 

Q. grouped_two 그룹 객체에 연산 메소드 적용, 각 그룹의 평균값을 구한 후 출력하세요.

# grouped_two 그룹 객체를 연산메소드 적용
average_two =  grouped_two.mean()
print(average_two)
df.corr()

 

적용 - 결합

  • 데이터 집계(egg), 변환(transform), 필터링(filter),객체에 함수 매핑(apply)
import pandas as pd
import seaborn as sns

#titanic 데이터셋에서 age, sex등 5개 열을 선택하여 데이터프레임 만들기
titanic = sns.load_dataset('titanic')
df = titanic.loc[:,['age','sex','class','fare','survived']]

#class 열을 기준으로 분할
grouped = df.groupby(['class'])
#각 그룹에 대한 모든 열의 표준편차를 집계하여 데이터프레임으로 전환
# 각 그룹에 대한 모든 열의 표준편차를 집계하여 데이터프레임으로 변환
std_all = grouped.std() # 표준편차를 그룹으로 저장
display(std_all)
print(type(std_all))

 

(Z = X-μ/σ) Z-score : 평균값에서 표준편차의 몇배 정도 떨어져 있다는 것을 평가하는 수치

  • 분자 : 개별 데이터가 평균으로부터 얼마나 떨어져 있는가
  • Z-score : 그 떨어진 정도가 그 집단의 표준편차의 몇 배 인가

표준 정규분포로 환산했을 경우

  • 표준편차 ±1(1시그마)배의 범위 내에 약 68% 데이터가 들어감
  • 표준편차 ±2(2시그마)배의 범위 내에 약 95% 데이터가 들어감
  • 표준편차 ±3(3시그마)배의 범위 내에 약 99% 데이터가 들어감
# 각 그룹에 대한 fare 열의 표준편차를 집계하여 시리즈로 반환
std_fare = grouped.fare.std()
display(std_fare)
print(type(std_fare))

Q.최대값-최소값을 반환하는 사용자함수를 정의하고 agg() 함수에 인수로 전달하여 그룹별로 집계하여 agg_minmax 이름으로 저장 후 처음 5개 행을 출력하세요.

 

# 그룹 전체에 agg() 메소드 적용 - 사용자 정의 함수를 인수로 전달
def min_max(x): # 최대값-최소값
    return x.max() - x.min()

# 각 그룹의 최대값과 최소값 차이를 계산하여 그룹별로 집계
agg_minmax = grouped.agg(min_max)
print(agg_minmax.head())

# 여러 함수를 각 열에 동일하게 적용하여 집계
agg_all = grouped.agg(['min','max'])
display(agg_all.head())

Q. grouped 에 각 열마다 다른 함수를 적용하여 agg_sep 이름으로 저장하고 출력

('fare'는 'min', 'max', 'age'는 'mean')

 

#각 열마다 다른 함수를 적용하여 집계
agg_sep=grouped.agg({'fare':['min','max'],'age':'mean'})
print(agg_sep.head())

import pandas as pd
import seaborn as sns

#titanic 데이터셋에서 age, sex등 5개 열을 선택하여 데이터프레임 만들기
titanic = sns.load_dataset('titanic')
df = titanic.loc[:,['age','sex','class','fare','survived']]

#class 열을 기준으로 분할
grouped = df.groupby(['class'])

Q. 데이터 개수가 200개 이상인 그룹만을 필터링 하여 데이터 프레임으로 반환하여 grouped_filter이름으로 저장후 처음 5개 행을 출력하시오

 

# 데이터 개수가 200개 이상인 
grouped_filter = grouped.filter(lambda x : len(x) >=200) # 그룹의 길이가 200 이상인 것을 조건으로 filtering 하라는 의미
display(grouped_filter.head())
print(type(grouped_filter))

 

 

Q. age 열의 평균이 30보다 작은 그룹만을 필터링하여 데이터 프레임으로 반환하여 age_fileter 이름으로 저장후 끝에서 5개 행을 출력하시오

 

#age 열의 평균이 30보다 작은 그룹만을 필터링 하여 데이터프레임으로 반환.
age_filter = grouped.filter(lambda x : x.age.mean()<30)
print(age_filter.head())
print()
print(type(age_filter))

Q. Class 각 그룹별 요약 통계정보를 집계 출력하세요

  • 소스 : sns.load_dataset('titanic')
  • 컬럼 선택 : ['age','sex','class','fare','survived']
titanic = sns.load_dataset('titanic')
df = titanic.loc[:,['age','sex','class','fare','survived']]
grouped = df.groupby(['class'])

# 집계 : 각 그룹별 요약 통계정보를 집계
agg_grouped = grouped.apply(lambda x : x.describe())
display(agg_grouped)

 

Z-score를 계산하는 사용자 함수 정의

def z_score(df):
    return (df-df.mean()) / df.std()

age_zscore = grouped.age.apply(z_score)    #기본값 axis=0
print(age_zscore.head())

 

 

from scipy.stats import zmap
import numpy as np
test = np.array([-0.33, -0.31, 0.55, 0.05, 0.93])
ctrl = np.array([[-0.65, 1.09, -1.67, -0.32, 1.26],
               [0.39, 0.68, -0.28, -0.75, -0.72]])
zmap(test,ctrl)

test2 = np.expand_dims(test, axis=0)
test2 = np.concatenate((test2, ctrl))
zmap(test2,ctrl)
# z = (x - x.mean(axis=0)) / x.std(axis=0)

 

 

# 필터링 : age 열의 데이터 평균이 30보다 작은 그룹만을 필터링하여 출력!!!!!!!!
age_filter = grouped.apply(lambda x : x['age'].mean() < 30)
display(age_filter) # First 만 30보다 크기 때문에 False
for x in age_filter.index:
    if age_filter[x]==True:
        age_filter_df = grouped.get_group(x)
        display(age_filter_df.head())

 

import pandas as pd
import seaborn as sns
#titanic 데이터 셋에서 age, sex등 5개 열을 선택하여 데이터프레임 만들기
titanic = sns.load_dataset('titanic')
df = titanic.loc[:,['age','sex','class','fare','survived']]

#class 열을 기준으로 분할
grouped = df.groupby(['class'])
# 그룹 객체에 연산 메서드 적용
gdf = grouped.mean()
print(gdf)
print()
print(type(gdf))

 

Q. class값이 first인 행을 선택하여 출력하시오

 

#Class 값이 first 인 행을 선택하여 출력
print(gdf.loc['First'])

피벗

  • 피벗 데이블을 구성하는 4가지 요소(행 인덱스, 열 인덱스, 데이터 값, 데이터 집계함수)에 적용할 데이터 프레임의 열을 각각 지정하여 함수의 인자로 전달
import pandas as pd
import seaborn as sns

# IPython 디스플레이 설정 변경
pd.set_option('display.max_columns',10)    #출력할 최대 열의 개수
pd.set_option('display.max_colwidth',10)   #출력할 열의 너비
# titanic 데이터셋에서 age, sex 등 5개 열을 선택하여 데이터프레임 만들기
titanic = sns.load_dataset('titanic')
df = titanic.loc[:, ['age','sex','class','fare','survived']]
display(df.head())

 

# 행, 열, 값, 집계에 사용할 열을 1개씩 지정 - 평균집계
pdf1 = pd.pivot_table(df, # 피벗할 데이터프레임
                     index='class', # 행 위치에 들어갈 열
                     columns='sex', # 열 위치에 들어갈 열
                     values='age', # 데이터로 사용할 열
                     aggfunc='mean') # 데이터 집계 함수
print(pdf1.head())

pdf2 = pd.pivot_table(df,                 # 피벗할 데이터프레임
                     index='class',       # 행 위치에 들어갈 열
                     columns='sex',       # 열 위치에 들어갈 열
                     values='survived',        # 데이터로 사용할 열
                     aggfunc=('mean','sum'))      # 데이터 집계 함수

display(pdf2.head())

+ Recent posts