반응형
쉬는 시간에 학생들이 듣고 싶어하는 노래를 틀어주곤 한다.
덕분에 많은 아이돌들을 알 수 있었는데... 문득 의문이 들었다.
아이돌들은 평균적으로 몇 명으로 구성되어있을까?
데이터는 위키백과에서 가져왔다.
아래 데이터는 1962년부터 2022년 8월까지 데뷔한 아이돌 데이터를 가지고 있다.
대한민국의 아이돌 그룹 목록 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전.
ko.wikipedia.org
결론부터 말하자면
아이돌 멤버수 평균은 아래의 표와 같다.
성별 | 멤버 수 평균 |
남 | 4.965517 |
여 | 4.634783 |
혼성 | 3.400000 |
전체 | 4.771670 |
왜 이런 숫자가 나왔는지 데이터 분석 단계를 자세히 살펴보자.
1. 아이돌 멤버 수에 대한 정의 내리기
아이돌 멤버 수는 종종 변동되기도 한다.
이번 데이터 분석에서 아이돌 멤버 수는 아이돌이 결성 되는 시점의 멤버 수로 정의했다.
2. 이상치 제거하기
특정 아이돌은 멤버 수가 28명이었다.
이러한 이상치는 아이돌 평균 멤버수 파악을 어렵게 한다.
Box Plot을 그려 이러한 이상치가 어느 정도 분포하는지 살펴봤다.
직사각형 위아래에 붙은 선 밖의 동그라미(o)들이 이상치다.
윗 부분에 있는 이상치는 아래의 공식을 통해 구했다.
(데이터의 75%에 위치하는 값) + 1.5*{(데이터의 75%에 위치하는 값) - (데이터의 25%에 위치하는 값)}
그 값은 9.0이었고, 9.0을 초과 하는 값은 이상치로 보고 데이터에서 제거했다.
위과정을 거쳐 나온 값이 앞서 보았던 표이다.
데이터 분석을 하다보면 항상 궁금증이 추가로 생긴다.
2020년 이후 데뷔한 아이돌 멤버 수는 평균 몇명일까?
2020년 이후 아이돌은 총 101팀이었다.
2020년 이후 아이돌 멤버수 평균은 아래의 표와 같다.
성별 | 멤버 수 평균 |
남 | 6.186047 |
여 | 5.543860 |
혼성 | 3.400000 |
전체 | 4.000000 |
아래는 소스코드
#활용할 라이브러리 불러오기
import requests #웹스크래핑
from bs4 import BeautifulSoup #html 해석
import pandas as pd #데이터 분석
import re #정규표현식(숫자와 문자가 섞여있는 경우 숫자만 추출하기 등)
import matplotlib.pyplot as plt #그래프 그리기
#위키피디아 정보 가져오기
res = requests.get("https://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EC%9D%98_%EC%95%84%EC%9D%B4%EB%8F%8C_%EA%B7%B8%EB%A3%B9_%EB%AA%A9%EB%A1%9D")
soup = BeautifulSoup(res.text, "lxml")
ls_table = soup.find_all("table")
#DataFrame 형태로 바꾸기
ls_dataframe = []
for table in ls_table:
ls_dataframe.append(pd.read_html(str(table))[0])
ls_dataframe = ls_dataframe[:-1] #마지막은 아이돌 멤버 정보가 담겨있는 표가 아님
####DataFrame 합치기
#열 이름 살펴보기(DataFrame을 합치기 위해서)
i = 1
for df in ls_dataframe:
print("{}번째 df".format(i), "\n", df.columns)
i+=1
#열 이름 바꾸기
ls_dataframe[-1].columns = ["데뷔", "한국어 이름 (영어/한자 이름)", "성별", "인원수", "리더", "소속사", "해체"]
#DataFrame 합치기 작업
df = ls_dataframe[0].loc[:, ["데뷔", "한국어 이름 (영어/한자 이름)", "성별", "인원수", "소속사", "해체"]]
for i in range(1, len(ls_dataframe)):
df = pd.concat([df, ls_dataframe[i]], ignore_index=False, axis=0)
#데뷔 년도만 가져오기
df["데뷔"] = df["데뷔"].astype(str)
df["데뷔"].unique() #이상한 데이터 찾기
for i in range(0, len(df["데뷔"])): #데뷔 년도만 넣기(월, 일 제거)
df["데뷔"].iloc[i] = df["데뷔"].iloc[i][:4]
df = df.loc[~(df["데뷔"]=="슈퍼엠 ")] #"슈퍼엠 "이란 이상한 데이터가 있었음. 삭제
df["데뷔"] = df["데뷔"].astype(int)
#데뷔할 때 멤버 수 가져오기
for i in range(0, len(df["인원수"])):
df["인원수"].iloc[i] = re.findall("\d+", str(df["인원수"].iloc[i]))[0]
df["인원수"] = df["인원수"].astype(int)
#성별을 남, 여, 혼성으로 나타내기
df["성별"].unique()
for i in range(0, len(df["성별"])):
if df["성별"].iloc[i] == "여 (혼)":
df["성별"].iloc[i] = "여"
elif df["성별"].iloc[i] == "혼":
df["성별"].iloc[i] = "혼성"
####이상치 처리하기
#그래프 그리기
plt.boxplot(df["인원수"])
plt.show()
#이상치 범위 탐색
iqr = df.describe()["인원수"]["75%"] - df.describe()["인원수"]["25%"]
outlier = df.describe()["인원수"]["75%"] + 1.5*iqr
#이상치를 넘어서지 않는 데이터만 가져오기(이상치 제거)
df = df.loc[df["인원수"] <= 9]
#성별에 따른 인원수
df.groupby("성별")["인원수"].mean()
#2020년 이후 데뷔한 아이돌 멤버 수 평균
condition2020 = df["데뷔"]>=2020
df.loc[condition2020].groupby("성별")["인원수"].mean()
반응형
'데이터 분석' 카테고리의 다른 글
초등학교에는 남학생이 더 많을까, 여학생이 더 많을까 (0) | 2023.08.01 |
---|---|
PAPS로 학생 군집화하여 체육시간 모둠 나누는 프로그램 만들기(ChatGPT) (5) | 2023.04.03 |
[데이터분석]"일별" 환율과 코스피, 코스닥은 관계가 있을까 (0) | 2022.11.17 |
[데이터분석]"월별" 환율과 코스피, 코스닥은 관계가 있을까? (0) | 2022.11.01 |
[데이터분석]엔화, 달러, 위안화는 함께 오를까? (0) | 2022.10.26 |
댓글