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

+ Recent posts