Python 을이용한기초통계분석 1. 통계학을위한 Python 모듈 1.1 numpy 패키지 - 고급데이터분석과수리계산을위한라이브러리를제공 - 아나콘다에기본적으로설치되어있음 (1) numpy가제공하는통계분석함수 import numpy as np print(dir(np)), 'max',, 'mean', 'median',, 'min',, 'percentile',, 'std',, 'var', (2) numpy 를이용한외부데이터불러오기 - 예제데이터 : cars Speed and Stopping Distances of Cars (M. Ezekiel), 변수 speed, dist cars 데이터 speed 4 4 7 24 24 25 dist 2 10 4 93 120 85 # 외부데이터불러오기 파일 import numpy as np data_file_name='e:/data/python/cars.txt' dat=np.genfromtxt(data_file_name,dtype='float32',skip_header=true) # skip_header=true 또는 skip_header=1 데이터의첫번째행이변수명일경우지정 print(np.shape(dat)) # np.shape(dat) 데이터객체의행과열을나타냄 speed=dat[:,1] 1
dist=dat[:,2] # 기초통계량구하기 len(speed) # 데이터의개수 np.mean(speed) # 평균 np.var(speed) # 분산 np.std(speed) # 표준편차 np.max(speed) # 최대값 np.min(speed) # 최소값 np.median(speed) # 중앙값 np.percentile(speed, 25) # 1사분위수 np.percentile(speed, 50) # 2사분위수 = 중앙값 np.percentile(speed, 75) # 3사분위수 np.percentile(speed, 42) # 42백분위수 (42%) (3) 난수생성 정규분포 import numpy as np r_norm_data=[] r_norm_data =np.random.normal(2,3,4) # np.random.normal(loc=0.0, scale=1.0, size=none) # loc: 평균, scale: 표준편차, size: 개수 print(r_norm_data) (4) 실습예제 X~B(10,0.7) 인이항분포 (binomial distribution) 를따르는난수 10개를생성하는 Python 프로그램을작성하시오. 2
1.2 matplotlib 패키지 - Python의시각화패키지 - line plot, scatter plot, contour plot, surface plot, bar chart, histogram, box plot, - matplotlib.pyplot 모듈 : matplotlib를사용할수있는함수들의모음 (1) 히스토그램과산점도 import numpy as np import matplotlib.pyplot as plt data_file_name='e:/data/python/cars.txt' dat=np.genfromtxt(data_file_name,dtype='float32',skip_header=true) speed=dat[:,1] dist=dat[:,2] plt.hist(speed) plt.show() plt.plot(speed,dist) plt.show() 3
plt.plot(speed, dist, c="r", lw=3, ls="-", marker="d", ms=10, mec="b", mew=3, mfc="w") plt.show() - plot arguments c: 선색깔 (blue b, green g, red r, cyan c, magenta m, yellow y, black k, white w, ) ls: 선형태 (- solid line style, -- dashed line style, -. dash-dot line style, _ marker: 데이터의위치를나타내는점 ( 마커 ) 의형태 (. point marker /, pixel marker / o circle marker / v triangle_down marker / ^ triangle_up marker / < triangle_left marker / > triangle_right marker / 1 tri_down marker / 2 tri_up marker / 3 tri_left marker / 4 tri_right marker / s square marker / p pentagon marker / * star marker / h hexagon1 marker / H hexagon2 marker / + plus marker / x x marker / D diamond marker / d thin_diamond marker, lw: 선굵기 ms: markersize, 마커크기 mec: markeredgecolor, 마커선색깔 mew: markeredgewidth, 마커선굵기 mfc: markerfacecolor, 마커내부색깔 (2) 표준정규분포를따르는난수생성후히스토그램그리기 import numpy as np import matplotlib.pyplot as plt mu=0 sigma = 1 # mean=0, standard deviation=1, 표준정규분포 s = np.random.normal(mu, sigma, 1000) plt.hist(s) 4
plt.show() plt.hist(s, 30) plt.show() plt.hist(s, 30, normed=true) plt.show() - 데이터정규화 (Normalization) [0,1] xx min (xx) max(xx) min (xx) (3) 실습예제 Iris 데이터 - Sepal.Length에대한히스토그램을출력하는프로그램을작성하시오. ( 계급의크기는 5개, 막대의색깔은검은색으로하시오.) 5
- Sepal.Length 와 Patal.Length 간의산점도를출력하는프로그램을작성하시오. ( 각점은연결되지 않게하고 X 축과 Y 축의제목을각각변수명으로출력되게하시오.) 1.3 pandas 패키지 - 데이터분석을제공하는라이브러리 - csv 파일등을데이터로읽고원하는데이터형식으로변환 (1) 웹상의데이터불러오기 target_url = ("http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data") # iris data를 pandas data frame 형식으로불러옴 iris_data = pd.read_csv(target_url,header=none, prefix="x") print(iris_data) print(iris_data.x4) summary = iris_data.describe() print(summary) Sepal_Length = list(iris_data.x0) print(sepal_length) (2) 데이터프레임 - 데이터프레임 (DataFrame): pandas 에서사용되는기본데이터 - 데이터프레임을정의할때는 2 차원리스트를매개변수로전달 a = pd.dataframe([ [10,20,30], [40,50,60], [70,80,90] ]) print(a) 6
# 1 차원데이터는 Series 를사용 import numpy as np s = pd.series([1.0, 3.0, 5.0, 7.0, 9.0]) print(s) # 자료형도함께출력됨 m = np.mean(s) print(m) (3) 원하는데이터추출 # 1 차원리스트의딕셔너리자료형으로부터키를이용하여원하는열의데이터출력 # 키, 몸무게, 유형데이터프레임생성하기 tbl = pd.dataframe({ "weight": [80.0, 70.4, 65.5, 45.9, 51.2], "height": [170, 180, 155, 143, 154], "type": [ "f", "n", "n", "t", "t"] }) # 몸무게목록추출하기 print(" 몸무게목록 ") print(tbl["weight"]) # 몸무게와키목록추출하기 7
print(" 몸무게와키목록 ") print(tbl[["weight","height"]]) # 원하는위치의값을추출할때는파이썬리스트처럼슬라이스를사용 tbl = pd.dataframe({ "weight": [80.0, 70.4, 65.5, 45.9, 51.2], "height": [170, 180, 155, 143, 154], "type": [ "f", "n", "n", "t", "t"] }) print("tbl[2:4]\n", tbl[2:4]) print("tbl[3:]\n", tbl[3:]) # 원하는조건추출 tbl = pd.dataframe({ "weight": [80.0, 70.4, 65.5, 45.9, 51.2, 72.5], "height": [170, 180, 155, 143, 154, 160], 8
"gender": [ "f", "m", "m", "f", "f","m"] }) print(" 몸무게와키목록 ") print(tbl[["weight","height"]]) print("--- height 가 160 이상인것 ") print(tbl[tbl.height >= 160]) print("--- gender 가 m 인것 ") print(tbl[tbl.gender == "m"]) # 정렬 tbl = pd.dataframe({ "weight": [80.0, 70.4, 65.5, 45.9, 51.2, 72.5], "height": [170, 180, 155, 143, 154, 160], "gender": ["f", "m", "m", "f", "f", "m"] }) print("--- 키로정렬 ") print(tbl.sort_values(by="height")) print("--- 몸무게로정렬 ") print(tbl.sort_values(by="weight", ascending=false)) 9
# 전치 tbl = pd.dataframe([ ["A", "B", "C"], ["D", "E", "F"], ["G", "H", "I"] ]) print(tbl) print("------") print(tbl.t) (4) 데이터조작 import numpy as np 10
# 10 개의 float32 자료형데이터생성 v = np.zeros(10, dtype=np.float32) print(v) # 연속된 10 개의 uint64 자료형데이터생성 v = np.arange(10, dtype=np.uint64) print(v) # v 값을 3 배하기 v *= 3 print(v) # v 의평균구하기 print(v.mean()) # 데이터정규화 # 키, 체중, 유형데이터프레임생성하기 tbl = pd.dataframe({ "weight": [80.0, 70.4, 65.5, 45.9, 51.2, 72.5], "height": [170, 180, 155, 143, 154, 160], "gender": ["f", "m", "m", "f", "f", "m"] }) # 키와몸무게정규화하기 # 최댓값과최솟값구하기 def norm(tbl, key): c = tbl[key] v_max = c.max() v_min = c.min() print(key, "=", v_min, "-", v_max) 11
tbl[key] = (c - v_min) / (v_max - v_min) norm(tbl, "weight") norm(tbl, "height") print(tbl) (5) numpy 로변환 머신러닝라이브러리중에서 pandas 의데이터프레임을지원하지않는경우 numpy 형식으로 변환하여사용하면됨 (6) 실습예제 - Japan credit 데이터를 pandas 데이터프레임으로불러와서각열 ( 변수 ) 에대한평균과 표준편차를구하시오. 12
- Japan credit 데이터를 pandas 데이터프레임으로불러와서각열 ( 변수 ) 에대한정규화및 표준화를수행하시오. ( 마지막열은제외 ) 1.4 추가적인패키지들 (1) sklearn - scikit-learn - 다양한데이터셋포함 - 데이터전처리, 지도 / 자율학습알고리즘및평가기법포함 (2) scipy // 사이파이 // - 과학기술계산지원 - 학습알고리즘및최적화기법제공 (3) statsmodels - 추정, 검정을포함한통계분석 (regression, time-series analysis, ) 제공 13
2. Python 회귀분석 2.1 Pandas 모듈이용 (1) 변수명이있는데이터 # csv 파일을가져옴 df = pd.read_csv("f:/data/python/csv_exam.csv") # 데이터의칼럼명을변경 # df.columns = ["num", "ban", "score1", "score2", "score3"] # 앞부분일부데이터보여줌 print(df.head()) # 회귀분석수행및결과 result = sm.ols(formula = 'science ~ math + english', data = df).fit() # 분석결과출력 print(result.summary()) (2) 변수명이없는데이터 # csv 파일을가져옴 df = pd.read_csv("f:/data/python/csv_exam2.csv",names=["id", "class", "math", "english", "science"]) # 앞부분일부데이터보여줌 print(df.head()) # 회귀분석수행및결과 result = sm.ols(formula = 'science ~ math + english', data = df).fit() # 분석결과출력 print(result.summary()) (3) 실습예제 14
- cars.txt 데이터를이용하여다음의회귀식을구하시오. dist = bb 0 + bb 1 ssssssssss - speed=21 일때 dist의예측값을구하시오. - speed (X축) 와 dist (Y축) 의산점도를그리시오. 15