본문 바로가기
BOOSTCAMP AI TECH/2주차_AI를 위한 수학

[BOOSTCAMP AI TECH] 9일차_Pandas 2, 확률론

by 이민우 2021. 1. 28.
728x90
반응형
  • 강의 목록

- Pandas 2

- 확률론 맛보기


  • 요약

강의

Pandas 라이브러리의 상세한 활용법을 학습했다.

또한 딥러닝에서의 확률론을 학습하며, 확률분포와 각종 확률변수, 조건부확률 등을 학습했다.

 

 

피어세션

어제의 강의를 다시 한 번 복습하는 시간을 가진 후, 어제 풀지 못했던 의문들을 풀었다.

 


  • 학습정리

Pandas

import pandas as pd

#groupby
#sql의 groupby와 같다.
#split->apply->combine 과정을 거친다.
df = pd.DataFrame([[876, 1, 'Riders', 2014], [789, 2, 'Riders', 2015], [863, 2, 'Devils', 2014], [673, 3, 'Devils', 2015], [741, 3, 'Kings', 2014]], columns = ['Points', 'Rank', 'Team', 'Year'])
print(df)
print("-------------------------------------------")

#한 개 이상의 열 묶기 가능
print(df.groupby("Team")["Points"].sum())
print("-------------------------------------------")
#Select sum(points) from df group by team
#두 개 이상일 경우 index가 두 개 생성
print(df.groupby(["Team", "Year"])["Points"].sum())
print("-------------------------------------------")

#unstack
#groupby 묶인 데이터를 2차원 배열 형태로 반환
print(df.groupby(["Team", "Year"])["Points"].sum())
print("-------------------------------------------")
print(df.groupby(["Team", "Year"])["Points"].sum().unstack())
print("-------------------------------------------")

'''
Team    Year
Devils  2014    863
        2015    673
Kings   2014    741
Riders  2014    876
        2015    789
Name: Points, dtype: int64
-------------------------------------------
Year     2014   2015
Team
Devils  863.0  673.0
Kings   741.0    NaN
Riders  876.0  789.0
'''

#swaplevel
#index level 변경
ind = df.groupby(["Team", "Year"])["Points"].sum()
print(ind.swaplevel()) #원래는 팀 기준이었는데 이젠 년 기준
print("-------------------------------------------")

#index level을 기준으로 기본 연산 수행 가능
print(ind.sum(level=0)) #0번 레벨, 0은 팀이고 1은 년인데 0을 기준으로
print("-------------------------------------------")


#groupby은 split->apply->combine 순서를 거친다.
#여기서 split에서만 끝나게 하는 것도 가능.
#이를 grouped라고 부른다.
#추출된 group 정보에는 세 가지 유형의 apply가 가능하다.
# 1. Aggregation : 요약된 통계정보 추출
# 2. Transformation : 해당 정보 변환
# 3. Filtration : 특정 정보를 제거하여 필터링

grouped = df.groupby("Team")
for name, group in grouped :
    print(name)
    print(group)
print("-------------------------------------------")
print(grouped.get_group("Devils"))
print("-------------------------------------------")

# 1. Aggregation
import numpy as np
print(grouped.agg(sum)) #팀별 함계
print(grouped.agg(np.mean)) #평균
print(grouped.agg([np.sum, np.mean, np.std]))
print("-------------------------------------------")


# 2. Transformation
score = lambda x : (x)
print(grouped.transform(score))
print("-------------------------------------------")
score = lambda x : x.max()
print(grouped.transform(score))
print("-------------------------------------------")
score = lambda x : (x - x.mean()) / x.std()
print(grouped.transform(score))
print("-------------------------------------------")

# 3. Filtre
# 필터 안에는 Boolean 조건이 존재해야 함.
print(df.groupby("Team").filter(lambda x : len(x) >= 2)) #같은 팀이 두 개 이상인 것만
print("-------------------------------------------")


#--Case Study--#
import dateutil

#https://www.shanelynn.ie/wp-content/uploads/2015/06/phone_data.csv
df_phone = pd.read_csv("phone_data.csv")
#date가 object (string)으로 되어있으니 dateutil으로 변경
df_phone['date'] = df_phone['date'].apply(dateutil.parser.parse, dayfirst = True)
print(df_phone.head())
print("-------------------------------------------")
print(df_phone.groupby("month")['duration'].sum())
#월별 통화량 합산 조회
print("-------------------------------------------")
print(df_phone[df_phone['item'] == 'call'].groupby('network')['duration'].sum())
#network별 통화량 합산 조회
#count()도 비슷하게 사용 가능.
#count().unstack()도 가능.
print("-------------------------------------------")
#agg 사용도 가능.
print(df_phone.groupby('month', as_index = False).agg({"duration":"sum"}))
print("-------------------------------------------")
print(df_phone.groupby(['month', 'item'], as_index = False).agg({"duration":sum, 'network_type':"count","date" : 'first'}))
print("-------------------------------------------")
#add_prefix() 사용시 컬럼 앞에 추가 이름이 붙음
#ex) month, item, duration => add_prefix('a_') => a_month, a_item, a_duration

#--Pivot Table--#
#엑셀 데이터 그 자체
#index 축은 groupby와 동일함
#Column에 추가로 라벨링 값을 추가해 Value에 숫자타입 값을 aggregation
df = pd.read_csv('phone_data.csv')
df['date'] = df['date'].apply(dateutil.parser.parse, dayfirst = True)
df_p = df.pivot_table(['duration'],
index = [df.month, df.item],
columns = df.network, aggfunc = 'sum', fill_value = 0)
print(df_p)
print("-------------------------------------------")

#--CorssTab--#
#피벗 테이블의 특수한 형태
#user-item rating matrix 등을 만들 때 사용
#두 칼럼에 교차 빈도, 비율, 덧셈 구하기
'''
df_movie = pd.read_csv("movie_rating.csv")
print(df_movie.head())
print("-------------------------------------------")
df_c = df_movie.crosstab(index = df_movie.critic, columns = df_mivie.title, values = df_movie.rating, aggfunc = "first").fillna(0)
print("-------------------------------------------")
'''

#--Merge & Count--#
# Merge : SQL의 Merge와 같이 두 개의 데이터를 합친다.
#parameter 중 on=칼럼명 은 해당 칼럼명을 기준으로 합친다. (같은 것만)

pd1 = pd.DataFrame([[1, 51], [2,49], [3,40], [4,50]], columns = ['subject_id', 'test_score'])
pd2 = pd.DataFrame([[3,61], [4,72], [5,83]], columns = ["subject_id", "test_id"])
print(pd.merge(pd1, pd2, on='subject_id')) #subject_id가 같은 애끼리 병합
print("-------------------------------------------")

#만약 컬럼명이 다르면?
pd2 = pd.DataFrame([[3,61], [4,72], [5,83]], columns = ["rsubject_id", "test_id"])
print(pd.merge(pd1, pd2, left_on='subject_id', right_on='rsubject_id')) #subject_id가 같은 애끼리 병합
print("-------------------------------------------")

#Join : Inner, Full, Left Outer, Right Outer가 있다 (SQL이랑 같네)
pd2 = pd.DataFrame([[3,61], [4,72], [5,83]], columns = ["subject_id", "test_id"])
print(pd.merge(pd1, pd2, on='subject_id', how = 'left'))
#how에 left, right, outer, inner을 넣음에 따라 각자 다른 join
#default는 inner
#중복된 칼럼명을 출력하는데, 삭제하고 싶으면
#left_index = True를 해주면 됨.
print("-------------------------------------------")

#--concat--#
#같은 형태의 데이터를 붙이는 연산작업
df_new = pd.concat([pd1, pd2]) #밑으로 추가. 그런데 인덱스를 물려받음. 
#df_new = pd1.append(pd2) #이렇게도 가능.
df_new.reset_index() # 인덱스가 0~3,0~2로 되어있으니 0~6으로 리셋
print(df_new)
#default는 axis=0인데 axis=1로 하면 밑이 아닌 옆으로 추가
df_new = pd.concat([pd1, pd2], axis = 1)
print(df_new)
print("-------------------------------------------")

#--Persistence : DB Connection--#
import sqlite3 #파일형태로 DB 연결

conn = sqlite3.connect("./data/dbex.db")
cur = conn.cursor()

cur.execute("create table airlines ( num1 NUMBER, time NUMBER, Constraing airlines_pk primary key (num1));")

cur.execute("insert into airlines values (1, 10)")
cur.execute("insert into airlines values (2, 20)")
cur.execute("insert into airlines values (3, 30)")

cur.execute("select * from airlines limit 5;")
result = cur.fetchall()
print(result)

#XLS 엔진으로 openpuxls 또는 xlsxwrite으로 엑셀 추출 가능.

import xlsxwriter
import pandas as pd

writer = pd.ExcelWriter('df_route.xlsx', engine = 'xlsxwriter')
df.to_excel(writer, sheet_name = 'Sheet1')

 


 

딥러닝에서의 확률론

  • 딥러닝은 확률론 기반의 기계학습 이론에 바탕을 두고 있다.
  • 기계학습에서 사용되는 손실함수 (Loss Function)들의 작동 원리는 데이터 공간을 통계적으로 해석해서 유도한다.
  • 예측이 틀릴 위험을 최소화하도록 데이터를 학습하는 원리는 통계적 기계학습의 기본 원리이다.
  • 회귀 분석에서 손실함수로 사용되는 L2 노름은 에측오차의 분산을 최소화한다.
  • 분류 문제에서 사용되는 교차엔트로피는 모델 예측의 불확실성 최소화한다.
  • 분산 및 불확실성의 최소화를 위해 측정하는 법을 알아야 한다.

 

확률분포

  • 데이터의 초상화라고 언급된다.
  • 데이터 공간 (x*y)에서 데이터를 추출하는 분포 (D)
  • 데이터는 확률변수로 (x,y) ~ D라고 표기한다.
  • (x,y) ∈ x*y : 관측 가능한 데이터
  • P(x,y)는 D를 모델링한다. D는 이론적으로 존재하는 확률변수이기에 사전에 알 수 없다.
  • P(X)는 입력 X에 대한 주변확률분포로 Y에 대한 정보를 주지 않는다.
  • 조건부확률분포 P(X|Y)는 데이터 공간에서 입력 X와 출력 Y의 관계를 모델링한다.
  • 조건부확률 P(X|Y)는 입력변수 X에 대해 정답이 Y일 확률을 의미한다. (밀도로 해석)

 

이산확률변수, 연속확률변수

  • 확률변수는 확률분포 D에 따라 이산형과 연속형으로 구분된다.
  • x*y에 의해 결정되는 것이 아님 주의
  • 이산형 확률변수는 확률변수가 가질 수 있는 경우의 수를 모두 고려하여 확률을 더해 모델링
  • 연속형 확률변수는 데이터 공간에 정의된 확률변수의 밀도 위에서의 적분을 통해 모델링
  • 여기서 밀도는 누적확률분포의 변화율을 모델링하며 확률로 해석이 불가능하다.

이산형확률변수
연속형 확률변수

조건부확률과 기계학습

  • 조건부확률분포 P(X|Y)는 데이터 공간에서 입력 X와 출력 Y의 관계를 모델링한다.
  • 조건부확률 P(X|Y)는 입력변수 X에 대해 정답이 Y일 확률을 의미한다. (밀도로 해석)
  • 로지스틱 회귀에서 사용했던 선형모델과 소프트맥스 함수의 결합은 데이터에서 추출된 패턴을 기반으로 확률을 해석한다.
  • 분류 문제에서 softmax(Wϕ + b)는 데이터 X로부터 추출된 특징패턴 ϕ(x)과 가중치행렬을 통해 조건부확률을 계산한다.
  • 회귀 문제의 경우 조건부 기대값 E[y|x]을 추정

 

기댓값

  • 확률분포가 주어지면 데이터를 분석하는 데 사용 가능한 여러 종류의 통계적 범함수 계산이 가능.
  • 기대값은 데이터를 대표하는 통계량이면서 동시에 확률분포를 통해 다른 통계적 범함수 계산에 사용됨.
  • 기대값을 이용해 분산, 첨도, 공분산 등 여러 통계량 계산이 가능.
  • 딥러닝은 다층신경망 (MLP)를 이용해 데이터로부터 특징패턴인 ϕ를 추출한다.
  • 특징패턴을 학습하기 위해 어떤 손실함수를 사용할지는 기계학습 문제와 모델에 의해 결정

기댓값 구하기

 

기대값을 이용한 분산, 첨도, 공분산 등 통계량 계산

 

몬테카를로 샘플링

  • 기계학습의 많은 문제들은 확률분포를 명시적으로 모를 때가 대부분이다.
  • 확률분포를 모를 때 데이터를 이용해 기댓값을 계산하려면 몬테카를로 샘플링 방법을 사용해야 한다.
  • 몬테카를로는 이산형이든 연속형이든 상관없이 성립한다.
  • 몬테카를로 샘플링은 기계학습에서 매우 다양하게 응용되는데, 독립추출만 보장된다면 대수의 법칙에 의해 수렴성을 보장한다.

 


  • 피어세션 회의 내용

어제 배운 내용을 복습했고, 어제 풀지 못한 의문을 푸는 시간을 가졌다.


  • 해야할 일

수학이 많이 부족함을 느꼈다. 시험문제를 다시 풀어보며 복습하는 시간을 가졌다. (비공개)


 

728x90
반응형