반응형

**cartogram

=>데이터의 크기 등을 나타내기 위해서 지도의 면적을 왜곡해서 표현하는 그림

=>만드는 방식은 엑셀 등을 이용해서 지도를 그려내는 방식이 있고 일러스트레이터나 websvg(xml)를 이용해서 그린 후 svg를 추출하는 방법

 

**인구 소멸 지역을 나타내는 cartogramcolorpleth( 단계구분도)

1.국가 통계 포털에서 인구정보를 다운로드

population_raw_data.xlsx

 

2.필요한 라이브러리를 import하고 그래프에서 한글을 사용하기 위한 설정을 하고 음수 표현을 위한 설정

 

#배열 자료구조(행렬 포함), 선형대구 ,과학 기술 계산을 위한 패키지

import numpy as np

#Series, DataFrame(자교구조), 기술 통계, 간단한 시각화를 위한 패키지

import pandas as pd

 

 

#시각화 기본 패키지

import matplotlib.pyplot as plt

 

#그래프에서 한글 처리를 위한 패키지

import platform

from matplotlib import font_manager, rc

 

#데이터 셋과 화려한 시각화를 위한 패키지

import seaborn as sns

#데이터 전처리를 위한 패키지

#sklearn 은 데이터셋과 전처리 그리고 머신러닝을 위한 패키지

from sklearn import preprocessing

 

#지도 시각화(단계 구분도 )를 위한 패키지

import folium

 

#그래프에서 한글 처리를 위한 설정

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')

   

 

#음수 하용을 위한 설정

#마이나스를 unicode로 하지 말라는 것이다.

plt.rcParams['axes.unicode_minus'] = False

 

3. 엑셀 파일의 내용을 읽기

엑셀 파일 읽을 경우 셀 병합이 있는지

 

#3. 엑셀 파일의 내용을 읽기

population = pd.read_excel('./Desktop/data/population_raw_data.xlsx', header = 1)

print(population.head())

population.info()

 

 

 

4.결측치(NA, None, NULL, np.NaN)처리

=>컬럼 자체를 제거 , NA인 행만 제거 ,다른 값으로 치환(이전값, 이후값, 중간값, 평균 ,최빈값, 머신러닝의 결과 ~ 가장 정확할 가능성이 높지만 시간이 오래 걸림)

#이 엑셀 파일에서는 위와 항목이름이 같은 경우가 Na

#d이전 값으로 NA를 채우기

population.fillna(method='ffill',inplace = True)

print(population.head())

population.info()

 

 

 

5.컬럼이름 변경

=>데이터를 직접 다운로드를 받으면 컬럼이름이 사용하기 어려운 경우가 많습니다.

성별은 보통 -> sex, gender

통계청에는 rc-1 , rc-2(직업) 

자료랑 같이 보면서 해야 한다.컬럼이름을 확인해서 바꾸는 작업을 해야 한다.

통계 spss 등을 많이 사용한다. 한글 인식 잘 안되고 컬럼이름을 잘 확인하고 알기 쉬운 것으로 바꾸기

 

 

6.시도가 소계인 데이터를 제외하고 가져오기

#시도가 소계인 데이터를 제외

#제외를 할 때는 drop을 이용해서 삭제를 할 수 도 있고

#필터링을 할 수 도 있습니다.

# population['시도'] == '소계' 소계인것  찾아보기

# population['시도'] != '소계' 소계가 아닌 것 행을 삭제

population = population[(population['시도'] != '소계')]

print(population.head()) #소계가 없어진다.

 

 

7.항목컬럼을 구분으로 변경

#항목 컬럼을 구분으로 변경

population.rename(columns = {'항목':'구분'},inplace = True)

 

#셀의 값 변경

#구분이 총인구수() -> 합계

#구분이 남자인구수() -> 남자

#구분이 여자인구수() ->여자

population.loc[population['구분'] == '총인구수 ()','구분' ] ='합계'

population.loc[population['구분'] =='남자인구수 ()','구분'] ='남자'

population.loc[population['구분'] =='여자인구수 ()','구분'] ='여자'

print(population['구분'].head())

 

7.청년과 노년을 분리하기 위해서 20- 39 까지의 합계와 65-100+까지의 합계를 새로운 컬럼으로 추가

#청년과 노년 층으로 새로운 컬럼을 추가

population['청년'] = population['20 - 24'] +population['25 - 29']+population['30 - 34'] +population['35 - 39']

 

population['노년'] = population['65 - 69']+population['70 - 74']+population['75 - 79'] + population['80 - 84'] +population['80 - 84'] +population['80 - 84'] +population['85 - 89']+population['90 - 94'] +population['95 - 99']

 

print(population['청년'].head())

print(population['노년'].head())

 

 

8.피봇 테이블(행과 열을 설정해서 데이터의 기술 통계값을 확인) 생성

#8.피봇 테이블(행과 열을 설정해서 데이터의 기술 통계값을 확인) 생성

#광역시도와 시도별 그리고 구분 별로 청년과 노년의 값 확인

pop = pd.pivot_table(population, index = ['광역시도','시도'], columns ='구분', values=['인구수','청년','노년'])

print(pop.head())

 

9. 소별비율 컬럼을 생성해서 추가 - 청년층 여자 / 노년층 합계/ 2

#9. 소별비율 컬럼을 생성해서 추가 - 청년층 여자 / 노년층 합계/ 2

pop['소멸비율'] = pop['청년','여자'] /pop['노년','합계'] / 2

print(pop['소멸비율'].head())

 

10.소멸위기지역이라는 컬럼을 추가 - 소멸비율이 1.0 미만이면 True아니면 False

 

#소멸위기 지역이라는 컬럼을 추가 - 소멸비율 < 1.0 여부

pop['소멸위기지역'] = pop['소멸비율'] < 1.0

print(pop['소멸위기지역'])

print(pop[pop['소멸위기지역']==False].index.get_level_values(1))

 

 

계산식을 바뀌서 할 수 도 있다.  ==============>

pop['소멸비율'] = pop['청년','여자'] / (pop['노년','합계'] / 2)

print(pop['소멸비율'].head())

 

#소멸위기 지역이라는 컬럼을 추가 - 소멸비율 < 1.0 여부

pop['소멸위기지역'] = pop['소멸비율'] < 1.0

print(pop['소멸위기지역'])

print(pop[pop['소멸위기지역']==False].index.get_level_values(1))
==================================

 

10 . 인덱스로 설정되어 있는 광역시도와 시도를 일반 컬럼으로 전환

=>인덱스를 컬럼으로 만들고자 할 때는 인덱스를 제거하면 됩니다.

#인덱스 제거

pop.reset_index(inplace = True)

print(pop.head())

 

 

11.2단으로 구성된 컬럼이름을 하나의 컬럼이름 만들기

광역시도와 시도를 합쳐서 하나의 컬럼 만들기

#컬럼이름 만들기 - 컬럼이름이 2래벨로 되여 있어서 위 아래 레벨을 합치느느 작업

#0번 레벨하고 1번 레벨의 데이터를 합치기

tmp_columns = [pop.columns.get_level_values(0)[n] +

               pop.columns.get_level_values(1)[n]

               for n in range(0, len(pop.columns.get_level_values(0)))]

print(tmp_columns)

pop.columns = tmp_columns

print(pop.head())

12. 시도이름 만들기

=>광역시는 구별로 분류가 도어 있는데 광역시가 아닌데 구를 가진 곳은 분류가 안되어 있음

=> 이 작업은 행정구역을 알아야 함

#광역시가 아닌 중에서 구를 가지고 있는 곳의 딕셔너리 만들기

si_name = [None] * len(pop)

 

tmp_gu_dict = {'수원':['장안구', '권선구', '팔달구', '영통구'],

'성남':['수정구', '중원구', '분당구'],

'안양':['만안구', '동안구'],

'안산':['상록구', '단원구'],

'고양':['덕양구', '일산동구', '일산서구'],

'용인':['처인구', '기흥구', '수지구'],

'청주':['상당구', '서원구', '흥덕구', '청원구'],

'천안':['동남구', '서북구'],

'전주':['완산구', '덕진구'],

'포항':['남구', '북구'],

'창원':['의창구', '성산구', '진해구', '마산합포구', '마산회원구'],

'부천':['오정구', '원미구', '소사구']}

 

#고성에 대한 처리

for n in pop.index:

    #광역시나 특별시 또는 자치시로 끝나지 않는

    if pop['광역시도'][n][-3:] not in ['광역시','특별시','자치시']:

        if pop['시도'][n][:-1] == '고성' and pop['광역시도'][n] =='강원도':

            si_name[n] ='고성(강원)'

        elif pop['시도'][n][:-1] == '고성' and pop['광역시도'][n] =='강원도':

            si_name[n] ='고성(경남)'

        else:

            si_name[n] = pop['시도'][n][:-1]

            #왕역시나 특셜시 차지시가 아닌데 구를 가지고 있는 처리

            for keys, values in tmp_gu_dict.items():

                if pop['시도'][n] in values:

                    if len(pop['시도'][n]) == 2:

                        si_name[n] = keys + ' '+ pop['시도'][n]

                    elif pop['시도'][n] in ['마산함포구','마산회원구'] :

                        si_name[n] = keys + ' ' + pop['시도'][n][2:-1] #앞에 두글자 빼기

                    else:

                        si_name[n] = keys + ' ' + pop['시도'][n][:-1]

    elif pop['광역시도'][n] == '세종특별자치시':

        si_name[n] = '세종'

    else:

        if len(pop['시도'][n]) == 2 :

            si_name[n] = pop['광역시도'][n][:2] + '' + pop['시도'][n]

        else:

            si_name[n] = pop['광역시도'][n][:2] + '' +pop['시도'][n][:-1]

print(si_name)

 

 

13.도시 이름을 pop에 새로운 컬럼으로 추가

pop['ID'] = si_name

 

#시도 이름을 pop에 새로운 컬럼으로 추가

pop['ID'] = si_name

print(pop['ID'])

 

 

#현재 상태 확인

print(pop.head())

print(pop.info())

 

 

14. 지도 정보를 저장한 엑셀 파일 읽기

#지도 정보를 가진 Excel 파일 읽기

draw_korea_draw = pd.read_excel('./Desktop/data/draw_korea_raw.xlsx')

print(draw_korea_draw)

 

 

15. 각 셀의 위치를 좌표로 만들기

#컬럼이름이 일련번호로 되어 있습니다.

#STACK함수를 일용해서 컬럼이름을 인덱스로 만들기

draw_korea_raw_stacked = pd.DataFrame(draw_korea_draw.stack())       

print(draw_korea_raw_stacked)

 

 

#좌표로 사용하기 위해서 커럶 이름 변경

draw_korea_raw_stacked.rename(columns = {'level_0' :'y','level_1':'x',0:'ID'},inplace = True)

print(draw_korea_raw_stacked)

 

16.  지도 그리기

1)경계선 만들기 위한 좌표 생성

#경계선 생성을 위한 조료 그리기

BORDER_LINES = [

[(5, 1), (5,2), (7,2), (7,3), (11,3), (11,0)], # 인천

[(5,4), (5,5), (2,5), (2,7), (4,7), (4,9), (7,9),

(7,7), (9,7), (9,5), (10,5), (10,4), (5,4)], # 서울

[(1,7), (1,8), (3,8), (3,10), (10,10), (10,7),

(12,7), (12,6), (11,6), (11,5), (12, 5), (12,4),

(11,4), (11,3)], # 경기도

[(8,10), (8,11), (6,11), (6,12)], # 강원도

[(12,5), (13,5), (13,4), (14,4), (14,5), (15,5),

(15,4), (16,4), (16,2)], # 충청북도

[(16,4), (17,4), (17,5), (16,5), (16,6), (19,6),

(19,5), (20,5), (20,4), (21,4), (21,3), (19,3), (19,1)], # 전라북도

[(13,5), (13,6), (16,6)], # 대전시

[(13,5), (14,5)], #세종시

[(21,2), (21,3), (22,3), (22,4), (24,4), (24,2), (21,2)], #광주

[(20,5), (21,5), (21,6), (23,6)], #전라남도

[(10,8), (12,8), (12,9), (14,9), (14,8), (16,8), (16,6)], #충청북도

[(14,9), (14,11), (14,12), (13,12), (13,13)], #경상북도

[(15,8), (17,8), (17,10), (16,10), (16,11), (14,11)], #대구

[(17,9), (18,9), (18,8), (19,8), (19,9), (20,9), (20,10), (21,10)], #부산

[(16,11), (16,13)], #울산

# [(9,14), (9,15)],

[(27,5), (27,6), (25,6)],

]

 

2)지도 그리기

plt.figure(figsize = (8,12))

#지역이름 표시

#행단위로 읽어오기

for idx, row in draw_korea_raw_stacked.iterrows():

    #공백을 기준으로 2개로 나누어 진다면 줄바꿈을 해서 출력

    if len(row['ID'].split()) == 2:

        dispname = '{}\n{}'.format(row['ID'].split()[0],row['ID'].split()[1])

    #마지막 2글자가 고성이라면 고성이라고 출력

    elif row['ID'][:2] =='고성':

        dispname ='고성'

    else:

        dispname = row['ID']

   

    #3글자가 넘으면 폰트를 줄여서 출력

    if len(dispname.splitlines()[-1]) >= 3 :

        fontsize, linespacing = 9.5, 1.5

    else:

        fontsize, linespacing = 11, 1.2

   

    #글자 작성

    plt.annotate(dispname,(row['x']+0.5, row['y']+0.5),

                 weight ='bold',

                 fontsize = fontsize, ha ='center',va ='center',

                 linespacing= linespacing)

   

#경계선 그리기

for path in BORDER_LINES:

    ys, xs = zip(*path)

    plt.plot(xs,ys, c = 'black',lw=1.5)

 

#상하 뒤집기 - 엑셀은 하단으로 갈때 좌표가 증가하지만

#모티너는 상단으로 갈 때 좌표가 증가합니다.

plt.gca().invert_yaxis()

 

#축 제거

plt.axis('off')

 

plt.show()

plt.gca().invert_yaxis()

위아래 뒤집어 졌다,

17.pop의 시도 이름과 draw_korea_raw_stackedid 일치시기키

=>set은 합집합 , 교집합 , 차집합 ,여집합을 계산할 수 있음

 

 

merge해서 id inner join

굳이 merge할 필요 없을 때는 set()을 기억하는 것이 좋다.

set -> 합집합 , 교집합 , 차집합 ,여집합

 

#pop ID draw_korea_raw_stacke ID 불일치 찾기

print(set(draw_korea_raw_stacked['ID'].unique())-set(pop['ID'].unique()))

 

print(set(pop['ID'].unique())-set(draw_korea_raw_stacked['ID'].unique()))

 

#서로 다른 것은 list로 만드다.

#pop에는 있는데 draw에는 없는 데이터 제거할 리스트 만들기

del_list = list(set(pop['ID'].unique())- set(draw_korea_raw_stacked['ID'].unique()))

print(del_list)

for rownum in del_list:

    pop = pop.drop(pop[pop['ID']==rownum].index)

 

#리스트를 순회하면서 데이터를 제거

print(set(pop['ID'].unique())-set(draw_korea_raw_stacked['ID'].unique()))

 

 

18.popdraw_korea_raw_stackedjoin

#pop draw_korea_raw_stacked join

pop = pd.merge(pop, draw_korea_raw_stacked , how='inner', on =['ID'])

pop.info()

 

19.좌표와 인구수를 이용해서 pivot 테이블을 생성

#좌표와 인구수를 이용해서 pivot 테이블을 생성

mapdata = pop.pivot_table(index ='y', columns = 'x' , values ='인구수합계')

print(mapdata)

 

#NaN 제거를 위한 작업

#NaN데이터는 --로 변환

masked_mapdata = np.ma.masked_where(np.isnan(mapdata),mapdata)

print(masked_mapdata)

#NaN -- 로 바꿔졌다.

 

20.컬럼이름과 datarame그리고 색상 이름을 대입하면 catogram을 그려주는 함수 만들기

 

#컬럼이름을 문자열로 설정하고 데이터프레임을 대입하고 색상을

def drawKorea(targetData, blockedMap, cmapname):

    gamma = 0.75

    #인구수 데이터의 크고 낮음을 분류하기 위한 값 만들기

    whitelabelmin = (max(blockedMap[targetData]) -

    min(blockedMap[targetData]))*0.25 + \

    min(blockedMap[targetData])

    #컬럼이름을 대입하기

    datalabel = targetData

    #최대값과 최소값 구하기

    vmin = min(blockedMap[targetData])

    vmax = max(blockedMap[targetData])

    #x y를 가지고 피봇 테이블 만들기

    mapdata = blockedMap.pivot_table(index='y', columns='x', values=targetData)

    #데이터가 존재하는 것 골라내기

    masked_mapdata = np.ma.masked_where(np.isnan(mapdata), mapdata)

    #그래프 영역 크기 만들기

    plt.figure(figsize=(9, 11))

   

    #색상 설정

    #지도에 색상을 설정

    plt.pcolor(masked_mapdata, vmin=vmin, vmax=vmax, cmap=cmapname,

               edgecolor='#aaaaaa', linewidth=0.5)

              

    # 지역 이름 표시

    for idx, row in blockedMap.iterrows():

        # 광역시는 구 이름이 겹치는 경우가 많아서 시단위 이름도 같이 표시

        #(중구, 서구)

        if len(row['ID'].split())==2:

            dispname = '{}\n{}'.format(row['ID'].split()[0], row['ID'].split()[1])

        elif row['ID'][:2]=='고성':

            dispname = '고성'

        else:

            dispname = row['ID']

       

       

        # 서대문구, 서귀포시 같이 이름이 3자 이상인 경우에 작은 글자로 표시

        if len(dispname.splitlines()[-1]) >= 3:

            fontsize, linespacing = 10.0, 1.1

        else:

            fontsize, linespacing = 11, 1.

            

        #글자색상 만들기

        #글자 색상ㅇ을 다르게 한다.

        #while 아니면 블랙

        annocolor = 'white' if row[targetData] > whitelabelmin else 'black'

        #텍스트 출력하기

        plt.annotate(dispname, (row['x']+0.5, row['y']+0.5), weight='bold',

        fontsize=fontsize, ha='center', va='center', color=annocolor,

        linespacing=linespacing)

       

       

    # 시도 경계 그리기

    for path in BORDER_LINES:

        ys, xs = zip(*path)   

        plt.plot(xs, ys, c='black', lw=2)

       

    plt.gca().invert_yaxis()

    plt.axis('off')

    cb = plt.colorbar(shrink=.1, aspect=10)

    cb.set_label(datalabel)

   

    plt.tight_layout()

plt.show()

 

21.인구 수 합계 이용해서 그리기  

#그리기

drawKorea('인구수합계', pop, 'Blues')

 

22.소멸위기 지역  그리기

print(pop.head())

#소멸위기지역을 수치 데이터로 변환 -True:1, False :0

pop['소멸위기지역'] = [1 if imsi else 0 for imsi in pop['소멸위기지역']]

 

drawKorea('소멸위기지역', pop, 'Blues')

 

**위의 데이터를 이용해서 단계구분도(colorpleth)그리기

=>단계구분도를 그릴때는 그리고자 하는 지도의 경계를 나타내는 json파일이 있어야 합니다.

=>우리나라 데이터는 southkorea-maps를 검색하면 github에서 제공

#단계구분도를 위한 라이브러리

import folium

import json

 

#데이터에서 지역이름을 인덱스로 설정

pop_folium = pop.set_index('ID')

print(pop_folium)

 

#표기하고자하는 지도의 경계선 데이터를 가져옵니다.

geo_str = json.load(open('./Desktop/data/korea_geo_simple.json',encoding='utf-8'))

print(geo_str)

 

#지도 출력

map = folium.Map(location=[36.2003,127.0541],zoom_start = 7)

 

map.choropleth(geo_data=geo_str,data = pop_folium['인구수합계'],fill_color='YlGnBu',key_on ='feature.id',

               columns =[pop_folium.index,pop_folium['인구수합계']])

 

map.save('pop.html')

 

print(pop_folium.index)

 

print(pop[pop['광역시도'] == '서울특별시'])

 

 

#지도 출력

map = folium.Map(location=[36.2003,127.0541],zoom_start = 7)

 

map.choropleth(geo_data=geo_str,data = pop_folium['소멸위기지역'],fill_color='YlGnBu',key_on ='feature.id',

               columns =[pop_folium.index,pop_folium['소멸위기지역']])

 

map.save('pop.html')

**기술통계

=>논리적 사고와 객관적인 사실에 따르며 일반적이고 확률적 결정론에 따라 인과관계를 규명

=>수집된 자료의 특성을 쉽게 파악하기 위해서 대표값이나 표 또는 그래프로 요약하는 기술통계학과 모집단에서 추출한 정보를 이용해서 다양한 특성을 과학적으로 추론하는 추론 통계학(검정, 분산분석 , 회귀분석)으로 나

 

**기술통계

=>자료를 요약하는 기초적인 통계량

=>모집단의 특성을 유추

=>빈도분석 : 개수 파악

=>기술통계분석 : 평균이나 합계 등을 구하는 것

1.기술통계함수

=>numpy에서 numpy가 기술 통계함수를 소유 : numpy.mean(데이터)

=>pandas에서는 SeriesDataFrame이 기술 통계함수를 소유:  DataFrame객체.mean()

DataFrame.mean(데이터프레임)

=>count, min,max, sum, std, var, median , mean(평균)

=>argmin,argmax, idxmin, idxmax(최대값을 가진 데이터의 위치)

6과 차이가 가장 작은 수

1 5 3 9

5 1 3 3

결국에 찾아야 하는 것이 차이값의 위치 의 값 을 찾아야 한다. 5

차이가 최소 찾을 때 index를 찾아야 한다.

유클리티 거리 , 맨하튼 거리 거리의 가까운 것의 거리를 찾는 것이다.

 

=>quantile(사분위수) : IQR(75%에서 25% 뺀것 이상치 찾는 것 )

           표준화 할 때도 필요 SCALLER할 때  

STANDARD scaller

minmax scaller -> min max 극단치 가능성이 있다. 극단치가 너무 좌우가 된다.

그래서 robus scaller를 사용한다.

=>describe: 최대 , 최소 , 평균 ,중간값 , 4분위수를 리턴

=>diff(이전 항과의 차), pct_change(이전 항과의 비율)

=>하나의 컬럼에만 사용 가능한 함수 : unique()-유일한 값들 리턴 , value _count() - 각 데이터의 개수

 

2.평균(mean)

1) 산술 평균 :데이터의 총합을 데이터의 개수로 나눈 값

 

2)기하 평균 : 평균 비율을 구할 때 사용

매출액이 100인 회사에서 다음 해에 매출액이 110이 되었고 그 다음해에 107.8을 기록했다면 평균 성장률은?

첫해에 105증가했고 그다음해에 2% 로 감소했으므로 평균 성장률은 (10-2) / 2 = 4 % ? 이렇게 하면 안된다.

1.1  * 0.98의 제곱근

 

3) 조화평균: 2개의 값의 곱에 2를 곱한 후 2개의 수를 더한 값으로 나누는 것

동일한 거리를 시곡 100km 로 가고 한번은 60km로 갔을 때 평균 속도는 ?

300km을 갔다고 했을 때 평균속도는 ?

 

(2 * 100 * 60 ) / (100+60)

 

4).단순 이동 평균

=>모든 데이터의 평균을 구하는 것이 아니고 최근의 데이터 몇 개의 평균만 구하는 것

=>pandasSeries를 가지고 rolling 메소드에 window에 데이터 개수를 설정해서 호출

 

5)지수 이동 평균

=>최근의 데이터에 가중치를 부여해서 평균을 구하는 것

=>pandasSeries 를 가지고 ewm 메소드에 span 매개변수를 이용해서 데이터 개수를 설정해서 호출

 

6) 주가를 가지고 회귀를 할 때는 단순 이동평균이나 지수 이동평균을 사용해야 합니다.

(최근데이터 + (1-알파)이전데이터 + (1-알파)제곱 * 이전의 이전데이터)/(1+(1-일파) +(1-알파)제곱)

 

 

###평균 그하기

s = pd.Series([10,11,10,78])

#비율 평균을 산출 평균으로 구하기

print(s.pct_change().mean())

 

 

import math

#평균 비율울 구할 때는 기하 평균을 사용

print(math.sqrt((11/10)*(10.78/11)) - 1)

 

#속도의 경우는 조화 평균을 사용

#동일한 거리르 100km 60km 로 달린 경우

print(2* 100* 60/(100+60))

 

#단순 이동 평균

print(s.rolling(window = 2))

 

#지수이동 평균  가중치를 0.5가지고 한다.

print(s.ewm(span= 2))

 

절사 평균 :양 극단치의 데이터를 제거하고 평균을 구하는 것

 

 

3. 중간 값(median)

=>데어터를 정렬했을 때 가장 중앙에 있는 값

=>데이터가 짝수인 경우는 중앙의 좌우값 평균을 이용

 

1 2 3 4 5: 중간값 - 3

1 2 3 4 5 6 : 중간ㄱ밧 - 3.5

=>중간값 데이터는 데이터 그룹에 없을 수도 있음

평균은 극단치에 매우 민감합니다.

극단치가 있을 때는 중간값이나 최빈값을 모집단을 대표하는 값으로 사용하는 것이 좋습니다.

시애틀에서 메디나와 원더미어 주변의 소득을 비교하는 경우 메디나에 빌게이츠가 삽니다.

평균을 가지고 비교하면 메디나 높게 나을 가능성이 높습니다.

이런 경우에는 중간값이나 최빈값을 모집단을 대표하는 값으로 사용하는 것이 좋습니다.

 

 

**척도

=>변수 , 변량, 컬럼 ,열 이라고도 부르는 테이블에서의 열

 

1.descriptive.csv

=>부모의 학력 수준에 따른 자녀의 대학진학 합격 여부를 조사한 데이터 셋

=>300개의 행과 8개의 열로 구성

=>열의 으미

resident: 거주지역(1,2,3 - 서울 , 광역시 ,시군구)

gender: 성별(1,2, - 남자,여자)

age:나이

level: 부모의 학력 수준(1,2,3 ~ 고졸 ,대졸 ,대학원졸 이상)

cost: 생활비

type: 학교 유형 (1,2 ~-4년제 , 4년제 미만)

survey: 만족도(1-2)

pass: 합격여부(1,2 ~ 합격 , 불합격)

 

 

#descriptive.csv파일 읽기

df = pd.read_csv('./Desktop/data/descriptive.csv')

print(df.head()) #데이터가 읽어지는 지 확인

 

 

df.info() # 데이터의 특성 확인 , 개수,

print(df.describe())#기술 통곟 확인

 

 

2. 명목 적도

=>구분 만을 위해서 의미없는 숫자로 만든 데이터 : 범주형이라고 하기도 합니다

=>거주지역이나 성별처럼 특별한 의미없이 구분만을 위해서 만든 척도

=>기술통계량을 구하는 것이 아무런 의미가 없음

=>이런 데이터는 비율만 확인하는 것이 일반적

=>막대 그래프나 원 그래프를 그려서 크기를 확인

=>이 척도가 분규의 타겟으로 사용이 된다면 비율이 거의 같은 것이 올바른 결과를 유추할 가능성이 높아집니다.

차이가 많이 나면 데이터를 더 수집하거나 다운샘플링이나 업샘풀링 등을 해주어야 한다.

 

#gender 값의 개수만 확인

df['gender'].value_counts().plot.bar(color='k')

#0하고 5 도 있다.

 

#이상한 데이터 확인 - 0, 5

df = df[(df['gender'] == 1 )| (df['gender'] == 2)]

df['gender'].value_counts().plot.bar(color='k')

 

 

3. 서열 척도

=>구분 뿐 아니라 순위를 표현하는 숫자로 만든 데이터 : 범주형

=>학력 수준이나 학교에서의 성적 순위 같은 데이터

=>명목 척도 처럼 기술 통계는 별 의미가 없고 비율만 확인하는 것이 일반적

=>순서는 명확하지만 순서마다 차이는 일정하지 않고 알기가 어려움

 

 

4.등간 척도

=>범주형으로 구분, 순위 그리고 각 값의 간격이 일정한 데이터

=>학교에서의 점수 , (90점하고 80점은 10점 더 잘 했다. ) ,및 설문 조사에서의 만족도

=>이 경우 부터는 기술 통계량이 의미를 갖음

 

5. 비율적도

=>연속형 데이터로 만들어진 데이터

=>사용자의 입력으로 만들어지는 데이터

=>기술 통계값이 의미를 갖음

=>빈도 분석할 때 주의 해야 합니다.

빈도 분석을 하게되면 너무 많은 항목이 만들어질 수 있습니다.

bining(구간 분할)을 해서 빈도 분석을 하는 것이 일반적입니다.

 

**표본 추출

=>전수 조사와 표본 조사

=>전수 조사는 모집단 내의 모든 대상을 상대로 조사하는 것

모집단의 특성을 정확하게 반영

비용과 기간이 많이 소모

 

=>표본조사는 모집단에서 일정한 대상을 샘플링해서 조사하는 것

전수조사의 단점을 보완할 수 있지만 잘못된 샘플링을 하게 됨녀 모집단의 특성을 정확하게 반영할 수 없습니다.

 

=>모수는 모집단의 특성을 나타내는 수치를 의미하고 통계량은 표본의 특성을 나타내는 것

통계량이 모수의 특성을 얼마나 잘 나타낼 수 있는가 ?

값이 얼마나 비슷한가

 

=>sample(표본) : 큰 데이터 집합으로부터의 부분 집합

=>population (모집단) : 데이터 전체 대상

=>N(n) : 모집단의 개수

 

=>랜덤 표본 추출 : 무작위 표본

(안에 아래 두개 있ㄷ.)

 

=>층화 표본 추출 : 모집단을 층으로 나눈 뒤 각 층에서 무작위로 데이터를 추출하는 것

=>단순 랜덤 추출 : 층화없이 표본을 추출하는 것

 

=>복원추출 : 이전에 추출된 데이터를 다시 모집단에 넣고 추출 (주사위 )

=>비복원 추출: 이전에 추출된 데이터를 모집단에서 제거하고 추출 (로또 )

 

=>표본 편향 : 잘못된 표본 (여론 조사하는데 단순 랜덤 추출하면 표본 편향이다.)

 

시청률이 높다고 해서 이슈화 되지 않는다. 20~30대 얼마 시청 했는냐 ? 화재성  여론조사는 단순 랜덤 추출하면 안되고 층화 표분 추출해야 한다.

 

=>추정

-점 추정 : 하나의 값과 일치하는 지 추정

-구간 추정: 범위를 가지고 추정

 

-신뢰수전 :계산된 구간이 모수를 포함할 확률 을 의미하면 보통 90% , 95% , 99% 를 사용

-유의수준(머신러닝할 경우 대부분 이것을 본다.) : 계산된 구간이 우연히 모수의 특성을 포함할 확률 0.1 . 0.05, 0.01을 사용

이름은 p-value

유의수준과 신뢰수준은 반대이다.

<= 0.05 우연히 나올 확률은 그것 밖에 안된다.

특정 유의 수준을 설정하고 그 유의 수준보다 낮게 나오면 기각 한다던가 채택을 합니다.

-신뢰구간: 모수를 포함할 상한값과 하한값

-표본오차(잔차): 모집단에서 추출한 표본이 모집단의 특성과 정확히 일치하지 않아서 발생하는 확률의 차이

-대통령 후보의 지지율 여론조사에서 후보의 지지율이 95%신뢰수준에서 표본오차 +- 3%범위 내에서 32.4%로 조사 되었다는 의미는

지지율이 29.4 ~ 35.4 %가 나올 확률이 95%라는 의미입니다.

5%는 틀릴 수도 있다.

 

1.단순 임의 추출

=>파이썬에서의 random모듈이 제공

random.random()을 이용하면 복원 추출

random.sample()을 이용하면 비복원 추출

random.shuffle(시퀀스 자료형): 을 이용하면 시퀀스 자료형을 랜덤하게 섞음

random()함수는 01사이의 실수를 리턴

randrange(시작숫자, 종료숫자)를 이용하면 범위를 변경

randint(시작숫자, 종료숫자)

 

 

import random

 

li = list(range(1,40,1))

print(li)

 

print(random.shuffle(li))#섞어 버렸다.

print(li)

 

#비복원 추출

print(random.sample(li, k = 4))

#할 때마다 다른 것 나온다.

 

 

2.가중치를 설정한 추출

=>numpychoice메소드를 이용하면 가중치를 설정해서 추출이 가능

=>choice(배열 , size = 추출할 개수 , replace =복원추출여부 ,p =[확률])

=>데이터의 비율이 동일하지 않을 떄는 확률을 설정해서 추출해야 합니다.

 

0-10

1-90

결과가 외곡 할 수 있다. 단순 랜덤 추출하면 170개 나올 수 있다.

그래서 비율로 나와야 한다.

 

0-50

1-30

2-20

테스트 데이터  7:4 는 같기 때문이다.

iris -> 5:5:5같기 같기 떄문에

 

li = ['라투','오미크론','다크스펙터','나이즈']

print(np.random.choice(li, 4)) #동일한 비율로 추출

print(np.random.choice(li, 4, p = [0.05, 0.3, 0.15, 0.5])) #나이즈 나올 확률이 높아진다.

 

 

3.pandas의 랜덤한 행 추출

=>SeriesDataFramesample메소드

n: 추출한 데이터 개수

frac: 전체 개수에서 추출할 비율 -nFrac은 같이 설정 불가

replace: 복원 추출 여부로 기본값은 False

weight: 가중치

random_state: 시드 번호 - 계속 나오는 매개변수 중의 하나

                                  머신러닝할 때 이 옵션의 값을 변경하면서 수행

axis: 추출할 방향으로 기본은 행 단위로 추출

 

 

4.scikit-learn 라이브러리의 model_selection 클래스의 train_test_split()이용

=>샘플링할 때 가장 많이 사용하는 함수

=>무작위 샘플링을 할 떄는 shuffle

=>

=>test_size옵션

 

 

overfit(과적합)

=>훈련 데이터에는 잘 맞는데 시험데이터에 잘 안맞는 경우

=>훈련데이터가 너무 많거나 변수가 너무 많을 때

두개를 하나로 만들어는 것 고유백터 교차 항

 

 

 

**python에서 인스턴스 메소드 호출

클래스.메소드이름(인스턴스) -unbound호출

인스턴스.메소드이름() -bound호출

 

class X:

           def funct(self):

                       print('인스턴스 메소드')

 

x = X()

x.func() -bound호출

 

X.func(x) ->unbound호출

반응형

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

데이터분석-8  (0) 2020.11.12
데이터분석-7  (0) 2020.11.11
데이터분석-6  (0) 2020.11.10
데이터분석-5  (0) 2020.11.09
데이터분석-4  (0) 2020.11.08
반응형
library(dplyr)
library(ggplot2)
mpg
data1 <- mpg %>% filter(displ <= 4) %>% summarise(mean(hwy))
data1
data2 <- mpg %>% filter(displ >= 5) %>% summarise(mean(hwy))
data2 

data <- mpg %>% filter( displ <= 4 | displ >= 5) %>% mutate(group1 = ifelse(displ <= 4, 'a', ifelse(displ>=5,'b','c'))) %>% group_by(group1) %>% summarise(mean(hwy))
data

mpg %>% filter()

#mpg는 위에  10개만 보여준다.
head(airquality, 20)
head(mpg, 30) #강제로 10개만 보여준다.

#데이터 타입으로 바꾸는것 as.data.frame
airquality <- as_tibble(airquality)
airquality

mpg

mpg %>% filter(manufacturer=='audi' | manufacturer=='ford') %>% group_by(manufacturer) %>% summarise(test=mean(cty)) %>% arrange(desc(test)) 

mpg_new <-mpg %>% mutate(total = (hwy+cty)/2) %>% arrange(desc(total)) %>% head()        
d2 <-mpg %>% mutate(total = (hwy+cty)/2) %>% arrange(desc(total))  %>% head()  
d2 <- as.data.frame(d2)
arrange(d2,desc(total))

mpg_new <- mpg %>% select('class','cty')
mpg_new

mpg_new %>%  filter(class =='suv' | class =='compact') %>% group_by(class) %>% summarise(sum(cty)) 

mpg %>% select('class','cty') %>%  filter(class =='suv' | class =='compact') %>% group_by(class) %>% summarise(mean(cty))  
mpg %>% filter(class =='suv' | class =='compact')  %>% select('class','cty')  %>% group_by(class) %>% summarise(mean(cty)) 

mpg %>% filter(class =='compact') %>% group_by(manufacturer) %>% summarise(tot=n()) %>% arrange(desc(tot))

 

mpg데이터셋 보기
ggplot

str->str(mpg)

tbl_df , tbl and data.frame
tbl data.frame비슷하는데 계산하기 위해서 나오는 것
tbl_df
chr m num, int등으로 되여있다.
열의 이름을 보고 싶으면 names(mpg)
names(mpg)[8] #cty만 뜨게끔 몇번째 명을 지정한다.
str(mpg)
names(mpg)
names(mpg)[8] #cty만 뜨게끔 몇번째 명을 지정한다.

 

names(mpg)[8] <- 'city'
names(mpg)
mpg
names(mpg)[8] <- 'cty'
names(mpg)
mpg

dplyr :: glimpse(mpg)
mpg
names(mpg)[12]
mpg %>% select(c(names(mpg)[12] ))

mpg <- subset( mpg, select = -c(names(mpg)[12] ) )
mpg

mpg <- ggplot2::mpg
mpg
ggplot(data= mpg,aes(x= displ,y=hwy))+geom_point()

ggplot(mpg,aes(displ,hwy,colour = class))+geom_point()

ggplot(mpg, aes(displ,hwy))+geom_point((aes(colour ="blue")))# 바닥에 색갈이 었으면 두개 층이 겹쳐져서 원하는 색갈을 못가진다.레이어가 겁쳐서나오기  overwritting
ggplot(mpg, aes(displ,hwy))+geom_point(colour ="blue")#동급에서 색갈이 먹여지는데 

ggplot(mpg, aes(displ,hwy,colour = class))+geom_point() #색갈갈
ggplot(mpg, aes(displ,hwy,colour = trans))+geom_point()#
ggplot(mpg, aes(displ,hwy,colour = drv))+geom_point()#
ggplot(mpg, aes(displ,hwy,colour = cty))+geom_point()#

#shape도형형
ggplot(mpg, aes(displ,cty, shape=drv))+geom_point()
ggplot(mpg, aes(displ,cty, shape=class))+geom_point()
ggplot(mpg, aes(displ,cty, shape=trans))+geom_point()
ggplot(mpg, aes(displ,cty, shape=cty))+geom_point()#A continuous variable can not be mapped to shape

#size #많을 수록 많아진다.
ggplot(mpg, aes(displ, cty, size= cty)) +geom_point()
ggplot(mpg, aes(displ, cty, size= trans)) +geom_point()

ggplot(mpg, aes(displ, cty, size= cty)) +geom_point(colour ="red")
ggplot(mpg, aes(displ, cty, size= cty)) +geom_point(colour= cty)#객체 'cty'를 찾을 수 없습니다
ggplot(mpg, aes(displ, cty, size= cty)) +geom_point(aes(colour= cty))

#만약 size와 color를 다르게 주면 어떤 그림을 그려 낼까요 
ggplot(mpg, aes(displ ,cty, size = cty , color= drv))+geom_point()

ggplot(mpg,aes(cty,hwy))+geom_point()#점선


str(diamonds)
ggplot(diamonds,aes(carat,price))+geom_point()
ggplot(economics, aes(date, unemploy))+geom_line()#선으로 
ggplot(mpg,aes(cty))
ggplot(mpg,aes(cty))+geom_histogram()#1차원으로 하는 것것


ggplot(mpg,aes(cty))+geom_histogram(bins=10)#더 굵어진다.
ggplot(mpg,aes(cty))+geom_histogram(bins=20)#bins는 막대기 그림림

dia <- diamonds #이름 바꾸기 
class(dia)
dia
#ord order 순서가 정해진다.
#carat 크기 모양

#범주유형으로 색상 하기 
ggplot(diamonds,aes(carat,price, color=cut))+geom_point()
ggplot(diamonds,aes(carat,price, color=color))+geom_point()
ggplot(diamonds,aes(carat,price, color=clarity))+geom_point()

 

#r과 rstudio 속도 관련문제
r은 훨씬 빠르고 부드럽게 된다.

#facetting
#따로따로 보여주는 것
#범주용 데이터에 대하여 

 

ggplot(mpg, aes(displ,hwy))+geom_point()+facet_wrap(~class)

geom_smooth()
ggplot(mpg,aes(displ,hwy))+geom_point()+geom_smooth()#곡선 범위 
ggplot(mpg,aes(displ,hwy))+geom_point()+geom_smooth(method="loess")#곡선 defaule  local지역을 쪼개서 연결하는 상황
ggplot(mpg,aes(displ,hwy))+geom_point()+geom_smooth(method="lm")#직선 범위  lw linear model 선형모델 

geom_boxplot()

#gitter 흩어주는 것인데 geom_violin()더 예쁘지는 것이다. 절반짤라서 
#geom_violin
ggplot(mpg, aes(drv, hwy)) +geom_violin()
ggplot(mpg,aes(drv,hwy))+geom_jitter()
ggplot(data = mpg, aes(x = drv, y = hwy))+
  geom_point(size = 2, position = "jitter")

geom_feqploy()
ggplot(mpg, aes(hwy)) +geom_freqpoly()#histogram그리고 그다음 그리는 것 
ggplot(mpg, aes(hwy)) +geom_freqpoly(bins = 20)#범위가 넓어진다.

geom_histogam()
ggplot(mpg, aes(displ,color= drv)) +geom_histogram(bindwidth= 0.5)#색상이 안된다.
ggplot(mpg, aes(displ,fill= drv)) +geom_histogram(bindwidth= 0.5)#
ggplot(mpg, aes(displ,fill= drv)) +geom_histogram(bindwidth= 0.5,position = "dodge")#한줄에 색사이 하나밖에 없다.


#geom_bar
#자주사용하는 것이다.
ggplot(mpg, aes(displ,fill= drv)) +geom_bar(position = "dodge")
ggplot(mpg, aes(displ,fill= drv)) +geom_bar(position = "fill")

ggplot(mpg, aes(manufacturer))+geom_bar()#변수가 하나일때는 stat안하면 자동으로count로 된다.
drugs <- data.frame(drug = c("a","b","c"), effect = c( 4, 9, 6))
ggplot(drugs, aes(drug, effect))+geom_bar(stat = "identity")#y값이 정해져있다.identity로무조건 설정해야 한다.
ggplot(drugs, aes(drug, effect))+geom_bar()#stat_count() must not be used with a y aesthetic.

ggplot(economics, aes(date, unemploy / pop))+geom_line()#알아서 계싼해서 만들어준다.
ggplot(economics, aes(date, unemploy))+geom_line()

ggplot(mpg, aes(drv, hwy)) +geom_boxplot()#박스가 25%에서 선을 거고 50% 선을 거 위에 25%에 선이 있다. 중앙값 
#잴 위에 있는 것은 이상값 동그라미 


mpg %>% filter(hwy < 20 & drv == 'f') 
mpg %>% filter(hwy < 25 & drv == 'f') %>% arrange(hwy)

 

데이터 프레임 합치기
결측치 not avaliable
데이터 정제하기[결측치] 데이터 비여있기

 

#na이냐 아니냐 
df <- data.frame(sex= c("M","F",NA,"M","F"),score=c(5,4,3,4,NA))
df
is.na(df)
table(is.na(df))

table(is.na((df$sex)))
table(is.na(df$score))

#na빼고 계산하면 안되기때문에 na로 되여있다.
mean(df$score)#[1] NA ->수학계산을 알수없다.
sum(df$score)#[1] NA->수학계산을 알수없다.

df %>% filter(is.na(score))#na인것만 골라낸다.
df %>% filter(!is.na(score))#na가 아닌것을 골라낸다.

#해결법은 아닌것만 모아서 계산하겠다.
df_nomiss <- df %>% filter(!is.na(score)) 
df_nomiss
#평균은 모두합쳐서 ,na빼고 , error
mean(df_nomiss$score) 
sum(df_nomiss$score)

df_nomiss <- df %>% filter(!is.na(score) & !is.na(sex))
df_nomiss
#na.omit생략한다. 지운다. na가보이면 그 행을 지운다. 
#na가 모이면 그 행을 삭제한다. 그래서 사용하면 안된다. 위험한 행위이다.
#다만 데이터가 엄청 많을때 무슨 영향을 미치는 지 알고 있을때 가능하다.
#위험한 행위이다.
df_nomiss2 <- na.omit(df)#모든 변수에 결측치 없는 데이터 추출
df_nomiss2

#아래것은 가장 권장한 결과이다.
#na가  있다는 것을 알고 있기에 원래 데이터가 수정되는 것이 아니여서 안정성이 있다.
mean(df$score, na.rm =  T)#결측치 제외하고 평균산출 
sum(df$score, na.rm = T)#결측치 제외하고 합계 산출
#결론은 어떻게 하냐 ? 입력 is.na na.rm na.omit
#결측치를 지우고 한것이다.

데이터 정제하기 [이상치] 이상한 이상이다.
이상치의 가장대표적인 예는 로또 1등이다. 분포에 끝에 있다는 것이지 나쁘는 것은 아니다.

 

outlier <- data.frame(sex= c(1,2,1,3,2,1) , score= c(5,4,3,4,2,26))
outlier

table(outlier$sex)
table(outlier$score)

outlier$sex <- ifelse(outlier$sex == 3, NA, outlier$sex)#3은 이상치보다 오류이다.
outlier

outlier$score <- ifelse(outlier$score>5 , NA, outlier$score)#16
outlier

outlier <- data.frame(sex= c(1,2,1,3,2,1) , score= c(5,4,3,4,2,26))
boxplot(outlier$score)

outlier %>% filter(!is.na(sex) & !is.na(score)) %>% 
  group_by(sex) %>% 
  summarise(mean_score = mean(score))

정규표현식
함수
인수가 없는 함수 

#함수 ->변수선언할 필요없다.
#함수 ->

Minho <- function(){
  x <- 10
  y <- 20
  return (x*y)#돌려주는 값의 선언
}

ls()
Minho
Minho()

#인수가 있는 함수의 선언
Minho2 <- function(x,y){
  xx <- x
  yy <- y
  return (sum(xx,yy))#돌려주는 값의 선언
  #시스템이 정의한 특정 함수를 이용한 결과를 돌려줌
}

Minho2(2,3)

kaggle 
gitub

Minho3 <- function(x,y){
  x3 <- x+1
  y3 <- y+1
  x4 <- Minho2(x3, y3)#함수에서 함수를 부르는 경우 재귀호출이 가능하다.
  return(x4)
}
Minho3(2,4)

#결과를 화면에 반환하지 않고 변수에 할당
Minho4 <- function(){
  x <-  10
  y <-  10
  return(invisible(x*y)) # 결과값은 보여지지 않지만 변수에는 값이 들어간다.
}
Minho4()
result <- Minho4()
result

#함수 외부의 변수를 조작해야
rm(x)
x <- 70 #시스템 변수 x에 70을할당 
ls()
minho5 <- function(){
  x <- 10#함수내에서 사용하는 변수 
  y <- 20#함수내에서 사용하는 변수 
  
  x <<- 40 #시스템에서 사용하는 변수  x에 40을 할당
  return(x+y)
}
minho5()

minho5 <- function(){
  x <- 20#함수내에서 사용하는 변수 
  y <- 20#함수내에서 사용하는 변수 
  x+y
}

#return이 우선순위고 return이 없으면 마지막으로 된다.
minho5 <- function(){
  x <- 20#함수내에서 사용하는 변수 
  y <- 20#함수내에서 사용하는 변수 
  return(x+y)
  x-y
}

minho5()
minho5

sum1 <- 0 #변수를 설정
for(i in seq(1,10,by =1 )) sum1 <- sum1+i#1에서 10을 1단위로 차례로 넣고 결과 확인
sum1

sum1 <- 0
for(i in 1:5){
  for(j in 1:5){
    sum1 <- sum1 + i*j
  }
}
sum1

sum1 <- 0
for(i in 1:5){
  for(j in 1:5){
    sum1 <- sum1 + i*j
  }
}
sum1

sum1 <- 0 #변수를 설정
for(i in seq(1,10,by =1 )) sum1 <- sum1+i#1에서 10을 1단위로 차례로 넣고 결과 확인
sum1

sum1 <- 0
for(i in 1:5){
  for(j in 1:5){
    sum1 <- sum1 + i*j
  }
}
sum1

while문
sum2 <- 0
i <- 1
while(i <= 10){
  sum2 <- sum2+i;
  i <-i+1
}
sum2

#repeat
sum3 <- 0
i <- 1
repeat{
  sum3 <- sum3+i
  i <- i+1
  if(i>10) break#이 조건에 맞으면 탈출한다.
}
sum3 <- 0
i <- 0
repeat{
  if(i> 5) break
  j <- 0
  repeat{
    if(j > 5)break
    sum3 <- sum3+i*j
    j <- j+1
  }
  i <- i+1
}
sum3

sum1 <- 0
len <- 10
for(i in 1:len){
  sum1 <- sum1 + i
}
sum1

서포트 벡터 머신
데이터 성격 이해 ->탐색적 데이터 (ggplot2,baseR graphic,플롯 , 페어)->변수를 피처엔저니어링(필요한것만 추가 파생변수 등 만든다. 뉴테이트 변수를 빼거나 넣거나 하는것 )
->분석(예측,분류,CNN등)
회귀 최소제곱법 찾는 방법
  단순회귀 예측 연속성
  로지스트회귀 양자택 sigmoid함수 ->
  다중회귀
전문가시스템
의사결정에서의 시리즈

kaggle 알고리즘 -> 분석 의사결정시리즈


vector점이라고 생각하면 된다.
중간에는 decition boundary
margin
support vetors
선형분류 문제 ->데이터를 분류하는 선형 결정경계(Decstion boudary)
분류가능하도록 데이터를 변화시킨다.
함수로 해서 변화한다. 변형을 시킨다.
비선형 분류
소프트 마진 
hypperparameter 로 튜닝하다.

playground.tensorflow.org/#activation=tanh&batchSize=10&dataset=circle&regDataset=reg-plane&learningRate=0.03&regularizationRate=0&noise=0&networkShape=4,2&seed=0.47074&showTestData=false&discretize=false&percTrainData=50&x=true&y=true&xTimesY=false&xSquared=false&ySquared=false&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=classification&initZero=false&hideText=false

 

Tensorflow — Neural Network Playground

Tinker with a real neural network right here in your browser.

playground.tensorflow.org

playground tensorflow

 

RBF(radial basis function)비선형 분류-> 잘 모르는 RBF
RBF(radial basis function)가우시안 커널
서포트 백터 머신의 장단점
장점
1. 분류문제나 회귀문제 동시에 쓸 수 있다.
2.사용하기 쉽다.
3. 예측의 정확도가 높다
단점
1.커널 hypperparameter 등을 위해 튜닝 과정이 필요하다.
2.선형 회귀/로지스틱 회귀와 다르게 신뢰 구간등을 

svm 지원 library
e1071
kabR
kerlab

신경망은  rgb함수로 
kernel 선형 아니면 마법사처럼 위에 올라갈것인지
분류가지고 예측한다.
데이터

 

#분류

install.packages("RCurl")
# load the library
library(RCurl)
# specify the URL for the Iris data CSV
urlfile <-'http://archive.ics.uci.edu/ml/machine-learning-databases/letter-recognition/letter-recognition.data'
# download the file
downloaded <- getURL(urlfile, ssl.verifypeer=FALSE)
# treat the text data as a steam so we can read from it
connection <- textConnection(downloaded)
# parse the downloaded data as CSV
letters <- read.csv(connection, header=FALSE)
# preview the first 5 rows
colnames(letters)<-c("letter","xbox", "ybox","width","height",
                     "onpix","xbar","ybar","x2bar","y2bar",
                     "xybar","x2ybar","xy2bar","xedge","xedgey",
                     "yedge","yedgex")
View(letters)
str(letters)
head(letters)
write.csv(letters,"letters.csv")
#머신러닝은 기계로 배운다.

 test_split = 0.2
train_size = round((dim(letters)[1] *(1- test_split)))#20000* -0.8 test는 4만계
set.seed(20180621)#seed 값에 따라사  sample을 돈다.
train_index = sample(1:(dim(letters)[1]),train_size) #1~ 20000, 16000

letters_train <- letters[train_index,]
letters_test  <- letters[-train_index,] #train한것 나머지를 구한다.

install.packages("e1071")
library(e1071)#svm 지원하는 것 
#데이터 , 문자로 맞추고 변수는 그 나머지 모든 것
#fitting svm with linear kernel
letters_linear <- svm(letter~. , data = letters_train,kernel ="linear")
summary(letters_linear)

Call:
svm(formula = letter ~ ., data = letters_train, kernel = "linear")


Parameters:
   SVM-Type:  C-classification 
 SVM-Kernel:  linear 
       cost:  1 

Number of Support Vectors:  7147

 ( 225 456 371 133 484 436 213 209 234 183 313 202 239 287 235 298 346 236 240 335 240 196 175 280 458 123 )


Number of Classes:  26 

Levels: 
 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

선형이여서 감마 값이 없다. 얼마나 멀리 있는지 가까이 있는지 
 



Ubuntu ->windows에서 linux사용가능하다.

!hostname
#나를 위해서 만들어진 서버
7f22e97478ea

반응형

'Study > R' 카테고리의 다른 글

R-6  (0) 2020.09.05
R-5  (0) 2020.09.05
R-3  (0) 2020.09.05
R -2  (0) 2020.09.05
R-1  (0) 2020.09.02

+ Recent posts