기법 정리 DecisionTreeRegressor & Random Search

 

회귀 문제

LinearRegression

KNeighborsRegressor

DecisionTreeRegressor

RandomForestRegressor

XGBRegressor

 

DecisionTree, Random Search

 

1) 라이브러리 불러오기

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

 

 

2) 데이터 준비

# x, y 분리

# medv : 본인 소유 주택 가
target = 'medv'

x = data.drop(target, axis=1)
y = data.loc[:, target]

# 학습용, 평가용 데이터 분리
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state=1)

 

 

3) DecisionTreeRegressor

from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import cross_val_score
from sklearn.metrics import mean_absolute_error, r2_score

model_dt = DecisionTreeRegressor(random_state=1)

# 성능예측

cv_score = cross_val_score(model_dt, x_train, y_train, cv=5)

# 결과 확인

print(cv_score)
print(cv_score.mean())

 

 

4) 모델 튜닝

from sklearn.tree import DecisionTree
from skelarn.model_selection import RandomizedSearchCV

# max depth : 1~50
params = {'max_depth' : range(1,50)}

model_dt = DecisionTreeRegressor(random_state)

model = RandomizeCV(nidek_dt,
                                param,
                                cv =5,
                                n_iter = 20,
                                scoring = 'r2')

# 결과 확인
** model.cv_results_['mean_test_score'] : 테스트로 얻은 성능
** model.best_parms_ : 최적의 파라미터
** model.best_score_ : 최고 성능
print(model.cv_results_['mean_test_score'])
print('최적 파라미터:', model.best_params_)
print('최고 성능:', model.best_score

 

# 변수 중요도

## model.best_estimator_
plt.barh(  y = list(x), width = model.best_estimator_.feature_importances_) # 최선의 파라미터로 된 DecisionTree이다.

 

 

'기업정보요약_train.csv' & '재무제표정보_train.csv' 분석

import pandas as pd
import maplotlib.pyplot as plt
import os
os.listdir(os.getcwd())
data1 = pd.read_csv('기업정보요약_train.csv', encoding='UTF - 8')
display(data1)

 
 
data10 = pd.read_csv('재무제표정보_train.csv',encoding = 'UTF - 8')
display(data10)

중소기업 자본 형태, 자본 종류, 자본 합계 분석

# 결합하고 중소기업 정보 남기
data_small = pd.merge(data1, data10, on='BusinessNum', how = 'left' )
data_small = data_small.loc[ data['cpmSclNm'] =='중소기업']
data_small = data_small[ ['BusinessNum', '기업명', 'cmpSclNm', 'accNm', 'acctAmt']]
data_small

 

중소기업 자산데이터 종류 분석

display(data_small['accNm'].value_counts()

 

K-Means

1) 라이브러리 로딩
import pandas as pd
import numpy as np
import matplotlib.pyplt as plt
import sklearn as sns

2) 군집모델 만들기
model = KMeans(n_clusters = 2, init='auto')
model.fit(x)

pred = model.predict(x)

pred = pd.DataFrame(pred, columns = ['predicted'])

# 모델의 중심 좌표 얻기

centers = pd.DataFrame(model.cluster_centers_, columns = ['x1', 'x2'])

plt.scatter(result['x1'], result['x2'], c=result['predicted'], alpha=0.5)
plt.scatter(centers['x1'], centers['x2'], s=50, marker='D', c='r')
# k means 모델을 생성하게 되면 inertia 값을 확인 가능
model.inertia_

# k를 증가시켜가면서 inertia 구하기
kvalues = range(1,10)
inertias = []

for k in kvalues:
    model = KMeans(n_clusters=k, n_init = 'auto')
    model.fit(x)
    inertias.append(model.inertia_)

plt.plot(kvalues, inertias, '-o')
plt.xlabel('number of clusters, k')
plt.ylabel('inertia')
plt.grid()
plt.show()
 

K-Means 실습

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.cluster import KMeans
from sklearn,preprocessing import MinMaxScaler
# 군집화 할 변수 선택
x = data.loc[:, ['Age', 'Income', 'Score' ] ]
스케일링
scaler = MinMaxScaler()
x_s = scaler.fit_transform(x)

# k값을 늘려가면서(1~20) 모델을 만들어, inertia 값을 저장
# 그래프를 통해 최적의 k값 결정


# 반복문으로 KMeans 모델
kvalues = range(1,21)
iv = []

for k in kvalues:
    model = KMeans(n_clusters = k, n_init='auto')
    model.fit(x_s)
    iv.append(model.inertia_)

# 그래프 그려서 적절한 k값 찾기
plt.plot(kvalues, iv, marker='.')
plt.grid()
# 적절한 k 찾으면 모델 선언
model = KMeans(n_clusters=5, n_init = 'auto', random_state=10)

한 번에 분석하기

# 'Age', 'Income', 'Score', 'pred'만 추출

temp = result.loc[:, ['Age', 'Income', 'Score', 'pred' ]]

sns.pairplot(temp, hue = 'pred')
plt.show()

 

 

https://data.seoul.go.kr/dataList/543/S/2/datasetView.do

 

열린데이터광장 메인

데이터분류,데이터검색,데이터활용

data.seoul.go.kr

 

 

import numpy as np
import pandas as pd
import csv
import matplotlib.pyplot as plt

data = pd.read_csv('./csv/교원+1인당+학생수(구별)_20230820151017.csv', index_col=0)

data_re = data.rename(columns=data.iloc[0])
data_re = data_re.drop(data.index[0])
data_re
print(data_re)

school_sort = list(set(list(data_re.index)))
print("\n\n학교 종류")
print(school_sort)

blank = []

for i in school_sort:

    a = data_re[data_re.index.str.contains(i)]    
    gyo = pd.DataFrame(a.loc[:,'교원1인당학생수'])
    gyo_nu = pd.to_numeric(gyo['교원1인당학생수'])
    gyo_nu_mean = gyo_nu.mean()
    
    blank.append(gyo_nu_mean)
    
print('\n\n')
print(blank)

plt.rcParams['font.family'] ='Malgun Gothic'
plt.rcParams['axes.unicode_minus'] =False

plt.bar(school_sort, blank)
plt.show()

 

 

https://www.senbigdata.com/

 

서울교육 데이터 활용 아이디어 공모전

home keyboard_arrow_right 공고안내 description 공고안내 서울특별시교육청에서는 서울교육 데이터 활용 아이디어 발굴을 통해 공공데이터 활용을 촉진하고, 시민 누구나 교육정책에 참여하는 기회 제

www.senbigdata.com

 

공공데이터 사이트

 

공공데이터포털 데이터셋

https://www.data.go.kr/

 

서울열린데이터광장

https://data.seoul.go.kr/

 

나이스교육정보개방

https://open.neis.go.kr/portal/mainPage.do

 

나이스 교육정보 개방 포털

OPEN API 활용신청 제공되는 데이터를 활용하기 위해 인증키를 발급 받으세요. 교육정보개방 소개 <!-- 2017.10.25 kty 정부3.0제거 교육부 정부 3.0 - 교육정보 개방 포털은 어떤 시스템인지 알아보세요.

open.neis.go.kr

교육통계서비스

https://kess.kedi.re.kr/index

 

 

유치원알리미

https://e-childschoolinfo.moe.go.kr/

 

유치원 알리미

유아 · 교직원 현황, 유치원 회계 현황, 환경위생 및 안전관리 사항 등 유치원의 주요 정보

e-childschoolinfo.moe.go.kr

학교알리미

https://www.schoolinfo.go.kr/Main.do

기본 준비

import numpy as np
import pandas as pd
import os

print(os.getcwd())
print(os.listdir(os.getcwd()))
print(os.listdir('./csv'))

 

 

csv 파일들은 편의를 위해 csv 폴더에 따로 모아두기

 

 

자료

 

https://www.data.go.kr/index.do

 

https://www.data.go.kr/data/15080794/fileData.do

 

 

전체출력

import csv
f = open('./csv/school in seoul.csv')
data = csv.reader(f)

for row in data:
    print(row)

 

카테고리 확인

import csv
f = open('./csv/school in seoul.csv')
data = csv.reader(f)

for row in data:
    a=0
    print(f"* 첫째 행 구성요소 : {row}")
    print(f"* 행 길이 : {len(row)}")
    for i in row:
        print(f"{a}번째 값 : {i}")
        a+=1
    break

 

 

Pandas를 활용하여 간단하게

import csv
import pandas as pd

f = open('./csv/school in seoul.csv')
data = csv.reader(f)

df = pd.read_csv('./csv/school in seoul.csv', encoding='cp949', index_col=0)
df

df = pd.read_csv('./csv/school in seoul.csv', encoding='cp949', index_col=0)

cp949 : 한글 표현하기 위함

index_col = 0 : 불필요한 인덱스 제거 역할


index_col = 0 입력

 

 

index_col  생략

 

원하는 정보(초, 중, 고 중에서 선택)만 골라서 출력

 

df.index.str.contains() 함수를 통해 데이터 프레임의 인덱스 문자열에 원하는 문자열이 포함된 행을 찾기

import csv
import pandas as pd

f = open('./csv/school in seoul.csv')
data = csv.reader(f)

df = pd.read_csv('./csv/school in seoul.csv', encoding='cp949', index_col=0)

name = input('초등학교, 중학교, 고등학교 중에서 선택')

a = df.index.str.contains(name)

df2 = df[a]

df2

 

df.index.str.contains(name)에는 True, False 값이 배열 형태로 저장

 

"초등학교" 입력 결과

 

초, 중, 고 갯수 확인

import csv
import pandas as pd

f = open('./csv/school in seoul.csv')
data = csv.reader(f)

df = pd.read_csv('./csv/school in seoul.csv', encoding='cp949', index_col=0)

df_cho = df[df.index.str.contains("초등학교")]
df_jung = df[df.index.str.contains("중학교")]
df_go = df[df.index.str.contains("고등학교")]

print(f"전체 학교 수 : {df.shape[0]}")
print(f"초등학교 수 : {df_cho.shape[0]}")
print(f"중학교 수 : {df_jung.shape[0]}")
print(f"고등학교 수 : {df_go.shape[0]}")

 

 

행 개수, 열 개수 확인

import csv
import pandas as pd

f = open('./csv/school in seoul.csv')
data = csv.reader(f)

df = pd.read_csv('./csv/school in seoul.csv', encoding='cp949', index_col=0)
df

print(f"행 개수 : {df.shape[0]} 열 개수 : {df.shape[1]}")

 

학교 종류 확인(리스트 타입)

import csv
import pandas as pd

f = open('./csv/school in seoul.csv')
data = csv.reader(f)

df = pd.read_csv('./csv/school in seoul.csv', encoding='cp949', index_col=0)

index_info = list(set(df.index.to_list()))
print(index_info)

 

학교 종류별 갯수 

import csv
import pandas as pd

f = open('./csv/school in seoul.csv')
data = csv.reader(f)

df = pd.read_csv('./csv/school in seoul.csv', encoding='cp949', index_col=0)

index_info = list(set(df.index.to_list()))

print(f" index_info {index_info}\n\n")

a=[]

for i in index_info:
    # 정확한 일치 개수를 세는 방식으로 변경
    count = (df.index==i).sum()
    print(f"{i}: {count}")
    a.append(count)

print('\n\n',a,'\n\n')

print(sum(a),'\n\n')

 

 

(df.index==i).sum() 코드 이해

 

시각화

import matplotlib.pyplot as plt

print(index_info)

print(a)

plt.rcParams['font.family'] ='Malgun Gothic'
plt.rcParams['axes.unicode_minus'] =False

plt.bar(index_info,a)
plt.xticks(rotation=90)
plt.tick_params(axis='x', direction='in', length=3, pad=6, labelsize=8, labelcolor='black')
plt.show()

 

 

 

한글 깨짐 방지 코드

plt.rcParams['font.family'] ='Malgun Gothic'
plt.rcParams['axes.unicode_minus'] =False

 

한 번에 끝내기

import numpy as np
import pandas as pd
import os
import csv
import matplotlib.pyplot as plt


f = open('./csv/school in seoul.csv')
data = csv.reader(f)

df = pd.read_csv('./csv/school in seoul.csv', encoding='cp949', index_col=0)

kind = list(set(df.index.to_list()))
print(f"학교 종류 확인\n {kind}\n")


numbers =[]

for i in kind:
    count = (df.index==i).sum()
    print(f"{i}: {count}")
    numbers.append(count)
#     print(df)
    

print(f"\n갯수 : {numbers}")
print("총 합계 :",sum(numbers),"\n")

plt.rcParams['font.family'] ='Malgun Gothic'
plt.rcParams['axes.unicode_minus'] =False

plt.bar(kind,numbers)
plt.xticks(rotation=90)
plt.tick_params(axis='x', direction='in', length=3, pad=6, labelsize=8, labelcolor='black')
plt.show()

 

인구 구조 시각화_행정안전부 인구 데이터

라이브러리 import & 현재 파일 경로 확인은 항상 기본적으로 하기!!

import numpy as np
import pandas as pd
import os

print(os.getcwd())
print(os.listdir(os.getcwd()))

 

csv 파일은 'age.csv' 이름으로 저장, 파일 내용 확인

import csv
f = open('age.csv')
data = csv.reader(f)

for row in data:
    print(row)

 

특정 데이터만 확인

import csv
f = open('age.csv')
data = csv.reader(f)
for row in data:
    if '신도림' in row[0]:
        print(row)

 

+ Recent posts