W tym raporcie chcemy przedstawić analizę książek z serwisu Kaggle:
Główny zbiór danych: https://www.kaggle.com/datasets/saurabhbagchi/books-dataset
Zbiór danych do analizy wydania książek w poszczególnych latach oraz analizy podziału książek według języka: https://www.kaggle.com/datasets/drahulsingh/best-selling-books
Za pomocą analizy danych chcemy odpowiedzieć na następujące pytania:
Jakie są najczęściej oceniane książki oraz którzy autorzy opublikowali najwięcej dzieł?
Zidentyfikujemy 15 książek z największą liczbą ocen i pokażemy, które tytuły przyciągają największe zainteresowanie czytelników.
Wskażemy top 10 pisarzy z największym dorobkiem literackim.
Pokażemy, jakie książki są najwyżej i najgorzej oceniane.
Jaki jest podział książek według języka, rodzaju i poziomu ocen?
Pokażemy, jakie języki dominują w literaturze, analizując dystrybucję książek według ich oryginalnego języka.
Przeanalizujemy, jaki typ książek dominuje na rynku.
Przeanalizujemy procentowy udział książek w trzech głównych grupach ocen: niskich (0–3), średnich (3–4) i wysokich (4–5).
Jaki jest wpływ gatunku na średnią ocenę i różne korelacje?
Zweryfikujemy, które gatunki książek uzyskują najwyższe średnie oceny.
Zbadamy korelację między średnią oceną książki a liczbą wystawionych recenzji.
#install.packages("plotly")
#install.packages("dplyr")
#install.packages("tidyverse")
#install.packages("ggplot2")
#install.packages("knitr")
suppressPackageStartupMessages(library(plotly))
suppressPackageStartupMessages(library(dplyr))
suppressPackageStartupMessages(library(tidyverse))
suppressPackageStartupMessages(library(ggplot2))
suppressPackageStartupMessages(library(knitr))
#books <- read.csv("/Users/macbookpro/Desktop/Books_df.csv")
#language_data <- read.csv("/Users/macbookpro/Desktop/best_selling_books.csv")
books <- read.csv("C:\\Users\\Darina\\Downloads\\Books_df.csv")
language_data <- read.csv("C:\\Users\\Darina\\Downloads\\best_selling_books.csv")
#"C:\\Users\\kriku\\Downloads\\Projekt R\\Books_df.csv"
#"C:\\Users\\kriku\\Downloads\\Projekt R\\best_selling_books.csv"
#"/Users/macbookpro/Desktop/Books_df.csv"
#"/Users/macbookpro/Desktop/best_selling_books.csv"
#view(books)
#view(language_data)
#names(books)
Top 15 najpopularniejszych książek za ilością ocen
most_rated_books <- books %>%
distinct(Title, .keep_all = TRUE) %>%
arrange(desc(No..of.People.rated)) %>%
slice(1:15) %>%
select(Title, No..of.People.rated) %>%
mutate(Title = str_sub(Title, 1, 20))
g1 <- ggplot(most_rated_books, aes(x = Title, y = No..of.People.rated)) +
geom_bar(stat = "identity", fill = "steelblue") +
coord_flip() +
theme_minimal() +
xlab("Book Title") +
ylab("Number of Ratings") +
ggtitle("Most Popular Books by Number of Ratings")
ggplotly(g1)
Top 10 autorwów
# Liczba książek na autora
books_per_author <- books %>%
count(Author) %>%
arrange(desc(n)) %>%
slice(1:10)
books_per_author
## Author n
## 1 Wonder House Books 389
## 2 Maple Press 110
## 3 Jeff Kinney 86
## 4 J.K. Rowling 84
## 5 Dreamland Publications 78
## 6 Team Pegasus 54
## 7 Sudha Murty 51
## 8 Oswaal Editorial Board 47
## 9 Rick Riordan 46
## 10 Om Books Editorial Team 44
g6 <- ggplot(books_per_author, aes(x = reorder(Author, -n), y = n)) +
geom_bar(stat = "identity", fill = "steelblue") +
theme_minimal() +
xlab("Author") +
ylab("Number of Books") +
ggtitle("Top 10 Authors by Number of Books") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggplotly(g6)
Najwyżej i najgorzej oceniane książki
# Najwyżej oceniane oceniane książki
highest_rated <- books %>%
filter(Rating == max(Rating)) %>%
select(Title, Author, Rating) # sumarycznie 240 książek
# Najgorzej oceniane książki
lowest_rated <- books %>%
filter(Rating == min(Rating)) %>%
select(Title, Author, Rating) # sumarycznie 306 książek
# Tabela dla najwyżej ocenianych książek
highest_rated %>%
slice(1:10) %>%
kable(col.names = c("Title", "Author", "Rating"), caption = "Top 10 Highest Rated Books")
| Title | Author | Rating |
|---|---|---|
| The Supernatural Quiz Book: 500 Questions and Answers on Supernatural: 500 Questions and Answers on Supernatural Season 1 | Light Bulb Quizzes | 5 |
| அசுரனின் காதல் (Tamil Edition) | Ebin Rider | 5 |
| Funny Jokes for 15 Year Old Teens: The Ultimate Q&A, One-Liner, Dad, Knock-Knock, Riddle, and Tongue Twister Collection! Hilarious and Silly Humor for Teenagers | Cooper The Pooper | 5 |
| अभिनेता जीवन-एक संघर्ष: Evaluate yourself before you enter in the industry! (Hindi Edition) | Pankaj Gupta | 5 |
| Marainthirunthu Paarkum Marmam Enna..!!!: மறைந்திருந்து பார்க்கும் மர்மம் என்ன..!!! (Tamil Edition) | Thiyashi Vijay | 5 |
| One Sting Attached (Hindi)/Ishq Baki/इश्क़ बाक़ी: Bichhad Ke Bhi Na Bichhde, Aise Saath Ke Naam/बिछड़ के भी न बिछड़े, ऐसे साथ के नाम | Pankaj Dubey/पंकज दुबे | 5 |
| Chautha Ank’Autobiography Ravindra Mahajani चौथा अंक माधवी रवींद्र महाजनी | Madhavi Ravindra Mahajani | 5 |
| Jag Badalnara Baap Manus (Dr. Babasaheb Ambedkar) | Jagdish Ohol | 5 |
| Snakes, Drugs and Rock ‘n’ Roll: My Early Years | Romulus Whitaker | 5 |
| Own Your Body: A Doctor’s Life-saving Tips | Dr. Shiv K Sarin | 5 |
# Tabela dla najgorzej ocenianych książek
lowest_rated %>%
slice(1:10) %>%
kable(col.names = c("Title", "Author", "Rating"), caption = "Top 10 Lowest Rated Books")
| Title | Author | Rating |
|---|---|---|
| Changing The Lens: Exploring The Depths Of Film And Philosophy | Dr Ruplekha Khullar & Sulagna Pal | 0 |
| The Musical Maverick: The Authorized Biography of Shankar Mahadevan | Ashis Ghatak | 0 |
| Thirteen Plays of Bhasa: (2 Vols. Bound in One) | A.C. Woolner Lakshman Sarup | 0 |
| Borsi Bhar Aanch | Yatish Kumar | 0 |
| Breakout Trading Made Easy “ब्रेकआउट ट्रेडिंग मेड ईजी” Book in Hindi | Maximize your Profits with Simple Price Action Strategies | Sunil Gurjar | Sunil Gurjar | 0 |
| Lilliput Land: How Small is Driving India’s Mega Consumption Story | Rama Bijapurkar | 0 |
| My First Mini Library Of Learning Vol. 1 | Puffin India | 0 |
| Ruskin Bond Short Stories - Set of 8 Bestselling Children Story Books | Ruskin Bond | 0 |
| 11 Rules For Life: Secrets to Level Up | Chetan Bhagat | 0 |
| The Mystery of the Magic Mirror | Shubira Prasad | 0 |
Podział książek wedlug roznych jezykow
top10_lang <- language_data %>%
count(Original.language) %>%
arrange(desc(n)) %>%
slice(1:15)
top10_lang
## Original.language n
## 1 English 131
## 2 Russian 6
## 3 French 5
## 4 German 5
## 5 Japanese 5
## 6 Chinese 4
## 7 Italian 4
## 8 Spanish 3
## 9 Hindi 2
## 10 Norwegian 2
## 11 Swedish 2
## 12 Czech 1
## 13 Dutch 1
## 14 Gujarati 1
## 15 Portuguese 1
# Wykres pączkowy
g2 <- top10_lang %>% plot_ly(labels = ~Original.language, values = ~n)
g2 <- g2 %>% add_pie(hole = 0.5)
g2 <- g2 %>% layout(title = "Books Distribution by Different Languages", showlegend = T,
xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))
g2
Podział książek według typu
top8_type <- books %>%
count(Type) %>%
arrange(desc(n)) %>%
slice(1:8)
top8_type
## Type n
## 1 Paperback 4200
## 2 Kindle Edition 2347
## 3 Hardcover 787
## 4 Audible Audiobook 199
## 5 Board book 181
## 6 Perfect Paperback 45
## 7 Product Bundle 44
## 8 Unknown Binding 24
# Wykres kołowy podziału książek na typy
plot_ly(data=top8_type,values=~n,labels=~factor(Type),
marker=list(colors=c("green","orange","blue")),
type="pie") %>% layout(title="Distribution of Books by Type")
Procent książek w różnych przedziałach ocen
# Procent książek w różnych przedziałach ocen
rating_bins <- books %>%
mutate(rating_group = case_when(
Rating <= 3 ~ "0-3",
Rating > 3 & Rating <= 4 ~ "3-4",
Rating > 4 ~ "4-5"
)) %>%
count(rating_group) %>%
mutate(percentage = n / sum(n) * 100)
rating_bins
## rating_group n percentage
## 1 0-3 395 4.982341
## 2 3-4 548 6.912210
## 3 4-5 6985 88.105449
plot_ly(data=rating_bins, values=~percentage, labels=~rating_group,
marker=list(colors=c("red", "orange", "blue")),
type="pie") %>%
layout(title="Percentage of Books by Rating Group")
Załeżność śriedniej oceny od gatunku książki
g4 <- ggplot(books[books$Rating > 2.5, ], aes(x = reorder(Main.Genre, Rating, FUN = median), y = Rating)) +
geom_boxplot() +
coord_flip() +
theme_bw() +
labs(title = "Boxplot of Average Ratings by Genre",
x = "Genre",
y = "Average Rating")
ggplotly(g4)
Ilość wydanych książek w poszczególnych latach
#Ilość książek wydanych w poszczególnych latach
year_distribution <- language_data %>%
group_by(First.published) %>%
summarise(count = n()) %>%
arrange(desc(count))
head(year_distribution)
## # A tibble: 6 × 2
## First.published count
## <int> <int>
## 1 1979 5
## 2 1974 4
## 3 1988 4
## 4 1992 4
## 5 2000 4
## 6 2012 4
g5 <- ggplot(year_distribution[year_distribution$First.published !=1304,], aes(x = First.published, y = count, size = count)) +
geom_point(alpha = 0.7, color = "blue") +
theme_minimal() +
labs(
title = "Bubble Plot of Publication Counts by Year",
x = "Year of First Publication",
y = "Number of Publications",
size = "Count"
) +
scale_size_continuous(range = c(2, 10))
ggplotly(g5)
Korelacja między ocenami a liczbą ocen
# Korelacja między ocenami a liczbą ocen
correlation <- cor(books$Rating, books$No..of.People.rated)
g3 <- ggplot(books, aes(x = Rating, y = No..of.People.rated)) +
geom_point(alpha = 0.5, color = "blue") +
geom_smooth(method = "lm", se = TRUE, color = "red") +
theme_minimal() +
xlab("Rating") +
ylab("Number of Ratings") +
ggtitle(paste("Correlation between Rating and Number of Ratings: r =", round(correlation, 2)))
ggplotly(g3)
## `geom_smooth()` using formula = 'y ~ x'