Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
Tags
- BDA
- 유미의 세포들
- 지금 우리 학교는
- 데이터분석가
- 이지스퍼블리싱
- 미디어 콘텐츠
- 딥러닝 스터디
- 드라마
- DOIT!
- 딥러닝교과서
- 패스트캠퍼스데이터분석부트캠프
- 데이터분석
- 패스트캠퍼스
- 미뮤엔토 에디터
- 웹툰 원작
- 국비지원취업
- 대외활동 추천
- 대중문화
- 데이터분석취업
- 데이터분석부트캠프
- 대외활동
- 국비지원
- 정년이
- 이태원 클라쓰
- 재혼황후
- 패스트캠퍼스부트캠프
- 부트캠프
- 미뮤엔토
- 미유엔토
- 현혹
Archives
- Today
- Total
디지털 마케팅 LAB
패스트캠퍼스 데이터분석 부트캠프 5주차_PYTHON (3) 본문
영화 데이터를 활용한 영화 흥행 요인 분석
- 데이터 살펴보기
- movies 데이터
- budget: 영화 예산 (단위: 달러)
- genres: 모든 장르
- homepage: 공식 홈페이지
- id: 각 영화당 unique id
- original_language: 원 언어
- original_title: 원 제목
- overview: 간략한 설명
- popularity: TMDB에서 제공하는 인기도
- production_companies: 모든 제작사
- production_countries: 모든 제각국가
- release_date: 개봉일
- revenue: 흥행 수익 (단위: 달러)
- runtime: 상영 시간
- spoken_language: 사용된 모든 언어
- status: 개봉 여부
- title: 영문 제목
- vote_avearage: TMDB에서 받은 평점 평균
- vote_count: TMDB에서 받은 투표수 - credits 데이터
- movie_id: 각 영화당 unique id
- title: 영문 제목
- cast: 모든 출연진
- crew: 모든 제작진
- movies 데이터
- 질문 만들기
- 연도별 흥행 수익은?
- 가장 흥행한 영화 TOP 10은?
- 흥행에 가장 성공한 감독과 배우는?
- 장르와 흥행 수익
■ 흥행 수익이 좋은 장르는?
■ 시간의 흐름에 따라 유행하는 장르가 바뀌는가?
■ 월별로 흥행하는 장르가 있는가? - 수익과 예산, 투표수, 평점과의 상관관계는?
- ROI(예산 대비 수익)가 높으면서 흥행에 성공한 영화의 특징은?
- 데이터 전처리
더보기
- 필요 컬럼만 남기기
- movies 데이터: 'id','budget','genres','title','release_date','revenue','vote_average','vote_count' 컬럼만 사용
- credits 데이터: 'movie_id','crew','cast' 컬럼만 사용 - 데이터 결합: 'id'(= 'movie_id' )컬럼을 기준으로 두 데이터프레임 merge
- ROI 컬럼 만들기
data['roi'] = data['revenue'] / data['budget']
- 감독 컬럼 만들기
■ 'crew' 컬럼의 각 행의 값은 현재 여러 딕셔너리가 하나의 리스트로 닫혀있는 형태 '[{"credit_id": "52fe48009251416c750aca23", "department": "Editing", "gender": 0, "id": 1721, "job": "Editor", "name": "Stephen E. Rivkin"}, {"credit_id": ..."}]'
■ ast라이브러리를 활용해 각 행의 값에서 리스트를 벗김■ 함수를 정의하여 직업이 감독인 딕셔너리의 'name'키의 값들을 반환하여 'director' 컬럼의 값으로import astprint(ast.literal_eval(data['crew'][0]))[{'credit_id': '52fe48009251416c750aca23', 'department': 'Editing', 'gender': 0, 'id': 1721, 'job': 'Editor', 'name': 'Stephen E. Rivkin'}, {'credit_id': '539c47ecc3a36810e3001f87', 'department': 'Art', 'gender': 2, 'id': 496, 'job': 'Production Design', 'name': 'Rick Carter'}, {'credit_id': '54491c89c3a3680fb4001cf7', 'department': 'Sound', 'gender': 0, 'id': 900, 'job': 'Sound Designer', 'name': 'Christopher Boyes'}, {'credit_id': '54491cb70e0a267480001bd0', 'department': 'Sound', 'gender': 0, 'id': 900, 'job': 'Supervising Sound Editor', 'name': 'Christopher Boyes'}, {'credit_id': '539c4a4cc3a36810c9002101', 'department': 'Production', 'gender': 1, 'id': 1262, 'job': 'Casting', 'name': 'Mali Finn'}, {'credit_id': '5544ee3b925141499f0008fc', 'department': 'Sound', 'gender': 2, 'id': 1729, 'job': 'Original Music Composer', 'name': 'James Horner'}, {'credit_id': '52fe48009251416c750ac9c3', 'department': 'Directing', 'gender': 2, 'id': 2710, 'job': 'Director', 'name': 'James Cameron'}, {'credit_id': '52fe48009251416c750ac9d9', 'department': 'Writing', 'gender': 2, 'id': 2710, 'job': 'Writer', 'name': 'James Cameron'}, {'credit_id': '52fe48009251416c750aca17', 'department': 'Editing', 'gender': 2, 'id': 2710, 'job': 'Editor', 'name': 'James Cameron'}, {'credit_id': '52fe48009251416c750aca29', 'department': 'Production', 'gender': 2, 'id': 2710, 'job': 'Producer', 'name': 'James Cameron'}, {'credit_id': '52fe48009251416c750aca3f', 'department': 'Writing', 'gender': 2, 'id': 2710, 'job': 'Screenplay', 'name': 'James Cameron'}, {'credit_id': '539c4987c3a36810ba0021a4', 'department': 'Art', 'gender': 2, 'id': 7236, 'job': 'Art Direction', 'name': 'Andrew Menzies'}, {'credit_id': '549598c3c3a3686ae9004383', 'department': 'Visual Effects', 'gender': 0, 'id': 6690, 'job': 'Visual Effects Producer', 'name': 'Jill Brooks'}, {'credit_id': '52fe48009251416c750aca4b', 'department': 'Production', 'gender': 1, 'id': 6347, 'job': 'Casting', 'name': 'Margery Simkin'}, {'credit_id': '570b6f419251417da70032fe', 'department': 'Art', 'gender': 2, 'id': 6878, 'job': 'Supervising Art Director', 'name': 'Kevin Ishioka'}, {'credit_id': '5495a0fac3a3686ae9004468', 'department': 'Sound', 'gender': 0, 'id': 6883, 'job': 'Music Editor', 'name': 'Dick Bernstein'}, {'credit_id': '54959706c3a3686af3003e81', 'department': 'Sound', 'gender': 0, 'id': 8159, 'job': 'Sound Effects Editor', 'name': 'Shannon Mills'}, {'credit_id': '54491d58c3a3680fb1001ccb', 'department': 'Sound', 'gender': 0, 'id': 8160, 'job': 'Foley', 'name': 'Dennie Thorpe'}, {'credit_id': '54491d6cc3a3680fa5001b2c', 'department': 'Sound', 'gender': 0, 'id': 8163, 'job': 'Foley', 'name': 'Jana Vance'}, {'credit_id': '52fe48009251416c750aca57', 'department': 'Costume & Make-Up', 'gender': 1, 'id': 8527, 'job': 'Costume Design', 'name': 'Deborah Lynn Scott'}, {'credit_id': '52fe48009251416c750aca2f', 'department': 'Production', 'gender': 2, 'id': 8529, 'job': 'Producer', 'name': 'Jon Landau'}, {'credit_id': '539c4937c3a36810ba002194', 'department': 'Art', 'gender': 0, 'id': 9618, 'job': 'Art Direction', 'name': 'Sean Haworth'}, {'credit_id': '539c49b6c3a36810c10020e6', 'department': 'Art', 'gender': 1, 'id': 12653, 'job': 'Set Decoration', 'name': 'Kim Sinclair'}, {'credit_id': '570b6f2f9251413a0e00020d', 'department': 'Art', 'gender': 1, 'id': 12653, 'job': 'Supervising Art Director', 'name': 'Kim Sinclair'}, {'credit_id': '54491a6c0e0a26748c001b19', 'department': 'Art', 'gender': 2, 'id': 14350, 'job': 'Set Designer', 'name': 'Richard F. Mays'}, {'credit_id': '56928cf4c3a3684cff0025c4', 'department': 'Production', 'gender': 1, 'id': 20294, 'job': 'Executive Producer', 'name': 'Laeta Kalogridis'}, {'credit_id': '52fe48009251416c750aca51', 'department': 'Costume & Make-Up', 'gender': 0, 'id': 17675, 'job': 'Costume Design', 'name': 'Mayes C. Rubeo'}, {'credit_id': '52fe48009251416c750aca11', 'department': 'Camera', 'gender': 2, 'id': 18265, 'job': 'Director of Photography', 'name': 'Mauro Fiore'}, {'credit_id': '5449194d0e0a26748f001b39', 'department': 'Art', 'gender': 0, 'id': 42281, 'job': 'Set Designer', 'name': 'Scott Herbertson'}, {'credit_id': '52fe48009251416c750aca05', 'department': 'Crew', 'gender': 0, 'id': 42288, 'job': 'Stunts', 'name': 'Woody Schultz'}, {'credit_id': '5592aefb92514152de0010f5', 'department': 'Costume & Make-Up', 'gender': 0, 'id': 29067, 'job': 'Makeup Artist', 'name': 'Linda DeVetta'}, {'credit_id': '5592afa492514152de00112c', 'department': 'Costume & Make-Up', 'gender': 0, 'id': 29067, 'job': 'Hairstylist', 'name': 'Linda DeVetta'}, {'credit_id': '54959ed592514130fc002e5d', 'department': 'Camera', 'gender': 2, 'id': 33302, 'job': 'Camera Operator', 'name': 'Richard Bluck'}, {'credit_id': '539c4891c3a36810ba002147', 'department': 'Art', 'gender': 2, 'id': 33303, 'job': 'Art Direction', 'name': 'Simon Bright'}, {'credit_id': '54959c069251417a81001f3a', 'department': 'Visual Effects', 'gender': 0, 'id': 113145, 'job': 'Visual Effects Supervisor', 'name': 'Richard Martin'}, {'credit_id': '54959a0dc3a3680ff5002c8d', 'department': 'Crew', 'gender': 2, 'id': 58188, 'job': 'Visual Effects Editor', 'name': 'Steve R. Moore'}, {'credit_id': '52fe48009251416c750aca1d', 'department': 'Editing', 'gender': 2, 'id': 58871, 'job': 'Editor', 'name': 'John Refoua'}, {'credit_id': '54491a4dc3a3680fc30018ca', 'department': 'Art', 'gender': 0, 'id': 92359, 'job': 'Set Designer', 'name': 'Karl J. Martin'}, {'credit_id': '52fe48009251416c750aca35', 'department': 'Camera', 'gender': 1, 'id': 72201, 'job': 'Director of Photography', 'name': 'Chiling Lin'}, {'credit_id': '52fe48009251416c750ac9ff', 'department': 'Crew', 'gender': 0, 'id': 89714, 'job': 'Stunts', 'name': 'Ilram Choi'}, {'credit_id': '54959c529251416e2b004394', 'department': 'Visual Effects', 'gender': 2, 'id': 93214, 'job': 'Visual Effects Supervisor', 'name': 'Steven Quale'}, {'credit_id': '54491edf0e0a267489001c37', 'department': 'Crew', 'gender': 1, 'id': 122607, 'job': 'Dialect Coach', 'name': 'Carla Meyer'}, {'credit_id': '539c485bc3a368653d001a3a', 'department': 'Art', 'gender': 2, 'id': 132585, 'job': 'Art Direction', 'name': 'Nick Bassett'}, {'credit_id': '539c4903c3a368653d001a74', 'department': 'Art', 'gender': 0, 'id': 132596, 'job': 'Art Direction', 'name': 'Jill Cormack'}, {'credit_id': '539c4967c3a368653d001a94', 'department': 'Art', 'gender': 0, 'id': 132604, 'job': 'Art Direction', 'name': 'Andy McLaren'}, {'credit_id': '52fe48009251416c750aca45', 'department': 'Crew', 'gender': 0, 'id': 236696, 'job': 'Motion Capture Artist', 'name': 'Terry Notary'}, {'credit_id': '54959e02c3a3680fc60027d2', 'department': 'Crew', 'gender': 2, 'id': 956198, 'job': 'Stunt Coordinator', 'name': 'Garrett Warren'}, {'credit_id': '54959ca3c3a3686ae300438c', 'department': 'Visual Effects', 'gender': 2, 'id': 957874, 'job': 'Visual Effects Supervisor', 'name': 'Jonathan Rothbart'}, {'credit_id': '570b6f519251412c74001b2f', 'department': 'Art', 'gender': 0, 'id': 957889, 'job': 'Supervising Art Director', 'name': 'Stefan Dechant'}, {'credit_id': '570b6f62c3a3680b77007460', 'department': 'Art', 'gender': 2, 'id': 959555, 'job': 'Supervising Art Director', 'name': 'Todd Cherniawsky'}, {'credit_id': '539c4a3ac3a36810da0021cc', 'department': 'Production', 'gender': 0, 'id': 1016177, 'job': 'Casting', 'name': 'Miranda Rivers'}, {'credit_id': '539c482cc3a36810c1002062', 'department': 'Art', 'gender': 0, 'id': 1032536, 'job': 'Production Design', 'name': 'Robert Stromberg'}, {'credit_id': '539c4b65c3a36810c9002125', 'department': 'Costume & Make-Up', 'gender': 2, 'id': 1071680, 'job': 'Costume Design', 'name': 'John Harding'}, {'credit_id': '54959e6692514130fc002e4e', 'department': 'Camera', 'gender': 0, 'id': 1177364, 'job': 'Steadicam Operator', 'name': 'Roberto De Angelis'}, {'credit_id': '539c49f1c3a368653d001aac', 'department': 'Costume & Make-Up', 'gender': 2, 'id': 1202850, 'job': 'Makeup Department Head', 'name': 'Mike Smithson'}, {'credit_id': '5495999ec3a3686ae100460c', 'department': 'Visual Effects', 'gender': 0, 'id': 1204668, 'job': 'Visual Effects Producer', 'name': 'Alain Lalanne'}, {'credit_id': '54959cdfc3a3681153002729', 'department': 'Visual Effects', 'gender': 0, 'id': 1206410, 'job': 'Visual Effects Supervisor', 'name': 'Lucas Salton'}, {'credit_id': '549596239251417a81001eae', 'department': 'Crew', 'gender': 0, 'id': 1234266, 'job': 'Post Production Supervisor', 'name': 'Janace Tashjian'}, {'credit_id': '54959c859251416e1e003efe', 'department': 'Visual Effects', 'gender': 0, 'id': 1271932, 'job': 'Visual Effects Supervisor', 'name': 'Stephen Rosenbaum'}, {'credit_id': '5592af28c3a368775a00105f', 'department': 'Costume & Make-Up', 'gender': 0, 'id': 1310064, 'job': 'Makeup Artist', 'name': 'Frankie Karena'}, {'credit_id': '539c4adfc3a36810e300203b', 'department': 'Costume & Make-Up', 'gender': 1, 'id': 1319844, 'job': 'Costume Supervisor', 'name': 'Lisa Lovaas'}, {'credit_id': '54959b579251416e2b004371', 'department': 'Visual Effects', 'gender': 0, 'id': 1327028, 'job': 'Visual Effects Supervisor', 'name': 'Jonathan Fawkner'}, {'credit_id': '539c48a7c3a36810b5001fa7', 'department': 'Art', 'gender': 0, 'id': 1330561, 'job': 'Art Direction', 'name': 'Robert Bavin'}, {'credit_id': '539c4a71c3a36810da0021e0', 'department': 'Costume & Make-Up', 'gender': 0, 'id': 1330567, 'job': 'Costume Supervisor', 'name': 'Anthony Almaraz'}, {'credit_id': '539c4a8ac3a36810ba0021e4', 'department': 'Costume & Make-Up', 'gender': 0, 'id': 1330570, 'job': 'Costume Supervisor', 'name': 'Carolyn M. Fenton'}, {'credit_id': '539c4ab6c3a36810da0021f0', 'department': 'Costume & Make-Up', 'gender': 0, 'id': 1330574, 'job': 'Costume Supervisor', 'name': 'Beth Koenigsberg'}, {'credit_id': '54491ab70e0a267480001ba2', 'department': 'Art', 'gender': 0, 'id': 1336191, 'job': 'Set Designer', 'name': 'Sam Page'}, {'credit_id': '544919d9c3a3680fc30018bd', 'department': 'Art', 'gender': 0, 'id': 1339441, 'job': 'Set Designer', 'name': 'Tex Kadonaga'}, {'credit_id': '54491cf50e0a267483001b0c', 'department': 'Editing', 'gender': 0, 'id': 1352422, 'job': 'Dialogue Editor', 'name': 'Kim Foscato'}, {'credit_id': '544919f40e0a26748c001b09', 'department': 'Art', 'gender': 0, 'id': 1352962, 'job': 'Set Designer', 'name': 'Tammy S. Lee'}, {'credit_id': '5495a115c3a3680ff5002d71', 'department': 'Crew', 'gender': 0, 'id': 1357070, 'job': 'Transportation Coordinator', 'name': 'Denny Caira'}, {'credit_id': '5495a12f92514130fc002e94', 'department': 'Crew', 'gender': 0, 'id': 1357071, 'job': 'Transportation Coordinator', 'name': 'James Waitkus'}, {'credit_id': '5495976fc3a36811530026b0', 'department': 'Sound', 'gender': 0, 'id': 1360103, 'job': 'Supervising Sound Editor', 'name': 'Addison Teague'}, {'credit_id': '54491837c3a3680fb1001c5a', 'department': 'Art', 'gender': 2, 'id': 1376887, 'job': 'Set Designer', 'name': 'C. Scott Baker'}, {'credit_id': '54491878c3a3680fb4001c9d', 'department': 'Art', 'gender': 0, 'id': 1376888, 'job': 'Set Designer', 'name': 'Luke Caska'}, {'credit_id': '544918dac3a3680fa5001ae0', 'department': 'Art', 'gender': 0, 'id': 1376889, 'job': 'Set Designer', 'name': 'David Chow'}, {'credit_id': '544919110e0a267486001b68', 'department': 'Art', 'gender': 0, 'id': 1376890, 'job': 'Set Designer', 'name': 'Jonathan Dyer'}, {'credit_id': '54491967c3a3680faa001b5e', 'department': 'Art', 'gender': 0, 'id': 1376891, 'job': 'Set Designer', 'name': 'Joseph Hiura'}, {'credit_id': '54491997c3a3680fb1001c8a', 'department': 'Art', 'gender': 0, 'id': 1376892, 'job': 'Art Department Coordinator', 'name': 'Rebecca Jellie'}, {'credit_id': '544919ba0e0a26748f001b42', 'department': 'Art', 'gender': 0, 'id': 1376893, 'job': 'Set Designer', 'name': 'Robert Andrew Johnson'}, {'credit_id': '54491b1dc3a3680faa001b8c', 'department': 'Art', 'gender': 0, 'id': 1376895, 'job': 'Assistant Art Director', 'name': 'Mike Stassi'}, {'credit_id': '54491b79c3a3680fbb001826', 'department': 'Art', 'gender': 0, 'id': 1376897, 'job': 'Construction Coordinator', 'name': 'John Villarino'}, {'credit_id': '54491baec3a3680fb4001ce6', 'department': 'Art', 'gender': 2, 'id': 1376898, 'job': 'Assistant Art Director', 'name': 'Jeffrey Wisniewski'}, {'credit_id': '54491d2fc3a3680fb4001d07', 'department': 'Editing', 'gender': 0, 'id': 1376899, 'job': 'Dialogue Editor', 'name': 'Cheryl Nardi'}, {'credit_id': '54491d86c3a3680fa5001b2f', 'department': 'Editing', 'gender': 0, 'id': 1376901, 'job': 'Dialogue Editor', 'name': 'Marshall Winn'}, {'credit_id': '54491d9dc3a3680faa001bb0', 'department': 'Sound', 'gender': 0, 'id': 1376902, 'job': 'Supervising Sound Editor', 'name': 'Gwendolyn Yates Whittle'}, {'credit_id': '54491dc10e0a267486001bce', 'department': 'Sound', 'gender': 0, 'id': 1376903, 'job': 'Sound Re-Recording Mixer', 'name': 'William Stein'}, {'credit_id': '54491f500e0a26747c001c07', 'department': 'Crew', 'gender': 0, 'id': 1376909, 'job': 'Choreographer', 'name': 'Lula Washington'}, {'credit_id': '549599239251412c4e002a2e', 'department': 'Visual Effects', 'gender': 0, 'id': 1391692, 'job': 'Visual Effects Producer', 'name': 'Chris Del Conte'}, {'credit_id': '54959d54c3a36831b8001d9a', 'department': 'Visual Effects', 'gender': 2, 'id': 1391695, 'job': 'Visual Effects Supervisor', 'name': 'R. Christopher White'}, {'credit_id': '54959bdf9251412c4e002a66', 'department': 'Visual Effects', 'gender': 0, 'id': 1394070, 'job': 'Visual Effects Supervisor', 'name': 'Dan Lemmon'}, {'credit_id': '5495971d92514132ed002922', 'department': 'Sound', 'gender': 0, 'id': 1394129, 'job': 'Sound Effects Editor', 'name': 'Tim Nielsen'}, {'credit_id': '5592b25792514152cc0011aa', 'department': 'Crew', 'gender': 0, 'id': 1394286, 'job': 'CG Supervisor', 'name': 'Michael Mulholland'}, {'credit_id': '54959a329251416e2b004355', 'department': 'Crew', 'gender': 0, 'id': 1394750, 'job': 'Visual Effects Editor', 'name': 'Thomas Nittmann'}, {'credit_id': '54959d6dc3a3686ae9004401', 'department': 'Visual Effects', 'gender': 0, 'id': 1394755, 'job': 'Visual Effects Supervisor', 'name': 'Edson Williams'}, {'credit_id': '5495a08fc3a3686ae300441c', 'department': 'Editing', 'gender': 0, 'id': 1394953, 'job': 'Digital Intermediate', 'name': 'Christine Carr'}, {'credit_id': '55402d659251413d6d000249', 'department': 'Visual Effects', 'gender': 0, 'id': 1395269, 'job': 'Visual Effects Supervisor', 'name': 'John Bruno'}, {'credit_id': '54959e7b9251416e1e003f3e', 'department': 'Camera', 'gender': 0, 'id': 1398970, 'job': 'Steadicam Operator', 'name': 'David Emmerichs'}, {'credit_id': '54959734c3a3686ae10045e0', 'department': 'Sound', 'gender': 0, 'id': 1400906, 'job': 'Sound Effects Editor', 'name': 'Christopher Scarabosio'}, {'credit_id': '549595dd92514130fc002d79', 'department': 'Production', 'gender': 0, 'id': 1401784, 'job': 'Production Supervisor', 'name': 'Jennifer Teves'}, {'credit_id': '549596009251413af70028cc', 'department': 'Production', 'gender': 0, 'id': 1401785, 'job': 'Production Manager', 'name': 'Brigitte Yorke'}, {'credit_id': '549596e892514130fc002d99', 'department': 'Sound', 'gender': 0, 'id': 1401786, 'job': 'Sound Effects Editor', 'name': 'Ken Fischer'}, {'credit_id': '549598229251412c4e002a1c', 'department': 'Crew', 'gender': 0, 'id': 1401787, 'job': 'Special Effects Coordinator', 'name': 'Iain Hutton'}, {'credit_id': '549598349251416e2b00432b', 'department': 'Crew', 'gender': 0, 'id': 1401788, 'job': 'Special Effects Coordinator', 'name': 'Steve Ingram'}, {'credit_id': '54959905c3a3686ae3004324', 'department': 'Visual Effects', 'gender': 0, 'id': 1401789, 'job': 'Visual Effects Producer', 'name': 'Joyce Cox'}, {'credit_id': '5495994b92514132ed002951', 'department': 'Visual Effects', 'gender': 0, 'id': 1401790, 'job': 'Visual Effects Producer', 'name': 'Jenny Foster'}, {'credit_id': '549599cbc3a3686ae1004613', 'department': 'Crew', 'gender': 0, 'id': 1401791, 'job': 'Visual Effects Editor', 'name': 'Christopher Marino'}, {'credit_id': '549599f2c3a3686ae100461e', 'department': 'Crew', 'gender': 0, 'id': 1401792, 'job': 'Visual Effects Editor', 'name': 'Jim Milton'}, {'credit_id': '54959a51c3a3686af3003eb5', 'department': 'Visual Effects', 'gender': 0, 'id': 1401793, 'job': 'Visual Effects Producer', 'name': 'Cyndi Ochs'}, {'credit_id': '54959a7cc3a36811530026f4', 'department': 'Crew', 'gender': 0, 'id': 1401794, 'job': 'Visual Effects Editor', 'name': 'Lucas Putnam'}, {'credit_id': '54959b91c3a3680ff5002cb4', 'department': 'Visual Effects', 'gender': 0, 'id': 1401795, 'job': 'Visual Effects Supervisor', 'name': "Anthony 'Max' Ivins"}, {'credit_id': '54959bb69251412c4e002a5f', 'department': 'Visual Effects', 'gender': 0, 'id': 1401796, 'job': 'Visual Effects Supervisor', 'name': 'John Knoll'}, {'credit_id': '54959cbbc3a3686ae3004391', 'department': 'Visual Effects', 'gender': 2, 'id': 1401799, 'job': 'Visual Effects Supervisor', 'name': 'Eric Saindon'}, {'credit_id': '54959d06c3a3686ae90043f6', 'department': 'Visual Effects', 'gender': 0, 'id': 1401800, 'job': 'Visual Effects Supervisor', 'name': 'Wayne Stables'}, {'credit_id': '54959d259251416e1e003f11', 'department': 'Visual Effects', 'gender': 0, 'id': 1401801, 'job': 'Visual Effects Supervisor', 'name': 'David Stinnett'}, {'credit_id': '54959db49251413af7002975', 'department': 'Visual Effects', 'gender': 0, 'id': 1401803, 'job': 'Visual Effects Supervisor', 'name': 'Guy Williams'}, {'credit_id': '54959de4c3a3681153002750', 'department': 'Crew', 'gender': 0, 'id': 1401804, 'job': 'Stunt Coordinator', 'name': 'Stuart Thorp'}, {'credit_id': '54959ef2c3a3680fc60027f2', 'department': 'Lighting', 'gender': 0, 'id': 1401805, 'job': 'Best Boy Electric', 'name': 'Giles Coburn'}, {'credit_id': '54959f07c3a3680fc60027f9', 'department': 'Camera', 'gender': 2, 'id': 1401806, 'job': 'Still Photographer', 'name': 'Mark Fellman'}, {'credit_id': '54959f47c3a3681153002774', 'department': 'Lighting', 'gender': 0, 'id': 1401807, 'job': 'Lighting Technician', 'name': 'Scott Sprague'}, {'credit_id': '54959f8cc3a36831b8001df2', 'department': 'Visual Effects', 'gender': 0, 'id': 1401808, 'job': 'Animation Director', 'name': 'Jeremy Hollobon'}, {'credit_id': '54959fa0c3a36831b8001dfb', 'department': 'Visual Effects', 'gender': 0, 'id': 1401809, 'job': 'Animation Director', 'name': 'Orlando Meunier'}, {'credit_id': '54959fb6c3a3686af3003f54', 'department': 'Visual Effects', 'gender': 0, 'id': 1401810, 'job': 'Animation Director', 'name': 'Taisuke Tanimura'}, {'credit_id': '54959fd2c3a36831b8001e02', 'department': 'Costume & Make-Up', 'gender': 0, 'id': 1401812, 'job': 'Set Costumer', 'name': 'Lilia Mishel Acevedo'}, {'credit_id': '54959ff9c3a3686ae300440c', 'department': 'Costume & Make-Up', 'gender': 0, 'id': 1401814, 'job': 'Set Costumer', 'name': 'Alejandro M. Hernandez'}, {'credit_id': '5495a0ddc3a3686ae10046fe', 'department': 'Editing', 'gender': 0, 'id': 1401815, 'job': 'Digital Intermediate', 'name': 'Marvin Hall'}, {'credit_id': '5495a1f7c3a3686ae3004443', 'department': 'Production', 'gender': 0, 'id': 1401816, 'job': 'Publicist', 'name': 'Judy Alley'}, {'credit_id': '5592b29fc3a36869d100002f', 'department': 'Crew', 'gender': 0, 'id': 1418381, 'job': 'CG Supervisor', 'name': 'Mike Perry'}, {'credit_id': '5592b23a9251415df8001081', 'department': 'Crew', 'gender': 0, 'id': 1426854, 'job': 'CG Supervisor', 'name': 'Andrew Morley'}, {'credit_id': '55491e1192514104c40002d8', 'department': 'Art', 'gender': 0, 'id': 1438901, 'job': 'Conceptual Design', 'name': 'Seth Engstrom'}, {'credit_id': '5525d5809251417276002b06', 'department': 'Crew', 'gender': 0, 'id': 1447362, 'job': 'Visual Effects Art Director', 'name': 'Eric Oliver'}, {'credit_id': '554427ca925141586500312a', 'department': 'Visual Effects', 'gender': 0, 'id': 1447503, 'job': 'Modeling', 'name': 'Matsune Suzuki'}, {'credit_id': '551906889251415aab001c88', 'department': 'Art', 'gender': 0, 'id': 1447524, 'job': 'Art Department Manager', 'name': 'Paul Tobin'}, {'credit_id': '5592af8492514152cc0010de', 'department': 'Costume & Make-Up', 'gender': 0, 'id': 1452643, 'job': 'Hairstylist', 'name': 'Roxane Griffin'}, {'credit_id': '553d3c109251415852001318', 'department': 'Lighting', 'gender': 0, 'id': 1453938, 'job': 'Lighting Artist', 'name': 'Arun Ram-Mohan'}, {'credit_id': '5592af4692514152d5001355', 'department': 'Costume & Make-Up', 'gender': 0, 'id': 1457305, 'job': 'Makeup Artist', 'name': 'Georgia Lockhart-Adams'}, {'credit_id': '5592b2eac3a36877470012a5', 'department': 'Crew', 'gender': 0, 'id': 1466035, 'job': 'CG Supervisor', 'name': 'Thrain Shadbolt'}, {'credit_id': '5592b032c3a36877450015f1', 'department': 'Crew', 'gender': 0, 'id': 1483220, 'job': 'CG Supervisor', 'name': 'Brad Alexander'}, {'credit_id': '5592b05592514152d80012f6', 'department': 'Crew', 'gender': 0, 'id': 1483221, 'job': 'CG Supervisor', 'name': 'Shadi Almassizadeh'}, {'credit_id': '5592b090c3a36877570010b5', 'department': 'Crew', 'gender': 0, 'id': 1483222, 'job': 'CG Supervisor', 'name': 'Simon Clutterbuck'}, {'credit_id': '5592b0dbc3a368774b00112c', 'department': 'Crew', 'gender': 0, 'id': 1483223, 'job': 'CG Supervisor', 'name': 'Graeme Demmocks'}, {'credit_id': '5592b0fe92514152db0010c1', 'department': 'Crew', 'gender': 0, 'id': 1483224, 'job': 'CG Supervisor', 'name': 'Adrian Fernandes'}, {'credit_id': '5592b11f9251415df8001059', 'department': 'Crew', 'gender': 0, 'id': 1483225, 'job': 'CG Supervisor', 'name': 'Mitch Gates'}, {'credit_id': '5592b15dc3a3687745001645', 'department': 'Crew', 'gender': 0, 'id': 1483226, 'job': 'CG Supervisor', 'name': 'Jerry Kung'}, {'credit_id': '5592b18e925141645a0004ae', 'department': 'Crew', 'gender': 0, 'id': 1483227, 'job': 'CG Supervisor', 'name': 'Andy Lomas'}, {'credit_id': '5592b1bfc3a368775d0010e7', 'department': 'Crew', 'gender': 0, 'id': 1483228, 'job': 'CG Supervisor', 'name': 'Sebastian Marino'}, {'credit_id': '5592b2049251415df8001078', 'department': 'Crew', 'gender': 0, 'id': 1483229, 'job': 'CG Supervisor', 'name': 'Matthias Menz'}, {'credit_id': '5592b27b92514152d800136a', 'department': 'Crew', 'gender': 0, 'id': 1483230, 'job': 'CG Supervisor', 'name': 'Sergei Nevshupov'}, {'credit_id': '5592b2c3c3a36869e800003c', 'department': 'Crew', 'gender': 0, 'id': 1483231, 'job': 'CG Supervisor', 'name': 'Philippe Rebours'}, {'credit_id': '5592b317c3a36877470012af', 'department': 'Crew', 'gender': 0, 'id': 1483232, 'job': 'CG Supervisor', 'name': 'Michael Takarangi'}, {'credit_id': '5592b345c3a36877470012bb', 'department': 'Crew', 'gender': 0, 'id': 1483233, 'job': 'CG Supervisor', 'name': 'David Weitzberg'}, {'credit_id': '5592b37cc3a368775100113b', 'department': 'Crew', 'gender': 0, 'id': 1483234, 'job': 'CG Supervisor', 'name': 'Ben White'}, {'credit_id': '573c8e2f9251413f5d000094', 'department': 'Crew', 'gender': 1, 'id': 1621932, 'job': 'Stunts', 'name': 'Min Windle'}]data['crew'] = data['crew'].apply(ast.literal_eval)def get_director(x):for i in x:if i['job'] == 'Director':return i['name']data['director'] = data['crew'].apply(get_director) - 배우 컬럼 만들기
■ 'cast' 컬럼도 'crew' 컬럼과 같은 형태
■ ast 라이브러리를 사용하여 각 딕셔너리의 'name'키의 값들을 반환하여 'cast_name' 컬럼의 값으로
■ 결과가 리스트 형태data['cast_name'] = data['cast'].apply(lambda x: [i['name'] for i in ast.literal_eval(x)]) - 장르 컬럼 만들기
■ 'genres' 컬럼도 'crew' 컬럼과 같은 형태 ← 한 영화에 다양한 장르가 포함되어 있기 때문
■ ast 라이브러리를 사용하여 각 딕셔너리의 'name'키의 값들을 반환하여 'main_genre' 컬럼의 값으로data['genres'] = data['genres'].apply(ast.literal_eval)def get_genres(x):if len(x) > 0:return x[0]['name']
data['main_genre'] = data['genres'].apply(get_genres) - 데이터 타입 변경
data['release_date'] = pd.to_datetime(data['release_date'], format='%Y-%m-%d')data['id'] = data['id'].astype(str)
- 연도, 월 컬럼 만들기
data['year'] = data['release_date'].dt.yeardata['month'] = data['release_date'].dt.month
- 결측치 제거
- 분석
- 연도별 흥행 수익은?
더보기💡 2000년대에 들어 급격히 흥행 수익이 높아졌다.import plotly.express as pxrevenue_by_year = data.groupby('year')[['revenue']].sum().reset_index()fig = px.line(data_frame=revenue_by_year, x="year", y="revenue")fig.show()data['release_date'].max()Timestamp('2016-09-16 00:00:00') - 가장 흥행한 영화 top10은?
더보기💡 대체적으로 예산, 투표수가 높으면 흥행 수익도 높아보이나, 정비례하진 않아 보인다. → 상관관계 분석을 진행해보자.top = data.groupby('title')['revenue'].sum().reset_index().sort_values('revenue', ascending=False).head(10)fig = px.bar(data_frame=top, x='title', y='revenue', title=f"흥행 수익 TOP 10 영화")fig.show()+ 예산 TOP 10, 투표수 TOP 10 영화는?
title_dic = {'budget':'예산', 'vote_count':'투표수'}for y in ['budget','vote_count']:top = data.groupby('title')[[y]].sum().reset_index().sort_values(y, ascending=False).head(10)fig = px.bar(data_frame=top, x='title', y=y, title=f"{title_dic[y]} TOP 10 영화")fig.show() - 흥행에 가장 성공한 감독과 배우는?
더보기💡 유명 감독과 배우 일부가 많은 흥행 수익을 차지하고 있다.- 감독top_director = data.groupby(['director'])['revenue'].sum().reset_index().sort_values('revenue', ascending=False).head(10)fig = px.bar(data_frame=top_director, x='director', y='revenue', title=f"흥행 수익 TOP 10 감독")fig.show()
- 배우
revenue_cast = data[['revenue', 'cast_name']].explode('cast_name')top_cast = revenue_cast.groupby('cast_name')[['revenue']].sum().reset_index().sort_values('revenue', ascending=False).head(10)fig = px.bar(data_frame=top_cast, x='cast_name', y='revenue', title=f"흥행 수익 TOP 10 배우")fig.show() - 장르와 흥핵 수익
더보기
- 장르별 흥행 수익 분포
💡 액션과 드라마 장르에 흥행 수익이 아주 높은 영화들이 많이 있지만, 중앙값을 비교하면 다른 장르에 비해 높은 편은 아님fig = px.box(data_frame = data, y = 'main_genre', x = 'revenue', hover_name = 'title')fig.show()💡 장르별 영화 수익 평균은 애니메이션 > 어드벤쳐 > 가족 > SF > 판타지 > 액션 순genre_avg_revenue = data.groupby('main_genre')[['revenue']].mean().reset_index()fig = px.bar(data_frame = genre_avg_revenue, x = 'main_genre', y = 'revenue', title = '장르별 흥행 수익 평균')fig.show()💡 흥행 수익 합계는 액션 > 어드벤쳐 > 드라마 > 코미디 > 애니메이션 순genre_sum_revenue = data.groupby('main_genre')[['revenue']].sum().reset_index()fig = px.bar(data_frame = genre_sum_revenue, x = 'main_genre', y = 'revenue', title = '장르별 흥행 수익 합계')fig.show()
- 연도별 장르별 수익
💡 2010년도부터 액션 영화의 흥행 수익 비중이 높아지기 시작했다.revenue_by_year_genre_pct = pd.pivot_table(data=data.query('year >= 1990'), index='year', columns='main_genre', values='revenue', aggfunc=sum, fill_value=0, margins=True)revenue_by_year_genre_pct = 100 * revenue_by_year_genre_pct.div(revenue_by_year_genre_pct.iloc[:,-1], axis=0).drop('All').drop('All', axis=1)revenue_by_year_genre_pct = pd.melt(revenue_by_year_genre_pct.reset_index(), id_vars='year', value_name='pct')fig = px.bar(data_frame=revenue_by_year_genre_pct, x="year", y="pct", color='main_genre', color_discrete_sequence=px.colors.qualitative.Light24_r)fig.show()
💡 1990년대 후반 ~ 2000년대 초반에는 드라마 장르의 흥행 수익이 높았다. - 월별 장르별 수익
(코드는 위에서 "year"를 "month"로 바꾸면 끝)
💡 액션, 어드벤처 장르는 비교적 봄, 여름에 개봉 수익이 높았다.
💡 드라마 장르는 비교적 가을, 겨울에 개봉 수익이 높았다.
💡 코미디 장르는 비교적 겨울에 개봉 수익이 높았다.
- 장르별 흥행 수익 분포
- 수익과 예산, 투표수, 평점과의 상관관계는?
더보기💡 예산과 투표수는 흥행 수익과 높은 양의 상관관계를 보이나, 평점 평균은 비교적 낮은 양의 상관관계를 보인다.fig = px.imshow(data[['budget','revenue','vote_average','vote_count']].corr(), text_auto='.2f', color_continuous_scale='Purp')fig.show()
for x in ['budget', 'vote_count', 'vote_average']:fig = px.scatter(data_frame = data, x = x, y = 'revenue', hover_name = 'title', size = 'revenue', color = 'revenue' , color_continuous_scale = px.colors.sequential.Sunsetdark, width = 700, height = 600, trendline = 'ols')fig.show()
+ 흥행 수익 TOP 100 영화들만 필터링
top100 = data.sort_values('revenue', ascending=False).head(100)
fig = px.imshow(top100[['budget','revenue','vote_average','vote_count']].corr(), text_auto='.2f', color_continuous_scale='Mint')fig.show()
for x in ['budget', 'vote_count', 'vote_average']:fig = px.scatter(data_frame = top100, x = x, y = 'revenue', hover_name = 'title', size = 'revenue', color = 'revenue' , color_continuous_scale = px.colors.sequential.Emrld, width = 700, height = 600, trendline = 'ols', trendline_color_override='green')fig.show()
💡 흥행에 성공한 영화 상위 100개로 추려보면, 그 상관관계가 더 낮아진다. - ROI(예산 대비 수익)가 높으면서 흥행에 성공한 영화의 특징은?
더보기💡 액션의 경우 예산이 큰 영화가 많아 ROI가 높은 편은 아니고, 드라마/코미디/로맨스 영화가 ROI가 큰 영화들이 많다.top300 = data.sort_values('revenue', ascending=False).head(300)
fig = px.scatter(data_frame = top300, x = 'roi', y = 'revenue', hover_name = 'title', size = 'revenue', color = 'main_genre',color_discrete_sequence=px.colors.qualitative.Light24, width = 700, height = 600)fig.show()
fig = px.box(data_frame = top300, y = 'main_genre', x = 'roi', hover_name = 'title')fig.show()
- 연도별 흥행 수익은?
유통 데이터를 활용한 리텐션과 RFM 분석
- 데이터 살펴보기
- 이커머스 데이터
- InvoiceNo: 영수증번호
- StockCode: 상품번호
- Description: 상품명
- Quantity: 판매수량
- InvoiceDate: 결제날짜
- UnitPrice: 개당 가격
- CustomerID: 고객번호
- Country: 나라
- 이커머스 데이터
- 질문 만들기
- 시간의 흐름에 따라 매출, 주문고객수, 주문단가의 추이는 어떻게 달라지는가?
- 리텐션 분석: 시간의 흐름에 따라 고객들은 얼마나 남고 얼마나 이탈했는가?
■ 유저가 제품을 사용한 이후 일정 기간이 지난 시점에 제품을 계속 사용하고 있는지 유저의 잔존과 이탈을 트래킹하는 분
■ Day0에 앱에 방문한 유저 중 Day1에 다시 재방문한 유저의 비율 = 리텐션
■ 일반적으로 리텐션이 높으면 유저가 서비스를 주기적으로 사용한다는 뜻으로 해석할 수 있어, 유저의 참여와 충성도 같은 지표를 높이기 위한 제품 방향성을 정하는데 중요한 지표로 활용 - RFM 분석: 고객의 행동에 따라 고객을 유형화 해보자.
■ Recency, Frequency, Monetary를 기반으로 고객을 유형화하는 방법
- Recency (최근성): 고객이 얼마나 최근에 구매를 했는지
- Frequency (빈도): 고객이 얼마나 자주 구매를 하는지
- Monetary (금액): 고객이 구매한 총 금액
■ 고객 유형을 세분화하여 맞춤형 전략을 구상 가능
- Ex) 총 구매금액은 낮지만 자주 방문하는 유저 vs 최근에 큰 금액을 구매했지만 자주 방문하지는 않았던 유저
- 데이터 전처리
더보기
- 결측치 제거
#고객 분석을 할 것이므로 CustomerID가 없는 행은 제거한다.data.dropna(subset=['CustomerID'], inplace=True)
- 데이터 타입 변경
data['InvoiceDate'] = pd.to_datetime(data['InvoiceDate'], format='%m/%d/%Y %H:%M')data['CustomerID'] = data['CustomerID'].astype(int).astype(str)
- 날짜 컬럼 추가
data['date_ymd'] = data['InvoiceDate'].dt.date.astype('datetime64')data['year'] = data['InvoiceDate'].dt.year
- 매출 컬럼 추가
data['amount'] = data['Quantity'] * data['UnitPrice'] #매출 = 수량 * 개당 가격
- 분석의 편의를 위해 최소 주문 제외
data = data.query('Quantity > 0')
- 분석
- 시간의 흐름에 따라 매출, 주문고객수, 주문단가의 추이는 어떻게 달라지는가?
더보기💡 매출과 주문고객수는 우상향, 주문단가는 유지- 매출
amount_by_date = data.groupby('date_ymd')[['amount']].sum().reset_index()
fig = px.line(data_frame=amount_by_date, x='date_ymd', y='amount')fig.show() - 주문고객수
customer_count_by_date = data.groupby('date_ymd')[['CustomerID']].nunique().reset_index( ).rename({'CustomerID':'customer_count'}, axis=1)
fig = px.line(data_frame=customer_count_by_date, x='date_ymd', y='customer_count')fig.show() - 주문단가
invoice_count_by_date = data.groupby('date_ymd')[['InvoiceNo']].nunique().reset_index().rename( {'InvoiceNo':'invoice_count'}, axis=1)invoice_amount = pd.merge(amount_by_date, invoice_count_by_date, on='date_ymd')invoice_amount['amount_per_invoice'] = invoice_amount['amount'] / invoice_amount['invoice_count']fig = px.line(data_frame=invoice_amount, x='date_ymd', y='amount_per_invoice')fig.show()
- 매출
- 리텐션 분석: 시간의 흐름에 따라 고객들은 얼마나 남고 얼마나 이탈했는가?
더보기💡 Month1 리텐션이 최근으로 오며 상승 중- 연월 단위로 고객번호, 영수증번호 전처리
retention_base = data[["CustomerID", "InvoiceNo", "date_ymd"]].drop_duplicates()retention_base['date_ym'] = retention_base['date_ymd'].dt.to_period('M')
- 날짜 범위 수정
retention_base = retention_base.query('date_ymd <= "2011-11-30"')#12월 데이터를 포함하면 2011년 12월 데이터는 리텐션이 낮을 수 밖에 없으므로 12월 데이터 제외
- 리텐션 계산
date_ym_list = sorted(list(retention_base['date_ym'].unique()))from tqdm.notebook import tqdmretention = pd.DataFrame()for s in tqdm(date_ym_list):for t in date_ym_list:period_start = speriod_target = t
if period_start <= period_target:period_start_users = set(retention_base.query('date_ym == @period_start')['CustomerID'])period_target_users = set(retention_base.query('date_ym == @period_target')['CustomerID'])
retained_users = period_start_users.intersection(period_target_users)retention_rate = len(retained_users) / len(period_start_users)
temp = pd.DataFrame({'cohort':[period_start], 'date_ym':[period_target], 'retention_rate':[ retention_rate]})retention = pd.concat([retention, temp])retention['cohort_size(month)'] = retention.apply(lambda x: (x['date_ym'] - x['cohort']).n, axis=1)retention['cohort'] = retention['cohort'].astype(str)retention['date_ym'] = retention['date_ym'].astype(str)retention_final = pd.pivot_table(data=retention, index='cohort', columns='cohort_size(month)', values ='retention_rate') - 리텐션 커브
retention_curve = retention.groupby('cohort_size(month)')[['retention_rate']].mean().reset_index()fig = px.line(data_frame = retention_curve, x='cohort_size(month)', y='retention_rate', title='리텐션 커브')fig.update_yaxes(tickformat='.2%')fig.show()
💡 2011-11월에 고객 재방문이 늘었다. - 연월 단위로 고객번호, 영수증번호 전처리
- RFM 분석: 고객의 행동에 따라 고객을 유형화 해보자 → RM 분석 진행
더보기- RM 계산
today_date = max(data['date_ymd'])
rfm = data.groupby('CustomerID').agg({'InvoiceDate': lambda x: (today_date - x.max()).days,#오늘로부터 며칠이 지났는지'amount': lambda x: x.sum()}) #주문금액
rfm.columns = ['recency', 'monetary'] - 각 팩터를 3등급으로 나누어 등급 매기기
rfm['recency_score'] = pd.qcut(rfm["recency"], 3, labels=[3, 2, 1])rfm['monetary_score'] = pd.qcut(rfm["monetary"], 3, labels=[1, 2, 3])rfm['rm_score'] = rfm['recency_score'].astype(str) + rfm['monetary_score'].astype(str)rfm.reset_index(inplace=True)rm_score = rfm.groupby('rm_score')[['CustomerID']].nunique().reset_index().rename({'CustomerID':'customer_count'}, axis=1)def categorize_customer(score):if score == '33':return '최우수' #최신성, 구매 모두 상당히 높음elif score in ['32','23','22']:return '우수' #최신성, 구매 모두 높음elif score =='11':return '휴면' #최신성, 구매 모두 낮음elif score in ['12','13']:return '이탈 방지' #구매는 높으나 최신성은 낮음 -> 다시 불러들어야 함elif score in ['31','21']:return '구매 유도' #최신성은 높으나 구매는 낮음 -> 구매를 유도해야 함
rm_score['category'] = rm_score['rm_score'].apply(categorize_customer)fig = px.treemap(data_frame = rm_score, path=['category'], values='customer_count', color_discrete_sequence=px.colors.qualitative.Pastel1)fig.show()
- RM 계산
- 시간의 흐름에 따라 매출, 주문고객수, 주문단가의 추이는 어떻게 달라지는가?

'패스트캠퍼스 데이터분석 부트캠프 14기 > 주차별 학습기록' 카테고리의 다른 글
| 패스트캠퍼스 데이터분석 부트캠프 9주차_SQL (2) (0) | 2024.06.21 |
|---|---|
| 패스트캠퍼스 데이터분석 부트캠프 8주차_SQL (1) (0) | 2024.06.14 |
| 패스트캠퍼스 데이터분석 부트캠프 4주차_PYTHON (2) (0) | 2024.05.17 |
| 패스트캠퍼스 데이터분석 부트캠프 3주차_PYTHON (1) (0) | 2024.05.10 |
| 패스트캠퍼스 데이터분석 부트캠프 2주차_EXCEL (2) (0) | 2024.05.03 |