여러 통계 데이터는 대부분 정규분포를 띄고 있다는 말이 있지만, 최근 수많은 데이터 분석을 통해 그렇지만은 않다고 밝혀졌다.
여기서는 통계 데이터 분포로서 자주 등장하는 멱함수 분포에 대해 알아보겠다.
사용 데이터
MovieLens 영화 데이터 -> ml-latest-small.zip -> ratings.csv
https://grouplens.org/datasets/movielens/
import pandas as pd
ratings = pd.read_csv('[파일 경로]/ratings.csv')
사용자(userId)가 영화(movieId)에 대해 평점(rating)을 부여한 데이터
사람들는 평균적으로 몇 개의 영화에 대해서 rating을 남겼는가?
groupby()
users = ratings.groupby('userId')['movieId'].count()
users[:5]
<결과>
userId
1 232
2 29
3 39
4 216
5 44
Name: movieId, dtype: int64
어떤 사람이 몇 개의 영화에 대해 평점을 남겼는지 확인하기 위해 groupby() 함수를 사용했다.
describe()
users.describe()
<결과>
count 610.000000
mean 165.304918
std 269.480584
min 20.000000
25% 35.000000
50% 70.500000
75% 168.000000
max 2698.000000
Name: movieId, dtype: float64
users 데이터를 분석해보니 평균(mean)과 중앙값(50%)의 차이가 매우 크게 나오는 것을 확인할 수 있다.
이를 통해 데이터가 독특한 분포를 이루고 있음을 알 수 있다.
데이터 시각화
import seaborn as sns
sns.distplot(users.values)
데이터 시각화 라이브러리인 seaborn의 distplot 그래프를 통해 데이터 분포를 확인해보자.
<결과>
예상대로 독특한 분포를 띄고 있다.
이러한 분포를 멱함수 분포(power law distribution)이라고 한다.
대다수의 사용자가 영화에 적당히 평점을 남긴 반면,
소수의 인원이 영화에 평점을 과도하게 많이 남겨서 멱함수 분포가 생긴다.
따라서 평균값은 의미가 없어지고 오히려 데이터를 1열로 세웠을 때의 중앙값이 더 의미있는 데이터라 할 수 있다.
사람들이 많이 보는 영화는?
groupby()
지금은 user -> movie로 groupby를 했는데, 반대의 경우 movie -> user는 어떨까?
films = ratings.groupby('movieId')['userId'].count()
films.sort_values(ascending=False)[:5]
<결과>
movieId
356 329
318 317
296 307
593 279
2571 278
Name: userId, dtype: int64
사람들이 많이 보는 영화는 이처럼 쉽게 구할 수 있다.
그러나 지금은 데이터 분포에 집중한다.
describe()
films.describe()
<결과>
count 9724.000000
mean 10.369807
std 22.401005
min 1.000000
25% 1.000000
50% 3.000000
75% 9.000000
max 329.000000
Name: userId, dtype: float64
데이터 시각화
sns.distplot(films.values)
<결과>
역시 멱함수 분포를 띄고 있다.
대다수의 사용자가 영화를 적당히 시청한 반면,
소수의 사용자가 영화를 과다하게 많이 시청했기 때문이다.
이러한 멱함수 분포는 생각보다 우리 일상에 자주 등장한다.
예를 들어 재산을 생각할 수 있다.
- 일반적인 사람들은 적당한 재산을 갖고 있는 반면,
- 대기업 CEO, 억만장자들은 상상을 초월할 재산을 갖고 있다.
-> 즉 재산의 규모가 증가할수록 높은 재산에 해당하는 사람들은 급격히 줄어드는 멱함수 분포를 띄고 있다 말할 수 있다.
또한 인스타그램이나, 뮤직 어플 등 몇몇의 유명 컨텐츠는 많이 소비되고, 나머지는 거의 소비되지 않는 상황 역시 멱함수 분포를 띄고 있다.
'python > data analysis' 카테고리의 다른 글
[Pandas] concat - 데이터 이어 붙이기 (0) | 2021.08.26 |
---|---|
[Pandas] 영화 평점 데이터 분석 (0) | 2021.08.26 |
[Pandas] describe(), hist()를 통한 데이터 분석 (0) | 2021.08.26 |
[Pandas] seaborn - heatmap을 사용한 데이터 상관관계 시각화 (0) | 2021.08.26 |
[Pandas] get_dummies를 사용한 수치화된 데이터 생성 (0) | 2021.08.26 |