반응형

**지수이동 평균

=>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함수를 호출하면 누락된 값을 채워집니다.

매개변수가 없으면 선형으로 관계를 파악해서 채워주고 methodquadratic을 설정하면 비선형으로 채워줍니다.

 

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에서는 SeriesDataFrame의 개별 요소에 동일한 함수를 적용하고자 하는 경우에 apply메소드를 이용

1.Seriesapply메소드를 호출하면 각 요소에게 함수를 적용한 후 그 결과를 가지고 다시 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를 합치기 위한 함수

=>첫번째 와 두번째 매개변수는 합치기 위한 SeriesDataFrame을 설정해야 하는데 leftRIGHT 매개변수로 대입해도 됩니다.

=>하나 이상의 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

=>구성 형태와 속성이 균일한 경우 행 또는 열방향으로 이어 붙이는 함수

=>mergejoin은 행방향으로 결합

=>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. numpypolyfit 이라는 함수를 이용해서 다항식을 구해서 선 그래프 그리기

=> 다항식 -> 회귀식

 

#막대 그래프와 산포도 같이 그려진다.

#개와 소계의 데이터를 가지고 다항식 구하기

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.stackunstack

=>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인것 3d이고 a인것 0

b이고 c인것 1d이고 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만드는 것  공장 같은데 가면 자동화 하는 것

자동화 프로그램 사용하는 원인은 스마트 팩토리

 

 

보통은 메크로이다.

 

 

반응형

'Study > 데이터 분석' 카테고리의 다른 글

데이터분석-8  (0) 2020.11.14
데이터분석-7  (0) 2020.11.11
데이터분석-6  (0) 2020.11.10
데이터분석-5  (0) 2020.11.09
데이터분석-4  (0) 2020.11.08

+ Recent posts