codestates / codestates/ds-blog
DSFT01 이재우 09042020 Titanic Data 분석 무작정 따라하기 #1
- Dominant language
- No language data
- Stars
- 2
- Forks
- 4
- PR merge metrics
- No merged PRs in 30d
Description
# 1. **Titanic Data** 분석 무작정 따라하기
학생이라면 아니 아마 대부분의 사람들은 공부를 어떻게 해야하나? 라는 질문을 안고 살고 있다. 내가 고등학교 3학년일 때, 지옥같던 하루 들을 참아내면서 공부하며 꿈을 꾸던 공부 보단 자유를 가진 대학생, 성인이 아닌 여전히 공부하고 있는 지금의 내 모습만 봐도 알 수 있다. 그렇기 때문에, 인생은 공부의 연속이라는 말에 크게 공감할 수 있다. 그래서 나는 데이터 사이언스를 공부하면서 좋은 선례의 데이터 분석을 따라하며 공부하고 이해해서 기록하여 내 입맛에 맞는 나의 말로 정리한 책을 만드는 방법으로 공부를 시작해 한가지의 공부방법을 제시하려 한다. 그 첫 단추를 가장 유명한 **Titanic data** 의 분석으로 시작하자. 데이터 분석의 첫 시작은 데이터를 이미 확보 했다고 가정 했을때, 데이터 전처리 과정이 그 첫번째 단계 일 것이다. 그래서 [Recommender System with Python](https://lsjsj92.tistory.com/597) 에서의 데이터 전처리 과정이 아주 간단하지만 알면 엄청 유용한 코드 같아서 실제로 적용해보면서 손에 익혀보려고 한다.
## 1.1 Copy 대상
[Recommender System with Python](https://lsjsj92.tistory.com/597)
에 코드 등을 바탕으로 **데이터 전처리** 과정의 코드를 먼저 이해하기.
# 2. 방법
- 따라할 대상의 코드를 이해하고, 나의 말로 바꿔보기
- **Titanic Data** 에 적용하기
- [Blog](https://github.com/codestates/ds-blog/issues) 에 기록하기
# 3. Recommender System with Python 데이터 전처리 코드 이해
```py
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from ast import literal_eval
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
```
> 항상 이 과정을 왜 제일 위에 쓸까 생각했는데, 이건 이 코드를 따라하고 읽는 사람을 위한 배려라고 느꼈다. 막상 따라할려고 코드를 Run 했는데 이것들이 없어 생긱는 에러를 만날 생각하니 까마득하다. 코드는 읽는 사람을 배려해줘야 하는것 같다. 나만 잘해서는 그 누구도 알아줄 수 없다.
💡 import 는 전체를 가져오는 것, from X import Y 는 X 에서 필요한 Y 만 가져오는 것.
```py
data = pd.read_csv('./movie_data/tmdb_5000_movies.csv')
```
> **pd.read_csv()** : 데이터 파일은 csv 파일로 많이 저장되고, csv 파일을 읽는 메서드
👨 tmdb_5000_movies.csv 라는 파일을 data로 저장할거야.
```py
data.head(2)
```
> **Dataframe.head(2)** : 데이터의 가장 위 2개를 보여줌, 데이터가 어떻게 생겼는지 간략히 확인
👨 상위 2개의 데이터를 보고싶어.
```py
data.shape
```
> **Dataframe.shape** : 매트릭스 (row, column) 을 보여줌, 데이터의 큰 포맷을 확인
몇개의 데이터를 가지고 있는지 가장 쉽게 알 수 있다.
👨 포맷이 어떻게 되는지 보고싶어, 데이터의 크기를 대략적으로 보고싶어.
```py
data = data[['id','genres', 'vote_average', 'vote_count', 'popularity','title', 'keywords', 'overview']]
```
> **Dataframe[["col_name1" , "col_name2"]]** : 불 필요한 열을 제거하는 과정!
우리가 앞으로 다룰 데이터들은 대부분 방대한 자료들을 담고 있고 굉장히 다듬어지지 않은 상태의 데이터들일 것이다. 그렇기 때문에, 우리가 분석하려는 목적을 잘 생각하고 필요한 데이터들을 알맞은 근거와 함께 골라낼 수 있는 능력이 필요하다. Recommender System with Python 에서는 'Genres'를 기반으로 추천을 해주는 시스템인데, 비슷한 genre 중에서도 'vote_count' 와 'vote_average' 를 기반으로 weighted_rating 을 계산하여 가장 높은 점수의 영화를 추천해준다.
👨 data에서 'id', 'genres', 'vote_average', 'vote_count', 'popularity','title', 'keywords', 'overview' 만 볼거야.
```py
m = data['vote_count'].quantile(0.9)
```
> **Series.quantile()** : 상위 몇퍼센트의 값을 알고 싶을 때
quantile로 median의 값을 아주 쉽게 알 수 있다.
👨 data에서 'vote_count'에서 상위 10%가 되는 값을 알고 싶고 그 값을 m 에 저장할거야.
```py
data = data.loc[data['vote_count'] >= m]
```
> **Dataframe.copy()** : Data의 원본을 해치지 않기 위해서 복사하기
**Dataframe.copy()**.loc[data['col_name'] >= value] : 특정 열에서 특정 값이 이상인 데이터만 추출하기
마찬가지로 데이터 전처리 과정에 꼭 필요하다, 예를들면 outlier 를 제거 할 때 쓰일 수도 있겠다.
👨 data를 수정할건데, 이 데이터는 data에서 'vote_count' 열의 값이 m 보다 같거나 큰 데이터만 모아서 만들거야.
```py
C = data['vote_average'].mean()
```
> **Series.mean()** : 데이터의 한 열의 평균값
평균은 Descriptive statistics에서 절대 빠지지 않는 값이다.
👨 c 라는 변수에, data의 'vote_average' 라는 열의 평균값을 저장할거야.
```py
def weighted_rating(x, m=m, C=C):
v = x['vote_count']
R = x['vote_average']
return ( v / (v+m) * R ) + (m / (m + v) * C)
```
>👨 weighted_rating 이라는 함수를 정의 할건데, x는 우리가 넘겨줘야 하는 parameter 이고, m과 C 미리 선언해서 값을 미리 정해놨어. x는 Dataframe일 것이고, v는 그 데이터에서 'vote_count'라는 값을 저장하고 R은 'vote_average' 값을 저장할거야. 그리고 함수를 호출 했을때 결과값은 ( v / (v+m) * R ) + (m / (m + v) * C) 이야.
❓ v와 R은 Series 타입일텐데, int인 m과 C를 함께 수식을 짤 수 있구나. Element-wise 계산인가?
```py
data['score'] = data.apply(weighted_rating, axis = 1)
```
>**Dataframe.apply()** : 특정 함수를 data에 적용하는 메서드, axis=1은 each row에 적용.
Data manipulation 과정이다. 사실 데이터의 값들은 우리가 원하는대로 주어지지 않는다. 그렇기 때문에 항상 주어진 데이터들을 이용하여 우리의 입맛대로 데이터를 조정할 수 있는 코드이다.
👨 data에 'score'라는 열을 추가 할건데, each row에 weighted_rating이라는 함수를 통해서 계산된 값을 저장해서 추가 할거야.
💡 데이터에서 한 row 에서 다른 col의 값을 이용하여 계산을 하려면 값을 계산하는 함수를 저장하고, apply(함수, axis=1)를 통해서 가능하구나.
```py
data['genres'] = data['genres'].apply(literal_eval)
data['keywords'] = data['keywords'].apply(literal_eval)
```
> ast.literal_eval : 문자열에 있는 문구를 문자열 때고 evaluate 해주는 메서드 ex) '{'id':28}' (string) 👉 {'id':28} (dictionary)
얕은 경험으로 데이터들은 string 으로 되어있을 때를 자주 봤었다. 이를 해결해 줄 수 있는 간편한 도구인것 같다.
👨 data의 'genres'와 'keywords' 열이 string으로 되어있는데, string을 떼고 그 값을 읽어서 저장하고 싶어.
```py
data['genres'] = data['genres'].apply(lambda x : [d['name'] for d in x]).apply(lambda x : " ".join(x))
data['keywords'] = data['keywords'].apply(lambda x : [d['name'] for d in x]).apply(lambda x : " ".join(x))
```
> **lambda x : return** 👉 정의 하지 않은 함수를 사용하고 싶을 때
**list." ".join()** : 특정 list의 값이 string으로 되어있는데, 그 string을 space 로 구분해서 하나의 string으로 저장
👨 data의 'genres'와 'keywords'의 값은 dictionary 타입이다. 그 dictionary 값 중에서 특정 'key'에 해당하는 값만 사용하고 싶다. 그래서
data의 'genres'와 'keywords'의 값을 변형하고 싶은데, data의 'genres'와 'keywords' 열의 값에서 'name'이라는 key의 값을 list로 저장하고 저장 된 list에 element 인 string들을 space로 구분하여 하나의 string으로 data 'genres' 와 'keywords' 열에 저장!
💡 apply와 lambda를 통해서 다양한 방식으로 데이터 값 변경이 가능하구나!
💡 데이터 값이 dictionary 양식일 때, 특정 key의 값만 필터링 하는 방법
💡 literal_eval 과 apply 와 join 이 세가지 과정이 있다는 것을 알아두면 유용할 것 같다.
```py
data.to_csv('./movie_data/pre_tmdb_5000_movies.csv', index = False)
```
> **Dataframe.to_csv()** : Dataframe을 csv 파일로 저장
👨 data라는 데이터를 ./movie_data/pre_tmdb_5000_movies.csv 으로 인덱스 없이 저장
# 4. Titanic Data에 배운 것들 적용해보기
[Titanic_1.ipynb](https://github.com/jingwoo4710/jingwoo4710.github.io/blob/master/Titanic_1.ipynb)
```py
import pandas as pd
df = pd.read_csv('https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv')
```
> 데이터 불러오기
```py
df.head(2)
```
> 어떻게 생긴 data 인지 확인
```py
df.shape
```
> 총 몇명의 사람의 data를 담고 있는지 알 수 있다.
```py
df = df[['Survived', 'Name', 'Sex', 'Age', 'Fare']]
```
> 기본적인 personal info와 advanced challenge 에서 보여진, 'Fare', 'Survived' 열을 필요 열로 선택했다.
```py
print(df["Fare"].quantile(0.5))
print(df["Fare"].mean())
```
> 기본적인 통계값인 median과 mean을 구해봤다.
```py
top_100 = df['Fare'].quantile(0.89)
data = df.copy()[df['Fare'] >= top_100]
average = data['Fare'].mean()
data.shape
```
> 요금을 기준으로, 높은 쪽으로 상위 100명을 선별하고 그 100명의 평균을 내보았다.
```py
def percent_above_average (d, average = average):
fare = d['Fare']
return (fare - average) / average * 100
data['percent_above_average'] = data.apply(percent_above_average, axis = 1)
```
> 상위 100명의 Fare 가 평균과 얼마나 차이가 나는지 계산할 수 있는 함수를 적용하여, percent_above_average 열을 만듬.
```py
info = "{'Bob': [['I liked it.','Love'], ['It was awful.', 'Star']], 'Sue': ['Pretty good.', 'Bland.']}"
print(type(info))
from ast import literal_eval
info = literal_eval(info)
print(type(info))
info_df = pd.DataFrame(info)
info_df.head(2)
info_df['Bob'].apply(lambda x : " ".join(x))
```
> **Titanic Data** 에 literal_eval 을 적용할 방법을 찾기 힘들어, 간단한 예시를 통해 이해한 바와 같이 결과물을 얻을 수 있을지 확인.
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.