책 [파이썬 라이브러리를 활용한 데이터 분석]

1. 파이썬 언어의 기본

(1) Jupyter Notebook

① np.random.randn()

>>> import numpy as np
    data = {i : np.random.randn() for i in range(7)}
    data    #표준정규분포에서 0을 기준으로 양쪽의 값이 랜덤하게 출력된다

>>> np.random.randn()

>>> np.random.randn(2,3)
>>> np.random.randn((2,3))
TypeError: 'tuple' object cannot be interpreted as an integer
  • 탭(tab) 자동완성
    셸에서 입력하는 동안 탭을 누르면 네임스페이스에서 입력한 내용과 맞는 변수(객체, 함수 등) 를 자동으로 맞춰준다

  • 자기관찰
    변수 이름 앞이나 뒤에 '?'를 붙이면 그 객체에 대한 일반 정보를 출력해준다

>>> print?
Docstring:
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file:  a file-like object (stream); defaults to the current sys.stdout.
sep:   string inserted between values, default a space.
end:   string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
Type:      builtin_function_or_method

② 주석 처리하기

>>> def add(a, b, c = 10):
    return a + b + c
>>> add(1, 2)
13

>>> #이것은 한줄 주석 입니다

    '''
    이것은
    여러줄
    주석
    입니다
    '''
    
    print("hello")
hello

>>> def add(a, b, c = 10):
        '''
        이것은
        여러줄
        주석
        입니다
        '''
        return a + b + c
>>> add?
Signature: add(a, b, c=10)
Docstring:
이것은
여러줄
주석
입니다
File:      c:\users\admin\appdata\local\temp\ipykernel_7068\1860594879.py
Type:      function
  • 실행 중인 코드 중지하기
    코드가 실행되고 있는 중간에 'Ctrl-C' 를 누르면 KeyboardInterrupt 예외를 발생시킨다
    이 예외는 거의 모든 파이썬 프로그램을 즉시 멈추도록 한다

③ 매직 명령어 : 앞에 '%' 기호를 붙여 사용한다

예) %timeit : 코드가 실행된 시간을 측정하고 싶을 때 사용

>>> import timeit
>>> a = np.random.randn(100,100)
	%timeit np.dot(a,a)    #np.dot() : 곱셈
70.6 µs ± 717 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

(2) Python

  • 모든 것은 객체
    파이썬에서는 모든 것을 '객체'로 만들어 처리한다
    모든 숫자, 문자열, 자료구조, 함수, 클래스, 모듈 등은 파이썬 인터프리터에서 '파이썬 객체' 라고 하는 어떤 '상자' 안에 저장된다
    각 객체는 연관된 자료형(문자열, 함수 등)과 내부 데이터를 갖고 있다

  • 함수 마저도 하나의 객체로 간주한다
    -> map(함수이름, 리스트) 에서의 '함수이름'과 '리스트'는 모두 '객체'이다 (즉 동급이라는 것)
    -> f = lambda x: x*2 람다함수를 'f'라는 이름의 객체로 저장한 것

  • 동적 참조
    동적 : dynamic, 그때그때 필요할 때
    예) 지역변수(instance) : 필요할 때만 만들어져 사용되고, 그 후에는 사라진다
    정적 : static, 항상
    예) 전역변수(glob) : 항상 존재

* 덕 타이핑 사고방식

객체의 자료형에는 관심이 없고, 그 객체가 '어떤 메서드나 행동을 지원하는지만' 알고 싶을 때
'만일 오리처럼 걷고 오리처럼 꽥꽥 운다면 그것은 오리다' 라는 의미

① iterable : 순회 가능한

거의 대부분의 자료형이 해당 (str, list, tuple, dictionary, set ..),
for 문에 넣을 수 있는 것
int형은 iterable 하지 않다
iter()로 여부를 판단할 수 있다

>>> a = [1,2,3]
    for i in 'a string':
        print(i)
a
 
s
t
r
i
n
g    #리스트 a 는 iterable 하다

>>> for i in 234:
    	print(i)
TypeError: 'int' object is not iterable        

>>> iter('234')
<str_iterator at 0x24162683b50>

>>> iter(234)
TypeError: 'int' object is not iterable

#집합(set)도 iterable 하다
>>> for i in set([2,3,4]):
    	print(i)
2
3
4        

>>> set([2,3,4])
{2, 3, 4}

② muterable : 수정 가능한 (객체나 값의 내용을 바꿀 수 있다)

거의 대부분의 자료형이 해당 (list, dictionary, Numpy array ..)
tuple, str, int형은 muterable 하지 않다 (immuterable)

>>> a = (1, 2)
	a[0]
1

>>> a[0] = 10
TypeError: 'tuple' object does not support item assignment

>>> b = "Hello"
	b[0] = 'h'
TypeError: 'str' object does not support item assignment    

>>> c = 123
	c[0]    
TypeError: 'int' object is not subscriptable
#숫자는 인덱싱이 되지 않는다

* None

파이썬에서 사용하는 Null 값 이다 (값이 없는 것)
None은 예약어가 아니라 NoneType의 유일한 인스턴스이다

>>> type(None)
NoneType

>>> def test():
    	return 1
>>> test()
1

>>> a = test()
	type(a)
int

>>> def test():
		print(1)
>>> test()
1

>>> a = test()
	type(a)
1
NoneType

* datetime 모듈

파이썬에서 모듈은 간단히 파이썬 코드가 담긴 '.py' 파일이다
모듈 임포트 -> import .py파일명

>>> import time
>>> time.time()
>>> time.localtime()
>>> time.localtime().tm_mon

>>> import datetime
>>> dt = datetime.datetime.now()
	dt
datetime.datetime(2022, 9, 20, 11, 50, 58, 541405)    

>>> dt.year
>>> dt.month

>>> today = datetime.datetime.now()
	christmas = datetime.datetime(2022, 12, 25)
	christmas
    
>>> christmas - today    #datetime은 연산이 가능하다    
datetime.timedelta(days=95, seconds=43741, microseconds=458595)

>>> type(christmas - today)
datetime.timedelta

책 [Do it! 쉽게 배우는 파이터 데이터 분석]

1. 패키지(라이브러리) 이해하기

(1) seaborn의 titanic 데이터로 그래프 만들기 (p.66)

seaborn 패키지에 들어있는 titanic 데이터로 그래프를 만들어보자

#seaborn의 load_dataset()으로 titanic 불러오기
#seaborn : 그림을 그려준다
>>> import seaborn as sns
    df = sns.load_dataset('titanic')
    df
    
#countplot() : 빈도 막대 그래프, 변수는 1개 사용
>>> sns.countplot(data = df, x = "sex")

>>> df.columns
>>> df.info()
#Dtype의 object : 'str' 을 의미(chr), category : 'factor'를 의미

>>> sns.countplot(data = df, x = 'class')
>>> sns.countplot(data = df, x = 'class', hue = 'alive') #범례가 만들어진다

#칼럼의 이름 조회
>>> df[['class', 'alive']]

#축 바꾸기
>>> sns.countplot(data = df, y = 'class', hue = 'alive')

(2) 모듈 알아보기 (p.69~)

#pydataset 패키지 설치하기
>>> pip list | findstr py
>>> pip install pydataset
>>> import pydataset

#pydataset의 data()함수를 이용해 pydataset 패키지에 들어있는 dataset 목록 출력
>>> pydataset.data()

#머신러닝 모델을 만들 때 사용하는 sklearn 패키지 설치
>>> pip list | findstr sci

#sklearn 패키지의 metrics 모듈 로드하기
>>> import sklearn.metrics

2. 데이터 프레임

(1) 데이터 입력해 데이터 프레임 만들기 (p.81~)

#pandas는 입력을 위한 것이 아니라, '분석' 을 위한 것이다
#데이터를 가공할 때 사용하는 패키지 이다
>>> import pandas as pd

>>> pd.DataFrame([1,2,3,4])
>>> pd.DataFrame([[1,2,3,4], ['a','b','c','d']])

#딕셔너리로도 데이터 프레임을 만들 수 있다
#key 부분이 칼럼의 이름이 된다
>>> pd.DataFrame({'name' : ['김지훈','이유진','박동현','김민지'],
                  'english' : [90,80,60,70],
                  'math' : [50,60,100,20]})
                  
>>> df = pd.DataFrame({'name' : ['김지훈','이유진','박동현','김민지'],
                  'english' : [90,80,60,70],
                  'math' : [50,60,100,20]})                  

>>> df['english']
#정식표가 아닌, 1차원 자료가 만들어진다 -> 'serise'

>>> df[['english', 'math']]
#2차원 자료 -> 'dataframe'
#바깥쪽 대괄호는 접근을 위함이고, 안쪽 대괄호는 두개를 묶어주기 위함

>>> df[['english']]

(2) 엑셀파일 불러오기 (p.85~)

>>> pwd    #현재 디렉토리 확인
>>> pd.read_excel("excel_exam.xlsx")
>>> exam = pd.read_excel("excel_exam.xlsx")
	exam.head()
    
#수학 평균 구하기 - 칼럼별로 접근해서 평균을 구할 수 있다
>>> exam['math']
	sum(exam['math']) / len(exam['math'])    

>>> import numpy as np
	np.mean(exam['math'])

>>> np.mean(exam)
	np.mean(exam, axis = 0)    #칼럼별 평균값을 한눈에 볼수있다

(3) CSV 파일 불러오기 (p.90~)

파일 저장 : 객체명.to_csv("파일명.csv")
파일 읽기 : pd.read_csv("파일명.csv")

#먼저 읽었던 엑셀파일을 이용해 csv 파일로 저장
>>> exam.to_csv("csv_exam.csv")
>>> pd.read_csv("csv_exam.csv")

#맨 앞의 'Unnamed: 0' 주석이 신경쓰인다면
>>> pd.read_csv("csv_exam.csv").[ : , 1: ]
SyntaxError: invalid syntax

#pandas에서는 데이터 프레임을 슬라이싱 할 때 인덱스 괄호 앞에 loc 또는 iloc 를 적어준다
>>> exam = pd.read_csv("csv_exam.csv").iloc[ : , 1: ]
	exam.head()
    
#인덱스 번호 제외하기 -> to_csv()에 'index = False'를 입력한다
#'index = False' : 인덱스 번호를 저장하지 않겠다
>>> exam = pd.read_excel("excel_exam.xlsx")
	exam.to_csv("csv_excel.csv", index = False)
	pd.read_csv("csv_excel.csv")
    
>>> exam.to_excel("csv_excel.xlsx", index = False)    

* loc와 iloc

loc
데이터 프레임의 행이나 칼럼에 'label' 이나 'boolen array' 로 접근
location의 약자로, 인간이 읽을 수 있는 label 값으로 데이터에 접근하는 것

iloc
데이터 프레임의 행이나 칼럼에 '인덱스 값' 으로 접근
integer location의 약어로, 컴퓨터가 읽을 수 있는 indexing 값으로 데이터에 접근하는 것


3. 데이터 분석 기초

(1) 데이터 파악하기 (p.99~)

#요약(summary) -> describe() : 요약 통계량 구하기
>>> exam.describe()

#info() : 변수 속성 파악하기
>>> exam.info()

(2) 함수와 메서드의 차이

* 내장함수

가장 기본적인 함수 형태
함수 이름과 괄호를 입력하여 사용한다
파이썬에 내장되어 있으므로 별도로 패키지를 설치하거나 불러올 필요가 없다
예) sum(), max() ...

* 패키지 함수

패키지 이름을 먼저 입력한 다음 점을 찍고 함수 이름과 괄호를 입력하여 사용한다
패키지를 로드해야 사용할 수 있다
예)

>>> import pandas as pd
>>> pd.read_csv('exam.csv')
>>> pd.DataFrame({'x' : [1,2,3]})

* 메서드

변수가 지니고 있는 함수
변수명 입력 후 점을 찍고 메서드 이름과 괄호를 입력하여 사용한다
예) df.head(), df.info() ...

메서드는 모든 변수에 사용할 수 있는 것이 아니다
변수의 자료 구조에 따라 사용할 수 있는 메서드가 다르다

head()는 데이터 프레임에 들어있는 메서드 이다. 따라서 리스트에는 사용할 수 없다

>>> df = pd.read_csv('exam.csv')
>>> df.head()

>>> var = [1,2,3]
>>> var.head()
AttributeError: 'list' object has no attribute 'head'

변수의 자료구조는 type()을 이용하면 알 수 있다

* attribute

변수가 지니고 있는 값을 의미한다
어트리뷰트를 출력하려면 변수명 뒤에 점을 찍고 어트리뷰트 이름을 입력하면 된다
어트리뷰트는 메서드와 마찬가지로 변수가 지니고 있으므로 변수명 뒤에 점을 찍고 입력한다
메서드와 달리 괄호는 입력하지 않는다
괄호가 있으면 메서드, 없으면 어트리뷰트라고 생각하면 된다
예) df.shape ...

메서드와 마찬가지로 변수의 자료 구조에 따라 지니고 있는 어트리뷰트가 다르다
shape는 데이터 프레임인 변수가 지니고 있는 어트리뷰트로, 리스트에는 사용할 수 없다

(3) 변수명 바꾸기 (p.113~)

df.rename() : pandas 에서 제공하는 함수
exam.rename() : 메서드

#'english'를 'eng'로 바꾼다
>>> exam.rename({'english' : 'eng'}, axis = 1)

#다른 방법
>>> exam.rename(columns = {'english' : 'eng'})

>>> exam

#english -> eng, science -> sci 로 바꾸기
>>> exam.rename(columns = {'english':'eng', 'science':'sci'})

#'inplace = True' -> 변경된 것을 저장해줌
>>> exam.rename(columns = {'english':'eng', 'science':'sci'}, inplace = True)
	exam

#데이터 프레임 복사본 만들기
>>> ex = exam.copy()

(4) 파생 변수 만들기 (p.116~)

>>> exam.head()

>>> exam['total'] = exam['math'] + exam['eng'] + exam['sci']
	exam
    
>>> exam['mean'] = exam['total'] / 3
	exam

#조건문을 활용해 파생변수 만들기
>>> exam['P/F'] = np.where(exam['mean'] > 70, 'P', 'F')
	exam

* mpg 통합 연비 변수 만들기

>>> import pydataset

>>> mpg = pydataset.data("mpg")
	mpg.head()    
>>> mpg.info()    

#countplot 으로 drv 칼럼 그려보기
>>> import seaborn as sns
#sns.countplot 를 사용할 때는 'data = '를 꼭 먼저 써주자
>>> sns.countplot(data = mpg, x = 'drv')

#drv 칼럼을 cyl 별로 그려보기 (cyl는 int)
>>> sns.countplot(data = mpg, x = 'drv', hue = 'cyl')
#hue : R에서의 'color' 역할 (color -> 색깔, hue -> 색상(보다 더 전문적인 개념))

#mpg에 total열을 만들기 (total = cty와 hwy 합의 평균)
>>> mpg['total'] = (mpg['cty'] + mpg['hwy']) / 2
	mpg.head()
    
#total의 최대값과 최소값
>>> print(np.max(mpg['total']))
	print(np.min(mpg['total']))

(5) 시각화

① seaborn (보다 더 간단하여 권장하는 방식)
② matplotib

>>> mpg['total']

#seaborn
>>> sns.histplot(data = mpg, x = 'total', bins = 7)

#matplotib
>>> mpg['total'].plot()
>>> mpg['total'].plot(kind = 'line')
>>> mpg['total'].plot.line()

>>> mpg['total'].plot(kind = 'hist')
>>> mpg['total'].plot.hist()

#mpg['total']이 20 이상이면 'pass', 아니면 'fail'일 칼럼이름 test를 만들자
>>> mpg['test'] = np.where(mpg['total'] >= 20, 'pass', 'fail')
	mpg.head()
    
#mpg['test'] 칼럼에서 'pass'와 'fail'의 빈도수는?
#'R'에서의 c() -> 'pandas' 에서는 [ ]
#'R'에서의 table() -> 'pandas' 에서는 value_counts()
>>> mpg['test'].value_counts()   #빈도표가 만들어진다
#mpg['test'].value_counts() 의 결과가 'Name: test, dtype: int64' 으로
나오는 것으로 보아 'mpg['test'].value_counts()' 는 데이터 프레임이 아님을 알 수 있다

>>> text = mpg['test'].value_counts()
	text.plot(kind = 'bar')
>>> text.plot(kind = 'barh')

#'rot = 0' : 축 이름 수평으로 만들기
>>> text.plot(kind = 'bar', rot = 0)

#sns 로 2차원 그래프 나타내기
>>> df1 = pd.DataFrame(mpg['test'].value_counts())
	df1   #칼럼이 1개 이다
    
>>> df2 = df1.reset_index()
	df2
    
>>> sns.barplot(data = df2, x = 'index', y = 'test')    
  • df.value_counts()를 이용하여 빈도수를 파악한 후 시각화를 하는 것도 좋지만 sns.countplot()로 표현하는 것이 더 간단하고 좋다

(6) 중첩 조건문 활용하기

#mpg['grade'] 칼럼을 만들자
#조건 : mpg['total']이 30 이상이면 'A', 20 이상이면 'B', 나머지 'C'
>>> mpg['grade'] = np.where(mpg['total'] >= 30, 'A',
np.where(mpg['total'] >= 20, 'B', 'C'))
	mpg.head()

#'A', 'B', 'C'의 빈도수는?
>>> mpg['grade'].value_counts()
#value_counts() 는 1개의 serise에 대해서 count 해준다

#'A', 'B', 'C'의 빈도수를 막대 그래프로
>>> grade = mpg['grade'].value_counts()
	grade.plot(kind = 'bar', rot = 0)
    
#알파벳 순으로 정렬하기 ('sort_index()' : index를 기준으로 sorting)
>>> grade = mpg['grade'].value_counts().sort_index()
	grade.plot(kind = 'bar', rot = 0)    

0개의 댓글