문제 설명
자세히 보기
분석하기 나쁜 데이터…?
Messy Data(지저분한 데이터)는 데이터의 연결 관계보다 특정 데이터 셋에 초점이 맞춰진 것입니다.
칼럼 헤더들이 변수 이름이 아닌 값이다.
다중 변수가 한 칼럼 내에 저장된다.
변수들이 행과 열 모두에 저장된다.
관측 유닛의 여러 속성들이 같은 테이블에 저장된다.
단일 관측 유닛이 여러 테이블에 저장된다.
Plain Text
복사
위와 같은 특징들이 있습니다.
다음과 같은 이유로 생성됩니다.
•
데이터분석을 전제로 데이터를 생성하지 않은 것
•
요약과 집계된 데이터가 직관적으로 이해하기 쉬움 (피벗 테이블 선호)
다음은 나쁜 데이터의 예시로, 열 이름이 변수가 아니고 값인 경우에 해당하는 데이터입니다.
year | artist.inverted | track | time | genre | date.entered | date.peaked | x1st.week | x2nd.week | x3rd.week | ... | x67th.week | x68th.week | x69th.week | x70th.week | x71st.week | x72nd.week | x73rd.week | x74th.week | x75th.week | x76th.week |
0 | 2000 | Destiny's Child | Independent Women Part I | 3:38 | Rock | 2000-09-23 | 2000-11-18 | 78 | 63.0 | 49.0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
1 | 2000 | Santana | Maria, Maria | 4:18 | Rock | 2000-02-12 | 2000-04-08 | 15 | 8.0 | 6.0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2 | 2000 | Savage Garden | I Knew I Loved You | 4:07 | Rock | 1999-10-23 | 2000-01-29 | 71 | 48.0 | 43.0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
3 | 2000 | Madonna | Music | 3:45 | Rock | 2000-08-12 | 2000-09-16 | 41 | 23.0 | 18.0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
4 | 2000 | Aguilera, Christina | Come On Over Baby (All I Want Is You) | 3:38 | Rock | 2000-08-05 | 2000-10-14 | 57 | 47.0 | 45.0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
5 | 2000 | Janet | Doesn't Really Matter | 4:17 | Rock | 2000-06-17 | 2000-08-26 | 59 | 52.0 | 43.0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
6 | 2000 | Destiny's Child | Say My Name | 4:31 | Rock | 1999-12-25 | 2000-03-18 | 83 | 83.0 | 44.0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
7 | 2000 | Iglesias, Enrique | Be With You | 3:36 | Latin | 2000-04-01 | 2000-06-24 | 63 | 45.0 | 34.0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
8 | 2000 | Sisqo | Incomplete | 3:52 | Rock | 2000-06-24 | 2000-08-12 | 77 | 66.0 | 61.0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
9 | 2000 | Lonestar | Amazed | 4:25 | Country | 1999-06-05 | 2000-03-04 | 81 | 54.0 | 44.0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
보기에는 좋지만, 분석하기는 어렵죠.
Pandas의 melt 등을 사용합니다.
# Melting
id_vars = [
"year",
"artist.inverted",
"track",
"time",
"genre",
"date.entered",
"date.peaked"
]
df = pd.melt(frame=df,id_vars=id_vars, var_name="week", value_name="rank")
# Formatting
# 정규식으로 x1st.week 에서 숫자 1만 추출
df["week"] = df['week'].str.extract('(\d+)', expand=False).astype(int)
df["rank"] = df["rank"].astype(int)
# 필요없는 행을 삭제합니다.
df = df.dropna()
# Create "date" columns
df['date'] = pd.to_datetime(df['date.entered']) + pd.to_timedelta(df['week'], unit='w') - pd.DateOffset(weeks=1)
df = df[["year", "artist.inverted", "track", "time", "genre", "week", "rank", "date"]]
df = df.sort_values(ascending=True, by=["year","artist.inverted","track","week","rank"])
# Assigning the tidy dataset to a variable for future usage
billboard = df
df.head(10)
Python
복사
결과물입니다.
year | artist.inverted | track | time | genre | week | rank | date |
246 | 2000 | 2 Pac | Baby Don't Cry (Keep Ya Head Up II) | 4:22 | Rap | 1 | 87 |
563 | 2000 | 2 Pac | Baby Don't Cry (Keep Ya Head Up II) | 4:22 | Rap | 2 | 82 |
880 | 2000 | 2 Pac | Baby Don't Cry (Keep Ya Head Up II) | 4:22 | Rap | 3 | 72 |
1197 | 2000 | 2 Pac | Baby Don't Cry (Keep Ya Head Up II) | 4:22 | Rap | 4 | 77 |
1514 | 2000 | 2 Pac | Baby Don't Cry (Keep Ya Head Up II) | 4:22 | Rap | 5 | 87 |
1831 | 2000 | 2 Pac | Baby Don't Cry (Keep Ya Head Up II) | 4:22 | Rap | 6 | 94 |
2148 | 2000 | 2 Pac | Baby Don't Cry (Keep Ya Head Up II) | 4:22 | Rap | 7 | 99 |
287 | 2000 | 2Ge+her | The Hardest Part Of Breaking Up (Is Getting Ba... | 3:15 | R&B | 1 | 91 |
604 | 2000 | 2Ge+her | The Hardest Part Of Breaking Up (Is Getting Ba... | 3:15 | R&B | 2 | 87 |
921 | 2000 | 2Ge+her | The Hardest Part Of Breaking Up (Is Getting Ba... | 3:15 | R&B | 3 | 92 |