**지수이동 평균
=>DatqaFream.ewm(span= 가중치를 부여할 데이터 개수).mean()
알파 = 1/span
최근의 데이터 + (1-알파)이전데이터 + (1-알파)제곱 * 그이전 데이터
=>최근의 데이터 반영 비율을 높이고 이전 데이터의 반영 비율을 줄여서 계산하는 방식
=>주가 데이터에 많이 사용
주가는 최근의 데이터의 추세를 반영하는 것이 예측의 정확성을 높여주기 떄문입니다.
import numpy as np
import pandas as pd
#2020년 1월 1일 부터 월 단위로 5개이 데이터를 생성
timeindex = pd.date_range('01/01/2020', periods = 5, freq ='M')
df = pd.DataFrame(index = timeindex)
df["price"] = [10,20,30,40,50]
print(df)
#span을 2로 설정해서 지수 이동 평균 구하기
print(df.ewm(span = 2).mean())
price
2020-01-31 10.000000
2020-02-29 17.500000
2021-03-31 26.153846
2020-04-30 35.500000
2020-05-31 45.206612
10 20 -> 15 20 => 17.5
10 20 30 -> 30
예를 들어 설명하겠습니다.
최근 5일간 종가가 1000, 1010, 1005, 1010, 1015 이렇게 형성되었다고 가정하겠습니다.
3일간 지수이동평균을 구해보겠습니다.
먼저 오늘 종가를 보면 1015원에 끝났습니다.
그러면 C=1015가 됩니다.
Xp는 전일의 3일 이동평균값이므로 (1010+1005+1010)/3 = 약 1008
K = 2/(n+1)이고 n = 3이므로
K = 1/2가 됩니다.
따라서 EMA는
1015*(1/2)+1008*(1-1/2)
= 1015*(1/2)+1008*(1/2)
= (1015+1008)/2 = 1011.5
즉, 오늘을 기준으로 계산한 3일 지수이동평균 값은 1011.5가 됩니다.
제가 제대로 이해한건지 모르겠네요...^^;
아무튼...
Xp는 전일의 n일 이동평균을 뜻하고
K는 오늘 종가를 이동평균을 계산하는데 얼마나 비중을 둘것인가를 결정하는 것 같습니다.
n값이 커지면 K값은 작아지죠
--------
기술적으로 해석해보자면
n값이 커질 때(20일 60일 120일 등..), 현재 주가와 n일 이동평균과의 차이가 얼마나지 않는 다는 건,
시장이 그 기간동안 급등락, 급반등 하지 않았다는 것을 의미하는 건가?
** 시계열 데이터에서의 누락된 값
=>시간의 간격이 일정한 간격에서 데이터가 누락된 경우라면 제거를 하는 것보다는 패턴을 확인해서 데이터를 대입하는 것이 좋습니다.
2019-01-01 : 100
2019-02-01 : 200
2019-03-01 : None
2019-04-01 : 400
=>DataFrame의 interpolate함수를 호출하면 누락된 값을 채워집니다.
매개변수가 없으면 선형으로 관계를 파악해서 채워주고 method에 quadratic을 설정하면 비선형으로 채워줍니다.
aX + b: 일차 방정식 0 선형 : 데이터의 분포가 직선에 가까워집니다.
aX ^ 2 + bX + c: 이차 방정식 이상 - 비선형 : 데잍의 분포가 곡선에 가까워집니다.
머신러닝을 할 때도 회구나 분류하기 전에 데이터의 분포를 확인해야 합니다.
데이터의 분포를 확인 할 때는 산포도(scatter) 를 열어 이용합니다.
10 20 30 40 -> 선형
1 4 8 ...-> 제곱의 관계 비선형
데이터의 분포를 보고 판단해야 한다.
비선형은 정확도가 떨어진다.
#2020년 1월 1일 부터 월 단위로 5개이 데이터를 생성
timeindex = pd.date_range('01/01/2020', periods = 12, freq ='M')
df = pd.DataFrame(index = timeindex)
#누락된 데이터(결측치 - None ,null, np.NaN) 만들기
df["price"] = [10,20,np.NaN,40,50,60,70,80,90,np.NaN,110,120]
print(df)
#선형으로 누락된 값 채우기
print(df.interpolate())
df["price"] = [100,400,np.NaN,1600,2500,3600,4900,6400,81000,np.NaN,12100,14400]
print(df)
#비선형으로 누락된 데이터 값 채우기
print(df.interpolate(method = 'quadratic'))
df["price"] = [100,400,np.NaN,1600,2500,3600,4900,6400,81000,np.NaN,12100,14400]
print(df)
#비선형으로 누락된 데이터 값 채우기
print(df.interpolate(method = 'linear'))
**pandas의 함수 매핑
=>pandas에서는 Series나 DataFrame의 개별 요소에 동일한 함수를 적용하고자 하는 경우에 apply메소드를 이용
1.Series가 apply메소드를 호출하면 각 요소에게 함수를 적용한 후 그 결과를 가지고 다시 Series를 만들어서 리턴
2.DataFrame에 적용을 하게 되면 적용방법에 따라 Series가 되기도 하고 DataFrame이 리턴되기도 합니다.
axis 옵션을 이용해서 열과 행 단위로 데이터를 대입할 수 있습니다.
axis = 0 이 기본값으로 열 단위로 대입하는 데 1을 설정하면 행단위로 함수에 대입
=>Series는 하나의 열의 개념이고 DataFrame은 행열(Matrix(numpy) - Trable(pandas))
=>머신러닝에서는 데이터의 단위가 대부분 Matrix입니다.
DataFrame['컬럼이름' ] :Series
DataFrame[['컬럼이름']] : DataFrame
pandas 자료구조에서 .values 하게되면 컬럼이름을 제거하고 데이터 만으로 구성된 numpy.ndarray를 리턴합니다.
=>머신러닝에서는 컬럼이름이 필요없습니다.
#seaborn 패키지에 존재하는 titanic데이터 가져오기
#인터넷에서 가져오기 때문에 인터넷이 안되면 안됨
#seaborn 패키지 : 샘플 데이터 셋과 matplotlib보다 시각적인 효과가 뛰어난 그래프를 만들어주는 패키지
#numpy, pandas, matplotlib, seaborn ,sklearn (전처리(preprocessing) , 머신러닝 )
import seaborn as sns
titanic = sns.load_dataset('titanic') #인터넷이 있어야 가능하다.
titanic.info()
#titanic 분류 누가 살았나 ? 누가 죽었고 ?
#2개의 컬럼을 추출해서 새로운 DataFrame만들기
#age, fare
df = titanic[['age','fare']] #열만
df.info()
#행 전체의 age와 fare,을 가져오기
df = titanic.log[:, ['age','fare']] #행 까지 뽑아 낼때
#df = titanic.log[1:10, ['age','fare']] #행 까지 뽑아 낼때
df.info()
def add_10(x):
return x + 10
# 데이터프레임에 함수 적용 - 열단위로 적용
result = df.apply(add_10)
print(result.head())
print(result.info())
# 데이터프레임에 함수 적용 - 행단위로 적용
result = df.apply(add_10, axis =1)
print(result.head())
print(result.info())
**DataFrame 결합
1.merge()
=>2개의 DataFrame이나 Series를 합치기 위한 함수
=>첫번째 와 두번째 매개변수는 합치기 위한 Series나 DataFrame을 설정해야 하는데 left와 RIGHT 매개변수로 대입해도 됩니다.
=>하나 이상의 KEY를 가지고 결합
=>관계형 데이터베이스의 JOIN과 유사
=>별다를 설정이 없으면 동일한 컬럼이름을 찾아서 JOIN
=>직접 JOIN KEY를 지정하고자 하면 ON 매개변수에 컬럼이름을 설정
=>양쪽의 KEY이름이 다른 경우에는 LEFT_ON그리고 RIGHT_ON 매개변수를 이용해서 직접 KEY를 설정
=>기본 merge는 inner join의 개념
=>어느 한쪽에만 존재하는 데이터를 merge에 참여시키고자 할 때는 how라는 매개변수에 left, right, outer 중에 하나를 설정하빈다.
이러한 join방식을 Outer join이라고 합니다.
=>key가 아닌 컬럼 중에 양쪽에 동일한 이름으로 존재하는 컬럼이 있으면 이 때는 _x와 _y라는 이름이 자동 삽입되는데 이것을 변경하고자 하면 suffixes 옵션에 튜플로 추가될 이름 2개를 설정하면 됩니다.
=>양쪽에 동일한 의미를 갖는 컬럼이 없는 경우 index를 이용해서 join을 할 수 있는데 이 경우에는 left_index = True 그리고 right_index = True를 추가해주면 됩니다.
=>merge를 수행하면 key 의 값으로 정렬을 수행하는데 sort옵션에 false를 설정하면 정렬하지 않습니다.
#stack price.xlsx파일과 stock valueation.xlsx파일 읽기
price = pd.read_excel('./Desktop/data/stock price.xlsx')
valuation = pd.read_excel('./Desktop/data/stock valuation.xlsx')
price.info()
valuation.info()
#2개의 dataframe을 id를 기준으로 합치기
#양쪽 모두에 존재하는 데이터만 조인에 참여 -inner jon
merge_inner = pd.merge(price, valuation)
print(merge_inner)
print(merge_inner.info())
#5개만 남는다. inner join이다.
#어느 한쪽 에만 존재하는 데이터도 join 에 참여 -outer join
merge_outer = pd.merge(price,valuation, how = 'outer',on = 'id')
print(merge_outer)
merge_outer = pd.merge(valuation ,price, how = 'outer',on = 'id')
print(merge_outer)
2.join
=>인덱스를 기준으로 합쳐주는 함수
DataFrame.join(다른 데이터 프레임)
#파일의 내용을 읽을 때 하나의 커럶을 인덱스로 설정
#id가 없어진다.
price = pd.read_excel('./Desktop/data/stock price.xlsx',index_col = 'id')
valuation = pd.read_excel('./Desktop/data/stock valuation.xlsx',index_col = 'id')
price.info()
valuation.info()
#index를 이용해서 join
#price 의 모든 데이터는 join 에 참여한다.
#valuation에서는 참여하지 않는 데이터도 있을 수 있음
#left outer join
stock_join = price.join(valuation)
print(stock_join)
3.concat
=>구성 형태와 속성이 균일한 경우 행 또는 열방향으로 이어 붙이는 함수
=>merge나 join은 행방향으로 결합
=>join옵션에 inner를 적용하면 양쪽에 모두 존재하는 데이터끼리 결합하고 outer를 설정하면 한쪽에만 존재하는 데이터도 결합을 하는데 기본값이 outer
=>axis옵션에 0을 설정하면 열방향으로 합치고 1을 설정하면 행 방향으로 합침
#concat 1- 열 행 방향으로 DataFrame을 합쳐주는 함수
df1 = pd.DataFrame({'a' : ['a0','a1','a2']},index = [1,2,3])
df2 = pd.DataFrame({'a' : ['a2','a3','a4'], 'b':['b2','b3','b4']},index = [2,3,4])
print(df1)
print(df2)
print(pd.concat([df1, df2])) #위 아래로 합쳐져 버린다.
print(pd.concat([df1, df2], axis = 0)) # 행으로 합친다. 기본이 axis = 0 이다.
#좌우로 합치기 - 기본이 outer라서 한쪽에만 존재하는 것도 나옴
print(pd.concat([df1, df2], axis = 1)) # 행으로 합친다.
#한 똑에만 존재하는 데이터 제거
print(pd.concat([df1, df2], axis = 1, join = 'inner'))
4.append
=>인덱스가 별의미가 없는 경우 무조건 행방으로 합치는 함수
5.combine_first
=>양쪽에 겹쳐지는 인덱스가 존재하는 경우에 무조건 호출하는 쪽의 값으로 설정
#행방향으로 무조건 합치기
print(df1.append(df2)) #행방향으로 무조건 합친다.
#인덱스를 가지고 합치는데 호출하는 쪽의 데이터를 우선 적용
print(df1.combine_first(df2))
print(df2.combine_first(df1))
**그룹화
=>DataFrame의 내용을 그룹 단위로 분할해서 탐색하는 것
=>그룹화를 한 후 집계 , 변환 ,필터링을 적용
=>분할을 이해서는 groupby 함수를 이용하고 변환에는 apply함수를 적용
1.groupby 함수
=>그룹화할 컬럼이름을 대입하면 그룹화를 수행 ,컬럼이름은 1개도 되고 컬럼이름의 list도 가능
=>그룹별 데이터를 별도가 가져오고자 하는 경우에는 get_group(그룹이름)
=>빠른 열거를 이용하면 그룹화할 때 사용한 키와 데이터를 튜플로 접근을 할 수 있습니다.
파이썬은 튜플을 나누어서 저장 가능
=>집계함수(개수 , 합계, 평균, 최대값 , 최소값, 표준편차 , 분산, 중간값, 사분위수 ) 사용 가능
=>mean(), max(), min(), sum(),count(), size(), var(), std(), first(), last(), describe(), info()등
describe()기술 통계에 대한 요약 정보
info() 자료형에 대한 요약 정보
=>apply()를 호출해서 변환 가능 - 매개변수 1개를 받아서 return하는 함수를 대입
=>filter()를 호출해서 원하는 데이터만 추출 가능 - 매개변수 1개를 받아서 bool을 리턴하는 함수를 대입
=>직접 만든 함수를 대입해서 결과를 얻고자 하는 경우에는 agg함수를 이용
agg함수에는 함수의 list를 대입해도 됩니다.
import seaborn as sns
#titanic 데이터 가져오기
titanic = sns.load_dataset('titanic')
print(titanic.info())
#class 별로 그룹화
grouped = titanic.groupby('class')
print(grouped)
# <pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000020F8F61A548> 클라스 이름의 객체로 나온다.
#그룹화된 데이터에 접근
#first,second, third 별로 보여준다.
for key ,data in grouped :
print(key)
print(data.head())
#Third 에 해당하는 그룹의 데이터만 가져오기
third = grouped.get_group('Third')
print(third['class']) # 다 third이다. 491 개가 있다.
#집계함수 적용 - 그룹별 평균 구하기
print(grouped.mean())
#2개의 특성으로 그룹화해서 집계
grouped = titanic.groupby(['class','sex'])
print(grouped.mean())
#그룹화 해서 원하는 함수를 적용
def func(x):
return x.max() - x.min()
grouped = titanic.groupby(['class'])
print(grouped.agg(func))
#여러 개의 함수를 적용
print(grouped.agg(['max', 'min']))
#보고서 만들 때 유용하다. 그룹별로 결과를 만들어서 보여주면 훨씬 좋다.
#각 그룹별 데이터 개수 확인
for key,data in grouped: #공백 있으면 오류
print(key, len(data))
#데이터가 200개 안되는 그룹은 제거
#데이터의 개수가 200이상인 여부를 알려주느 함수
def over200(x):
return len(x) >= 200
grouped_filter = grouped.filter(over200)
print(grouped_filter['class'])
#second가 제거 됬다.
#위의 내뇽을 람다함후소 변환
#python에서의 람다는 이름없는 한줄 짜리 함수
#필터링이나 mapping(apply) 메소드에서 람다를 많이 사용
grouped_filter = grouped.filter(lambda x : len(x) >= 200)
print(grouped_filter['class'])
#age열의 평균이 30이 안되는 부분을 출력
for key,data in grouped: #공백 있으면 오류
print(key, data['age'].mean())
grouped_filter = grouped.filter(lambda x : x['age'].mean() < 30)
print(grouped_filter['class'])
2.멀티 인덱스
=>인덱스를 여러 그룹으로 설정한 것
=>멀티 인덱스로 설정된 데이터 모임에서 특정한 인덱스의 데이터를 가져오고자 하면 loc[(첫번째 인덱스 값, 두번째 인덱스 값...)]
=>xs라는 함수를 이용할 수 있는데 이 경우에는 첫버째 매개변수로 인덱스 이름을 대입하고 level에 인덱스의 값을 대입합니다.
#멀티 인덱스
#그룹화를 할 때 2개 이상의 컬럼 이름을 대입하면 멀티 인덱스
grouped = titanic.groupby(['class','sex'])
gdf = grouped.mean()
print(gdf)
#내가 원하는 하나만 찾고 싶을 때
# 행단위로 데이터 접근
print(gdf.loc['Third']) #남자 여자 따로 따로 나온다.
#Third 의 male 만 가져오기
print(gdf.loc[('Third' , 'male')]) #third에 남자만 알고 싶다.
#index를 안쓰니깐 전체 male가져올 수 없다.
#xs인덱스 사용
print(gdf.xs('male',level = 'sex')) # 전체 male만 가져온다.
3.pivot_table()
=>데이터를 그룹화하기 위한 함수
=>데이터를 행과 열 단위로 그룹화해서 기술 통계 값을 출력해주는 함수
pandas.pivot_table(데이터프레임, values = [연산을 수행할 컬럼이름 나열],index = [index로 사용할 컬럼이름 나열] , colunmns =[컬럼으로 사용할 이름 나열] ,margins = 전체 데이터 출력여부 (bool로 설정), argfunc =수행할 함수 , fill_vale = NA인 경우의 대체값 )
=>pivot_table 함수를 호출하면 인덱스는 대부분의 경우 멀티 인덱스로 생성되는데 해제하고자 하는 경우에는 reset_index를 호출하면 됩니다.
#####pivot_table()
import numpy as np
import pandas as pd
import seaborn as sns
#seaborn에 존재하는 titanic데이터 가져오기
titanic = sns.load_dataset('titanic')
titanic.info()
#age , sex, class, fare, survice
#새로운 데이터 프레임 만들기
df = titanic[['age','sex','class','fare','survived']]
print(df)
df = titanic.loc[:,['age','sex','class','fare','survived']]
print(df)
#class별로 성별로 구분해서 age의 평균 구하기
pivot1 = pd.pivot_table(df,index= ['class'], columns =['sex'], values =['age'],aggfunc='mean')
#일반함수는 그냥 사용해야 하는데 제공한 것은 ''을 사용해야 한다.
print(pivot1)
pivot1 = pd.pivot_table(df,index= ['class','sex'], columns =['sex'], values =['age','fare'],aggfunc=['mean','sum','count'])
print(pivot1)
#첫번째 인덱스(class)가 First인 데이터 가져오기
print(pivot1.xs('First'))
#level을 안되서 index를 설정했다. pivot_table 에서
#First, 이고 male인 데이터 가져오기
print(pivot1.xs(('First','male'), level =['class','sex']))
#mean 열의 데이터만 가져오기
print(pivot1.xs('mean',axis = 1))
** 서울시 구별 CCTV(자치구별 cctv)개수 와 인구수를 시각화
1.데이터 가져오기
1) data.seoul.go.kr 사이트에서 서울시와 관련된 데이터를 가져오기
=>cctv개수 ->cctv.xlsx ->pop_cctv.xlsx
http://data.seoul.go.kr/dataList/OA-2734/C/1/datasetView.do
=>인구 데이터 ->pop.txt
http://data.seoul.go.kr/dataList/419/S/2/datasetView.do
hwp는 읽기 불편하다. python 도큐먼트는 영어로 쓰야 한다.
2. python에서 2개의 파일을 내용을 읽어서 DataFrame으로 만들기
'''
서울시 구별 cctv와 인구수 시각화
'''
import pandas as pd
#1.pop_cctv.xlsx파일과 pop.txt파일의 내용 읽기
cctv = pd.read_excel('./Desktop/data/pop_cctv.xlsx')
print(cctv.head())
cctv.info()
#skiprows= 2 2줄 뛰기
#,sep=' '
#delimiter ='\t') 구분자는 탭
#thousands =','천단위 구분기호는
pop = pd.read_csv('Desktop/data/pop.txt',skiprows= 2,delimiter ='\t',thousands =',')
print(pop.head())
pop.info()
3. 컬럼이름을 수정 구 이름을 동일한 형태로 만들기
#3.컬럼이름을 수정 구 이름을 동일한 형태로 만들기
#inplace = True 가 설정되면 현재 데이터프레임에 적용하고
# 이 옵션이 없으멶 현재 데이터프레임을 복사해서 작업하고 return을 해줍니다.
cctv.rename(columns = {cctv.columns[0]:'구별'},inplace = True)
pop.rename(columns = {cctv.columns[1]:'구별'},inplace = True)
#cctv의 구별 데이터에서 공백을 전부 제거하기
gu = []
for x in cctv['구별']:
gu.append(x.replace(' ',''))
cctv['구별'] = gu
4.불필요한 컬럼이나 열을 제거
=>컬럼이나 열을 제거하는 방법은 현재 데이터프레임에서 직접 제거(drop함수 이용)
=>필요한 컬럼이나 열만 추출
#4.불필요한 컬럼이나 열을 제거
#pop에서 필요한 행과 열만 가져오기
#pop에서 기간 ,구불 계, 남자 ,여자 열만 추출
pop = pop[['기간','구별','계','남자','여자']]
#0번 행을 제거
pop.drop([0],inplace = True)
#여성비율이라는 새로운 컬럼을 추가 - 여자 /계 * 100
pop["여성비율"] = pop['여자'] / pop['계'] * 100
print(pop)
5.2개의 데이터프레임을 합치기
#cctv와 pop를 합치기 -기준은 구별
df = pd.merge(cctv,pop, on ='구별')
print(df)
6.합치면 데이터프레임에서 불필요한 컬럼 제거
2011년 이전 ,2012년 , 2013년 , 2014년 , 2015년, 20166년 , 2017년 , 기간
df.drop(['2011년 이전','2012년','2013년','2014년','2015년','2016년','2017년','기간'],axis = 1, inplace = True)
print(df)
7.구별 컬럼을 인덱스로 설정
#구별 컬럼을 인덱스로 설정
df.set_index('구별',inplace = True)
print(df)
8. 그래프 그리기
#그래프 그리기 위한 패키지
import matplotlib.pyplot as plt
#그래프에서 한글 처리를 위한 패키지
from matplotlib import font_manager, rc
import platform
#운영체제를 확인해서 글ㄸ꼴 설정
if platform.system() == 'Windows':
font_name= font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
elif platform.system() =='Darwin':
rc('font',family = 'AppleGothic')
#cctv 개수를 가지고 막대 그래프 그리기
df['소계'].plot(kind='barh', figsize=(10,10))
plt.show()
산포도 그리기
#인구수 (계) 와 cctv 개수(소계)를 가지고 산포도 그리기
plt.figure(figsize = (8,8))
plt.scatter(df['계'],df['소계'],s = 50)
plt.xlabel('인구수')
plt.ylabel('cctv 개수')
plt.grid()
plt.show()
10. numpy의 polyfit 이라는 함수를 이용해서 다항식을 구해서 선 그래프 그리기
=> 다항식 -> 회귀식
#막대 그래프와 산포도 같이 그려진다.
#개와 소계의 데이터를 가지고 다항식 구하기
import numpy as np
#1이면 1차 다항식 2이면 2차 다항식 3이면 3차 다항식 점점 더 정확해진다.
fp1 = np.polyfit(df['계'],df['소계'],1)
f1 = np.poly1d(fp1)
print(f1)
#선 그래프 그리기
# 10000 부터 700000 까지를 100개로 분할 배열 생성
fx = np.linspace(100000,700000,100)
plt.figure(figsize = (8,8))
plt.scatter(df['계'], df['소계'] , s = 50)
#lw 두께이다.
plt.plot(fx, f1(fx), ls = 'dashed', lw = 3, color ='g')
plt.xlabel('인구수')
plt.xlabel('cctv 개수')
plt.grid()
plt.show()
11. 산포도의 각 점에 자신의 이름을 표시하고 잔차 (실제 데이터와 예측된 데이터와의 차이)를 점의 색상으로 설정
#막대 그래프와 산포도 같이 그려진다.
#개와 소계의 데이터를 가지고 다항식 구하기
import numpy as np
#1이면 1차 다항식 2이면 2차 다항식 3이면 3차 다항식 점점 더 정확해진다.
fp1 = np.polyfit(df['계'],df['소계'],1)
f1 = np.poly1d(fp1)
print(f1)
#선 그래프 그리기
# 10000 부터 700000 까지를 100개로 분할 배열 생성
fx = np.linspace(100000,700000,100)
plt.figure(figsize = (8,8))
plt.scatter(df['계'], df['소계'] , s = 50)
#lw 두께이다.
plt.plot(fx, f1(fx), ls = 'dashed', lw = 3, color ='g')
plt.xlabel('인구수')
plt.xlabel('cctv 개수')
plt.grid()
plt.show()
잔차 - 실제 데이터와 예측된 데이터와의 차이
#잔차를 색상으로 표시하고 지역 이름을 점위에 출력
#잔차 계산
df['잔차'] = np.abs(df['소계'] - f1(df['계']))
plt.figure(figsize = (14,12))
#c = df['잔차'] 색갈로 구분한다.
plt.scatter(df['계'], df['소계'] , c = df['잔차'],s = 50)
#lw 두께이다.
plt.plot(fx, f1(fx), ls = 'dashed', lw = 3, color ='g')
#그래프에 텍스트 출력하기
# 1.02 오른쪽으로
# 0.98 주위
# 1 이상이면 위에
for n in range(25):
plt.text(df['계'][n]*1.02 , df['소계'][n]*0.98, df.index[n],fontsize= 12)
plt.xlabel('인구수')
plt.xlabel('cctv 개수')
plt.colorbar()
plt.grid()
plt.show()
**데이터 구조화
stack & unstacke
1.stack과 unstack
=>stack은 컬럼을 인덱스로 이동시켜 데이터를 길게 쌓는 것이고 unstack은 쌓은 것을 옆으로 늘어뜨리는 것=>읽어온 데이터의 구조가 원하는 구조가 아닐때 이러한 구조화 메소드를 이용해서 원하는 구조로 만들어서 데이터 분석을 수행합니다.
multi index 연습할때 데이터 만들기 쉽지 않다.
#데이터 구조화
#stack과 unstack
#튜플의 list를 이용해서 멀티 인덱스 만들기
mul_index = pd.MultiIndex.from_tuples([('cust_1','2015'),('cust_1','2016'),('cust_2','2015'),('cust_2','2016')])
#데이터 프레임 만들기
data = pd.DataFrame(data = np.arange(16).reshape(4,4),index = mul_index,columns=['prd_1','prd_2','prd_3','prd_4'])
print(data) #4줄로
#stack하면 밑으로
#z컬럼들을 인덱스로 설정 -stack
#모든 열을 세로 방향으로 세워서 하나의 열로 만듭니다.
#index는 1개의 level.이 더 많아 집니다.
data_stacked = data.stack()
print(data_stacked) #세로 방향으로 생긴다. 3* 4
#unstack은 데이터를 가로 방향으로 늘어 뜨리는 것
#level옵션을 이용해서 원하는 만큼만 열로 만들 수 있습니다.
#지금 같은 경우는 index가 3가지 이므로 0,1,2 가능
print(data_stacked.unstack(level = 0)) #8개로 변경 잴 앞에 있는것 빠져나간다. cust_1 cust_2
print(data_stacked.unstack(level = 1)) #8개로 변경 2015으로 나누는 거
print(data_stacked.unstack(level = 2)) #4개로 변경 prd_1 prd_2 prd_3 prd_4
print(data_stacked.unstack(level = 2).unstack(level= 1)) #2개로 변경 prd_1 prd_2 prd_3 prd_4 ,2015 2016
2. melt
=>여러 개의 컬럼의 데이터를 합쳐서 하나의 컬럼으로 만드는 것
=>데이터프레임과 id_vars매개변수에 합치고자 하는 컬럼 이름의 list를 대입하면 됩니다.
melt
#2개의 컬럼을 합쳐서 1개로 만들기
#남겨두고자 하는 컬럼의 list를 id_vars에 대입하면
#나머지 컬럼을 합쳐서 컬럼의 이름은 variable
#값은 value에 설정합니다.
print(data)
print(pd.melt(data, id_vars=['prd_3','prd_4']))
print(pd.melt(data, id_vars=['prd_3']))
3.crosstab
=>행과 열을 기준으로 빈도를 세어서 테이블을 만들어주는 함수
=>교차분석 할 때 이용 ~ 도수분포표(frequency table)를 만들어준느 기능
=>함수에 행 이름과 열 이름을 설정
=>머신러닝 결과 등을 타날 때 자주 이용
오른 것을 오른것 얼마나 했느냐? 정확도 출력해주느
#도수분포표 -CRASSTAB
data = pd.DataFrame({'id':['id1','id1','id1','id2','id2','id2'],
'fac_1':['a','a','a','b','b','b'],
'fac_2':['c','c','c','c','d','d']})
print(pd.crosstab(data['fac_1'],data['fac_2']))
a이고 c인것 3개 d이고 a인것 0개
b이고 c인것 1하 d이고 b인것 2개
그룹별로 계산 하면 된다.
#도수분포표 -CRASSTAB
data = pd.DataFrame({'id':['id1','id1','id1','id2','id2','id2'],
'fac_1':['a','a','a','b','b','b'],
'fac_2':['c','c','c','c','d','d']})
print(pd.crosstab(data['fac_1'],data['fac_2']))
#비율로 출력하기
print(pd.crosstab(data['fac_1'],data['fac_2'],normalize = True))
# 3/6 1/6 0/6 2/6
#잔차의 합으로 평가하는 것도 있고 그룹별로 하는 것도 있다.
#머신러닝에서는 잔차로 한다. 회귀분석에서 한다.
정확도
잔차(error) -> 회귀에서 사용 예측값에서 실제 값을 뺀것
분류에서는 아래 같은 식으로 계산한다.
분류는 표보고 판단하는 것이 중요하다.
비가 오는 날 얼마 안되고 비가 오지 않는 날이 많다. 그래서 비율이 달라서 assembling등 해야 한다.
인구는 적지만 젊은 분이 많으면 소멸이 안될 수 있다.
rpa ->자동화 software만드는 것 공장 같은데 가면 자동화 하는 것
자동화 프로그램 사용하는 원인은 스마트 팩토리
보통은 메크로이다.