728x90

https://www.youtube.com/watch?v=qboGste6k6g&t=19s

 

 

데이터를 분석하는 것을 좋아하면서

오랜 축구팬인 저는

 

2023년부터 K리그1, K리그2 데이터를 수집하고 있고

이것을 바탕으로 데이터 분석을 하고 싶었습니다.

 

그래서 이번 기회에 Excel에서 대시보드를 만들어 보았습니다.

제가 시즌(2023, 2024, 2025, 2026)을 선택하면 

대시보드의 내용이 자동으로 바뀌는 '자동화' 개념을 조금 넣었구요.

 

주제는

시즌별 K리그1 총 관중수,

구단별 관중수,

관중 TOP 3 입니다.


 

데이터는 이렇게 생겼습니다.

 

K리그1 관중수.xlsx 파일을 만든 다음 시즌별로 시트를 생성했어요.

이 시트는 시즌에 따라 무한히 생성될 수 있습니다.

언젠가 시트 개수가 매우 많아질텐데 이 때 어떻게 할지는 추후 고민하기로...

 

www.kleague.com 

 

K LEAGUE

 

www.kleague.com

 

이 사이트에서 경기 관련 데이터들을 확인한 다음

.xlsx 파일에 손으로 직접 입력했습니다.

 

UiPath로 자동화를 구현하고 싶었으나

UiPath가 워낙 도깨비 같은 녀석이라서 구현하는 것이 쉽지 않았습니다.

제가 배움이 조금 짧기도 했고요... 그래서 일단은 손으로 계속 입력하고 있습니다.

 

 

https://www.kleague.com/match.do?year=2026&leagueId=1&gameId=4&meetSeq=1&startTabNum=1

 

K LEAGUE

R1 전북 vs 부천 몬타뇨 83분 골 2026.03.01 조회수 275

www.kleague.com

 

위 링크는 K리그1 어떤 한 경기의 데이터들이 모여 있는 링크입니다.

개막전 전북현대 v 부천FC1995 경기에 대한 링크인데

여기서 제가 .xlsx 파일에 입력하는 데이터 항목은

 

경기일시, 홈팀, 점수, 원정팀, 날씨, 관중수, 원정석 관중수, 심판진(6명) 입니다.

그 외 일부 항목은 엑셀에서 자동으로 계산되게끔 수식을 입력했구요.

예를 들면 홈팀 승무패 항목은 제가 홈팀과 원정팀의 점수만 입력하면 자동으로 승무패가 계산됩니다.

수식 예) =IF(L2>M2,"승",IF(L2=M2,"무","패"))


K리그2, 승강플레이오프는 별도의 .xlsx 파일을 만들어서 데이터들을 저장해두었습니다.

 

방금 K리그1에 대한 대시보드를 만들었으니

이제는 K리그2, 승강 플레이오프 파일에 대해서도 대시보드는 만들어야겠죠.


 

이제 본론으로 들어와서, 대시보드 화면입니다.

 

저는 크게 4가지 항목으로 나누어서 대시보드를 만들었습니다.

물론 초보 입장에서 만들었기 때문에 개선의 여지가 많을 것입니다.

 

1. 전체 관중수

2. 구단별 총 관중수

3. 구단별 총 관중수 그래프

4. 관중수 TOP3

 

그 전에,

현재 날짜(A3)에는 =today() 함수를 사용해서 현재 날짜를 확인할 수 있도록 했습니다.

시즌 선택(A4)은 2023, 2024, 2025, 2026 시즌 중 하나를 직접 선택할 수 있도록 했습니다.

 

 

이제 시즌을 선택할 때마다, 대시보드 화면이 달라지는 겁니다.

 

 

 

 

(2026시즌은 개막한지 얼마 안되어서 진행중입니다)


< 주요 기능 >

1. 전시즌 대비(A10)에서 지난 시즌 대비 증감 현황을 파악할 수 있습니다.

증가했을 경우에는 파란색, 감소했을 경우에는 빨간색으로 표시되도록 조건부 서식에서 규칙을 지정했어요.

 

 

2. 승강제가 있는 K리그의 특성으로, 매 시즌 12개 참가팀이 일부 달라질 수 있습니다.

따라서 전시즌 대비 부분에서 승격팀은 지난 시즌 데이터가 없어서 N/A 오류가 발생하게 됩니다.

저는 이것을 iferror( '수식' , '메시지' ) 함수를 통해 '승격팀'으로 표시했습니다.

2023시즌에는 직전 2022시즌 데이터가 없으므로 '자료없음'으로 표시했습니다.

 

 

< 분석 후 알게된 것 >

2023년은 코로나 시대에서 해방된 연도로, 3월 중순부터 마스크 의무화가 해제된 것으로 저는 기억합니다.

따라서 2023, 2024, 2025, 2026 계속해서 데이터를 누적하고 분석할수록

 

2024시즌 : 2023시즌보다 관중이 소폭 늘어났다.

2025시즌 : 2024시즌보다 관중이 크게 줄어들었다.

 

이것을 알게 되었습니다. 

2023년 약 244.7만

2024년 약 250.8만

2025년 약 229.9만 

 

2025년 왜 줄어들었는가? 를 살펴보기 위해서는

별도의 분석이 필요하겠습니다.

예를 들면 수중전이 많아서 줄어들었거나, 평일 경기가 많아서 줄어들었거나

다양한 이유가 있을 수 있습니다. 물론 관중 많은 팀의 성적이 낮아져서 줄어들었을 수도 있죠.

 

 

< 이 대시보드에서 추가로 하고 싶은 것 >

대시보드를 만들었지만 이것이 완벽하다고 생각하지 않습니다.

그래서 이 대시보드를 꾸준히 다듬고 개발할 생각입니다.

 

저는 일단 디자인적으로 뭔가 허전한 느낌이구요,

관중수 외에 다른 항목들도 대시보드에 넣고 싶습니다.

 

아직 초보의 실력이라 부족한 부분이 많습니다.

계속해서 공부하고 발전시켜 나가겠습니다.

 

읽어주셔서 감사합니다.

728x90
< 링크 >
여기를 클릭하세요 (프로그래머스 고득점 Kit 106문제 모음)

여기를 클릭하세요 (30. 부모의 형질을 모두 가지는 대장균 찾기)

< 문제 >
부모의 형질을 모두 보유한 대장균의 ID(ID), 대장균의 형질(GENOTYPE), 부모 대장균의 형질(PARENT_GENOTYPE)을 출력하는 SQL 문을 작성해주세요. 이때 결과는 ID에 대해 오름차순 정렬해주세요.

< 내가 작성한 코드 >
SELECT
B.ID,
B.GENOTYPE,
A.GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA AS A
JOIN ECOLI_DATA AS B ON A.ID = B.PARENT_ID
WHERE (A.GENOTYPE & B.GENOTYPE) = A.GENOTYPE
ORDER BY ID

< 풀이 >
문제를 풀면서 문제가 점점 어려워지는 것을 느끼고 있다.
나는 이 문제를 셀프 조인(Self Join)을 활용해서 접근했다.
셀프 조인은 최대한 간단하게 말하자면
A 테이블에 B 라는 컬럼이 있으나 직접적인 관계가 아니라서 바로 사용할 수 없을 때
셀프 조인 사용을 생각할 수 있다.

자식 대장균(ID)의 GENOTYPE과 부모 대장균(PARENT_ID)의 GENOTYPE을 비트 연산을 통해 포함 여부를 확인해야 한다. 현재 자식 대장균(ID)의 유전형질은 GENOTYPE으로 있기에 우리가 필요한 것은 부모 대장균(PARENT_ID)의 유전형질이며 이를 활용하기 위해 SELF JOIN을 활용했다.
 
728x90

< 링크 >
여기를 클릭하세요 (프로그래머스 고득점 Kit 106문제 모음)

여기를 클릭하세요 (29. 특정 형질을 가지는 대장균 찾기)

< 문제 >
2번 형질이 보유하지 않으면서 1번이나 3번 형질을 보유하고 있는 대장균 개체의 수(COUNT)를 출력하는 SQL 문을 작성해주세요. 1번과 3번 형질을 모두 보유하고 있는 경우도 1번이나 3번 형질을 보유하고 있는 경우에 포함합니다.

< 내가 작성한 코드 >
SELECT COUNT(*) COUNT
FROM ECOLI_DATA
WHERE GENOTYPE & 2 != 2
AND (GENOTYPE & 1 = 1
OR GENOTYPE & 4 = 4);

< 풀이 >
'2번 형질을 보유한다'는 말이 무슨 뜻인지 몰라서 처음엔 쉽지 않았는데,
그러다 2진수로 바꿔서 결과가 2가 아니면 '보유하지 않는다'는 의미로 생각할 수 있었다.
그래서 C언어에서 알게된 비트연산자 &를 생각했다.
쿼리의 where 조건문에서 & 2를 해봤다.
(개인적으로 SQL에 비트연산자를 쓸 수 있다는걸 이번에 처음 알았다.)

728x90

< 링크 >
여기를 클릭하세요 (프로그래머스 고득점 Kit 106문제 모음)

여기를 클릭하세요 (28. 대장균의 크기에 따라 분류하기1)

< 문제 >
대장균 개체의 크기가 100 이하라면 'LOW', 100 초과 1000 이하라면 'MEDIUM', 1000 초과라면 'HIGH' 라고 분류합니다. 대장균 개체의 ID(ID) 와 분류(SIZE)를 출력하는 SQL 문을 작성해주세요.이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요.

< 내가 작성한 코드 >
select id, case when size_of_colony <= 100 then 'LOW'
when size_of_colony > 100 and size_of_colony <= 1000 then 'MEDIUM'
when size_of_colony > 1000 then 'HIGH' end SIZE
from ecoli_data
order by id asc;

< 풀이 >
조건에 따라 결과를 다르게 해야하기 때문에 SQL if 또는 SQL case when 구문이 생각났고
이것을 검색 후 어떻게 쓰는지 참고하면서 문제를 풀었다.

728x90

< 링크 >
여기를 클릭하세요 (프로그래머스 고득점 Kit 106문제 모음)

여기를 클릭하세요 (27. 대장균들의 자식의 수 구하기)

< 문제 >
대장균 개체의 ID(ID)와 자식의 수(CHILD_COUNT)를 출력하는 SQL 문을 작성해주세요. 자식이 없다면 자식의 수는 0으로 출력해주세요. 이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요.

< 내가 작성한 코드 >
select id, ifnull((select count(*)
from ecoli_data
group by parent_id
having id = parent_id), 0) as CHILD_COUNT
from ecoli_data
order by id;

< 풀이 >
문제에서 자식의 수가 주어지지 않았기 때문에 스스로 정의해야 한다.
자식의 수는 ID = PARENT_ID 로 판단해서
자식의 수를 별도의 서브 쿼리로 묶어서 select 문에 컬럼으로 조회하도록 하고

값이 null일 경우 0으로 출력하라고 했기 때문에
이것은 ifnull( 컬럼명, 바꿀 값 ) 을 사용하면 된다.

728x90

< 링크 >
여기를 클릭하세요 (프로그래머스 고득점 Kit 106문제 모음)

여기를 클릭하세요 (26. 특정 물고기를 잡은 총 수 구하기)

< 문제 >
FISH_INFO 테이블에서 잡은 BASS와 SNAPPER의 수를 출력하는 SQL 문을 작성해주세요.
컬럼명은 'FISH_COUNT`로 해주세요.

< 내가 작성한 코드 >
select count(*) as FISH_COUNT
from fish_info a left join fish_name_info b on a.fish_type = b.fish_type
where b.fish_name in ('BASS', 'SNAPPER');

< 풀이 >
1. 두 개의 테이블이 있고, 상황을 봤을 때 Left Join 을 생각했다.
그 이유는 왼쪽 테이블(fish_info)에 데이터가 무수히 많고,
오른쪽 테이블(fish_name_info)에는 데이터가 3개만 있어서
문제가 '종류별 개수'를 조회하라고 했기 때문에
left join을 사용해야겠다고 생각했다.

2. 만약에 inner join을 했다면? 데이터 행이 3개만 출력되었을 것이다.

3. 그래서 left join 구문을 작성한 다음, where 조건 쿼리를 추가했다.
오른쪽 테이블에서 'BASS', 'SNAPPER'를 조회해야 하므로 IN 구문을 생각했다.
where b.fish_name in ('BASS', 'SNAPPER')

728x90

< 링크 >
여기를 클릭하세요 (프로그래머스 고득점 Kit 106문제 모음)

여기를 클릭하세요 (25. 가장 큰 물고기 10마리 구하기)

< 문제 >
FISH_INFO 테이블에서 가장 큰 물고기 10마리의 ID와 길이를 출력하는 SQL 문을 작성해주세요. 결과는 길이를 기준으로 내림차순 정렬하고, 길이가 같다면 물고기의 ID에 대해 오름차순 정렬해주세요. 단, 가장 큰 물고기 10마리 중 길이가 10cm 이하인 경우는 없습니다. ID 컬럼명은 ID, 길이 컬럼명은 LENGTH로 해주세요.

< 내가 작성한 코드 >
select id, length
from fish_info
order by length desc, id asc
limit 10;

< 풀이 >
가장 큰 물고기 10마리라는 뜻은 상위 10개의 데이터를 조회하라는 뜻과 같다.
그래서 나는 sql limit 를 검색하면서 문제를 풀었다.

728x90

< 링크 >
여기를 클릭하세요 (프로그래머스 고득점 Kit 106문제 모음)

여기를 클릭하세요 (24. 잔챙이 잡은 수 구하기)

< 문제 >
잡은 물고기 중 길이가 10cm 이하인 물고기의 수를 출력하는 SQL 문을 작성해주세요.
물고기의 수를 나타내는 컬럼 명은 FISH_COUNT로 해주세요.

< 내가 작성한 코드 >
select count(*) as FISH_COUNT
from fish_info
where length is null;

< 풀이 >
1. 기본 쿼리 작성
select count(*) from fish_info

2. where 조건 추가
where length is null;

+ Recent posts