Be Brave, Be Humble

빅데이터 분석기사 실기 Part2. 파이썬에 발 담그기 (프리렉) 본문

Statistics/Data Science

빅데이터 분석기사 실기 Part2. 파이썬에 발 담그기 (프리렉)

해쨔니 2022. 10. 25. 17:13

Open in Colab 누르면 코랩으로 이동 가능

 

과거의 나는 왜 스파이더로 작성했을까요.. 왜..

한 블럭 안에 들어가서 가독성 제로인 점 양해를.. ㅠ 

In [ ]:
# -*- coding: utf-8 -*-
"""
Created on Mon Jun  6 22:08:36 2022

@author: FullSun

"""

###############################################
########### Part2. 파이썬에 발 담그기 ###########
###############################################

#---------------------------------------------
#           1. 너무 쉬운 파이썬
#---------------------------------------------

#--------- <1.3> 내 안에 모든 것을 저장하기 : 데이터 타입, 변수 ---------#

if 2 > 1:
    print('맞습니다')

type(123)
type('123')
type(123.0)

### [1] 독자적인 그릇: 기본 데이터 타입
#1) bool
# bool: 0이 아닌 숫자나 문자는 모두 True
type(False)
type(True)
bool(1) #True
bool('123') #True
bool(0) #False

#2) integer
# 양수, 0, 음수
type(500)
type(0)
type(-1000)
int(-3.2) #소수점 버림 -> 3
int(3.2) 
int(3.5) 
int(3.7) 
int(True) #1

#3) float
type(3.2)
1e8 #1x10^8
type(1e8)
123.e-06
float(0)
float(True) #1.0

#4) string
'I Love FullSun'
"""I
Love
FullSun"""
str(True)
str(123)


##### [2] 함께하는 그릇: 응용 데이터 타입
# 1) tuple
''' 2개 이상의 데이터가 포함된 데이터 타입.
    수정, 추가, 삭제 불가능. '''
mountain = ('한라산', '지리산', '설악산', '북한산')
mountain
type(mountain)
mountain[0]
mountain[-1]
mountain[-4]

# 2) list
''' 2개 이상의 데이터를 포함하는 데이터 타입.
    튜플보다 자유로움. 수정, 삭제, 추가 가능
    slicing -> [시작 : 마지막+1] '''
mountain = ['한라산', '지리산', '설악산', '북한산']
mountain
type(mountain)
mountain[1]
mountain[-1]
mountain[0:1]    
mountain[0:2]
mountain[:]
mountain[-1:-3] #빈 리스트 출력
mountain[-3:-1] #['지리산', '설악산']
mountain+mountain
mountain*3
mountain[2] = '설악산~' #원소 변경
del mountain[2] #원소 삭제
mountain.append('태백산') #원소 추가
mountain.insert(2, '설악산') #데이터 끼워넣기 insert 
mountain.insert(0, '태백산') #중복 데이터도 삽입 가능
mountain.count('태백산') #태백산이 몇 개 있는지
mountain.remove('태백산') #중복 데이터 중 가장 앞의 데이터만 삭제
mountain.pop() #마지막에 있는 값 삭제
mountain.sort() #오름차순 정렬
len(mountain)

# 3) dictionary
NCT = { '드림' : '해찬',
       '원투세븐' : '도영',
       '유' : '재현',
       '슈퍼엠' : '마크' }
type(NCT)
NCT #딕셔너리에서 각각은 독립이기 때문에 순서는 의미 없음
NCT['드림']
NCT['유']
NCT['웨이븨'] = '샤오쥔' #새로운 쌍 추가
NCT
NCT['웨이븨'] = '윈윈' #같은 키값으로 설정하면 덮어쓰워짐
NCT
NCT['유'] = '태용'
del NCT['웨이븨']
del NCT['드림']
NCT
NCT['드림'] = '이동혁'
NCT

# 4) 집합set
''' 튜플, 리스트, 딕셔너리와 같이 다수의 숫자 or 문자를 포함.
    중복된 데이터가 없고, 데이터간 순서 없음 '''
헬로우 = set("hello")
헬로우 #중복 허용하지 않기 때문에 l은 한 번만 들어가며 순서도 재정렬 됨
하이 = set('hi')
하이
헬로우.intersection(하이) #교집합
헬로우 & 하이 #교집합
헬로우.union(하이) #합집합
헬로우|하이 #합집합
헬로우-하이 #차집합
하이-헬로우 #차집합 (연산 순서에 영향 받음)
헬로우.add('!') #원소 추가
헬로우.update(['w','o','w']) #여러 문자열 한번에 추가
헬로우.add(2)
헬로우.remove(2)

#--------- <1.4> 이거해라 저거해라 ---------#
##### [1] 산술 공부하기: 산술 연산자
2//5 #2를 5로 나눈 몫
5//2
2%5 #2를 5로 나눈 나머지
5%2
2**5 #2^5

##### [2] 누가누가 더 클까?: 비교 연산자
# >, <, >=, <=, ==, !=


##### [3] 논리적으로 질문하기: 논리 연산자


##### ~날아감...##### 

#---------------------------------------------
#        2. 파이썬의 잠재력 활용하기
#---------------------------------------------

#--------- <2.1> 내 생각을 그대로 보여주기: if/elif/else/in/lambda ---------#

##### [1] 만약 ~하다면: If문
##### [2] ~하는 동안에: for문
NCT = ['해찬','도영', '재현', '태일']
for i in NCT:
    print(i)

for i in NCT:
    if i == '재현':
        break #재현이면 for문 탈출
    print(i)

for i in NCT:
    if i == '재현':
        continue #재현이면 아래 명령어 실행하지 않고 for문으로 돌아가기
    print(i)

##### [3] ~하는 동안에 2탄: while문
num = 0
while num < 10:
    num = num + 1
    print(num)

num = 0
while num < 10:
    print(num)
    num = num + 1
else:
    print("Finish")

    
##### [4] 나만의 코드: 함수(function)
''' 내장함수: 별도의 import필요X
    외장함수: import 필요
    사용자정의함수: def키워드로 작성 '''
#외장함수
import random
random.random()    

def plus (num1, num2):
    print(num1+num2)
plus(1,2)

def who (): #parameter는 필수 아님
    print("It's Full-Sun")
who()

def squared (num):
    print(num*num)
squared(10)
xx = squared(10)
xx #squared는 단순히 print만 하고 끝나기 때문에 xx에 아무런 값도 저장되지 않음. return 사용할 것

def squared3(num):
    return(num*num*num)
squared3(10)
xx = squared3(10)
xx

#--------- <2.2> 라이브러리 활용하기 ---------#

##### [1] pandas: 2차원 데이터로 놀기
## 판다스 데이터 타입 알아보기
''' 행렬로 구성된 1, 2차원 데이터를 가공하는 라이브러리.
    판다스 전용 데이터타입: Series(시리즈), DataFrame(데이터프레임)
        -Series: 1차원 데이터 타입. 각 데이터의 행에는 index라는 기본값 존재.
                (그냥 일반적인 col 1개짜리 DF 생각하면 될 듯)
        -DataFrame: 2차원 데이터 타입. row방향의 인덱스와 column으로 구성.
        
    분석 대상을 판다스로 가공하고자 한다면 pd.Series(), pd.DataFrame()으로 변환 필요.'''
import pandas as pd
NCT = ['해찬','도영', '재현', '태일']
NCT_seires = pd.Series(NCT)
type(NCT_seires)
NCT_seires #인덱스와 데이터로 구성되며, 인덱스는 0부터 시작.

import pandas as pd
NCT = ( ['해찬', 23, 'dream&127'], ['도영', 27, '127'],
        ['재현', 26, '127'], ['태일', 29, '127'])
NCT
type(NCT) #tuple
NCT_DF = pd.DataFrame(NCT)
NCT_DF
type(NCT_DF)

#인덱스 변경하기
NCT_DF.index = ['1번', '2번', '3번', '4번']
NCT_DF
#col_name 변경하기
NCT_DF.columns = ['이름', '나이', '유닛']
NCT_DF

## 일부 열 값을 뽑기: []
NCT_DF['나이']
NCT_DF[['이름', '나이']] #두 개 이상 추출하려면 대괄호로 묶기

## 일부 행 추출하기: []
NCT_DF[1:3] # 1,2번째 행 추출 >>끝-1<< !!!!
NCT_DF['2번':'3번']
#인덱스 이름 사용해서 행 추출 -> loc
NCT_DF.loc['1번'] #행 추출
NCT_DF.loc[['1번','2번']] #두 개 이상 추출하려면 대괄호로 묶기
NCT_DF.loc['1번':'3번'] #슬라이싱 기능 사용 가능
#인덱스 number 사용해서 행 추출 -> iloc
NCT_DF.iloc[0]
NCT_DF.iloc[0:3] 

# + 행과 열 한번에 추출하기
''' 1) .loc[인덱스, 컬럼]
    2) .iloc[행 번호, 열 번호] '''
NCT_DF.loc['1번', ['이름', '나이']]
NCT_DF.iloc[0:3, 0:2]
NCT_DF.iloc[:3, :]

## 파일 읽고 쓰기: read_csv, to_csv
# 제 2유형은 데이터 파일이 CSV로 주어짐.
import pandas as pd
data = pd.read_csv("경로") #데이터 import
data.to_csv("경로") #데이터 export
pd.read("경로") #데이터 읽기


##### [2] sklearn: 진짜 머신러닝 하기
''' sklearn은 머신러닝 수행하는 라이브러리로 풀네임은 scikit-learn(사이킷런)
    데이터 전처리(preprocessing)-데이터 변환-모델 선택-검증 수행
    
    -주요 모듈과 내부 함수 
    *preprocessing모듈: StandardScaler/ MinMaxScaler/ RobustScaler/ OneHotEncoder/ LabelEncoder...
    *model_selection모듈: train_test_split/ cross_validation/ learning_curve/ validation_curve/ Grid_searchCV ...
    *linear_model모듈: LogisticRegression/ Perceptron ...
    *tree모듈: DecisionTreeClassifier/ DecisionTreeRegressor ...

    사용법: from sklearn.모듈 import 함수 '''

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier    

##### [3] numpy: 수학 계산하기
''' numpy는 벡터, 행렬 등 수치 연산을 수행하는 선형대수 라이브러리. '''
import numpy as np
np.zeros((2,3)) #2행3열
type(np.zeros((2,3))) #numpy.ndarray
np.ones((3,4))
np.full((2,3), 10) #10으로 채워진 2x3행렬
np.array(range(20)) #0부터 20개 숫자 만들기
np.array(range(20)).reshape(4,5) #4x5행렬로 reshape
np.array((4,5), np.nan)

# + nan 행렬 만들기
a = np.empty((3,3,))
a.fill(np.nan)


#--------- <2.3> 유용한 내장 함수 활용하기 ---------#
import pandas as pd
import numpy as np

data = {
        'age' : [20, 23, 49, 38, 32, 29, 25, 30, 32, 26],
        'gender' : ['남', '여', '남', '여', '여', '여', '여', '여', '남', np.nan]
         }
type(data) #dict
len(data['age'])
len(data['gender'])
data = pd.DataFrame(data)
data
type(data)

##### [1] 숫자를 계산하는 함수

## 합계 구하기: sum
data.iloc[:, 0].sum()
sum(data.iloc[:, 0])

## 최댓값 구하기: max
data.iloc[:, 0].max()
max(data.iloc[:, 0])

## 평균값 구하기: mean
data.iloc[:, 0].mean()

## 분산 구하기: var
data.iloc[:, 0].var()

## 표준편차 구하기: std
data.iloc[:, 0].std()

## 중앙값 구하기: median
data.iloc[:, 0].median()

## 사분위수 구하기: quantile
data.quantile(0.25) #1사분위
data.quantile(0.75) #3사분위
data.iloc[:, 0].quantile(0.75)
data.quantile((0.25, 0.75)) #1, 3사분위

## 거듭제곱 구하기: pow
pow( data.iloc[:, 0], 3 )  #나이 열의 세제곱

## 반올림 구하기: round
#parameter는 몇 번째 자리까지 표현할 지를 나타냄
round(123.456, 2)  #123.46
round(123.456, 1) #123.5
round(data['age']/7, 2) #age열을 셋째 자리에서 반올림

# + 올림, 내림 함수
import math
math.ceil(123.456) #올림. 124
math.floor(123.456)  #버림. 123


##### [2] 겉모습을 살피는 함수

## 모양 구하기: shape
data.shape
data['age'].shape
len(data['age']) #.shape과 같은 결과

## 길이 구하기: len
len(data) #10
len('Superhuman')
len('12345678')
len(123) #TypeError: object of type 'int' has no len()
len(str(123)) #문자열로 변경해서 구해야함

## 크기 구하기: size
#변수 안에 들어있는 값들의 개수 출력. 즉, 데이터의 양
data.size #10행 2열이므로 20개의 데이터가 있음

## 상위 데이터 가져오기: head
data.head()
data.head(3)

## 하위 데이터 가져오기: tail
data.tail()

## 열 이름 구하기: columns
data.columns

## 행 이름 구하기: index
data.index #RangeIndex(start=0, stop=10, step=1) => 0부터 9까지 


##### [3] 데이터 요약 관련 함수

## 값의 개수 세기: value_counts
data['gender'].value_counts()

## 중복 제거하기: unique
data['gender'].unique() #array(['남', '여', nan], dtype=object)

## null 여부 확인하기: isnull
data.isnull()
data['gender'].isnull()
data['gender'].isnull().sum()
sum(data['gender'].isnull())

## 개수 세기: count
# nan인 값은 제외함
data.count() #age=10, gender=9로 조회 됨.
'Be brave, Be humble'.count('B') #대소문자 구별X

## 정보 조회하기: info
# 데이터의 구조, null 수, 데이터 타입, 인덱스, 열이름 조회
data.info()

## 데이터 표현하기: describe
# n, mean, std, min, max, quantile
data.describe() # 연속형 변수에 대해서만 출력함


##### [4] 데이터 변형 관련 함수

## 열과 행 위치 바꾸기: transpose, T
data.transpose()
data.T

## 행/열 이름으로 데이터 가져오기: loc
''' row: df.loc['행 이름']
    col: df.loc[:, '열 이름']
    row&col: df.loc['행 이름', '열 이름'] '''
data.loc[3]  #index=3인 값 확인
data.loc[3:7] #index=3인 값부터 index=7행    >>index이름으로 조회하는 거라 -1 없음<< 
data.loc[:,'gender']
data.loc[:, ['gender', 'age']]

data.loc[data['gender'] == '남'] # 남자인 행 추출
data.loc[data['gender'] == '여']

## 행/열 위치값으로 데이터 가져오기: iloc
data.iloc[3] #행 위치가 3인 값
data.iloc[4:8]
data.iloc[4:8, 1] # 4부터 7까지!! >>index num으로 조회하는 거라 -1 !! <<
data.iloc[:, 1]
data.iloc[:, 0:2] # 0부터 1열까지!! 

## 값을 정렬하기: sort_values
data.sort_values('age') #default=ascending
data.sort_values('age', ascending=False)
data.sort_values(['age', 'gender']) #앞에 나열한 변수 순서대로 sort

## 결측치 메꾸기: fillna
''' ** R은 NA와 Null을 구분하지만, Python은 구분없이 NaN으로 통일'''
data['gender2'] = data['gender'].fillna('남') #결측치를 '남'으로 메꾼 gender2 변수 생성

## 결측치 삭제하기: dropna
data2 = data.dropna()
data2 # NaN 존재하는 열 삭제

## 행/열 제거하기: drop
data.drop(index = [0, 2, 4, 6, 8]) #행 삭제
data.drop(columns = ['gender']) #열 삭제 

## 값 바꾸기: replace
# gender2 변수를 생성해서 여/남 -> F/M 으로 교체하기
data['gender2'] = data['gender'].replace('여', 'F').replace('남', 'M')
data
Comments