기본 문법¶
생성¶
- 기본 객체
- 리스트(list): []
- 튜플(tuple): ()
※ 원소가 1개인 튜플 생성시 쉼표 잊지 말것. - 딕셔너리(dictionary): {"key1": [value1], "key2": [value2]
- range(): 0부터 시작하는 수열을 생성하며 반복문 등에 활용
- NumPy
- 어레이(array): 기본 행렬 연산을 지원
※ np.array([1, 2, 3]), np.array([[1, 2], [3, 4]]) - np.arange(): 시작과 끝을 지정가능한 등차수열 생성 가능
- np.r[]: 이산, 연속 수열 생성 가능
※ np.r[1, 2, 3:6]
- 어레이(array): 기본 행렬 연산을 지원
- Pandas
- 시리즈(Series): Pandas의 기본 객체이며 1차원 ※ pd.Series([1, 2, 3])
- 데이터프레임(DataFrame): 원소의 개수가 같은 시리즈를 묶은 2차원 객채 ※ pd.DataFrame({"key1": [value1], "key2": [value2]})
데이터 읽어오기¶
- pandas 활용
- csv: pd.read_csv()
- txt: pd.read_csv("file_name.txt", sep = ";")
※ \t, # 등등 - excel: pd.read_excel()
데이터 확인하기¶
- 기본 함수
- type(): 객체의 속성 확인
- type(): 객체의 속성 확인
- pandas 활용(객체명: df)
- df.head(): 첫 5개 row 출력
- df.tail(): 마지막 5개 row를 출력
- df.ndim: 객체의 차원
- df.shape: 객체의 각 차원 길이(pd.DataFrame의 경우 row, column)
객체 알아보기¶
- 기본 함수
- set(): 중복 제거(unique)
- len(): 1차원 객체의 길이(pd.Series는 원소 개수, pd.DataFrame은 row 개수)
데이터 전처리¶
연산¶
- 연산자 활용
- 사칙연산: +. -. *, /
- 지수: 2 ** 3
- 몫/나머지: //, %
- 할당: =
- 리스트 병합: +
- 텍스트 붙이기: +
- 인덱스 역순: -
※ 리스트 listt가 있을 경우, listt[-1]을 하면 마지막 원소 선택 가능
- 기본 함수
- sum(): 합계
- max(): 최대값
- min(): 최소값
- NumPy
- np.where(): 엑셀의 if함수와 유사하며, 더미 변수 생성시 활용가능
※ np.where(조건, True일 경우 출력, False일 경우 출력)
- np.where(): 엑셀의 if함수와 유사하며, 더미 변수 생성시 활용가능
속성 변환¶
- 기본함수
- int(): 정수(integer)로 변환
- float(): 실수로 변환
- str(): 문자로 변환
- Pandas 활용
- Series.astype("str"): 문자가 아닌 것을 문자로 변환
※ "str", "int", "float", "boolean", "category" - Series.to_frame(): 데이터프레임이 아닌 것을 데이터프레임으로 변환
- pd.to_datetime(): 시간 속성으로 데이터를 변환
※ origin: 특정 일자로 부터 며칠 지났는지 계산
※ format: 복잡한 데이터 전처리용 옵션(%Y, %m, %d, %H)
- Series.astype("str"): 문자가 아닌 것을 문자로 변환
변수명 변경¶
- Pandas(데이터프레임 df)
- df.rename(): 데이터프레임의 변수명 변경
※ df = df.rename(columns = {"aa": "bb"})
- df.rename(): 데이터프레임의 변수명 변경
In [ ]:
score_stat = score_stat.reset_index(drop = True)
score_stat = score_stat.rename(columns = {"index":"Subject"})
In [ ]:
aws["TM"] = pd.to_datetime(aws["TM"]) # to_datetime 매우 중요!!
In [ ]:
df_1["StartPoint"] = df_1["StartPoint"].str.replace(names[0], "충청")
인덱스(index)¶
- Pandas(데이터프레임 df)
- df.set_index(): 특정 변수를 인덱스로 지정
- df.reset_index(): 인덱스 초기화
※ drop = False일 경우 인덱스가 df의 변수로 이동
※ pd.Series에 사용시 바로 데이터프레임으로 변환(단, drop = False) - df.loc[,]: 인덱스, 논리값, 텍스트 기반 데이터프레임 인덱싱
- df.iloc[,]: 정수 기반 데이터프레임 인덱싱
※ .loc, .iloc 인덱서의 경우 콤마(,) 앞은 row, 뒤는 column 지정
In [ ]:
df_sub = df.loc[df["grade"]==2,:]
df_sub = df_sub.iloc[:, np.r_[:2, 4:9]]
Pandas 객체 연산¶
- Series 기본(ser로 정의)
- ser.max(): 최대값
- ser.min(): 최소값
- ser.mean(): 평균값
- ser.std(): 표준편차
- ser.quantile(): 분위수 함수(0: 최소값, 1: 최대값)
- ser.kurt(): 첨도(kurtosis)
- ser.skew(): 왜도(skewness)
- ser.idxmax(): 최대값이 위치한 인덱스 추출
- ser.idxmin(): 최소값이 위치한 인덱스 추출
- ser.unique(): 중복 제거(고유값)
- ser.isna(): 결측 여부 판별(결측 == True)
- ser.isnull() :널값 여부 판별
- ser.notna(): 결측 여부 판별(관측 == True)
- Series 문자처리(.str)
- ser.str.replace(): 패턴 매칭 및 치환
- ser.str.split(): 특정 패턴 기준으로 문자열 분리
※ ser.str.split(pat = "@", expand = True) - ser.str.contains(): 특정 패턴을 포함한 문자열의 존재 여부 확인
※ ser.str.contains(pat = "[0-9]", regex = True)
- Series 날짜처리(.dt)
- ser.dt.year: 연
- ser.dt.month: 월
- ser.dt.day: 일
- ser.dt.dayofweek: 요일
- Series 시계열
- ser.rolling().mean(): 단순 이동 평균
※ ser.rolling(window = 5).mean(): 5단위 시간 이동평균 - ser.ewm().mean(): 지수 가중 이동 평균(EWMA)
※ ser.ewm(alpha = 0.5).mean()
- ser.rolling().mean(): 단순 이동 평균
- DataFrame(df로 정의)
- df.concat(): 두 개 이상의 데이터프레임을 합침
※ axis 사용에 주의. 인덱스 문제 발생 가능 - df.merge(): 두 데이터프레임 병합(join)
※ df1.merge(df2, left_on = "col1", right_on = "col2", how = "left")
※ how: "left", "right", "inner", "outer" - df.drop(): 특정 변수 제거 가능
- df.dropna(): 결측치가 있는 row 제거 가능
※ how: "any", "all" - df.fillna(): 결측치를 특정 값으로 치환(Series에도 사용 가능)
- df.sort_values(): 지정 변수 기준 데이터프레임 정렬(오름차순, 내림차순)
- df.sample(): 특정 row를 단순 임의 추출
※ n: 정수로 입력하며 row개수 지정, frac: 비율로 입력(0~1) - pd.get_dummies(): 가변수 생성. 필요시 drop_first = True로 변수 하나 제거
- df.concat(): 두 개 이상의 데이터프레임을 합침
In [ ]:
ser.str.replace("[^0-9]", "") # [^ ] : 대괄호 내의 모든 규칙을 반전
In [ ]:
cross[1].idxmax()
cross.iloc[:,1].idxmax()
cross.loc[cross[1] == cross[1].max(), ].index[0]
In [ ]:
mean = df_sub.loc[:, "Math":].mean(axis=1)
df_score = pd.DataFrame({"Stu_ID":df_sub["Stu_ID"],"Mean": mean})
score_max = df_sub.loc[:,"Math":].max()
score_min = df_sub.loc[:,"Math":].min()
score_std = df_sub.loc[:,"Math":].std()
score_stat = pd.DataFrame({"max": score_max,
"min": score_min,
"std": score_std})
df_sub.loc[:, "Math":].agg(["std","max","min"]).transpose()
df_sub.loc[:,"price":].agg(["max", "mean"])
df_sub.groupby("cut")["price"].agg(["max", "min"])
df_sub.groupby(["cut","color"])["price"].agg(["max","min"])
df.describe()
In [ ]:
df_dum2 = pd.get_dummies(df.iloc[:, 1:], columns=["season"])
In [ ]:
df.groupby("season")["count"].apply(lambda x: round(x.mean()))
df.groupby("season")["count"].agg(["mean"])
# 시즌별로 count 평균을 계산하고 싶은 경우
In [ ]:
df.loc[df["StartPoint"] == "강원", "value"].quantile([0.25, 0.5, 0.75]).round(1)
# 고속도로 통행 시작시점이 강원인 모든 차량 통행량(강원을 포함한 모든 도착지점)의 q1,median,q3, (정수형, 소수점 1자리에서 반올림)
객체 피벗(pivot)¶
- Pandas(데이터프레임 df)
- df.transpose(): 행렬 전치와 같이 데이터프레임의 row와 column을 서로 바꿈
- pd.melt(): id.vars에 지정하는 변수 기준으로 길게 늘어뜨림.
- pd.pivot_table(): pd.melt()와 반대기능. 추가 요약함수가 필요할 수 있음.
In [ ]:
df_q1_melt = df_q1.melt(id_vars = ["date", "StartPoint"])
In [ ]:
df_q3_pivot = df_q3.pivot_table(index = "month", columns = "wday", values = "Gangwon", aggfunc = "mean")
df_q3_pivot = df_q3_pivot.apply(lambda x: (x - min(x))/(max(x) - min(x))) # min-max Norm.
사용자 정의 함수(UDF)¶
In [13]:
#사용자 정의 함수(udf)
def minmax(x):
return (x-x.min()) / (x.max() - x.min())
In [ ]:
def stdize(x):
return (x-x.mean()) / x.std()
통계¶
Crosstab¶
In [ ]:
df.season.value_counts(normalize=True)*100
pd.crosstab(df.season, df.holiday, normalize=True) # 전체 다 더한 것이 1
pd.crosstab(df.season, df.holiday, normalize=0) # 계절별 공휴일 비율
pd.crosstab(df.season, df.holiday, normalize=1) # 공휴일별 계절 비율
In [ ]:
pd.crosstab(df.channel,df.is_booking, normalize=0) # 유입채널별 결제 비율
상관분석¶
- Pandas 활용(데이터프레임 df로 정의)
- df.corr(): 상관계수행렬 생성
※ method = "pearson": 피어슨 상관계수
※ method = "spearman": 스피어만 순위 상관계수
- df.corr(): 상관계수행렬 생성
- scipy 활용(from scipy.stats.stats import pearsonr)
- pearsonr(): 피어슨 상관 분석 상세
t-test¶
- scipy(from scipy.stats import ttest_1samp, ttest_rel, ttest_ind)
- ttest_1samp(): 단일표본 t검정
- ttest_rel(): 대응표본 t검정
- ttest_ind(): 독립 2표본 t검정(등분산 가정 확인 필요)
※ ttest_ind(ser1, ser2, equal_var = True)
※ pd.Series 객체가 아닌 평균값 하나를 입력으로 넣지 말것!!!
In [ ]:
from scipy.stats import ttest_ind
stat, p_value = ttest_ind(df_q2.loc[df_q2["StartPoint"] == "경기", "Gyeongsang"],
df_q2.loc[df_q2["StartPoint"] == "경상", "Gyeonggi"])
round(p_value, 4) #p_value는 소수 4째자리까지 기술한다(소수 4자리까지, 소수점 5자리에서 반올림)
ANOVA¶
scipy 활용(from scipy.stats import f_oneway)
- f_oneway(): 일원분산분석을 실시하며 각 집단으로 구분된 pd.Series 객체 입력
※ f_oneway(df["group1"], df["group2"], df["group3"])
- f_oneway(): 일원분산분석을 실시하며 각 집단으로 구분된 pd.Series 객체 입력
statsmodels 활용
- from statsmodels.formula.api import ols
- from statsmodels.stats.anova import anova_lm
- scipy 보다 자세한 레포트 제공
In [ ]:
# One-way ANOVA 기준 코드
# aov = ols("price ~ C(type)", df).fit()
# print(anova_lm(aov))
In [ ]:
from statsmodels.formula.api import ols
KMeans 클러스터링¶
In [ ]:
from sklearn.cluster import KMeans
model = KMeans(n_clusters = 3, max_iter = 100, random_state = 1234).fit(df_q3_pivot)
'파이썬 통계 머신러닝' 카테고리의 다른 글
stats.ttest_ind(df1, df2) : t 검정 (0) | 2020.07.25 |
---|---|
df.quantile(q=[0.25, 0.5, 0.75]) : 분위수 구하기 (0) | 2020.07.25 |
pd.concat( [df1,df2] ) : df1과 df2를 붙일때 사용 (0) | 2020.07.25 |
df.apply(lambda x: func(x)) : DF각 값들에 대해 함수 호출시 사용 (0) | 2020.07.25 |
pd.read_csv() : csv 읽을 때 사용하는 함수 (0) | 2020.07.25 |