빅데이터 관련 프로그래밍/Python - bigdata(pandas 기초)

2018/02/25 - [빅데이터 관련 프로그래밍/Python] - 15. Matplotlib 사용하기 –라인 플롯, 바 플롯, 히스토그램, 산점도

먼저 아래 데이터를 복붙하여 사용할 것이다. 리스트[]를 여러개 묶어놓은 2차원리스트 즉, array 데이터이다.
이 데이터를 DataFrame에 넣고, 칼럼과 인덱스를 주자. (Series 는 index만 인자로 줄 수 있었다)

data = [[1.4, np.nan],
           [7.1, -4.5],
        [np.nan, np.nan],
        [0.75, -1.3]]
df = pd.DataFrame(data, columns=["one", "two"], index=["a", "b", "c", "d"])

image


DataFrame의 데이터 분석용 통계함수 사용( sum, mean, min)

  • 이 때, sum()함수에 axis=0을 줘서 행 방향 = 의 합을 구할 수 있다. 마찬가지로 axis=1을 인자로 주면, 열 방향 = 의 합을 구할 수 있다.
    image
    이 때, sum()함수의 계산과정에서 NaN은 무시하고 계산하는 것을 알 수 있다.
  • 비슷하게, 특정 열에 대한 합과 특정 행의 합도 구할 수 있다. 인덱싱을 사용하면 된다.
    image
  • 비슷하게, 합 뿐만 아니라 평균( .mean()함수 ), 분산( .var()함수 )를 사용하면 된다.(인덱싱 없이하면 열에 대한 통계량이 나온다)
    image
  • 만약, 의 평균을 구하려면, sum()처럼 인자에 axis=1을 넣으면 되는데, NaN을 감안해서 무시안하고 평균도 NaN으로 처리하고 싶다면,
    또다른 인자로서 skipna = False를 대입하면 된다.  df.mean(axis=1, skipna=False)
    image
  • 그외 통계함수 정리
    image


  • 다시 df의 데이터를 보면서, “one”이라는 열의 NaN에는 열의 나머지성분의 평균값으로, “two”라는 열의 NaN에는 열의 나머지성분 중 최소값으로 대체해보자각 평균값과 최소값을 구한 뒤  - >  각 열에 .fillna( value = )를 대입해주면 된다.
    (1) 먼저 “one”열에서 평균값을 미리 계산해서 one_mean 에  담아둔다.( 통계함수들은 NaN을 배제하고 계산되기 때문에 바로 할 수 있다)
       one_mean = df["one"].mean()
    (2) “two”열에서 최소값을 .min() 를 이용해서 찾아서 two_min에 담아둔다.
       two_min = df["two"].min()
    (3) 각 열을 인덱싱한 것에 .fillna( value = )에다가 각각 넣은 뒤, 그 값을 다시 각 열에 대입한다.
        df["one"] = df["one"].fillna( value = one_mean )
         df["two"] = df["two"].fillna( value = two_min)
    image


DataFrame의 유용한 특수 통계함수 – 상관관계와 공분산

먼저 데이터는 아래와 같은 것을 복붙해서 사용하자. numpy의 rand함수를 이용해서 6x4 이차원 array를 만들고 대입한다.

df2 = pd.DataFrame(np.random.randn(6, 4),
                   columns=["A", "B", "C", "D"],
                   index=pd.date_range("20160701", periods=6))

image

  • 상관계수를 구하려면, df2[“특정열”]  .corr ( df2[ “비교하고싶은 열” ] ) 의 방식으로 .corr()함수를 사용한다.
    앞 변수에는 기준 열을 적고, 인자 비교하고 싶은 열을 인덱싱해서 넣어주면 된다.
    df2["A"].corr( df2["B"])
    이 때, 계산은 피어슨 상관계수 공식에 의해 계산된다.
    (cf. 피어슨 상관계수(Pearson correlation coefficient) 는 두 변수간의 관련성을 구하기 위해 보편적으로 이용된다 )
    ( 링크 : https://ko.wikipedia.org/wiki/%EC%83%81%EA%B4%80%EB%B6%84%EC%84%9D)
    image

  • 공분산을 구하려면, 상관계수와 비슷한데, .cov()함수를 사용하면 된다.
    df2["B"].cov( df2["C"])
    image
  • 만약, 특정 열을 인덱싱안하고, df2.corr() 이나, df2.cov()를 사용하면 모든 열 간의 상관관계와 공분산을 계산해준다.
    image


DataFrame 정렬함수

  • pandas의 DataFrame에서는 인덱스 기준 정렬과 값 기준 정렬을 지원한다.
    정렬 하기에 앞서, 기존의 인덱스칼럼순서를 섞어주기 위해 reindex()함수를 사용한다.
    dates = df2.index
    random_dates = np.random.permutation(dates)

    df2 = df2.reindex(index=random_dates, columns=["D", "B", "C", "A"])
    (1) datatime타입의 인덱스를 dates 변수에 넣고 –> np.random.permutation( ) 함수를 이용해서 섞어준 것을 random_dates에 넣는다.
        이 함수는 인자에 있는 리스트를 랜덤하게 섞어주는 역할을 한다
    (2) df2.reindex() 를 이용해서 기존 dataFrame에 인덱스와 칼럼을 섞어준다.
      - index는 datetime타입이라서 변수에 따로 빼내어 함수를 이용해서 섞고 난뒤 대입 / columns은 그냥 자체적으로 섞어서 대입해준다.
    image


index 기준 정렬

  • 인덱스가 오름차순이 되도록 해보자. df2.sort_index(axis=0)함수를 이용하는데, 인자로, axis = 0을 넣어서
    인덱스를 기준으로 0 = 열 = 행 방향(↓)으로 정렬해준다.
    image
  • 칼럼(열)이 오름차순으로 정렬하고 싶다면, 마찬가지로 sort_index()함수를 사용하는데, axis = 1을 넣어서
    칼럼을 기준으로 1= 행 = 열방향(→)으로 정렬해준다.
    image
  • 이제 내림차순으로 정렬하고 싶다면, index와 columns를 정렬하는 것과 똑같이 sort_index( axis = )에다가 , 추가로 인자를 ascending = False 를 주면,
    내림차순으로 정렬이 된다.
    먼저, 행 index를 내림차순으로 해보자. df2.sort_index(axis=0, ascending = False)
    image
    다음으로 열 columns를 내림차순으로 해보자. df2.sort_index(axis=1, ascending = False)
    image
    < 열 방향 = 행 = axis = 1> < 행 방향 = 열 = axis = 0>

값 기준 정렬 ( 거의 특정열에 대한 값들의 정렬임)

값 기준 정렬을 사용하는 것은  먼저 <특정 열>에 대해서  --> 그 값들이 오름차순으로 정렬되도록 –> 각 행들을 정렬해버리는 것이다.

  • 예를 들어,  <D열>기준으로 값들이 오름차순 되도록 행들을 정렬하는 코드는 df2.sort_values(by="D")이다.
    즉, sort_values( )함수의 인자에 by="열(칼럼) 이름”을 넣어주는 것이다. 
    sort_values( by = “ 칼럼명 ”)
    image

df2 의 E열과 F열을 추가해보자.
df2["E"] = np.random.randint(0,6, size = 6)
df2["F"] = ["alpha", "beta", "gamma", "gamma", "alpha", "gamma"]
( np.random.randint()는 정수를 랜덤하게 생성하는데, 인자의 0,6 은 0과 6사이(1,2,3,4,5)의 수 중 랜덤정수, 만약 최대값이 명시 되지 않으면 0<->최소값 사이 정수 / size는 리스트의 성분개수인 열  or  (행,렬) 을 의미한다)
image

  • 2개의 열에 대해서 오름차순하도록 할 수 있다. 즉,  첫번째 열을 기준으로 오름차순 하는데, 만약 값이 같다면 두번째 열을 기준으로 오름차순 되도록 할 수 있다. 방식은 sort_values( by = “칼럼명”)과 비슷한데, by = 에다가 리스트 형식으로 우선순위 대로 열들을 대입해준다.
    df2.sort_values(by=["E", "F"]) 는  E열을 기준으로 값들을 오름차순이 되도록 행을 정렬하는데, 만약 같다면, F열이 오름차순이 된다.
    (1개 열의 값기준 오름차순 정렬은 대괄호가 없이 그냥 by="칼럼명")
    image

그외 유용한 함수들

  • 특정열인덱싱 . unique() : 특정열을 중복없는 열로 만들어준다.
    특정열인덱싱 . value_counts() : 특정열의 각 성분값들이 포함된 행의 개수를 알려준다.
    특정열인덱싱 . isin(  [ “ 특정값 " ]  ) : 특정값이 포함되어있는지 boolean 마스크를 생성해준다.
                                                 이 때,  “특정값1”, “특정값2” 로 OR(또는) 연산이 가능하다.
    image
  • .isin( [ “”] )함수를 이용해 만든 마스크를  행을 선택(인덱싱)할 때 쓰는, df2.loc()함수의 행index에 집어넣으면,  해당 행을 뽑아낼 수 있다.
    df2.loc[ df2["F"].isin(["alpha", "beta"]) , :]
    위 코드는 특정열 “F”열에, alpha 혹은 beta를 포함하는 들을 뽑아낸다.
    image


사용자 정의 함수를 행or열에 적용하기 [  lambda  ->  apply() ]

새로운 DataFrame을 정의해서 사용하자. numpy의 randn함수로 2차원 array를 정의하고, 각 인덱스와 칼럼값을 직접 입력한다.

df3 = pd.DataFrame(np.random.randn(4, 3), columns=["b", "d", "e"],
                   index=["Seoul", "Incheon", "Busan", "Daegu"])

image

  1. 먼저, python에서 사용하는, 함수를 만들어주는 [ lambda 인자(, 인자2) : 표현식 ]으로  func라는 함수를 정의해보자.
    func함수는 사용자 정의 함수로서, 최대값- 최소값을 계산해서 반환해준다.
    func = lambda x: x.max() - x.min()
  2. 다음으로 행 또는 열에 대해서, apply()함수를 사용하여, 정의한 함수를 인자로 주고,  다음  axis을 인자로 주어 행 또는 열을 선택하면,
    정의한 함수가 해당 행 또는 열에 대해 계산을 해준다.
    df3.apply( func, axis = 0)  :  func함수를 axis=0인 행 방향(열)으로 시행해서, 각 열의 최대값 – 열의 최소값을 계산해 줄 것이다.
    image
    마찬가지로 axis = 1을 주면, 각 행들에 대해서 최대값 –최소값의 계산을 해줄 것이다.
    image
  • dataFrame은 인덱스와 컬럼인자를 주지 않으면, index와 columns는 0부터 시작한다.
    여기서는 numpy의 랜덤함수인 np.random.rand( 행,렬)로 랜덤 array를 만들어서 대입해보자.
    image
    이 때, index에 대해서는 pd.date_range( “ yyyymmdd”, periods = 6) 함수를 사용해보자.
    pandas에서 제공하는 Datetime64라는 데이터형으로 구성된 인덱스( DatatimeIndex)를 생성할 때 사용되는 함수다.
    뒤에 periods =6 은 입력날 날자로부터 6일에 대한 index를 생성한다. 즉, 6개 행을 만든다.
    image


결측값, 이상치(NaN) 조작하기

pandas를 이용해서 dataset를 가져올 때, NaN과 같이 범주에서 벋어난 값이 존재 할 수 있다. 이러한 값을 결측값(missing value), 이상치(out lier)라고 한다. 이 결측값, 이상치를 제거하거나 새로운 값으로 대입하는 방법을 알아보자.

  • 먼저, 새로운 열F를 만들고, 값을 입력하는 과정에서  하나의 성분으로 np.nan을 이용해보자. 성분에 NaN대입하는 numpy의 함수다
    image
  • 이제 우리는 NaN이라 표기된 값만 골라내고,해당 행을 제거해야한다.
    (행제거는 밑에어 df.drop()으로 따로 배운다. 여기서는 NaN을 포함하는 행을 제거하는 방법을 배운다.)
    이럴 때, df.dropna( how = “any” ) 함수를 이용해야한다. 각 행들 중 NaN을 포함하는 행들을 제거한 df를 가져올 수 있다.
    이 때,  any 행의 성분에 NaN이 하나라도 있으면 그 행을 제거 라는 뜻이다. 
    만약, how의 인자에 “all”이 있다면, 행의 성분이 모두 NaN일 때 제거한다는 뜻이다. 지금은 모두 NaN인 행이 없으니 그대로나올 것이다
    image
  • 이제 NaN이 포함된 행을 제거하는 것이 아니라, NaN에 다른 값을 대입해보자.
    이럴 땐, df.dropna(how=" ")가 아닌 df.fillna(value=5.0)함수를 사용해야한다.
    NaN 성분들에 일괄적으로 value값을 대입한다.
    image
  • NaN이 포함되어 있는 데이터에 대한 boolean마스크를 생성할 수 있다. NaN인 성분만 True를 뽑아내주는 df.isnull()함수를 사용해준다.
    image
    *****이제 이러한 마스크를 이용해서 loc함수의 행index자리에 넣어 NaN을 포함한 행만 뽑아낼 수 있다.*****

기존에 강의에서는 np.array로 생성한 array에 대해
[ 전체기준-> 열안의 특성성분과 조건문을 통해 마스크생성 (for문을 이용할 경우, 중복없는기준열생성) -> 행index자리에 넣기 ]
에 넣기 의 과정으로 뽑아냈다면,

  • 여기 NaN를 뽑아내기위해서, 전체기준열을 뽑기전 df.isnull()함수를 먼저 사용해야하므로 전체 데이터에 대한 마스크를 먼저 생성한다
    [  is.null()로 전체마스크 –>  전체 마스크 중 df[ “ 전체기준” ]으로 직접제시 –> loc함수의 행index자리에 넣기 ]
    df.loc[    df.isnull()["F"] ,    :]
    image


행 또는 열의 삭제

index를 이용해서 행을 삭제하는 방법도 있다.


  • df.drop()함수를 이용해서 2개이상의 열을 삭제할 때도, 열명은 리스트의 형태로 작성한 뒤  콤마, axis=1를 넣어주면 된다.
    df.drop( [ "B","F"], axis=1)
    image


DataFrame을 생성해보자.

  • Series도 있지만, 주로 사용할 데이터는 DataFrame이다. 필요한 패키지들을 import해놓고, 아래와 같이
    python 딕셔너리를 만들고, DataFrame을 만드는데, 인자로 columns를 주어 키값=칼럼=열 의 순서를 정해주고, 딕셔너리에 없는 새로운 열도 추가해주자. 그리고 index를 인자로주어 리스트의성분=행=인덱스의 이름도 정해주자.
    data = {"name" : [ "Kilho", "Kilho","Kilho", "Charles","Charles" ],
               "year" : [2014, 2015, 2016, 2015, 2016],
               "points" : [1.5, 1.7, 3.6, 2.4, 2.9]}
    df = pd.DataFrame( data, columns = ["year", "names", "points", "penalty"],
                                       index = ["one", "two", "threes", "four", "five"]  )
    image


DataFrame의 열을 선택(인덱싱)하고 조작하기

  • 하나의 열을 가져오는 방법은 2가지이다. 편한것을 선택하면 된다.  대표적인 열 선택 코드는  DataFrame변수[ “ 칼럼명” ] 이다.
    이 때, DataFrame에서 하나의열을 가져온 결과는 Series의 모양을 하고 있다는 것을 기억하자.
    ( series를 생성할 때,  index명도 함께 줄 수 있다는 점을 뒤에 사용할 것이다)
    df[“컬럼이름”] or df.컬럼이름 으로 하나의 컬럼(열)을 series의 형태로 가져올 수 있다.
    image
  • 2개 이상의 열을 가져오는 방법은, df[[ “칼럼이름1”, “칼럼이름2”]]의 방법으로 가져온다. 이 때는, series가 아닌 dataFrame형태로 가져온다.
    대괄호가 2개라는 것을 명심하자. 대괄호 1개에다가 [리스트]형식으로 가져온다고 생각해도 된다.
    image
  • 선택된 열의 모든 성분에, 일괄적으로 값을 대입할 수 있다. 성분이 비어있던 “penalty”에다가 0.5를 대입해보자.
    image
  • 일관적인 값이 아니라, 선택된 열에다가  행에 따라  각각 어떤 값을 대입하고 싶다면, python의 리스트 형태로 만들어서 대입하면 된다.
    numpy의 1차원 array도 대입할 수 있다.
    image
  • 새로운 열을 생성과 동시에 대입할 수도 있다. zeros라는 열을 새로 만들고, 여기다가 numpy의 np.arange(5)로 대입해보자. 새로운 열(칼럼)이 추가되면서, 값이 대입되는 것을 확인할 수 있다.
    cf) np.arange(n)은  0부터 총 n개, 즉, n-1까지 1차원 배열을 생성한다는 뜻이다.
    image
  • DataFrame의 하나의 열을 선택했을 때 Series로 제공된다는 점에서 착안하여, 새로운 열을 입력할 때도, 리스트가 아닌 series를 대입해줄 수 도 있다.
    series를 정의한 다음, 그 series 변수를 df[ “ 칼럼이름” ]  = series를 대입해보자.
    series를 만들어서 대입하는 이유는, series를 정의할 때, 리스트형식으로 values를 넣고, 뒤 인자에 index를 정해줄 수 있고, 기존의 행index와 동일한 이름으로 주면, 맞춰서 끼워들어가는 특징을 이용할 수 있다. 5개의 index이름 중에 3개만 골라서 , 거기 끼워맞춰 들어가게 해보자.
    image
    열에 값을 대입할 때, python의 리스트나 numpy의 array를 대입했던 것과 달리, Series를 대입할 때의 핵심적인 차이다.
    ***근데,, 원래 기존값이 있는 상태에서, 값이 없는 행에 끼워넣었더니,, 기존값들이 NaN이 되어버린다. 끼워넣기보다는 초기화..!
  • 새로운 열을 추가할 때, 기존dataFrame 열의값을 연산한 것도 대입할 수 있다.(그냥 대입하면 그대로 옮겨온 것과 같다)
    새로운 열 “net_points”를 만들면서 동시에 연산한 값을 대입해보자
    image
    비슷하게 조건문을 통해 True 혹은 False가 대입되도록 할 수도 있다.
    image
  • 기존의 열을 삭제하는 방법은, del 키워드와 함께 일반적인 열 선택코드를 입력하면 된다.
    예를 들어 del df[“high_points”]
    image
  • 현재 존재하는 컬럼들을 확인하려면 df.columns로 트래킹 하면된다.
    image
  • 데이터프레임의 index와 columns에 이름을 정해주자.
    image


DataFrame의 행을 선택하고 조작하기

  • 경고 ) pandas에서는 행을 선택하는 인덱싱 방법이 무수히 많다는 것이 문제이다. 그리고 버젼이 올라가면서 행을 인덱싱하는 방법도 달라지고 있다.
  • 먼저 열을 인덱싱하는 것과 유사한 행 인덱싱 방법 2가지를 살펴보자.
    df[ 0 : 3 ]은 index 0부터 총 3개 행을 가져온다. numpy의 array와 비슷하다.
    df[ “two” : “four” ]는 index명이 “two”인것부터 마지막 “four”까지 사이의 모든 행을 가져온다.

    image
    마치 열을 선택하는 코드와 너무나도 유사하기 때문에, 비추는 방법들이다.
  • .loc[] .iloc[]의 함수를 사용해서 행을 인덱싱하는 방법을 추천한다.
    df.loc [ “ index 명” ] 을 통해 가져온 값은, 열을 인덱싱 했을 때와 마찬가지로 Series의 형태로 가져온다.
    행의 범위인덱싱도 마찬가지다
    image
  • 행을 인덱싱하는 .loc[]함수의 재밌는 점은, 행을 인덱싱하면서 동시에 열도 인덱싱할 수 있따.
    인덱스 인자로서 “칼럼명”을 추가해주면 된다. ex> df.loc[ “two”:”four” , “points”]
    image
    이를 응용하면, 행인덱스 자리에 전체를 의미하는 콜론(:)을 넣고, 가져올 칼럼명을 입력하면, 열을 인덱싱하는 것과 같아진다.
    즉,  .loc[ : , “칼럼명” ] 으로 열을 선택하는 인덱싱하는 코드인  df [ “칼럼명” ]과 같다.
    image
    마찬가지로, 2개이상의 열을 선택하는 방법에서 2개의 대괄호로, 리스트형식처럼 칼럼명을 나열해서 가져왔던 것과 유사하게, .loc함수에서도 할 수 있다.
    image
    . loc[]함수를 이용해서  행과 열에 동시에 범위 인덱싱도 할 수 있다.
    my) loc[ ] 함수를 이용한 인덱싱은, 행을 우선순위로하여서 무조건 입력되어야하며, 뒤에 인자를 추가해서 칼럼명 자유롭게 인덱싱할 수 있는 것이구나.
    image
  • 새로운 행을 추가하는 방법도 열과 마찬가지로 인덱싱할 때처럼, 일반적인 행을 선택하는 방식에 대입해주는 식이다.
    대신 열(칼럼)에 값을 대입해주기 위해서는, 전체 열을 인덱싱한 콜론을 넣은 뒤, 우항에서 리스트의 형식으로 대입해주는 것이다
    (칼럼의 갯수에 맞게 리스트 성분을 대입한다면, 굳이 열에 대한 전체인덱싱은 없어도 가능하더라)
    image
    *** .loc[ , ]만 기억하면 모든 인덱싱이 가능하다.
  • .iloc 함수는 numpy 의 array 인덱싱 방식으로 가져올 때 쓰는 것이다. 즉, 칼럼명이 아니라 index숫자로서 가져올 때 쓴다.
    예를 들어, df.iloc[3]은 4번째 행을 가져온다. array인덱싱과 유사하다.
    image
    마찬가지로 행과 열의 범위인덱싱을 할 수 있다.
    df.iloc[ 3:5, 0:2 ] 는 4번째 행부터 5번째 행까지,  1번째열 부터 2번째 열까지를 가져온다.
    image
    간격을 띄엄띄엄 으로 행과 열을 가지고 오고 싶다면,  리스트형식으로 해당 index를 준다.
    예를 들어, df.iloc[ [0, 1, 3] , [1, 2] ]  1번째 2번째 4번째 행 / 2번째, 3번째 열을 가져오게 된다.
    image
    특정 값 하나만 가져오고 싶다면 범위인덱스가 아닌 해당 인덱스를 적어주면 된다.
    df.iloc[1, 2] 는 2행 3열의 값만 가져온다.
    image
  • 즉, iloc를 이용하면 마치 numpy의 array를 인덱싱 하는 것처럼 index번호로 인덱싱 할 수 있다.



Boolean 인덱싱하기

  • 기존 DataFrame에서,  “year”칼럼 중 2014보다 큰 값만 인덱싱하고 싶다고 가정해보자.
    df["year"] > 2014 를 입력하면, Series형태로 마스크가 얻어진다.
    image
       (마스크는  전체데이터중 기준이 되는 열 과 그 가운데 특정성분을 비교한 조건문이었다.
       for문으로 선택된 행을 뽑아내고 싶을 땐, 중복없는 전체기준열을 따로 담아서, 조건문에 하나씩 들어가도록 사용했었다)
  • 이러한 마스크를 인덱스 자리에 넣은 .loc함수를 이용하면 원하는 행을 선택할 수 있다. (열은 전체를 선택한다.)
    df.loc[ df["year"] > 2014 , : ]
    image
  • 이번에는 names 칼럼중에, 이름이 Kilho인 행을 뽑아내고, 칼럼은 names와 같이 points도 뽑아내보자.
    df.loc[ df["names"] == "Kilho", ["names","points"]]
    image
    ( 이렇게 전체기준열(칼럼) 에서 원하는 행을 뽑아냈으면, 전체기준열(칼럼)도 같이 가져오는게 일반적인 분석방법이다)
  • 만약 사용할 조건이 여러개라면, & 앤드 연산자를 이용해서, 여러개의 마스크 행 인덱스에 넣어주면 된다.
    df.loc [ ( df["points"] > 2 ) & (df["points"] < 3 ) , : ] 는  [ points칼럼의 값이 2보다 크고 3보다 작은 행들 , 의 모든 컬럼정보를 ] 가져온다.
    image
  • 이제 조건에 맞게 마스크를 사용해서 인덱싱 한 행의  특정칼럼에 특정값을 입력할 수 있다
    df.loc [ df["points"] > 3, "penalty"] = 0 를 통해  points칼럼이 3보다 큰 행들을 뽑아내서 , penalty칼럼에 0을 대입한다.
    image

pandas python에 대한 이미지 검색결과
pandas는 핵심라이브러리로, 고유한 자료구조인 SeriesDataFrame으로 빅데이터 분석에 높은 수준의 퍼포먼스를 발휘한다.
Series와 DataFrame는 앞서 공부한 numpy의 1차원과 2차원 array과 매우 유사하다.


pandas Series 살펴보기

  • pandas를 사용하기에 앞서 numpy 와 pandas 패키지를 모두 import해야한다.
    image
  • Series를 정의할 때, pd.Series()함수를 이용하는데,  python의 listnumpy의 array가 인자로 입력된다.
    image
    series를 확인해보면, index와 values가 동시에 확인된다.
    이 때, 리스트의 성분 갯수 = index의 갯수가 되는 것을 알 수 있다.
    series변수.values를 호출하면 값(values)만 따로 array로 확인할 수 있고, .index를 이용하면 index 범위값 얻을 수 있다.
    데이터형을 확인하려면, obj.dtypes를 통해 확인할 수 있다.
    image
  • Series의 특징은 값과 함께, 우리가 원하는 index를 입력할 수 있다는 것이다. list나 array인자 이외에 추가로 index=[ ]를 이용해서 입력해준다. obj2 = pd.Series( [ 4, 7, -5, 3], index=["d", "b", "a", "c"])
    *** 인덱스의 성분을 줄 때는 ‘’ 작은 따옴표로 주고, 그외에 키값, 시리즈이름, 시리즈인덱스이름은 다 “”쌍따옴표
         확인 결과 “”쌍따옴표로 줘도 상관없다. 왜 확인 했냐면..
    *** DataFrame에서 인자에 인덱스를 정의해줄 때는, “”쌍따옴표로..
    image
    이것은 python에서 중괄호로 {  “키값” : 벨류값 ,  “키값” : 벨류값 } 형식으로 만든 딕셔너리와 비슷하며,
    Series를 만들 때 인자를 (arr , index=[ , , ] ) 가 아니라 딕셔너리를 줘서 원하는 index를 줄 수 도 있다.
    image
    즉, pd.Series( )의 인자에는 [ , , ] list / np.array() / 파이썬의 딕셔너리가 들어갈 수 있다.
  • 또다른 Series의 특징은, Series의 이름과 index에 이름을 지정해줄 수 있다는 것이다.
    series변수.name = “ 시리즈이름”,  series변수.index.name = “인덱스이름”
    image
  • 비슷하게, 위에서 직접 입력한 index의 값을 바꿔 줄 수 도 있다. series변수.index = [ ‘새’, ‘로’, ‘운’, ‘인덱스’]
    image


pandas DataFrame 살펴보기

dataFrame은 먼저, python의 딕셔너리 형태로 data를 정의해준 뒤 ===> dataFrame을 정의한다.
그외에 인자로 numpy의 array도 들어갈 수 있다.

  • 먼저, 딕셔너리형태로 데이터를 정의해주는데, { “키값” : value }에서  values자리에 [  리,스,트 ] 형태로 입력을 해준다.
    그렇게 하면, 키값들의 갯수가은 열(Columns)의 갯수이 될 것이고, 리스트의 성분들의 갯수은 각 행의 갯수(index)를 담당할 것이다.
    만들어진 딕셔너리를 pd.DataFrame( )인자에 넣어준다.
    image
    세로로는 index(리스트 성분의 갯수)가, 가로로는 키값(columns) 들이 둘러싸고 있는 표형태의 데이터를 얻을 수 있다. 엑셀의 table모양과 아주 흡사하다.이 때, 키값이 자동으로 Colums의 이름이되며, 키값의 갯수가 열의 갯수가 된다.
           밸류값인 리스트의 성분갯수가  행의 index를 결정한다.
    이렇게 dataFrame에서는 2종류의 index가 존재한다. 가로의 index를 columns라고 한다.
    df.index / df.columns / df.values 를 통해 값을 확인해보자. values는 2차원 넘파이의 array형태로 값을 얻을 수 있다.
    image
  • Series와 마찬가지로 DataFrame의 index와 columns에도 이름을 붙힐 수 있다
    image
  • 많은 DataFrame 함수를 자동완성해주는 기능도 있다. dataFrame변수. [TAB]키를 눌러서 확인하자.
    image
  • pd.DataFrame( 딕셔너리data)로 정의할 때,
    키값이 자동으로 Columns의 이름이되며, 키값의 갯수열의 갯수가 된다.
    밸류값인 리스트의 성분갯수가  행의 index를 결정한다.
    하지만, 딕셔너리에서 정의한 키값을 인자로 columns에 직접 넣어 columns의 순서를 새롭게 정의할 수 있으며,
    만약 키값이 미리 존재하지 않는 이름을 columns인자의 성분으로 넣는다면, 그 칼럼은 NaN으로 표시가 된다.
    또 인자로서, index를 입력하면, 리스트성분의 개수로 자동설정되어 0부터 시작하던 index의 이름을 줄 수 있다.
    image
    이 때, NaN라는 것은 Not a Number를 의미한다. 해당하는 값이 없다는 뜻이다.
    다음 강의에서 이 값을 메꾸는 방법을 배울 것이다.
  • 마찬가지로, df2라는 칼럼과 인덱스 이름을 정의한 DataFrame에 칼럼과 인덱스의 이름을 확인할 수 있다.
    image
  • 또다른 유용함수로 df.describe()라는 함수가 있다. 연산이 가능한 숫자를 가진 컬럼을 뽑아내고  그 칼럼들에 대해
    기본 통계량(총 개수, 평균, 표준편차, 최소값, 퍼센트, 최대값)을 산출하여 표시해준다.
    이는 어떤 dataset를 가져온 뒤, DataFrame으로 바꾼 다음 전체적으로 살펴볼 때 아주 좋다.
    image

movielens-1m.zip

주로 데이터분석은 pandas 라이브러리를 이용해서 할 것이기 때문에, Numpy의 데이터분석을 간단하게 사용해보자.
첨부파일에 올려진 데이터(movielens dataset)는 콜론 2개(::)을 구분자로 사용하고 있다.
보통은 콤마(, )로 많이 구분하며, 그러한 파일을 csv라고 부른다.
우리는 홈폴더의 python_da / data/ 폴더에 첨부파일을 압축을 풀어와 실습해보자.


dataset 파일 읽어오기

np.loadtxt( “ 파일경로”, 파일에서 사용한 구분자,  데이터타입 지정)를 이용해서 파일을 읽어와, data 변수에 array로 넣어준다.
파일 경로는 .ipynb 파일을 만들어서 사용하는 폴더( c:\user\cho\python_da\)
까지는 자동인식이 된다.
우리는 노트북home폴더 이후에 “data폴더 / 파일경로”를 지정해주면된다.
나는 홈화면에서 파일을 타고 들어간 다음 구분자까지 확인한 후, 노트북파일이 열린 python_da/ 뒤로부터 복사하였다
데이터타입은 np.int64를 사용해 정수만 불러오자.(파일 불러오는 동안 in [ 출력번호 ] 가 * 로 표시되다가 완료되면 숫자로 바뀐다.)
data = np.loadtxt("data/movielens-1m/ratings.dat", delimiter = "::", dtype = np.int64)
image

데이터셋을 다루는 좋은 습관은, 들고 있는 데이터의 앞 몇개를 매 작업마다 살펴보는 것과 array의 shape를 관찰하는 것이다.
*** numpy없이 list만 있으면, 행렬의 개념이 적용안되면서 shape확인도 안된다. array로 데이터를 관리해야한다.
(1) 먼저  [ 처음부터 5행까지, 전체열]을 살펴보기 위해, data[ :5, :] 를 입력해서 읽어온 데이터의 앞 5행만 살펴보자.
image
  (2) shape도 살펴보자. ( 행, 렬)이 나타난다. 만약 1차원배열이면,,, 열만 나타난다
image



data 분석해보기 ( 인덱싱 –> 계산)


전체 평점의 평균을 계산 (인덱싱 한 array. 평균함수)

  1. 평점은 index 2번에 위치한 데이터들이다. 인덱싱을 통해 3열만 선택한 뒤
  2. array.mean()함수로 평균평점을 계산해야한다. data[:,2].mean()
    image
    만약 파이썬만 사용했다면, 매 행에서 평점 열을 뽑아내서 array에 더하고, 전체 갯수로 나누는 작업을 해야하지만
    넘파이를 이용하면, 뽑아내는 과정없이, 인덱싱 한 뒤 mean()함수로 손쉽게구할 수 있다.



각 사용자별 평균 평점을 계산***(고난도)

6강때 학습한 것 처럼
[1] 전체데이터 중 기준으로 삼을 열만 인덱싱하여 전체 데이터에 대한 전체기준열array로 삼을 것이다.
[2] 기준으로 삼은 열에서unique(arr)함수로 중복없는 기준열array를 만들어 array변수에 따로 담아놓자.
    바로 만들 수 있다.
[3]  전체 기준열array == 중복없는 기준열array 中 특정성분 을 조건문으로 하여 마스크룰 만든다.
[4] 그 마스크를 전체데이터의 행의 index에 집어 넣으면, 전제기준열에서 특정성분을 가진 행만을 뽑아 낼 수 있다.
   열의 index에 넣으면 원하는 열만 뽑아낼 수 있다.

image

    1. 먼저 전체데이터에서 기준으로으로 삼을 각 사용자를 의미하는 1열을 인덱싱하여 전체기준열array[1]를 만들고 ,
      중복없는 기준array[2]따로 만들자. np.unique( arr )함수로 unique한(중복되지 않은) 사용자id의 종류를 뽑아내야한다.
      image
      어떤 array를 뽑아냈다면, 위에서 말한 것처럼, 앞에 몇개 + shape를 통한 행x열 (1차원이면 열만)을 확인하자
      shape를 통해, 1차원배열으로, 중복없는 기준열인 user_ids는 1부터, 6040 개의 열을 가진다
      cf) 앞에 몇개만 확인할 경우, 1차원이면 [ :5] - 5개의 열 확인 / 2차원이면 [:5, :] – 5개의 행 확인 이다.
      제일 앞 인덱스에다가 볼 열 / 행 / .. 을 개수를 지정하자.
      image
    2. 전체 기준 열[1] ==  중복없는 기준열[2] 中 원하는 조건 을 통해 마스크[3]를 만들고,
      행index에 집어넣어서, 조건을 만족하는 행만 뽑아낼 것이다.( 사용자id를 가진 행만 뽑아내서 받아준다)
      이 때, 원하는 조건성분이 for문을 통해서 user_ids에 있는 것이 하나씩 입력되는 user_id가 원하는 조건이다.
      (0) 먼저, for문을 돌면서 append()함수를 사용해서 데이터를 받아줄 list = []를 하나 만들어줘야한다.
          mean_rating_by_user_list는 기준인 user_id와 각 사용자의 평점들을 평균낸 값을 받아줄 것이다.
      (1) 마스크를 만든다( 전체기준열 == 중복없는기준열 中 원하는조건)
           data[:, 0] == user_id
      (2) 마스크를 전체데이터의 행index에 집어넣어서, 기준을 만족하는 행들만 받아오는 data_for_user 에 넣자.
           data_for_user = data [ data[:, 0] == user_id, :
      *** 여기까지가   특정열-> 특정성분을 가진 행들만 뽑아서 모은 것이다. 아직 for문을 돌리는 것은 생각x
      image

    3. 원하는 행들만 모여있는 data_for_user에서, 평점을 의미하는 3열만 인덱싱한 뒤 그 array에 대해 array.mean()으로 평균을 구하여 mean_rating_for_user에 담자. 현재의 조건인 user_id에 대한 행들의 평점array를 평균낸 값이 저장된다.
      mean_rating_for_user = data_for_user[ : , 2 ].mean();
      image

    4. 마지막으로, 첫번 째 코드인 mean_rating_by_user_list라는 빈 리스트[ , , , , ]에다가
      넣을 list변수.append(  [ 리스트, 성분  ] )를 통해
      해당 user_id와 함께 해당 user_id에 대한 평점들의 평균(data_for_user)을 같이 담을 것이다.
          mean_rating_by_user_list.append ( [user_id , mean_rating_for_user ] )
      image
    5. FOR문을 돌면서, 각 사용자들(user_ids)에 대한 평균평점들이 처음에 만들어놓은 리스트에 담길 것이다.
      이 때, array가 아닌 []리스트 성분으로 [ 사용자id,  평점평균 ]을 담았기 때문에  1차원 array이다.
      인덱싱으로 5개만 확인하고 싶으면 열으로 확인해야한다.
      image
      cf) array (  [ [리, 스, 트1] ,
                      [리, 스, 트2] ] ) ==> array 만 M X N 행렬이 적용되는 것이다.
          list[  [ 리스트, 성분] ,
                [ 리스트, 성분 ] ] ==> list는 1차원으로서, 인덱스에서는 열만 적용된다. + shape도 적용 안된다.

      image

    6. append()를 사용해야하므로, 2차원처럼 생긴 2개의 정보를 담아 리스트로 받았다. 하지만 리스트는 행렬의 개념이 아니므로
      데이터관리에 유용하도록 이 2차원처럼 생긴 리스트를 np.array( list , 타입)을 이용해 array에 집어넣을 것이다.
      ( numpy를 이용해서    리스트 –> array로 바꿔서 데이터를 관리하자!  np.array ( 리스트변수 ) or ( [리스트, 성분] )
      그러면 인덱스에 [행, 렬] 개념 및 shape을 적용할 수 있다.  데이터타입은 실수형으로 만들어준다.
      mean_rating_by_user_array = np.array( mean_rating_by_user_list , np.float32)
      image
      만약 인덱스를 하나만 넣는다면, [행]으로 간주된다. 2차원 행렬에서는 [ :5 ] 와 [ :5, : ] 가 동일하다. shape도 확인해준다.
      image




cf) 읽어오기
np.loadtxt( “ 파일경로”, 파일에서 사용한 구분자,  데이터타입 지정)
를 이용해서 파일을 읽어와, data 변수에 array로 넣어준다.
(파일 불러오는 동안 in [ 출력번호 ] 가 * 로 표시되다가 완료되면 숫자로 바뀐다.)
data = np.loadtxt("data/movielens-1m/ratings.dat", delimiter = "::", dtype = np.int64)

data파일로 쓰기(내보내기)


이제 사용자별 평점평균을 표시하는 array를 ---> 외부파일로 쓰는 작업을 해보자. np.savetxt()메소드를 이용할 것이다.
np.savetxt( “ 파일명”해당 array 변수 ,  파이썬포맷, 구분자)
를 이용해서 파일로 내보내기(쓰기)를 할 수 있다.
np.savetxt("mean_rating_by_user.csv", mean_rating_by_user_array, fmt='%.3f', delimiter=',')

이 때, 파일경로는 해당notebook이 있는 위치폴더(python_da)가 루트다. 노트북들과 함께 저장된다.
image

array 각 성분에 대한 특정계산  함수

  • 1부터 9까지 정수 array를 만들고, np.sqrt( arr )매소드를 사용해보자.
    cf) np.arange( n ) 은 0부터 n-1까지 / (1, n)은 1부터 n-1까지 정수array 생성
    np.sqrt( arr) 매소드는 각 array성분에 제곱근을 입힌다.
    image
  • np.log10(arr)은 각 성분에 상용로그를 입힌 array를 생성한다.
    image

2개이상의 array에 대한 각 성분 비교 함수

  • 랜덤으로 1x8 array 2개를 만들고, np.maxium( arr1, arr2 )함수를 이용해서, 각 성분 중 큰 성분을 골라내서 새로운 array을 만든다.
    cf) np.random.randn( n )은 일차원 1xn array / (n, m)은 2차원 n X m array 랜덤생성
    image
  • 그외 참고할만한 함수
    image



Numpy 통계함수

앞서 학습한, 한 array의 각 성분에 대한 계산 이외에, array 전체성분에 대한 각종 통계량을 계산할 수 있는 함수들이 있다.
np. 이 아닌 array.으로 시작하는 것이 특징이다.

  • 크기가 5x4 랜덤 array를 생성하고 arr.sum()함수를 이용해서 array의 전체성분의 합을 구한다.
    image
  • arr.mean()을 이용해서 array의 전체성분의 평균을 구한다.
    image
  • 그 외 한 array에서 적용되는 통계함수
    image


행 방향 or 열 방향의 성분들만 계산하는 통계함수를 써보자.
array로 나타낼 수 있는 데이터는 일반적으로,  행이  한 사람or 한 item을 의미하고, 열이 각 속성을 의미하는 것이 많다.

  • arr.sum( axis = 0)은 sum()함수의 인자에 axis=0을 넣음으로써, 행 방향 (↓) 즉, 각 열들의 합을 구할 수 있다.
    image
  • arr.sum( axis =1)은 열 방향(→) 즉, 각 행들의 합을 구할 수 있다.
    image


특정 조건을 만족하는 성분을 셀 때 유용한 함수

  • array에 조건문을 달면, 마스크(boolean indexing)을 생성하는 것을 배웠다. 이러한 마스크에다가 sum()함수를 적용할 수 있다.
    ( arr>0 ).sum()을 하면, array의 성분들이 True는 1로, False는 0으로 계산되서 합계가 나온다. 결과가 9이 나왔다면, 성분들 중 0보다 큰 성분은 9개이다.
    결과적으로, ( array 조건).sum()함수조건을 만족하는 성분의 총 개수이 된다.
    image


정렬함수

데이터상에서 Top30, 상위5% 등의 데이터를 구하는 방법이 바로 정렬함수를 사용하는 것이다.

  • 8열의 성분들을 작은것부터 오름차순으로 정렬하려면,  np.sort( arr) 함수를 이용한다.
    image
  • 이제 큰것부터 내림차순으로 정렬하기 위해서는, 파이썬 일종의 꼼수이니, 외워서 사용하자.
    np.sort( arr ) [  ::-1 ]은 내림차순으로 각 성분들을 정렬한다. np.sort(arr)를 호출 한 결과에 특이한 인덱스[::-1]를 붙히는 것이다.
    image

2차원 array에서도 정렬함수를 적용할 수 있다.

  • 2차원 5 x3 array에서도 마찬가지로 오름차순을 하기 위해서는 np.sort( ) 함수를 호출하지만, 차이점은 인자값에 추가로 axis가 들어간다.
    즉, np.sort( arr , axis= 0)을 오름차순으로 정렬한다.
    image
    마찬가지로 (arr, axis =1)을 인자값으로 주면, 각 행을 오름차순으로 정렬한다.

    이 때, 각 열을 오름/내림차순으로 정렬(axis=0)하면, 한 행을 기준으로 묶여있던 성분들이 뒤섞여버린다. 즉, 서로다른 행간에 성분들이 섞여버리게 된다.
    우리가 주로할 작업은, 특정 열(각 item의 특정 속성)을 기준을 으로 행 단위(item단위)로 오름차순으로 정렬하는 것을 주로 할 것인데,
    sort함수만으로는 우리가 원하는 결과를 얻을 수 없다. 추후 추가적인 조취를 취해야한다.


많은 수의 성분(150개)을 가진 일차원 array를 랜덤하게 만들어서, 상위 5%의 인덱스 값이 무엇인지 확인해보자.

  1. 먼저 내림차순으로 sorting을 한다. np.sort(large_arr)[::-1]
    image
  2. 전체 성분의 5%에 해당하는 인덱스를 내림차순정렬된 sort()에다가 반영해준다. np.sort(large_arr)[::-1][ int(0.05* len( large_arr))]
    (1)  len( large_arr )array의 총 길이를 구한다.
    (2)  총 길이에 0.05를 곱하여, 상위 5%에 해당하는 길이를 구한 뒤 정수형으로 형변환해준다. int ( 0.05 * 150 ) = 7
    (3) 그값을 내림차순으로 정렬한 array에다가 인덱스로 반영하면, index가 7인 성분이 나올 것이다.(원래는 –1 해줘야.. 8이 아닌 7번째 나올?)
    image


Numpy array에 사용되는 또다른 유용함수

미리 준비한 1차원 array을 보면, 중복된 성분을 가진다. 이 때 np.unique( arr ) 함수를 통해 중복된 성분을 제외한 array를 반환한다.
cf) ints에 unique()함수를 써서 생성한 array를 보니,  중복된 것을 제외하면서 숫자는 오름차순으로 정렬되네!

image

array indexing

넘파이의 꽃이라고 하는 인덱싱은, 성분을 추출할 때 필요한 것이다.

  • 먼저 넘파이를 import하고, array를 하나 만들어진다. index는 0부터 시작하기 때문에, [5]는해서 6행or 6열으로 해석한다
    image
  • 1차원 array에 범위 인덱스를 적용해보자. 1차원 array의 index는 오로지 열의 index만을 의미한다.
    만약, arr[ 5: 8 ]이라고 입력하면, index가 5인 것(6열)부터  인덱스가 8인 것 전까지, 즉 index 7인 (8열 까지)다.
    예를 들어, arr[2:3]은 3열부터 3열까지니까 3열만 의미, arr[1:5]는 2열부터 5열까지 를 의미한다.
    숙달되어야한다. 범위 인덱스는 앞+1열(or행)부터 뒤열(or행)까지!!
    image
    이 때, 해당하는 index 5부터 7까지에 한 숫자를 모두 대입할 수 도 있다. arr[5:8] = 12
    image
    만약 범위인덱스가 비어있다면, arr[ : ]는 array의 전체 열(성분)들을 의미한다.
    image


2차원 array의 indexing을 살펴보자.

  • 2차원 array의 인덱스는 반드시 [  ,  ] 콤마를 기준으로 2개의 인자를 받는다.
    앞 인자는 행의 index를 의미한다. 뒤 인자는 열의 index이다. 여기에 콜론:을 넣으면, 모든 성분에 해당하는 것이다.
    image

    cf)범위 인덱싱 :  콜론(:)을 이용해서, 콜론 좌측에는 시작index를 / 콜론 우측에는 마지막index + 1값이 대입된다.
       그대로 n행 또는 n열까지라고 해석하자.
  • 행의 인덱스에도 범위인덱스를 적용할 수 있다.
    만약 arr2d[ 1:3 ,  : ]으로 행의 index에서 콜론(:)을 이용하여 index1부터 2까지를 의미하므로 2행과 3행을 불러올 수 있다.
    image
  • 이번에는 행의 index에다가, 전체를 의미하는 콜론을 넣고, 열의 인덱스에는 구체적으로 index를 적어주자.
    arr2d[ : , 3]은 1,2,3,4행 전체에 대해서 4번째 성분을 가져와서 배열을 만든다.
    즉, 1행의 4 2행의 8, 3행의 12, 4행의 16을 가져와서 새로운 array를 만든다.
    image
  • 열의 index에서 범위인덱스를 넣어보자. arr2d [ : , : 2] 에서 :2는 첨부터 index1까지를 의미하므로, 1열과 2열을 의미한다.
    image
  • 특정 원소만 가져오는 것은 가장 단순하다. [1,2]는 2행 3열이다.
    image
  • 특정 범위의 행x열에다가 0을 대입해보자. arr2d[:2, 1:3] = 0에서 행은 index 0, 1까지, 열은 index 1, 2까지를 의미한다.
    즉 행렬의 1행 2행의 2열 3열에다가 0을 입력한다.
    image



boolean Indexing

  • array 인덱싱 이외에도 불리언 indexing도 중요하다.
  • 데이터는 아래 코드를 복사해서 생성하자.
    names = np.array(["Charles", "Kilho", "Hayoung", "Charles", "Hayoung", "Kilho", "Kilho"])
    data = np.random.randn(7, 4)
    np.random.randn ( 7, 4 )라는 함수는 array의 성분을 랜덤으로 7X4 이차원array를 생성하는 함수다.
    image
  • 각 names의 성분(7개의 열)에 따라---> data의 각 행 대응된다고 생각해보자.
    예를 들어서, Charles라는 사람은 1행에, Kilho라는 사람은 2행의 데이터에 대응된다고 생각하고 아래처럼 array조건문을 입력해보자.
    image
  • names == "Charles"
  • array([ True, False, False,  True, False, False, False])
  • 이 결과 생성된 array는, 원래 성분이 7개인 names와 성분의 갯수가 동일하다. 근데 True나 False로만 이루어진 array이다.
    array에 조건문에 사용되는 [ == ] 를 사용했더니, names의 성분에 대응하여, 값이 “Charles”인 것과 동일한 것만 True, 다른 것은 False로서 성분이 구성된 array를 반환한다. 이것이 바로 boolean array 혹은 마스크 라고 한다.
    [ array == array 의 성분중 1개 ]  ====> [ true or false]로 구성된 마스크 array를 뽑아낸다.
  • 이러한 마스크는 다른 array의 행 또는 열의 인덱스에 집어넣어 인덱싱하는데 사용할 수 있다.
    아래와 같이 입력해보자.
    image
    data의 행index에, 숫자나 범위인덱스 대신 마스크를 넣었다. 그랬더니, 마스크에서 True1번째 성분과 4번째 성분에 해당하는 1번째 3번째 행만 뽑아내졌다. 
  • 마찬가지로 아래와 같이 입력해보자.
    image
    names == “kilho” 마스크를 행index에 넣어서, kilho가 들어있던 2,6,7번째 성분에 대응하여, data 중 2,6,7번째 행만 뽑아낸다.
    즉, 마스크를 이용해서 행이나 열을 인덱싱할 수 있다.
    array == array 의 성분중 1개  =>  true or false로 구성된 마스크 array => 행or열의 index에 들어가 해당 행or열을 뽑아낸다
    인덱스 자리 [행, ] or [ , 열 ]마스크를 집어넣으면, true에 해당하는 행or열만 뽑아낸다는 특징이 있는 것이다.

    image
  • 행index에서 뽑아낼 마스크를 2개로 줄 수 도 있다
    image
  • 기존의 데이터array의 성분에 조건문을 달아, boolean indexing 즉, 마스크를 만들 수 있다.
    (앞에서는 names라는 이름array를 기준으로 마스크를 만들었었다)
    data의 각 행의 4열만 뽑아보고,  그 array에 조건문을 달아서 마스크를 만들어보자.
    image
    이를 행index의 인덱싱으로 사용해보자. data[ data[:,3]< 0, : ]를 해석해보자면, 각 행 중 4열의 성분이 0보다 작은 행만 추출하는 것이다.
    image
    추출과 동시에 해당 행에 0을 대입해 줄 수 도 있다.
    image

numpy에 대한 이미지 검색결과

넘파이는 백터 및 행렬연산에 있어서 엄청난 편의성을 제공한다. 추후 사용할 판다스와 맷플롯립 등의 기반이되는 라이브러리다.
기본적으로 array라는 단위로 데이터를 관리한다. 고등수학의 행렬과 대단히 유사한 부분이 많다.


array 사용

  • 먼저, 노트북에 numpy 라이브러리를 import해야한다.
    import numpy as np 에서 np는, 앞으로 셀에서는 약자np. 으로 사용할 것이라는 의미이다.
    image
  • data1에, 성분이 5개인 일차원 리스트를 만들고, data1을 인자로하여 새로운 arr1이라는 array를 생성하자.
    arr1 이라는 array이는 크기가5 짜리인 1차원 array이다. (리스트 생성 – > np.array)
    image
    생성한 array의 크기정보를 트래킹 하기 위해서는  array안의 멤버변수 .shape로 확인한다.
    예제의 경우 array의 크기가 5이므로 5가 출력된다.(행은 없고 열만 5개라는 의미이다)
    image
  • 2차원 리스트를 만들어서 –> array 에 담아보자.
    image
    이 때, arr2는 2 x 4 짜리 array가 되는 것이다. shape로 확인해보자( 행 , 열 순으로 표시된다)
    image
  • 특수한 array경우에는 리스트-> np.array( 리스트) 의 과정없이도 한방에 만들 수 있다.
    예를 들어, 0으로만 구성된 3 X 6의 배열은 np.zeros( (행, 열 ) )라는 함수로 바로 생성가능하다.
    image
    마찬가지로, 1으로만 구성된 배열은 np.ones( (행, 열))로 생성가능하다. 이번에는 1차원으로 열만 입력해보자.
    image
    또 특수한 np.arange  함수는 0부터 n-1까지 간격이 1인, array를 한번에 생성한다.
    image

array의 데이터형 in Numpy

  • 파이썬에 데이터형이 있듯이, 넘파이에서도 array의 고유한 데이터형을 가진다. 이 데이터형은
    dtype이라는 멤버변수를 이용해, 생성한 array의 데이터형을 확인할 수 있다.
    image
    arr1의 인자인 data1에는 실수인 7.5가 포함되어 있었기 때문에, 넘파이에서 자동으로 float64형으로 array를 만들었던 것이다.
    arr2에는 모두 정수인 리스트 data2를 인자로 가졌기 때문에, 자동으로 int64형 array를 만들었다.
  • 데이터형은 생성시 직접 지정할 수도 있다. np.array()함수의 인자에 리스트와 동시에, dtype = np.데이터형64을 같이 입력해주면 된다.
    image
    * 참고로 int나 float 뒤의 숫자는 메모리상에서 몇 bit를 이용해서 해당array의 각 성분을 표시할지를 나타내는 것이다.
      더 큰 숫자를 사용할 수록 더 큰 숫자를 표현할 수 있다.
  • 기존의 array 데이터형을 변환하여 새로운 array를 만들수 있다. astype( np.바꿀데이터형64 )이라는 함수를 사용하면 된다.
    생성한 뒤,  dtype멤버변수로 확인해보자.
    image
  • 그 이외에 데이터형 정리
    image



array의 연산

  array에 대해서는 + , – , *, / 가 적용이 된다.

  • 먼저 2개의 이차원 array(2 x 3)를 생성해보자.
    image
  • 더하기를 해보자. 행x열의 각 성분들이 더해진다.
    image
  • 마찬가지로, 빼기, 곱하기, 나누기도 각 성분들끼리 연산된다.
    image
    *이 때, 흔히 오해하는 것중에 하나가 곱셈연산 같은 경우는 고등수학의 행렬의 곱셈이 아니다.
  • array의 각각의 성분에 대해서  하나의 일반 숫자와의 연산도 가능하다.
    image

iphython실행하기

Anaconda Prompt를 실행한 뒤, [jupyter notebook]을 입력하면 아래와 같이 뜨면서, http://localhost:8888/tree의 크롬 웹사이트가 자동으로 열린다. 뜬 화면이 바로 iPython Notebook GUI 화면이다.
커맨드콘솔을 써야하는 iPython과는 비교가 된다.
image image
홈폴더의 내용물이 표시되어있다.


iPython NoteBook 살펴보기

  1. 앞서 만들었던 python_da폴더에 들어가서, 우측상단의 [new] > phyhon3 버튼을 눌러 데이터분석 한번에 할 때 사용할 일지인 [노트북]을 만들어야한다.
    image
    먼저 노트북 제목을 설정하기 위해, Untitled 을 클릭해서 노트북 이름을 바꾼다

  2. 화면에 보이는 직사각형의 입력라인은 [cell]이라 한다. 클릭을 통해 활성화하고, cell바깥을 클릭하여 비활성화 시킨다.
    ipython과 다르게 여러줄 입력이 가능하다.
    image
    이제 화면상단에 보이는 [Run]을 클릭하면 콘솔에서 enter친 것처럼, 출력문을 표시한 뒤, 다음 셀로 넘어간다.
    image
    현재 셀을 실행하지 않고, 한꺼번에 여러 셀들을 입력한 다음, 한번에 실행 시킬려면 [ + ]을 눌러서 셀을 추가한다. 이 때, 실행되지 않은 셀들은 [ 출력순서 ]가 비어있다. 다 작성하고 난뒤에, 비어있는 가장 첫번째 cell으로 이동한 다음, Run을 실행해줘서 순차적으로 실행시킬 수 있다. image
    * 사실 [ ]안에 수는 라인번호가 아니라 가장 최근에 실행된 cell을 의미한다.
    만약 실행했던 셀을 다시 실행하고 싶다면, 해당 셀을 선택한 뒤 Run을 눌러주면 된다. 그러면  [  ] 안에 출력순서가 커지면서 가장 최근에 실행되었다는 것을 알린다



  3. cell을 삭제하는 버튼은, 해당 셀을 클릭한 다음, [가위]버튼을 이용해서 삭제한다. 사실 잘라내기를 실행시킨 것이므로 옮기고 싶은 바로 위 셀에서
    [붙히기(paste cell below]버튼을 누르면 된다.
    image
    단순하게 이동만 시키고 싶다면 [ 위/아래 화살표]를 눌러서 조절할 수 있다.

  4. 메모리에 올라온 모든 정보(변수 및 메소드())를 삭제하고 싶다면 [ 회전화살표 ] – Restart kernel을 통해 메모리에 정보들을 모두 삭제시킨다.
    %who를 통해 확인할 수 있다.
    image

    image
  5. 화면에 올라온 변수출력정보까지 삭제하고 싶다면 상단 메뉴중 Kernel > [ Restart kerner and Clear Output ]을 누른다.
    셀의 내용만 남아있게 되고, 출력순서 [ ]는 모두 비어진다.
    image
    image

    모든 셀을 다시 순차적으로 실행하고 싶다면, 상단 메뉴중 Cell > [ Run all ]을 선택한다.
    만일 순서가 뒤죽박죽이라 에러가 난다면, 셀 위치를 조절하거나 해당 셀을 삭제한 뒤 다시 실행시켜야함.


  6. 이제 작성한 노트북을 다른 형태로 Export 할 수 있다. 상단 File > DownLoad as 를 선택한다.
    image
    예를 들어, html로 저장한 뒤 실행해보면 아래와 같다. 셀의 정보와 출력문을 나타내준다.
    image

  7. 메뉴버튼 중 [키보드]모양을 클릭하면 단축키 리스트들이 나와있다.
    image
    image

  8. 지금까지의 내용을 저장하려면 상단의 [디스켓]버튼을 눌러서 저장한다. 그러면 우측에 Check point라는  것이 뜨게 될 것이다.
    image
  9. 노트북을 종료하고 싶다면 File > Close and Halt를 눌러 종료한다.
    *.ipynb는 iPython NoteBook 에서 다루는 파일의 확장자다

  10. 이제 ipython notebook을 완전히 종료하고 싶다면, 웹사이트 뿐만 아니라 아나콘다 프롬프트에 들어가서 [Ctrl + C]를 통해 완전히 종료한다. interrupted..가 뜨면서 종료되어, 홈폴더 경로에 다시 위치하게 된다.
    image

4. iPython 살펴보기

2018. 2. 22. 15:35

iPython 살펴보기

앞서 ipython은 기본 파이썬 대화식 프로그래밍 툴(Python shell)에다가 몇가지 기능을 덧붙인 툴이라고 설명했다.
Anaconda Prompt에서  ipython을  입력하여 사용할 수 있다.

  • ipython 콘솔에서 초록색  in은 내가 코드를 입력할 수 있는 상태를 의미한다.  [ ] 안에 숫자는 해당라인을 의미한다.
    대화식 프로그래밍이 가능하게하는 파이썬의 장점은, 내가 보고싶은 변수를 입력하면 바로 out [ 해당라인 ] 으로 답을 해준다는 것이다.
    image
    print( 변수 ) 로 출력할 수 있으나, 변수명만 입력하면 출력해준 다는 것은 엄청난 장점이다.
  • tab 키를 통해서 긴 변수라도 자동완성해주는 기능을 제공한다.
    imageimage
    이는 변수가 많아 졌을 때 대단히 유용하다
  • 하나의 In에다가 복수개의 행을 입력할 수 있다.
    반복문, 조건문처럼 복수개의 행을 입력할 때,  enter를 입력하더라도 자동으로 들여쓰기가 된다.
    조건문의 경우에는, else문은 if문과 동일한 위상으로 직접 적용해줘야하는 주의사항이 있다.
    image
    함수를 정의할 때도 유사하게 진행된다.
    image
  • 이때, [ Ctrl + L ]을 입력하면 지금까지 작성한 라인들을 다 삭제해준다(python 2.x 버전에서는 clear 명령어였다)
    image
  • 어떤 변수나 함수에 ?(물음표)를 붙히면, 자료형/값/ 간단한 정보를 제공해준다.
    앞에 정의한 변수에 number_of_employees? 확인해보자
    함수의 경우, 함수()뒤에 소괄호()를 빼고 함수이름? 으로 확인할 수 있다.
    image
  • iPython에서 제공하는 [ %who] 명령어를 입력하면, 현재까지 정의한 모든 변수/함수를 확인할 수 있다.
    이러한 iPython명령어들을 매직커맨드(매직명렁어)라고 한다.
    image
    del number_of_employees를 통해 변수를 삭제한 다음, %who를 통해 메모리에 올라와있는 변수를 다시 확인해보자.
    image
    이제 모든 변수/함수를 삭제하는 [%reset]명령어를 입력하고, %who로 확인해보자.
    image
    [%time + 계산식 ]이라는 매직명령어는 특정코드가 사용되는 소요된 시간을 확인할 수 있다.
    image
    cf) range( a )는 0부터 시작해서 a-1까지의 범위를 의미한다. a직전에 stop한다는 의미이다.
        **는 거듭제곱을 의미한다.

1. 미니콘다 설치

아나콘다는 오픈소스 파이썬의 플랫폼으로, 단순설치로 환경설정을 한번에 끝내주기 때문에 아주 편리하다.
아나콘다에서 떨어져나온 미니콘다(miniconda)는 핵심만 뽑아서 재구성한 플랫폼이다. 오픈소스 관리패키지인 콘다와 파이썬만 포함하기 때문에, 설치가 훨씬 빠르다.

  1. https://conda.io/miniconda.html 에 들어가서 윈도우 비트수에 맞게 다운받아서 설치한다. 혹시 자기 윈도우가 몇비트인지 모르는 사람은 내컴퓨터 우클릭> 속성 > 시스템 종류에서 확인한다.
  2. 최신버전(2018. 2. 22)인 MiniConda phython3.6 64비트를 다운받아 설치한다.
    image 

    image
  3. 윈도우메뉴 > 프로그램 및 검색 에서 [ cmd ]를 검색하여 명령 프롬프트을 실행 > [ conda]를 입력하여 파이썬이 제대로 설치되었는지 확인한다.
    나같은 경우, d:\User\사용자폴더\ 에 설치하였다. 그리고 cmd 혹은 명령프롬프트에서 conda명령어가 안먹혔다. 그래서 시작메뉴 > 설치된 아나콘다 > [Anaconda Prompt ]를 실행해서 conda 를 치니 정상적으로 확인이 되었다.
    image
    image

         - 명령어들은 콘다라는 패키지매니져의 커맨드들을 나타나는 것을 확인 할 수 있다.



2. conda 버전 업데이트하기

Anaconda Prompt에서 [ conda update conda ]를 입력해준다.
image


3. 파이썬 버전 확인하기

[ python --version ]을 입력하면 미니콘다를 통해 설치된 파이썬의 버전을 확인할 수 있다.
image


4. iPython설치

파이썬의 패키지매니져 중에 하나인 pip명령어를 통해서 ipython과 여러 라이브러리를 설치한다.

  • ipython설치 : [ pip install ipython ]을 입력하여 설치한다.
    image
  • ipython실행 : [ ipython]을 입력한다.
    image
  • ipython종료 :  [ exit() ]를 입력한다.(엑시트 함수)
    image



5. 실습 폴더 사전작업

윈도우 탐색기에 들어간, c:\User\cho(사용자명)은 홈폴더이다.  이 폴더에 데이터분석을 위한 폴더를 몇개 더 만들 것이다.

  • 홈폴더에서 새로운 폴더 [python_da] 를 만든다.
    image
  • 다시 python_da폴더에 새로운 폴더 [data]를 만든다.
    image


 

6. 라이브러리 설치

  1. Numpy 설치 : 커맨트창에 [ pip install numpy ]를 입력하여 바로 설치한다.
  2. pandas 설치 : [ pip install pandas ]를 입력하여 설치한다
  3. matplotlib 설치 : [ pip install matplotlib ]을 입력하여 설치한다.
    image
  4. jupyter 설치 : [ pip install jupyer ]를 입력하여 설치
    * ipython 라이브러리를 사용하도록 해주는 라이브러리이다.


IPython Notebook

Python에서는 Python shell이라는 기본적인 대화식 프로그래밍 툴을 제공하는데, IPython은 이 기본 툴에 몇 가지 강력한 기능을 덧붙인 툴이라고 할 수 있다.

IPython Notebook은, IPython의 대화식 프로그래밍 방식을 기본적으로 제공하면서, 여러분이 데이터 분석을 하는 과정을 노트 형식으로 보기 쉽게 기록하고 정리해 놓을 수 있도록 도와주는 강력한 툴이다.


참고 사이트


파이썬 데이터분석 라이브러리

Scipy(싸이파이)에서 제공하는 라이브러리들로  수학, 과학 분야를 분석하는데 특화된 에코시스템이다.

  • 넘파이(NumPy) : 벡터 및 행렬계산에 엄청난 편의를 제공하는 라이브러리로, 앞으로 사용할 pandas, matplotlib의 기본 베이스가 되는 라이브러리
  • 판다스(pandas) : 가장 많이 사용하게 될 라이브러리로, 고유하게 정의된 자료구조를 활용해서 빅데이터를 분석해준다. 기존 엑셀로 하던 모든 분석을 높은 수준으로 스켈과 속도가 커진다.
  • 맷플롯립(matplotlib) : numpy와 pandas를 통해 얻은 데이터 분석결과를 시각화 해주는 라이브러리


어떠한 데이터를 다룰까?

  • 인터넷 주소를 줄여주는 bit.ly은 json(키-벨류)형식의 인터넷 트래픽 dataset을 분석해서 정부에 제공했다.
  • MovieLens는 인터넷 고객의 영화평점을 분석해서 예상평점이 높은 영화를 추천하는 시스템을 공개했다. 사용자별로 id와 영화별id, 평점, 날짜를 분석했다.
  • kaggle은 US Baby Names(1880 ~ 2014)의 dataset을 분석했다. 미국의 사회보장국에서 얻은 정보 행의 값인 id, Name, Year, Gender, 총 출생수Count로 분석했다. 그외 대선득표율, 대출상태 관련 데이터셋도 제공했다.

데이터란?

데이터란?  어떤 대상에 대한 측정이나 관찰을 통해, 모아놓은 값이며, 사실을 모아놨다고 해서 데이터셋(Dataset)이라고도 한다.

분석이란? 대상을 더 잘이해하기 위해, 유효적절한 방법으로 나누고 쪼개서 그 대상을 잘 이해하는 것이다.

우리는 데이터의 의미를 도출하기 위해 데이터를 분석한다.


빅데이터에 대한 분석 방법

  1. 탐색적 데이터 분석(EDA, exploratory data analysis)
  2. 가설검정
  3. 기계학습
  4. 자연어 처리
  5. 패턴인식


탐색적 데이터분석은 모든 데이터분석의 출발점으로서, 각종 통계적 기법을 적용하여 특징을 발견하고 시각화한다.

이 때, 데이터에 대한 가설을 세우고 검증하는 방법으로 간다. 이제부터 탐색적 데이터분석을 데이터분석이라 줄여서 부르기로 한다.

데이터분석을 통한 수익 창출의 예

  • amazon : 고객이 구매한 이전애 구매한 서적을 분석한 뒤, 해당고객과 유사한 구매성향을 가진 고객들에게 그 서적을 추천하는 시스템을 통해 전체 매출의 35%를 차지했다.
  • 독일 국가대표팀 : 2014년 독일국가대표팀은, 통계기업에 데이터분석을 요청하였고, 팀워크&개인기량을 높이기 위한 피드백을 제공함. 이를 통해 선수들이 3초->1초까지 공 소유시간을 줄었다.



빅 데이터란?

양이 많이 많고 복잡해서, 통상적인 데이터분석이 먹히지 않는 것이다.

큰수의 법칙(Law of Large Numbers)에 의하면, 표본의 크기가 커질수록 모집단의 평균과 가까워진다는 것이 알려져있다.

예를 들어, 양면의 동전을 여러번 던진다면 결국 앞면과 뒷면의 비율은 1:1로 수렴하게 된다.

image_thumb4

데이터의 양이 많을 수록, 분석을 통해 보다 사실에 가까워질 가능성이 높아진다는 것을 알 수 있다.

이 때문에, 분석자들의 입장에서는 어떻게 하면 데이터를 많이 모을 수 있을 까가 화두였다.

하지만, 오늘날 모바일 과 인터넷기술의 발전으로 데이터를 데이터를 축적되는 속도가 매우 높아졌다.

앞어 살펴본 2가지 사례와 같이, 분야를 막론하고 빅데이터의 분석은 어떤 일의 성패와 매우 관련성이 높다.



왜 파이썬인가?

오늘날의 빅데이터란 테라바이트 단위를 말한다. 하지만 개인이 다룰 데이터는 수백 메가바이트 혹은 기가바이트 수준일 뿐이다.

WLWCodeColorizer.zip

첨부파일을 다운 받아서, 다 모든행이 열리지도 않음에도 불구하고,  년도에 따른 출생자를 구하기 위해, 일부행을 지운 상태에서
데이터 > 부분합 > Year, 합계, Count를 선택해서 구해보자.

image

왼쪽 상단의 2번 탭을 눌러서, 각 년도에 따른 출생수(Count)를 살펴보자. 하지만 우리는 각 년도별 성별(남/여)에 따른 출생수의 합도 구해야한다. 이때, 부분합을 한번 더 누른 다음 [ gender , 합계, Count, 새로운값으로 대치를 해제 ]하면 된다. 3번째 탭에서 확인해보자.

image

근데 우리가 해야할 분석은 부분합 2번 하는 것보다 더 복잡할 수 도 있다. 예를 들어, 각 연도별 성별 조합에 따른 출생수의 합 내에서 전체대비 상위 1000가 차지하는 이름의 비중을 구하는 방법은 어떻게 할 것인가?
각 연도별 성별 내에서, 출생수를 기준으로 내림차순 정렬한 다음, 출생수가 많은 이름별로 1번부터 1000번까지 세야한다.

이렇게 엑셀을 통한 빅데이터분석은 계산과정도 함수도 너무 복잡해진다. 결정적으로 데이터가 1048576행까지밖에 로드가 안되며, 그 상태에서 여러방향으로 분석하려해도 속도가 느리고 유연성이 떨어진다.

반면 파이썬에서는 2줄이면 파일을 모두 로드할 수 있고, 차트도 한번에 해결된다. 대신 데이터를 일일히 보여주진 않는다. 작은 데이터규모는 엑셀이 편한데, 빅데이터의 경우에는 파이썬이 압도적이다.


다른 언어도 있는데 왜 수많은 언어중에 파이썬인가?

  • 언어 자체가 너무 쉽다.
  • 컴퓨터와 대화가 가능하다. 대화식 프로그래밍 방식은 파이썬 이외에 스크립트언어의 특징이기도 하다.  자바, 스칼라, 루비 등이 있다.
    특히, 파일이 바뀔때마다 컴파일을 해야하는 수고가 던다.
  • 강력한 라이브러리를 가진 것이 독보적이다.(NumPy, pandas, matplotlib)
  • 공짜다(R과 Phython은 모두 무료인 open source)

R과 python은 무슨 차이인가? 위의 장점들은 R도 가지고 있으나, 파이썬은 경우 다양한 목적으로 사용할 수 있는 언어다.

예를들어,  오늘의 주식시장을 분석한 데이터를 웹사이트에 업데이트하고자 한다. 이런 경우에는, 파이썬 라이브러리를  사용하여 주식시장 데이터를 긁어온 다음, 미리 분석가가 짜놓은 데로 원하는 데이터분석을 실시간으로 하도록하고, 파이썬 웹 프레임워크로 웹사이트를 만들 수 도 있다.


+ Recent posts