Original size 1140x1600

Мировое потребление лапши в 2022 году

PROTECT STATUS: not protected
The project is taking part in the competition

Как большая любительница поесть, я решила провести анализ данных о еде и выбрала свой любимый продукт — лапшу. Для дальнейшей проведенной мной работы я использовала датасет с kaggle (World Instant Noodles Consumption 2022).

Процесс создания графиков

Я решила сделать минимум (4 графика), но такой, чтобы показать как можно большее количество информации об имеющихся данных.

1. Для начала, я импортировала файл с данными в Google Colab с помощью кода:

import pandas as pd import numpy as np

from google.colab import drive drive.mount ('/content/drive')

file_path = '/content/drive/MyDrive/Noodles.xlsx'

df = pd.read_excel (file_path, sheet_name='noodles (1)')

print («Первый взгляд на данные:») df.head ()

2. Затем я сделала проверку данных:

print («ПРОВЕРКА») print («Точные названия всех столбцов:») for i, col in enumerate (df.columns): print (f"Столбец {i}: '{col}' (тип: {type (col)})»)

print («\n» + «=»*50) print («Проверяем последние строки:») df.tail ()

3. Далее я настроила визуал и другие параметры:

import matplotlib.pyplot as plt import matplotlib.font_manager as fm

available_fonts = [f.name for f in fm.fontManager.ttflist] if 'DejaVu Sans' in available_fonts: plt.rcParams['font.family'] = 'DejaVu Sans' elif 'Liberation Sans' in available_fonts: plt.rcParams['font.family'] = 'Liberation Sans' else: plt.rcParams['font.family'] = 'sans-serif' plt.rcParams['axes.unicode_minus'] = False

palette = { 'noodle_gold': '#FFB347', 'broth_orange': '#FF8C42', 'soy_sauce': '#2D1B00', 'bowl_white': '#FFFBF0', 'chive_green': '#90A959', 'spice_red': '#D32F2F' }

plt.rcParams['figure.figsize'] = (12, 7) # размер plt.rcParams['axes.titleweight'] = 'bold' plt.rcParams['axes.titlecolor'] = palette['soy_sauce']

print («Стиль для графиков установлен»)

4. Создание первого графика.

Столбчатая диаграмма (Bar Chart) показывает топ-10 стран-лидеров по потреблению лапши в 2022 году. Код для создания диаграммы:

df_sorted_2022 = df.sort_values (by=2022, ascending=False).head (10) countries = df_sorted_2022['Country/Region'] noodle_2022 = df_sorted_2022[2022]

fig, ax = plt.subplots (figsize=(13, 8))

num_bars = len (countries) colors = [palette['noodle_gold']] * num_bars colors[0] = palette['broth_orange'] colors[1] = palette['broth_orange']

bars = ax.bar (countries, noodle_2022, color=colors, edgecolor=palette['soy_sauce'], linewidth=1.5)

for bar in bars: height = bar.get_height () height_text = f'{int (height/1000)}K' if height >= 1000 else f'{int (height)}' ax.text (bar.get_x () + bar.get_width ()/2., height + 100, height_text, ha='center', va='bottom', fontsize=11, fontweight='bold', color=palette['soy_sauce'])

ax.set_title ('МИРОВЫЕ ЛИДЕРЫ ПО ПОТРЕБЛЕНИЮ ЛАПШИ (2022 год)', fontsize=20, pad=25, color=palette['soy_sauce']) ax.set_xlabel ('Страна', fontsize=14, fontweight='bold', color=palette['soy_sauce']) ax.set_ylabel ('Потребление (млн упаковок)', fontsize=14, fontweight='bold', color=palette['soy_sauce'])

plt.xticks (rotation=45, ha='right', fontsize=11)

ax.spines['top'].set_visible (False) ax.spines['right'].set_visible (False) ax.spines['left'].set_color (palette['soy_sauce']) ax.spines['bottom'].set_color (palette['soy_sauce']) ax.grid (axis='y', alpha=0.2, linestyle='--', color=palette['soy_sauce'])

ax.set_facecolor (palette['bowl_white']) fig.patch.set_facecolor (palette['bowl_white'])

plt.tight_layout ()

try: save_path = '/content/drive/MyDrive/noodles_chart_1_top10.png' plt.savefig (save_path, dpi=300, bbox_inches='tight', facecolor=palette['bowl_white']) print (f’График 1 сохранён: {save_path}') except: print ('Сохраните график вручную (значок дискеты на графике)')

plt.show ()

Original size 1289x790

Столбчатая диаграмма

5. Создание второго графика.

Линейный график (Line Chart) демонстрирует динамику изменения потребления лапши с 2018 по 2022 год в пяти ключевых странах. Код для создания графика:

top5_countries = df.sort_values (by=2022, ascending=False).head (5)['Country/Region'].tolist () df_top5 = df[df['Country/Region'].isin (top5_countries)] years = [2018, 2019, 2020, 2021, 2022]

fig, ax = plt.subplots (figsize=(14, 8))

line_colors = [ palette['broth_orange'], palette['spice_red'], palette['noodle_gold'], palette['chive_green'], '#FFB347' ]

for i, country in enumerate (top5_countries): country_data = df_top5[df_top5['Country/Region'] == country] values = [country_data[year].values[0] for year in years]

ax.plot (years, values,
        marker='o',
        markersize=8,
        linewidth=3,
        color=line_colors[i],
        label=country,
        alpha=0.9)

ax.set_title ('ДИНАМИКА ПОТРЕБЛЕНИЯ ЛАПШИ (2018-2022)', fontsize=20, pad=25, color=palette['soy_sauce']) ax.set_xlabel ('Год', fontsize=14, fontweight='bold', color=palette['soy_sauce']) ax.set_ylabel ('Потребление (млн упаковок)', fontsize=14, fontweight='bold', color=palette['soy_sauce'])

ax.set_xticks (years) ax.set_xticklabels (years, fontsize=12)

legend = ax.legend (loc='upper left', fontsize=12, framealpha=0.9) legend.get_frame ().set_facecolor (palette['bowl_white']) legend.get_frame ().set_edgecolor (palette['soy_sauce'])

ax.grid (True, alpha=0.2, linestyle='--', color=palette['soy_sauce']) ax.spines['top'].set_visible (False) ax.spines['right'].set_visible (False) ax.spines['left'].set_color (palette['soy_sauce']) ax.spines['bottom'].set_color (palette['soy_sauce'])

ax.set_facecolor (palette['bowl_white']) fig.patch.set_facecolor (palette['bowl_white'])

plt.tight_layout ()

try: save_path = '/content/drive/MyDrive/noodles_chart_2_lines.png' plt.savefig (save_path, dpi=300, bbox_inches='tight', facecolor=palette['bowl_white']) print (f’График 2 сохранён: {save_path}') except: print ('Сохраните график вручную (значок дискеты)')

plt.show ()

Original size 1389x789

Линейный график

6. Создание четвертого графика

Интерактивная карта мира (Choropleth Map) визуализирует географическое распределение потребления лапши по странам. Код для создания карты (для корректной работы plotly я преобразовала числовые столбцы в строки):

! pip install plotly -q

import plotly.express as px import plotly.io as pio

df_map = df.copy ()

df_map_fixed = df_map.copy ()

year_columns = [2018, 2019, 2020, 2021, 2022] for year in year_columns: df_map_fixed[str (year)] = df_map_fixed[year]

df_map_fixed = df_map_fixed.dropna (subset=['CCA3', '2022'])

df_map_fixed['hover_text'] = df_map_fixed.apply ( lambda row: f»{row['Country/Region']}
» + f"Потребление: {int (row['2022']):, } млн упаковок
» + # Используем '2022' f"Рейтинг: {int (float (row['Rank'])) if pd.notna (row['Rank']) else 'N/A'}
» + f"Континент: {row['Continent']}», axis=1 )

colorscale = [ [0.0, '#FFF3E0'], [0.3, '#FFCC80'], [0.6, '#FFA726'], [0.8, '#FB8C00'], [1.0, '#E65100'] ]

fig = px.choropleth ( df_map_fixed, locations='CCA3', color='2022', hover_name='Country/Region', hover_data={'hover_text': True, 'CCA3': False, '2022': False}, color_continuous_scale=colorscale, range_color=[0, 50000], labels={'2022': 'Потребление лапши (млн упаковок)'}, title='🌍 ПОТРЕБЛЕНИЕ ЛАПШИ ПО СТРАНАМ МИРА' )

fig.update_layout ( title={ 'text': '🌍 ПОТРЕБЛЕНИЕ ЛАПШИ ПО СТРАНАМ МИРА (2022 год)', 'y': 0.95, 'x': 0.5, 'xanchor': 'center', 'yanchor': 'top', 'font': dict (size=24, color=palette['soy_sauce'], family='DejaVu Sans, sans-serif') }, geo=dict ( showframe=True, showcoastlines=True, projection_type='natural earth', landcolor='#F5F5F5', coastlinecolor=palette['soy_sauce'], framecolor=palette['soy_sauce'] ), coloraxis_colorbar=dict ( title='Млн упаковок', title_font=dict (size=14, color=palette['soy_sauce']), tickfont=dict (size=12, color=palette['soy_sauce']), thickness=20, len=0.75 ), width=1300, height=700, paper_bgcolor=palette['bowl_white'], plot_bgcolor=palette['bowl_white'] )

fig.update_traces ( hovertemplate='%{customdata[0]}

Original size 1909x853

Потребление лапши на карте мира

7. Создание четвертого графика.

Диаграмма рассеяния (Scatter Plot)отображает взаимосвязь между численностью населения страны и объёмом потребления лапши. Здесь я захотела выделить Китай, который впереди по обоим показателям. Код для создания диаграммы:

import numpy as np

df['Population_num'] = df['2022 Population'].astype (str).str.replace ('.', '', regex=False).astype (float) df_clean = df.dropna (subset=['Population_num', 2022]) df_clean['Population_millions'] = df_clean['Population_num'] / 1_000_000 df_clean['Consumption_thousands'] = df_clean[2022] / 1_000

fig, ax = plt.subplots (figsize=(14, 9))

continent_colors = { 'Asia': palette['broth_orange'], 'Europe': palette['chive_green'], 'Africa': '#FF8C42', 'North America': '#4ECDC4', 'South America': '#FF6B6B', 'Oceania': '#A6A6A8' }

for continent, color in continent_colors.items (): continent_data = df_clean[df_clean['Continent'] == continent] if not continent_data.empty: ax.scatter ( continent_data['Population_millions'], continent_data['Consumption_thousands'], s=200, c=color, alpha=0.7, edgecolors=palette['soy_sauce'], linewidth=1.5, label=continent, zorder=5 )

special_countries = ['China', 'India', 'Indonesia'] for _, row in df_clean.iterrows (): if row['Country/Region'] in special_countries: ax.annotate ( row['Country/Region'], xy=(row['Population_millions'], row['Consumption_thousands']), xytext=(10, 10), textcoords='offset points', fontsize=11, fontweight='bold', color=palette['soy_sauce'], arrowprops=dict ( arrowstyle='->', color=palette['soy_sauce'], alpha=0.6, linewidth=1.5 ) )

df_no_china = df_clean[df_clean['Country/Region'] ≠ 'China'] if len (df_no_china) > 1: z = np.polyfit (df_no_china['Population_millions'], df_no_china['Consumption_thousands'], 1) p = np.poly1d (z) ax.plot (df_no_china['Population_millions'], p (df_no_china['Population_millions']), color=palette['soy_sauce'], linewidth=2, linestyle='--', alpha=0.6, label='Линия тренда (без Китая)')

ax.set_title ('ЗАВИСИТ ЛИ ПОТРЕБЛЕНИЕ ЛАПШИ ОТ НАСЕЛЕНИЯ СТРАНЫ? ', fontsize=20, pad=25, color=palette['soy_sauce']) ax.set_xlabel ('Население страны, млн человек', fontsize=14, fontweight='bold', color=palette['soy_sauce']) ax.set_ylabel ('Потребление лапши, тыс. упаковок', fontsize=14, fontweight='bold', color=palette['soy_sauce'])

legend = ax.legend (title='Континенты', fontsize=11, title_fontsize=12, loc='upper left', framealpha=0.9) legend.get_frame ().set_facecolor (palette['bowl_white']) legend.get_frame ().set_edgecolor (palette['soy_sauce'])

ax.grid (True, alpha=0.2, linestyle='--', color=palette['soy_sauce']) ax.spines['top'].set_visible (False) ax.spines['right'].set_visible (False) ax.spines['left'].set_color (palette['soy_sauce']) ax.spines['bottom'].set_color (palette['soy_sauce'])

ax.set_facecolor (palette['bowl_white']) fig.patch.set_facecolor (palette['bowl_white'])

plt.tight_layout ()

try: save_path = '/content/drive/MyDrive/noodles_chart_4_scatter.png' plt.savefig (save_path, dpi=300, bbox_inches='tight', facecolor=palette['bowl_white']) print (f’График 4 (Scatter Plot) сохранён: {save_path}') except Exception as e: print (f’Ошибка сохранения: {e}')

plt.show ()

print («\nАНАЛИЗ СВЯЗИ МЕЖДУ НАСЕЛЕНИЕМ И ПОТРЕБЛЕНИЕМ:») print («=»*60)

correlation = df_no_china['Population_millions'].corr (df_no_china['Consumption_thousands']) print (f"Коэффициент корреляции (без Китая): {correlation:.3f}»)

if correlation > 0.5: print («Сильная положительная связь: чем больше население, тем больше едят лапши») elif correlation > 0.3: print («Умеренная положительная связь») elif correlation > 0: print («Слабая положительная связь») elif correlation < -0.5: print («Сильная отрицательная связь») else: print («Связь практически отсутствует»)

print («\nКлючевые наблюдения:») print («1. Китай — абсолютный выброс: огромное население + огромное потребление») print («2. Индия: большое население, но относительно малое потребление лапши») print («3. Индонезия: среднее население, но высокое потребление») print («4. Большинство стран следуют общей тенденции»)

Original size 1380x890

Диаграмма рассеяния